Eine undulierende Zahl ist eine Zahl, deren Ziffern wie die folgende Zahl zwischen hoch und runter wechseln : 461902 oder 708143 oder sogar 1010101, aber nicht 123, weil 2 <3.
Schreiben Sie ein Programm oder eine Funktion, die einen Wahrheitswert zurückgibt, wenn eine Zahl undulant ist , und ansonsten einen falschen Wert. Der kürzeste Code gewinnt.
Hinweis : Einstellige Zahlen sind eine gültige Eingabe, werden jedoch nicht als udulant angesehen und geben daher isUndulant
false für n <10 zurück.
code-golf
decision-problem
number-theory
leonardo
quelle
quelle
Antworten:
J, 45
Beispielgebrauch:
Ich bin mir ziemlich sicher, dass es eine feinere Möglichkeit gibt, Insert
/
zu drehen , um mehr von der Arbeit in einem Durchgang zu erledigen, aber ich bin seit Monaten j-weniger, ich muss darauf zurückkommen.quelle
Ruby,
72 bis70 ZeichenVerwendung und Testfälle:
Einzelne Ziffern ergeben falsch :
Aufeinanderfolgende identische Ziffern geben ebenfalls false zurück :
quelle
J, 30 Bytes
Ein anderer Ansatz als der andere J antwortet.
Wäre 3 Zeichen kürzer, wenn 5 als undulant angesehen würden.
quelle
(pdf) eTeX, 129 Zeichen
Kompilieren mit
pdfetex filename.tex 1324?
gibt eine PDF-Ausgabe aus. TeX ist in erster Linie eine Schriftsprache, und die Ausgabe auf stdout würde etwa 20 Zeichen mehr erfordern. Auch die seltsame Forderung nach einstelligen Zahlen (eher falsch als wahr) erfordert 26 Zeichen.quelle
Haskell,
88777365 ZeichenDies erfordert die häufig verwendete Sprache Pragma (oder
-X
Flag):NoMonomorphismRestriction
. Wenn Sie das nicht zugeben, müssen wir 4 Zeichen hinzufügen und so definierenz
:quelle
u n=length s>1&&(a[GT,LT]||a[LT,GT])where s=show n;z=q compare s$tail s;w=q(==)z;q=zipWith;a=and.w.cycle
Es ist ein bisschen elegant.zipWith
einmal mitcompare
wie du, dannzipWith
nochmal mit(==)
undcycle[GT,LT]
odercycle[LT,GT]
als zweites arg.tail>>=zipWith compare
was einige Bytes verkürzen würde.q
:q[]=0<1;q(a:b:s)|a/=b,a/=EQ=q$b:s;q _=0>1
q s=and$all(/=EQ)s:zipWith(/=)s(tail s)
Salbei,
8376 BytesIch hatte die Idee, cmp (* [..]) von JBernardo zu verwenden. In Sage
uniq(...)
ist ein Alias fürlist(set(...))
.Bearbeiten: gerade bemerkt, dass für x <10
uniq(cmp(...)) == []
, die nicht eingeschaltet ist[[1],[-1]]
. Wenn x als Zeichenkette anstelle einer ganzen Zahl eingegeben würde, könnte ich weitere 4 Zeichen herausholen!quelle
sum(uniq(...))^2
, dasum([1,-1]) = 0
und die Summen der Singletons [1] und [-1] Quadrate zu 1 zu verwenden. Leider schlägt es bei einer dreimal wiederholten Ziffer fehl; 1011101.L
wenn die Zahl in Python größer als 2 ** 32 ist und das Ergebnis beeinflusst. Passiert das auf Sage?L
weil Sage Python ist. 1234 -> Ganzzahl ('1234'). Sie können direkt mit Sage anfangenPython:
101100 ZeichenVor der Verkleinerung:
Nach der Verkleinerung:
quelle
Python,
134129 ZeichenUngolfed:
quelle
JavaScript, 88 Zeichen
Verwandeln Sie die Zahl im Wesentlichen in eine Zeichenfolge und vergleichen Sie benachbarte Zeichen.
quelle
K, 41 Bytes
Z.B
quelle
CoffeeScript Früher
986753 BytesTests:
Unkomprimiert:
quelle
J,
44393631 BytesVerwendung wie zuvor.
Ich hatte nicht bemerkt, dass meine letzte Änderung die Ungleichung mit 0-Check völlig unnötig machte. :-)
Vorherige Antwort (+ Erklärung):
Verwendung:
Die Antwort besteht aus vier Teilen:
u=.".;' ',.":
Dies liest die Zahl als Zeichenkette ein":
, teilt sie in eine Liste von Zeichen mit vorangestellten Leerzeichen' ',.
auf;
, setzt sie wieder zusammen , konvertiert sie zurück in Zahlen".
und speichert dann das Ergebnis.u=.
Dies macht 461902 im Grunde genommen zu 4 6 1 9 0 2, was ich leichter finde zu verarbeiten in J.*/2~:/\2<:/\
Dies funktioniert mit dem in u gespeicherten Wert. Es nimmt jedes Zeichenpaar und prüft, ob das linke kleiner oder gleich dem rechten ist,2<:/\
so dass 4 6 1 9 0 2 zu 1 0 1 0 1 wird. Dann nimmt es das Ergebnis und prüft jedes Zahlenpaar auf Ungleichheit2~:/\
So wird 1 0 1 0 1 zu 1 1 1. Schließlich multipliziert es sie alle miteinander, um entweder eine 0 oder eine 1 zu erhalten.*/
An diesem Punkt könnten wir die Antwort zurückgeben, wenn es nicht zwei Dinge gäbe: Eine einzelne Ziffer gibt 1 zurück, wenn die Frage erfordert eine 0; und gleiche Zahlen werden genauso behandelt wie 'kleiner als', so dass 461900 1 anstelle von 0 zurückgibt. Schade. Weiter geht's ...(1<#u)
Dies prüft, ob die Anzahl der in u gespeicherten Elemente#u
größer als 1 ist und gibt false zurück, wenn es sich nur um eine einstellige Zahl handelt.(0=+/2=/\u)
Dies nimmt jedes in u gespeicherte Zahlenpaar und prüft auf Gleichheit2=/\u
. Es summiert dann die Antworten und prüft, ob es 0 hat.Die Ergebnisse der Teile 2, 3 und 4 werden dann multipliziert, um (hoffentlich) eine 1 zu ergeben, wenn die Anzahl den in der Frage angegebenen Anforderungen entspricht.
quelle
a.i.":
Haskell, 82 Bytes
Probieren Sie es online!
quelle
readFile "Undulant.hs" >>= print . length . dropWhile (== '\n') . reverse . filter (/= '\r')
c=cycle[(<),(>)]
kann auf gekürzt werdenc=(<):(>):c
.zipWith3($)l(show n)$tail$show n
kann seinzipWith3($)l=<<tail$show n
und((>):c)
kann seintail c
. Insgesamt 70 Bytes: Probieren Sie es online!Python,
119108 Bytesquelle
... for a,b in zip(t,t[1:])
anstatt Bereiche zu verwenden. Außerdem brauchen Sie die Klammern nicht inall([...])
- Python erstellt beim Auffinden einen Generator(... for ...)
, auch wenn die Klammern für einen Funktionsaufruf stehen.x>9 and all(i^j for i,j in zip(l,l[1:]))
und entfernenif l else False
.cmp(i,j)
und stattdesseni^j
gesetzti*j<0
und getestet werdenand l[0]!=0
. Einige weitere Charaktere: - /print
speichert ein Zeichenreturn
, aber ist es legitim? Die Spezifikation fordert eine Funktion an, die "zurückgibt".Python, 155 Zeichen
quelle
C ++, 94 Zeichen
gleiche Methode wie meine Erlang-Antwort mit einer for-Schleife anstatt einer Rekursion.
quelle
Python
105101100 ZeichenRekursive Lösung.
c(r,t)
prüft, ob das erste Zeichenr
kleiner(t==-1)
oder größer(t==1)
als das zweite Zeichen ist, und ruft die entgegengesetzte Prüfung für den verkürzten String auf.quelle
0
speichern, indem Sie es entfernen , und Sie können drei Zeichen in der zweiten Zeile speichern, indem Sieu=lambda x:x>9 and c(`x`,cmp(*`x`[:2])or 1)
x>9and
.Perl / re, 139 Bytes
Tut alles , was in regex ist ein bisschen eine schlechte Idee.
Ich verwende Perl 5.12, denke aber, dass dies unter Perl 5.10 funktioniert. Ziemlich sicher, dass 5.8 raus ist.
quelle
GolfScript, 48 Bytes
In der Hoffnung, J zu schlagen, benutze ich zum ersten Mal GolfScript. Hat nicht ganz geklappt.
quelle
JavaScript,
66656260 BytesNimmt Eingaben als Zeichenfolge, gibt
true
undulierende Zahlen zurück, leere Zeichenfolgen (Falschzeichen) für einstellige Zahlen undfalse
andere.Versuch es
Führen Sie das folgende Snippet aus, um
0-9
25 Zufallszahlen zu testen<10,000,000
.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.
Dieses Argument wird sofort in zwei Parameter zerlegt: Es
s
ist das erste Zeichen in der Zeichenfolge unda
ein Array, das die verbleibenden Zeichen enthält (z . B."461902"
wirds="4"
unda=["6","1","9","0","2"]
).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ällena+a
ist dies der Fall und wir fahren mit dem nächsten Teil der Funktion fort.Wir werden prüfen, ob jedes Element
x
ina
zurückkehrt,true
wenn es eine Funktion durchläuft.Dies bestimmt, was unser erster Vergleich sein wird (
<
oder>
) und dann werden wir von dort abwechseln. Wir prüfen, ob die Zeichenfolges
kleiner ist als das Arraya
, das dabei in eine Zeichenfolge umgewandelt wird. Wenn sies
kleiner ist als das erste Zeichena
,y
wird dies der Fall seintrue
oderfalse
nicht.Wir erstellen einen String mit dem aktuellen Wert von
s
am Anfang undx
am Ende. Dazwischen indexieren wir den String,"<>"
indem wir ihn inkrementiereny
, seinen anfänglichen booleschen Wert in eine Ganzzahl umwandeln und modulo um 2, was uns0
oder ergibt1
.Bewerte diesen String.
Schließlich übergeben wir ein zweites Argument
eval
, das ignoriert wird, und setzen damit den Wert vons
auf den aktuellen Wert vonx
für die nächste Iteration.quelle
PowerShell, 88
Naiv und trivial. Ich werde später Golf spielen.
Meine Testfälle .
quelle
JavaScript, 112
Sie müssen nur ein Argument übergeben. Ich könnte dies wahrscheinlich mit einer For-Schleife weiter Golf spielen.
quelle
d>=l
->d>0
) und (d<=l
->d<2
) vielleicht? Ich schaue nicht genau hin, da es vielleichtd
Bruchteile gibt, die es verzerren könnten.L
, kein1
. Trotzdem danke!Erlang,
137123118 Zeichenquelle
CJam, 30 Bytes
CJam ist neuer als diese Herausforderung, daher konkurriert dies nicht um das grüne Häkchen, aber es ist trotzdem kein Gewinner (obwohl ich mir sicher bin, dass dies tatsächlich einiges an Golfspielen kann).
Teste es hier.
Wie es funktioniert
Zuerst mache ich eine Zeichenkettenmanipulation (gefolgt von eval), um 5 Bytes bei doppeltem Code zu sparen:
Tatsächlich ist mein Code also
Zunächst gehe ich wie folgt mit dem seltsamen Sonderfall einer einzelnen Ziffer um. Ich kopiere die Ziffer bei Index
1
und stelle sie der Nummer voran. Wir müssen 3 Fälle unterscheiden:12...
wir dann erhalten212...
, so dass der Start undulant ist, und wirkt sich nicht auf , ob die gesamte Zahl undulant.11...
bekommen wir111...
. Nun ist der Start nicht undulant, aber die Zahl war sowieso nicht undulant, daher hat dies auch keinen Einfluss auf das Ergebnis.1
die erste Ziffer (da die Array-Indizierung von CJam am Ende eine Schleife bildet). Dies führt zu zwei identischen Ziffern, und die Zahl ist nicht undulant.Schauen Sie sich jetzt den Code im Detail an:
Ich bin mir sicher, dass es eine kürzere Möglichkeit gibt, Ziffern (mit einer Länge von mehr als 1) dahingehend zu überprüfen, ob sie wellenförmig sind (insbesondere ohne Verwendung von zwei Falten), aber ich konnte sie noch nicht finden.
quelle
Prolog 87 Bytes
Um es auszuführen, speichere es einfach als golf.pl, öffne einen Prolog-Interpreter (zB gprolog) im selben Verzeichnis und mache dann:
Es wird angegeben,
true
ob die Nummer undulant ist, ansonsten nur nein.quelle
Mathematica, 46 Bytes
Beispiele (Leerzeichen sind nicht erforderlich):
quelle
Scala,
141 133 12997 BytesMit a = n% 10, b = (n / 10)% 10, c = (n / 100)% 10
Dann
a-b * b-c
ist entwederx*-y
oder-x*y
mitx
undy
als positive Zahlen und das Produkt ist in beiden Fällen negativ, aber für-x*-y
oderx*y
(a <b <c oder a> b> c) ist das Produkt immer positiv.Der Rest des Codes behandelt Sonderfälle: eine Ziffer, zwei Ziffern, zwei identische Ziffern.
quelle
Perl, 78 Bytes
quelle
Q, 71 Bytes
Beispielnutzung:
quelle
{(x>9)&any all a=#[;(1 -1;-1 1)](#)a:1_signum(-':)("I"$')($)x}
gives 62 wegloggen($)
Syntaxstring
und die Logik ist eine nette Geste.Julia 0,6 , 62 Bytes
Nimmt eine Zahl auf, kehrt
true
für Undulant zurück undfalse
für nicht. ZBf(163)
kehrt zurücktrue
.Probieren Sie es online!
quelle