Der PPCG-Benutzer und gewählte Mod @Dennis war der zweite Benutzer, der mehr als 100.000 Wiederholungen verdiente!
Dies ist eine völlig originelle Idee, die ich von niemand anderem bekommen habe , aber lasst uns eine Herausforderung basierend auf seiner Benutzer-ID 12012
als Tribut machen!
Wenn Sie es sich ansehen, werden Sie feststellen, dass es zwei unterschiedliche "Abschnitte" zu seiner ID gibt.
12
und
012
Beide Abschnitte ergeben eine 3. Das ist eine ziemlich interessante Eigenschaft.
Definieren wir eine "Dennis 2.0-Zahl" als eine positive Ganzzahl, bei der jede maximale Folge von streng ansteigenden Ziffern dieselbe Zahl ergibt. Zum Beispiel,
123
ist eine Dennis 2.0-Zahl, weil es nur eine maximale Unterliste mit streng aufsteigenden Ziffern gibt, und sie summiert sich auf 6. Zusätzlich ist 2.846.145 auch eine Dennis 2.0-Zahl, weil die drei maximalen Unterlisten mit aufsteigenden Ziffern, nämlich
28
46
145
Alles in allem 10
. Zusätzlich Zahlen , die nur die gleiche Ziffer wiederholen muss Dennis 2.0 Zahlen sein , weil zum Beispiel 777
kann in gebrochen werden
7
7
7
die eindeutig alle auf sieben summieren.
Eine Zahl wie 42
ist keine Dennis 2.0-Zahl, da sie in zwei Teile zerlegt ist
4
2
die eindeutig nicht die gleiche Zahl ergeben.
Die Herausforderung
Sie müssen ein Programm oder eine Funktion schreiben, um festzustellen, ob eine bestimmte Nummer eine Dennis 2.0-Nummer ist oder nicht. Sie können Eingaben und Ausgaben in jedem vernünftigen Eingabeformat vornehmen, z. B. als Zeichenfolge, als Zahl, aus einer Datei, Funktionsargumenten / Rückgabe, von STDIN / STDOUT usw., und dann einen Wahrheitswert zurückgeben, wenn diese Zahl Dennis 2.0 ist Zahl und ein falscher Wert, wenn dies nicht der Fall ist. Als Referenz ist hier jede Dennis 2.0-Nummer bis zu 1.000:
1
2
3
4
5
6
7
8
9
11
12
13
14
15
16
17
18
19
22
23
24
25
26
27
28
29
33
34
35
36
37
38
39
44
45
46
47
48
49
55
56
57
58
59
66
67
68
69
77
78
79
88
89
99
101
111
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
202
222
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
303
312
333
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
404
413
444
456
457
458
459
467
468
469
478
479
489
505
514
523
555
567
568
569
578
579
589
606
615
624
666
678
679
689
707
716
725
734
777
789
808
817
826
835
888
909
918
927
936
945
999
Es gelten Standardlücken und die kürzeste Antwort, gemessen in Bytes, gewinnt!
quelle
1236|6
,
dazwischen nehmen? Dies ist wahrscheinlich sehr anstrengend.Antworten:
Jelly,
13-12Bytes1 Byte dank @Dennis.
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES6),
72-70ByteNimmt einen String als Eingabe. Gibt entweder false oder einen Wahrheitswert zurück (der eine Zahl sein kann).
Es wird ein regulärer Ausdruck verwendet, um eine Eingabezeichenfolge wie folgt umzuwandeln
"2846145"
:Ruft dann
eval()
diesen Ausdruck auf.quelle
2011
teilt sich also auf2 / 01 / 1
und ist keine D2.0-Zahl. Was189
ist es eine D2.0 Zahl und18
ist ein truthy Wert.Python, 50 Bytes
Erwartet
input()
, zu einer Zeichenfolge ausgewertet zu werden, sodass die Eingabe umgebende Anführungszeichen in Python 2 benötigt. Die Ausgabe erfolgt über den Exit-Code , wobei 0 Erfolg (wahr) und 1 Fehler (falsch) angibt.Teste es auf Ideone .
Wie es funktioniert
Wir initialisieren r mit der Zeichenfolge 0 und iterieren über alle Ziffern d in der Eingabe.
Wenn d größer als die erste Ziffer von r ist (anfangs 0 , dann gleich dem vorherigen Wert von d ), wird es
r<d
zu True ausgewertet und'=+'[r<d]*2
ergibt++
.Wenn d kleiner als die erste Ziffer von r ist ,
'=+'[r<d]*2
ergibt sich==
.Wenn d gleich der ersten Ziffer von r ist , ist r länger als die Singleton-Zeichenfolge d und
'=+'[r<d]*2
ergibt erneut==
.In allen Fällen werden die Ziffer d und die beiden generierten Zeichen vor r gesetzt .
Wenn alle eingegebenen Ziffern verarbeitet wurden, wird
eval(r)
der generierte Ausdruck ausgewertet.Wenn die Eingabe aus einer einzelnen, streng ansteigenden Folge von (positiven) Ziffern besteht, wird der Ausdruck zu ihrer Summe ausgewertet.
Beispielsweise ergibt die Ganzzahl 12345 den Ausdruck
5++4++3++2++1++0
, der bei der Auswertung 15 ergibt . Beachten Sie, dass jede Sekunde + ein unärgerliches Plus ist, sodass das Ergebnis davon nicht beeinflusst wird. Die Division von 1 durch 15 ist gültig (das Ergebnis ist nicht wichtig). Das Programm wird normal beendet.Wenn die Eingabe aus zwei streng aufsteigenden Ziffernfolgen besteht, besteht der Ausdruck aus einem einfachen Vergleich.
Beispielsweise ergibt die Ganzzahl 12012 den Ausdruck
2++1++0==2++1++0
, der bei der Auswertung True ergibt , da beide Terme die Summe 3 haben . Die Division von 1 durch True ( 1 ) ist gültig (das Ergebnis ist nicht wichtig). Das Programm wird normal beendet.Andererseits ergibt die Ganzzahl 12366 den Ausdruck
6==6++3++2++1++0
, der bei der Auswertung Falsch ergibt , da die Terme die Summen 6 und 12 haben . Dividieren 1 durch Falsch ( 0 ) stellt einen Zerodivisionerror ; Das Programm wird mit einem Fehler beendet.Wenn die Eingabe aus drei oder mehr streng aufsteigenden Ziffernfolgen besteht, besteht der Ausdruck aus einem verketteten Vergleich , der nur dann True zurückgibt, wenn alle beteiligten Vergleiche True zurückgeben .
Beispielsweise ergibt die Ganzzahl 94536 den Ausdruck
6++3==5++4==9++0
, der bei der Auswertung True ergibt , da alle Terme die Summe 9 haben . Wie zuvor wird das Programm normal beendet.Andererseits ergibt die Ganzzahl 17263 den Ausdruck
3==6++2==7++1++0
, der bei der Auswertung Falsch ergibt , da die Terme die Summen 3 , 8 und 8 haben . Nach wie vor wird das Programm mit einem Fehler beendet.quelle
Brachylog , 13 Bytes
Probieren Sie es online!
Erläuterung
~c
wird zuerst mit den größten Unterlisten vereinigt.quelle
Pyke, 18 Bytes
Probieren Sie es hier aus!
quelle
PowerShell v2 +,
1006461 BytesEin buchstäblicher Einzeiler, da dies alles eine Pipeline ist. Übernimmt die Eingabe als Zeichenfolge
$args[0]
. Schleifen durch sie alschar
-array, jede Iteration entweder das aktuelle Element mit einer Platzierung+
oder-eq
vor ihm auf die Rohrleitung basierend darauf , ob der aktuelle Wert-l
ess-als-oder -e
Qual auf den vorherigen Wert$i
. Diese Saiten sind-join
ed zusammen und Ausleiteniex
(kurz fürInvoke-Expression
und ähnlich wieeval
z. B. für die Eingabe2846145
wird dieser als ausgewertet werden+2+8-eq4+6-eq1+4+5
, das istTrue
.Dieser Boolesche Wert verbleibt in der Pipeline und
True
/ oderFalse
wird implizit bei Programmabschluss geschrieben.Hinweis: Bei der Eingabe mit einer Ziffer verbleibt die resultierende Ziffer in der Pipeline. Dies ist ein wahrer Wert in PowerShell.
Beispiele
quelle
GNU sed 217 oder 115
Beide enthalten +1 für -r
217
Übernimmt die Eingabe in normaler Dezimalzahl
Probieren Sie es online!
115
Nimmt die Eingabe als kommagetrennte Liste der Ziffern in Unary an. zB
123
wäre1,11,111
Probieren Sie es online!
quelle
Perl, 38 + 3 (
-p
) = 41 Bytes-9 Bytes dank @Ton Hospel !
Da es eine gibt
$'
, muss sich der Code in einer Datei befinden, um ausgeführt zu werden. So-p
zählt für 3 Byte. Gibt 1 aus, wenn die Nummer eine Dennis 2.0-Nummer ist, oder andernfalls eine leere Zeichenfolge:quelle
s%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/
mit der-p
Option (+3, weil der Code$'
)A
ist es viel besser , das Ergebnis des Vergleichs anstelle dieses Zufalls zu verwenden ! Vielen Dank! Ich verstehe das.O
zwar nicht ... Ohne es schlägt es in einigen Fällen fehl, aber ich kann nicht verstehen, warum.$'
ist die nächste Ziffer und alle danach. So in zB778
vergleicht es7
mit78
dem,lt
um wie eine steigende Sequenz auszusehen. DasO
bricht und vergleicht sich7O
mit78
(alles oben9
in ASCII funktioniert)$' or $
"anstelle meiner Erfassungsgruppen" zu verwenden, konnte sie jedoch nicht finden, "und alle danach". Danke für den Tipp!~$&le~$'
sollte 1 kürzer seinJavaScript (ES6),
666563 Bytes2 Bytes gespart dank @ edc65
Übernimmt die Eingabe als Zeichenfolge. Alte Version (funktioniert nur in Firefox 30+):
quelle
[...x,0]
->[...x,p=t=z=0]
Mathematica, 38 Bytes
Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt
True
oderFalse
als Ausgabe zurück.quelle
Brachylog 2, 10 Bytes, Sprachnachstellung
Probieren Sie es online!
Dies ist im Grunde derselbe Algorithmus wie die Antwort von @ Fatalize (die ich erst gesehen habe, nachdem ich dies geschrieben hatte), aber er wurde etwas umgestellt, um es unter der Syntax von Brachylog 2 golfiger zu machen.
Es ist ein vollständiges Programm, das zurückkehrt,
false.
wenn es keine Dennis 2.0-Nummer ist odertrue
wenn es eine ist.Erläuterung
Wie bei einem vollständigen Brachylog-Programm üblich, erhalten wir, wenn alle Behauptungen gleichzeitig erfüllt werden können, eine echte Rendite, ansonsten eine falsche. Die Standardreihenfolge für
~c
Partitionen mit weniger, mehr Elemente zuerst zu sortieren ist, und in Prolog (also Brachylog), die durch das erste Prädikat im Programm (unter Verwendung des zweiten als Tie - Break definiert die Standardreihenfolge, und so weiter, hier~c
dominiert, weilẹ
deterministisch ist und somit nichts zu ordnen hat).quelle
MATL,
2423201816 BytesGibt eine truthy von Falsey Matrix
Probieren Sie es online!
Auch Glückwunsch @Dennis!
Erläuterung
quelle
&=
!PHP,
10810592 BytesNimmt Eingaben von Argumenten, beendet mit
0
für Dennis-2.0-Nummer, mit1
else.Nervenzusammenbruch
quelle
05AB1E , 18 Bytes
Erläuterung
N = 12012
als Beispiel verwendet.Probieren Sie es online!
quelle
Ruby 2.3, 56 Bytes
Mit ziemlicher Sicherheit nicht die golferischste Art, dies zu tun, aber es zeigt einige nette Sprachmerkmale.
(Nicht Newline-tolerant, also laufe wie
ruby dennis2.rb <<< '12012'
)quelle
PHP, 144 Bytes
Ich bin sicher, es gibt einen viel clevereren (und kürzeren) Weg, dies zu tun, aber es wird vorerst reichen.
quelle
Python 2, 69 Bytes
Übernimmt die Eingabe als Zeichenfolge.
Erläuterung:
Ex
1201212012
Konvertiert in Liste der Summen:
1+2,0+1+2,1+2,0+1+2,
Berechnet und konvertiert zu setzen.
set([3])
Wenn die Länge des Satzes 1 ist, sind alle Summen gleich.
quelle
JavaScript (ES6), 58
Anwendung meines selten nützlichen Trinkgeldes https://codegolf.stackexchange.com/a/49967/21348
Es scannt den String char, indem es den Lauf aufsteigender Zeichen identifiziert und am Ende jedes Rums prüft, ob die Summe immer gleich ist
Prüfung
quelle
Pyth , 20 Bytes
Zwei Versionen
Probieren Sie das erste online aus!
Probieren Sie den zweiten online aus!
quelle
Rubin,
11710585 BytesDies würde die ganze Zahl dieser Dennis-Nummer oder,
nil
falls nicht, eine Dennis-Nummer zurückgeben. Alle ganzen Zahlen werden auch in Ruby als wahr undnil
als falsch betrachtet.i
ist die Ganzzahl, die geprüft wird.Die dritte Version gibt tatsächlich
true
und zurückfalse
.PS getestet, um 172 Ganzzahlen von 1 bis 1000 wie in der Antwort zurückzugeben.
quelle
APL, 23 Bytes
Erläuterung:
N←⍎¨⍕⍵
: die einzelnen Ziffern in der Eingabe erhalten, speichern inN
N⊂⍨1,2>/N
: finden Sie die Unterlisten der streng steigenden Zahlen inN
+/↑
: summiere jede Unterliste1=≢∪
: Überprüfen Sie, ob die resultierende Liste nur ein einziges Element enthältquelle
Add ++ , 109 Bytes
Probieren Sie es online!
Wie es funktioniert
Wir definieren unsere 3 Funktionen,f , G und k . f ist die Hauptfunktion, die die Eingabe in die richtige Ausgabe umwandelt.
Zuerst konvertieren wir die EingabeX in eine Liste von Ziffern, dann nehmen Sie die Vorwärtsschritte. Als nächstes nehmen wir das Vorzeichen jedes Inkrements. Dies ergibt bei zunehmenden Teilfolgen eine Teilfolge von1 für gleiche Teilfolgen, wie z [ 4 , 4 , 4 ] , Dies ergibt 0 s und für abnehmende Abschnitte, - 1 ist zurück gekommen. Wir nehmen dann das Komplement von jedem dieser Zeichen, um uns umzudrehen1 in einen falschen Wert und alles andere in einen wahren Wert. Nächster,0 wird diesem Array vorangestellt, und wir nehmen das Vorzeichen jedes Elements erneut. Dies ergibt ein Array,EIN , von 0 und 1 , wobei das erste Element immer ist 0 .
Wir geben dann den Bereich[ 1 , 2 , . . . l e n gt h ( A ) ] und entfernen Sie die entsprechenden Elemente 0 im EIN . Dies lässt uns mit einem zweiten Array,EIN′ . Wir tippen dann die Anzahl der Ziffern in die Eingabe, addieren eine und hängen diese Zahl anEIN′ . Wir deduplizieren dannEIN′ , um ein neues Array zu ergeben, EIN'' .
Als nächstes verwenden wir dieG Hilfsfunktion. WieG ist dyadisch (benötigt 2 Argumente) und verhält sich in Verbindung mit jedem Operator etwas anders EIN'' .
€
. Dyadische Funktionen holen einen Wert aus dem Stapel und binden diesen Wert als ihr rechtes Argument, um eine partielle monadische Funktion zu erzeugen. Diese Teilfunktion wird dann auf jedes Element im Argument abgebildet. Das gebundene rechte Argument sind hier die Ziffern der Eingabe, und die Teilfunktion wird abgebildetSchauen wir uns nur eine Iteration von anG( x , y) wo x : = [ 1 , 2 , 0 , 1 , 2 ] und y= 3 . Beachten Sie, dass3 ist der erste Index in EIN'' Woher die Schilder? EIN entsprach mit 1 , eher, als 0 . In der Tat, fürx = 12012 , wir können das sehen EIN''= [ 3 , 6 ] . 3 ist der einzige Index ungleich Null in EIN , und 6 ist die Länge von X Plus eins.
So fürG( [ 1 , 2 , 0 , 1 , 2 ] , 3 ) Folgendes passiert: Zuerst tauschen wir die beiden Argumente aus, sodass der Stapel die Ziffern unter dem Index enthält. Wir reduzieren dann das Array und den Index. Bisher sieht der Stapel so aus [ 1 , 2 ] , die dann von zurückgegeben wird G .
[1 2 0 1 2 2]
. Wir führen dann den Kopf Befehl. Wir ziehen den Index vom oberen Ende des Stapels und nehmen so viele Zeichen vom unteren Ende des Stapels. Dies ergibtDamit,G( x , y) wird über jedes Element abgebildet y∈ A'' , der eine Reihe von Präfixen der Eingabe mit unterschiedlicher Länge zurückgibt. Dieser Teil könnte etwas verwirrend werden, daher werden wir ihn anhand der Beispieleingabe von bearbeitenx : = 12012 . Nach der Kartierung vonG sieht der Stack momentan so aus
Wir verschieben dann ein Array, das die Länge jedes Arrays enthält, in das oberste Element oder in diesem Fall in das Array[ 2 , 5 ] . Dies ist das gleiche wieEIN''- 1 , wenn die - Operatorzuordnungen, aber es werden mehr Bytes benötigt, um diese Beziehung zu verwenden. Als nächstes werden die Vorwärtsdifferenzen der Längen genommen und0 wird vorangestellt und ergibt in diesem Beispiel [ 0 , 3 ] . Dieses neue Array wird dann mit den Ergebnissen von komprimiertG erschaffen B und der Starmap- Operator wird über jedes Paar gefahren.
Der Starmap- Operator verwendet die Funktionk als Argument und arbeitet mit einer dyadischen Funktion und einem verschachtelten Array. Das Array muss aus Paaren bestehen, z[ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ] und die dyadische Funktion wird über jedes Paar abgebildet, wobei jedes Element der Paare das linke bzw. rechte Argument ist.
Hier ist unser Beispiel für ein verschachteltes Array[ [ [ 1 , 2 ] , 0 ] , [ [ 1 , 2 , 0 , 1 , 2 ] , 3 ] ] und unsere Funktion ist k . Wir werden uns einfach darauf konzentrierenk ( [ 1 , 2 , 0 , 1 , 2 ] , 3 ) zur Zeit.
Für unsere Eingabe wird dies zurückgegeben[ 0 , 1 , 2 ] . (Genau genommen kehrt es zurück[ 2 , 1 , 0 ] , aber die Reihenfolge spielt für den Rest des Programms keine Rolle).
Nachk ( x , n ) wird über jedes Paar abgebildet ( x , n ) ∈ B Wir nehmen die Summe jedes Paares und überprüfen dann, ob jedes Element gleich ist, indem wir behaupten, dass jedes benachbarte Paar gleich ist, und dann behaupten, dass jeder dieser Gleichheitstests ergibt 1 (ein wahrer Wert). Schließlich wird dieses Ergebnis zurückgegeben.
quelle