Gibt es eine Beule?


39

Bestimmen Sie anhand einer Liste positiver Ganzzahlen, ob es ein Element gibt, das entweder größer als seine zwei Nachbarn oder kleiner als seine zwei Nachbarn ist (ein "Stoß"). Um klar zu sein, kann eine Erhebung niemals das erste oder letzte Element der Liste sein, da sie nur einen Nachbarn hat.

Ihr Programm sollte einen von zwei konsistenten Werten ausgeben, die entweder einer Liste ohne Unebenheiten oder einer Liste mit Unebenheiten entsprechen. Was die Werte sind, ist unwichtig. Sie können sie selbst auswählen.

Dies ist daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

[] -> False
[1] -> False
[1,2] -> False
[1,2,1] -> True
[1,2,2] -> False
[1,2,3] -> False
[1,2,2,1] -> False
[1,2,2,3] -> False
[1,2,1,2] -> True
[1,3,2] -> True
[3,1,2] -> True
[2,2,2] -> False

5
Testfallanfrage: Andere Zahlen als 0-1-2-3, auch Negative erlaubt / nicht erlaubt?
Magic Octopus Urn

Vorgeschlagener Testfall: [1,3,3](
Stellt

1
@ETHproductions Wird das nicht schon von abgedeckt [1,2,2]? Oder vermisse ich etwas?
Nic Hartley

2
@NicHartley, die Deltas von [1,2,2]sind die gleichen wie die Zeichen dieser Deltas, aber das ist bei nicht der Fall [1,3,3].
Shaggy

Antworten:


15

Gelee , 5 Bytes

IṠIỊẠ

Gibt 0 zurück, wenn eine Unebenheit vorliegt, 1, wenn nicht.

Probieren Sie es online!

Wie es funktioniert

IṠIỊẠ  Main link. Argument: A (integer array)

I      Increments; take all forward differences of A.
 Ṡ     Take the signs.
       The signs indicate whether the array is increasing (1), decreasing (-1), or
       constant at the corresponding point. A 1 followed by a -1 indicates a local
       maximum, a -1 followed by a 1 a local minimum.
  I    Increments; take the forward differences again.
       Note that 1 - (-1) = 2 and (-1) - 1 = -2. All other seven combinations of
       signs map to -1, 0, or 1.
   Ị   Insignificant; map each difference d to (-1 ≤ d ≤ 1).
    Ạ  All; return 1 if all differences are insignificant, 0 if not.

1
Was ist "Inkremente"? Was wird inkrementiert und was macht das?
Weizen-Assistent

1
@ WheatWizard Ich denke, dies ist das Äquivalent zu 05AB1Es Deltas (¥) -Befehl: Ein Array [n0, n1, n2, n3] wird eingefügt und das Array [n1-n0, n2-n1, n3-n2] wird verschoben.
Kaldo

10

JavaScript (ES6), 38 Byte

Gibt einen Booleschen Wert zurück.

a=>a.some(x=n=>x*(x=a<n|-(a>(a=n)))<0)

Testfälle

Wie?

Wir verwenden a , um den vorherigen Wert von n zu speichern . Wir setzen x auf 1, wenn a <n , -1, wenn a> n oder 0, wenn a = n . Und wir testen, ob old_x * x <0 ist , was nur möglich ist, wenn ( old_x = 1 und x = -1 ) oder ( old_x = -1 und x = 1 ).

Da x mit der anonymen Rückruffunktion von some () initialisiert wird , wird es während der ersten Iteration zu NaN gezwungen , wodurch der Test falsch wird.


Dies wird im strengen Modus ausgelöst.
Aluan Haddad

2
@AluanHaddad Nun, 99% des JS-Golf-Codes werden nur wegen nicht deklarierter Variablen im strengen Modus geworfen. PPCG und Codereview passen nicht gut zusammen. : P
Arnauld

Das ist fair, ich bin nicht sehr golfbegeistert.
Aluan Haddad

4
Warum dann kommentieren lol
Mark C.

8

Haskell , 42 Bytes

any(<0).f(*).f(-)
f a b=zipWith a b$tail b

Probieren Sie es online!

Erläuterung

Zuerst haben wir die Funktion f, die eine Binärfunktion und eine Liste annimmt und die Binärfunktion auf jedes benachbarte Paar in der Liste anwendet.

Dann gilt unsere Hauptfunktion für f(-)die Eingabeliste. Dies berechnet die Differenzliste. Wir wenden dann f(*)auf die Liste an, um jedes benachbarte Paar zu multiplizieren. Zuletzt fragen wir, ob ein Paar kleiner als Null ist.

Eine Zahl in der Endeliste kann nur negativ sein, wenn sie das Produkt einer negativen und positiven Zahl aus der Differenzliste ist. Um also einen negativen Eintrag zu erzeugen (und dann true zurückzugeben), muss die ursprüngliche Liste von aufsteigend auf absteigend umgeschaltet werden oder umgekehrt, das heißt, sie muss eine Unebenheit aufweisen.


Nizza Weg, um mit der leeren Liste umzugehen!
Laikoni


5

Oktave mit Bildpaket, 34 32 Bytes

2 Bytes gespart dank @StewieGriffin !

@(x)0||prod(im2col(diff(x),2))<0

Probieren Sie es online!

Erläuterung

Berechnet aufeinanderfolgende Differenzen, ordnet sie in Gleitblöcken der Länge 2 an, ermittelt das Produkt jedes Blocks und prüft, ob ein solches Produkt negativ ist.


0||prod(...)Spart 2 Bytes. Sie können auch den gesamten anyTeil überspringen und die Standard-Wahrheits- / Falschdefinition verwenden, um 5 Bytes zu sparen .
Stewie Griffin

Verdammt, das Speichern von 5 Bytes wird Ihre Lösung kürzer machen als meine :( Gute Verwendung des Image-Pakets. Ich wusste nicht, dass es auf TIO war.
Stewie Griffin

1
@StewieGriffin Da die Herausforderung zwei konsistente Werte erfordert, kann ich sie nicht entfernen any. Danke für die 0||Idee!
Luis Mendo

4

R, 48 Bytes

function(x)any(apply(embed(diff(x),2),1,prod)<0)

Probieren Sie es online!

So geht es Schritt für Schritt am Beispiel von c (1,4,1,4):

> x=c(1,4,1,4)
> diff(x)
[1]  3 -3  3
> embed(diff(x),2)
     [,1] [,2]
[1,]   -3    3
[2,]    3   -3
> apply(embed(diff(x),2),1,prod)
[1] -9 -9
> any(apply(embed(diff(x),2),1,prod)<0)
[1] TRUE

Als Bonus gibt es hier eine Lösung von ähnlicher Länge und Konzept mit Paket zoo:

function(x)any(zoo::rollapply(diff(x),2,prod)<0)

1
ordentlich! Notiz an mich selbst: Denken Sie daran, embedexistiert. Es ist schade , dass rowProdsund colProdsexistiert nicht als Aliase in R.
Giuseppe

1
@ Giuseppe aus Verzweiflung habe ich tatsächlich überprüft, ob sie existierten :) aber in der Tat nur rowSumsund rowMeans...
Plannapus

1
Naja, zumindest beim Durchsehen der Dokumente .colSumswird die Eingabe in eine Matrix umgewandelt, die auf zusätzlichen Eingaben basiert, die wahrscheinlich irgendwo eine Golfanwendung haben. Jetzt muss ich nur noch eine finden!
Giuseppe

@ Guiseppe: Schauen Sie sich die Funktionen im matrixStatsPaket an.
Michael M

@MichaelM Aufgrund der Länge des Paketnamens ist es leider nicht konkurrenzfähig (57 Bytes:) function(x)any(matrixStats::colProds(embed(diff(x),2)))<0. Aber für alles andere als Code-Golf ist dieses Paket in der Tat eine Fundgrube.
Plannapus


3

Perl 6 , 39 Bytes

{so~(.[1..*]Zcmp$_)~~/'re L'|'s M'/}

Probieren Sie es online!

$_ist das Listenargument für diese anonyme Funktion. .[1..*]ist die gleiche Liste, aber mit dem ersten Element gelöscht. ZcmpZippt die beiden Listen zusammen mit dem cmpOperator, wodurch eine Liste mit OrderWerten erstellt wird. Bei einer Eingabeliste 1, 2, 2, 2, 1würde dies beispielsweise zu einer Liste führen More, Same, Same, Less.

Jetzt müssen wir nur noch wissen, ob diese Liste zwei benachbarte Elemente enthält More, Lessoder Less, More. Der Trick, den ich verwendet habe, besteht darin, die Liste mit in eine durch Leerzeichen getrennte Zeichenfolge zu konvertieren ~und dann zu testen, ob sie entweder eine Teilzeichenfolge re Loder eine Teilzeichenfolge enthält s M. (Das erste kann nicht nur sein, e Lweil es Sameauch mit einem "e" endet.)

Der Operator für intelligente Übereinstimmungen gibt entweder ein MatchObjekt zurück (wenn die Übereinstimmung erfolgreich war) oder Nil(wenn dies nicht soder Fall war). Er konvertiert also alles , was es ist, in einen booleschen Wert.



3

Ruby , 55 46 Bytes

->a{a.each_cons(3).any?{|x,y,z|(y-x)*(y-z)>0}}

Probieren Sie es online!

Ein Lambda, das ein Array akzeptiert und einen Booleschen Wert zurückgibt.

-9 Bytes: Ersetzen (x<y&&y>z)||(x>y&&y<z)durch (y-x)*(y-z)>0(dank GolfWolf )

->a{
  a.each_cons(3)              # Take each consecutive triplet
    .any?{ |x,y,z|            # Destructure to x, y, z
      (y-x)*(y-z) > 0         # Check if y is a bump
    }
}

1
Ich denke, Sie können |anstelle von ||1 Byte sparen.
Yytsi


Speichern Sie 1 Byte mit '0 <(yx) * y- = z'
GB

3

PostgreSQL 173 Bytes

SELECT DISTINCT ON(a)a,x>j and x>k OR x<least(j,k)FROM(SELECT a,x,lag(x,1,x)OVER(w)j,lead(x,1,x)OVER(w)k FROM d WINDOW w AS(PARTITION BY rn ORDER BY xn))d ORDER BY 1,2 DESC;
     a     | c 
-----------+---
 {1}       | f
 {1,2}     | f
 {1,2,1}   | t
 {1,2,1,2} | t
 {1,2,2}   | f
 {1,2,2,1} | f
 {1,2,2,3} | f
 {1,2,3}   | f
 {1,3,2}   | t
 {2,2,2}   | f
 {3,1,2}   | t
(11 rows)

Hallo und willkommen auf der Seite. Ich bin nicht mit PostgreSQL vertraut, aber Sie können möglicherweise die Menge der von Ihnen verwendeten Leerzeichen reduzieren. Im Allgemeinen erfordern die meisten Sprachen nicht die meisten Abstände, die Sie verwenden.
Weizen-Assistent

@ WheatWizard es sind die Beispieldaten in der Datenbank, es ist irrelevant.
Evan Carroll

Was ist dein Code dann? Wir erlauben nicht, dass die Eingabe direkt in den Code anstatt in die Eingabe eingefügt wird. Wenn dies hier der Fall ist, sollten Sie es so umschreiben, dass die Eingabe über eine Standardmethode erfolgt .
Weizen-Assistent

@ WheatWizard von dem Link, den Sie angegeben haben, codegolf.meta.stackexchange.com/a/5341/23085
Evan Carroll

1
Ok, wenn das das von Ihnen verwendete Eingabeformat ist, ist das in Ordnung. Viel Glück beim Golfen, es ist schön zu sehen, dass die Leute in weniger gebräuchlichen Sprachen Golf spielen.
Weizen-Assistent

3

Java 8, 108 104 101 86 84 79 72 Bytes

a->{int i=a.length,p=0;for(;i-->1;)i|=p*(p=a[i]-a[i-1])>>-1;return-i>1;}

-2 Bytes dank @ OlivierGrégoire .
-13 Bytes dank @Nevay .

Probieren Sie es online aus.


1
84 Bytes . Ich habe die Iterationsreihenfolge geändert (nach unten), die beiden Multiplikationsoperanden vertauscht und konnte dann eine überflüssige entfernen -1.
Olivier Grégoire

1
79 Bytes: a->{int i=a.length;for(;i-->2;)i|=(a[i]-a[--i])*(a[i]-a[i-1])>>-1;return-~i|3;}(Rückgabe -1für wahrheitsgemäße Fälle, 3für falsche Fälle) - oder, wenn das Vorhandensein / Fehlen einer Ausnahme als Rückgabewert verwendet wird, 55 Bytes:a->{for(int i=0;++i>0;)i|=(a[i-1]-a[i])*(a[i]-a[i+1]);}
Nevay

1
72 Bytes:a->{int i=a.length,p=0;for(;i-->1;)i|=p*(p=a[i]-a[i-1])>>-1;return-i>1;}
Nevay

3

R , 58 56 Bytes

function(x)any(abs(diff(sign(diff(c(NA,x)))))>1,na.rm=T)

Probieren Sie es online!

2 Bytes dank Giuseppe gespeichert


3
Sie können die geschweiften Klammern {}für -2 Bytes loswerden .
Giuseppe

Darüber hinaus denke ich, dass Sie Stewie Griffins Ansatz für 42 Bytes
Giuseppe

@ Giuseppe, ich denke, Stewie hat meine Methode portiert, mit dem Unterschied, dass meine Methode den leeren Vektor wie in den Testfällen aufgeführt richtig handhaben kann. Matlab ist mit leeren Vektoren etwas nachsichtiger als R.
NofP

c()ist NULLdas, nicht die gleiche wie der leere Vektor von ganzen Zahlen ist integer(0), während in MATLAB []ist ein doublestandardmäßig, aber wenn man es auf diese Weise halten will, das ist durchaus sinnvoll .
Giuseppe

3

J , 16-15 Bytes

-1 Byte dank FrownyFrog

1 e.0>2*/\2-/\]

