JavaScript, 66 65 62 60 Bytes
Nimmt Eingaben als Zeichenfolge, gibt true
undulierende Zahlen zurück, leere Zeichenfolgen (Falschzeichen) für einstellige Zahlen und false
andere.
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
Versuch es
Führen Sie das folgende Snippet aus, um 0-9
25 Zufallszahlen zu testen <10,000,000
.
f=
([s,...a])=>a+a&&a.every(x=>eval(s+"<>"[++y%2]+x,s=x),y=s<a)
tests=new Set([...Array(10).keys()])
while(tests.add(Math.random()*1e7|0).size<35);
o.innerText=[...tests].map(x=>(x=x+``).padStart(7)+` = `+JSON.stringify(f(x))).join`\n`
<pre id=o></pre>
Erläuterung
Ein paar lustige kleine Tricks in diesem, also denke ich, dass es eine seltene Erklärung für eine JS-Lösung von mir verdient.
()=>
Wir beginnen einfach mit einer anonymen Funktion, die beim Aufruf die Ganzzahl als Argument verwendet.
[s,...a]
Dieses Argument wird sofort in zwei Parameter zerlegt: Es s
ist das erste Zeichen in der Zeichenfolge und a
ein Array, das die verbleibenden Zeichen enthält (z . B. "461902"
wird s="4"
und a=["6","1","9","0","2"]
).
a+a&&
Zuerst verknüpfen wir uns a
mit sich selbst, wodurch beide Vorkommen in Zeichenfolgen umgewandelt werden. Wenn die Eingabe eine einstellige Zahl ist, a
ist sie leer und wird daher zu einer leeren Zeichenfolge. Eine leere Zeichenkette plus eine leere Zeichenkette ist immer noch eine leere Zeichenkette, und da dies in JS falsch ist, beenden wir die Verarbeitung beim logischen UND und geben unsere leere Zeichenkette aus. In allen anderen Fällen a+a
ist dies der Fall und wir fahren mit dem nächsten Teil der Funktion fort.
a.every(x=>)
Wir werden prüfen, ob jedes Element x
in a
zurückkehrt, true
wenn es eine Funktion durchläuft.
y=s<a
Dies bestimmt, was unser erster Vergleich sein wird ( <
oder >
) und dann werden wir von dort abwechseln. Wir prüfen, ob die Zeichenfolge s
kleiner ist als das Array a
, das dabei in eine Zeichenfolge umgewandelt wird. Wenn sie s
kleiner ist als das erste Zeichen a
, y
wird dies der Fall sein true
oder false
nicht.
s+"<>"[++y%2]+x
Wir erstellen einen String mit dem aktuellen Wert von s
am Anfang und x
am Ende. Dazwischen indexieren wir den String, "<>"
indem wir ihn inkrementieren y
, seinen anfänglichen booleschen Wert in eine Ganzzahl umwandeln und modulo um 2, was uns 0
oder ergibt 1
.
eval()
Bewerte diesen String.
s=x
Schließlich übergeben wir ein zweites Argument eval
, das ignoriert wird, und setzen damit den Wert von s
auf den aktuellen Wert von x
für die nächste Iteration.