Probieren Sie es online!

Original: 16 Bytes

0>[:<./2*/\2-/\]

2-/\] - Unterschiede der jeweils benachbarten Gegenstände

2*/\ - Produkte der jeweils angrenzenden Artikel

[:<./ - das Minimum

0> - ist negativ?

Probieren Sie es online!


Hallo ! Könnte dies nicht auf die einfachere explizite Form 0> <./ 2 * / \ 2 - / \ (13 Bytes) verkürzt werden?
Mathias Dolidon

@Mathias Dolidon Dies funktioniert im Interpreter, aber hier in PPCG ist es üblich, eine Funktion (J Verb) bereitzustellen, wenn Eingaben vorhanden sind. Wenn das Verb stillschweigend ist, zählen wir die Zuweisungsbytes nicht f=.. Bitte beachten Sie, dass ich relativ neuer Benutzer bin :)
Galen Ivanov

Ich auch, und Sie haben die Regel für mich geklärt. Vielen Dank ! :)
Mathias Dolidon

1
1 e.0>2*/\2-/\]
FrownyFrog

@ FrownyFrog Vielen Dank! Es scheint, dass ich e selten benutze. :)
Galen Ivanov



2

Attache , 39 Bytes

Any&:&{_*~?Sum[__]}@Slices&2@Sign@Delta

Probieren Sie es online!

Ziemlich zufrieden damit, wie sich das herausstellte.

Erläuterung

Dies ist eine Zusammensetzung von vier Funktionen:

Delta
Sign
Slices&2
Any&:&{_*~?Sum[__]}

DeltaRuft die Unterschiede zwischen Elementen ab. =

Dann Signwird auf jeden Unterschied angewendet, wodurch wir ein Array von 1s, 0s und -1s erhalten. =

Slices&2Geben Sie dann alle Slices der Länge zwei aus dem Array an und geben Sie alle Differenzenpaare an.

Schließlich Any&:&{_*~?Sum[__]}ist äquivalent zu, für die Eingabe x:

Any[&{_*~?Sum[__]}, x]
Any[[el] -> { el[0] and not (el[0] + el[1] = 0) }, x]

Dies sucht nach Elementen, die sich zu Null summieren, aber nicht Null sind. Wenn ein solches Elementpaar existiert, gibt es eine Unebenheit.



2

Schale , 7 Bytes

V<0Ẋ*Ẋ-

Probieren Sie es online!

Erläuterung

V<0Ẋ*Ẋ-  Implicit input, say [2,5,5,1,4,5,3]
     Ẋ-  Consecutive differences: [3,0,-4,3,1,-2]
   Ẋ*    Consecutive products: [0,0,-12,3,-2]
V<0      Is any of them negative? Return 1-based index: 3

2

Oktave , 33 Bytes

@(x)0||abs(diff(sign(diff(x))))>1

Probieren Sie es online!

Erläuterung:

@(x)                           % Anonymous function taking x as input
                  diff(x)       % Takes the difference between consecutive elements
             sign(diff(x))      % The sign of the differences
        diff(sign(diff(x)))     % The difference between the signs
    abs(diff(sign(diff(x)))>1   % Check if the absolute value is 2
@(x)abs(diff(sign(diff(x)))>1   % Output as matrices that are treated truthy or falsy

2

Brachylog , 10 Bytes

s₃.¬≤₁∧¬≥₁

Probieren Sie es online!

Erfolgreich ( true.), wenn es eine Beule gibt, und fehlgeschlagen ( ), wenn es false.keine Beule gibt.

Erläuterung

Das ist schon ziemlich lesbar:

s₃.           There is a substring of the input…
  .¬≤₁        …which is not non-decreasing…
      ∧       …and…
       ¬≥₁    …which is not non-increasing

2

05AB1E , 7 Bytes

¥ü‚P0‹Z

Probieren Sie es online!

Erläuterung

¥         # calculate delta's
 ü‚       # pair each element with the next element
   P      # product of each pair
    0‹    # check each if less than 0
      Z   # max

Gab es nicht eine 1-Byte-Alternative, 0‹die die Zahl grundsätzlich auf ein negatives Vorzeichen überprüft?
Magic Octopus Urn

@MagicOctopusUrn: Wird dverwendet, um zu überprüfen, ob nur die Oberseite des Stapels enthalten ist [0-9], was das Gegenteil von dem ist, was wir hier wollen. Aber jetzt ist es intelligenter und Negative / Floats werden ebenfalls als Zahlen gezählt.
Emigna

Ahhhh ... hätte schwören können a, das negativeZeichen gesehen zu haben und zurückgekehrt zu sein oder so ... Aber ich denke du hast recht, ich erinnere mich an deinen dTrick.
Magic Octopus Urn

2

Brachylog , 10 Bytes

s₃s₂ᶠ-ᵐ×<0

Probieren Sie es online!

Nicht annähernd so ordentlich und elegant wie die 10-Byte-Antwort von @ Fatalize, aber es funktioniert!

s₃   % There exists a substring of three elements [I,J,K] in the array such that

s₂ᶠ  % When it's split into pairs [[I,J],[J,K]]

-ᵐ   % And each difference is taken [I-J, J-K]

×    % And those differences are multiplied (I-J)*(J-K)
     % (At a bump, one of those will be negative and the other positive. 
     % At other places, both differences will be positive, or both negative, 
     %  or one of them 0 - ultimately resulting in a non-negative product.)

<0   % The product is negative





1

Wolfram Language (Mathematica) , 37-36 Bytes

FreeQ[(d=Differences)@Sign@d@#,-2|2]&

Gibt das Gegenteil der Testfallantworten (Falsch und Richtig umgekehrt). Stellen Sie a voran !, um zur normalen Form zu wechseln.

ODER

Abs@(d=Differences)@Sign@d@#~FreeQ~2&

Auch umgekehrt Ausgang, so ersetzen FreeQmit MatchQfür Normalform.

Erklärung: Nehmen Sie das Vorzeichen der Unterschiede der Reihenfolge. Wenn die resultierende Sequenz {1, -1} oder {-1,1} enthält, gibt es eine Unebenheit. Der absolute Wert der Differenzen von {1, -1} oder {-1,1} ist in beiden Fällen 2.

Rasiere ein weiteres Byte ab, indem du die endgültige Liste quadrierst, anstatt den absoluten Wert zu nehmen:

FreeQ[(d=Differences)@Sign@d@#^2,4]&

Probieren Sie es online!


1

Perl, 35 Bytes

Beinhaltet +3für-p

bump.pl:

#!/usr/bin/perl -p
s%\S+ %$a*1*($a=$&-$')%eg;$_=/-/

Rennen wie:

bump.pl <<< "3 1 2"

1

Julia 0,6 , 57 56 Bytes

l->any(p>c<n||p<c>n for(p,c,n)=zip(l,l[2:end],l[3:end]))

Grundsätzlich nur totalhumans Python Antwort. -1 Byte von user71546

Probieren Sie es online!

Julia 0,6 , 39 Bytes

f(x,y,z,a...)=x>y<z||x<y>z||f(y,z,a...)

Lispy-Rekursionsstil, alias Dennis 'Python-Antwort. Gibt zurück, truewenn eine Beule vorhanden ist, andernfalls wird ein Fehler ausgegeben. Das sollten vielleicht 42 Bytes sein, da Sie es beim Aufruf aufteilen müssen. ZB für a=[1,2,1]dich als anrufen f(a...). f(a)=f(a...)würde diesen Bedarf beseitigen, ist aber länger. Ich muss eine Rekursion verbessern, und ich mag es nicht wirklich, Code zu schreiben, der einen Fehler auslöst.

Probieren Sie es online!


1
scheint der Raum danach forist nicht notwendig;)
Shieru Asakoto
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.