2019 ist gekommen und wahrscheinlich hat jeder die Besonderheit dieser Zahl bemerkt: Sie setzt sich tatsächlich aus zwei Unterzahlen (20 und 19) zusammen, die eine Folge von aufeinanderfolgenden absteigenden Zahlen darstellen.
Herausforderung
Geben Sie bei einer gegebenen Zahl x
die Länge der maximalen Folge von aufeinanderfolgenden absteigenden Zahlen zurück, die gebildet werden können, indem man die Subnummern von verwendet x
.
Anmerkungen :
- Unternummern dürfen keine führenden Nullen enthalten (zB
1009
nicht aufteilbar in10
,09
) - Aufeinanderfolgend und absteigend bedeutet, dass eine Zahl in der Folge gleich der vorherigen Zahl -1 sein muss oder (z. B.
52
kann nicht aufgeteilt werden,5,2
weil5
und2
nicht aufeinanderfolgend2 ≠ 5 - 1
) - die Reihenfolge muss mit der vollen Zahl, zB in erhalten werden
7321
kann man nicht verwerfen7
die Reihenfolge und erhalten3
,2
,1
- nur eine Sequenz kann aus der Zahl erhalten werden, beispielsweise
3211098
kann nicht aufgeteilt in zwei Sequenzen3
,2
,1
und10
,9
,8
Eingang
- Eine Ganzzahl (
>= 0
): kann eine Zahl, eine Zeichenfolge oder eine Ziffernliste sein
Ausgabe
- Eine einzelne Ganzzahl angesichts der maximalen Anzahl absteigender Teilzahlen (beachten Sie, dass die Untergrenze dieser Zahl ist
1
, dh eine Zahl wird in einer absteigenden Folge von Länge eins für sich zusammengesetzt)
Beispiele:
2019 --> 20,19 --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
- Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
210 -> 2,1,0
falsch (gleich mit0 -> 0
)? Die Aufgabe besagt, dass " Unternummern keine führenden Nullen enthalten dürfen ". Ist Null ein Sonderfall?212019
. Scheint, als hätte ich nicht alle Regeln gelesen.Antworten:
Jelly ,
159 BytesBugfix dank Dennis
Probieren Sie es online! (O ( N2) )
321
dauertsogareine halbe Minute, da der Code mindestensWie?
quelle
JavaScript (ES6), 56 Byte
Ein Port von ArBos Python-Antwort ist deutlich kürzer. Es schlägt jedoch in einigen Testfällen aufgrund zu vieler Rekursionen fehl.
Probieren Sie es online!
JavaScript (ES6), 66 Byte
Übernimmt die Eingabe als Zeichenfolge.
Probieren Sie es online!
Kommentiert
quelle
Perl 6 ,
43 4140 Bytes-1 byte dank nwellnhof
Probieren Sie es online!
Regex-basierte Lösung. Ich versuche stattdessen, einen besseren Weg zu finden, um eine Übereinstimmung von einer absteigenden Liste zu erzielen, aber Perl 6 macht Partitionen nicht gut
Erläuterung:
quelle
Python 3 ,
232228187181180150149 Bytes-1 danke an @ Jonathan Frech
Probieren Sie es online!
Anfänglicher Code ohne Golf:
quelle
s+1 for
kann seins+1for
,(t(n[:j])-t(n[j:j+i])==1)*t(n[0])
kann möglicherweise seint(n[:j])-t(n[j:j+i])==1>=t(n[0])
.if
.Python 2 ,
787473 BytesProbieren Sie es online!
-1 Byte danke an Arnauld
Übernimmt die Eingabe als Zeichenfolge. Das Programm stößt ziemlich schnell auf Pythons Rekursionstiefenbegrenzung, kann jedoch die meisten Testfälle abschließen.
Wie es funktioniert
quelle
a+c+1
kann auf gekürzt werdena-~c
.05AB1E , 10 Bytes
Extrem langsam, daher funktioniert der TIO unten nur für Testfälle unter 750.
Probieren Sie es online aus .
Erläuterung:
quelle
n!
zu gehen ,n lg n
einfach nicht wert ist.Pyth, 16 Bytes
Versuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .
quelle
Jelly , 11 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Holzkohle , 26 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Schleife
i
von 0 bis zur Länge der Eingabe.Schleife
k
von 0 bis zur Länge der Eingabe.Berechnen Sie die ersten
k
Zahlen in absteigender Reihenfolge ausgehend von der Zahl, die durch die ersteni
Ziffern der Eingabe angegeben wird, verketten Sie sie und akkumulieren Sie die resultierenden Zeichenfolgen in der vordefinierten leeren Liste.Suchen Sie die Position der ersten passenden Kopie der Eingabe und reduzieren Sie das Modulo 1 um mehr als die Länge der Eingabe.
Beispiel: Für eine Eingabe werden
2019
folgende Zeichenketten generiert:2019
wird dann bei Index 12 gefunden, der modulo 5 reduziert wird, um 2 zu ergeben, die gewünschte Antwort.quelle
Haskell, 87 Bytes
Die Eingabe ist eine Liste von Ziffern.
Probieren Sie es online!
Function erstellt
#
eine Liste aller möglichen Teilungen, indem beide betrachtet werdena
vor allen Teilungen, die von einem rekursiven Aufruf mit dem Rest der Eingabe (x<-b#c
) zurückgegeben wurden, jedoch nur, wenn die nächste Nummer nicht Null (b>0
) (oder die letzte Nummer in der Eingabe (c==[]
)) ist unda
eine Nummer größer als die erste ist Nummer des jeweils vorherigen Splitx
(a==x!!0+1
).und
b
aus der Eingabeliste an die aktuelle Nummera
und Fortfahren mit dem Rest der Eingabe ((10*a+b)#c
)Der Grundfall ist, wenn die Eingabeliste leer ist (dh nicht mit dem Muster übereinstimmt
(b:c)
). Die Rekursion beginnt mit der aktuellen Zahla
being0
((0#)
), die niemals den ersten Zweig trifft (vora
allen vorherigen Teilungen), da sie niemals größer als eine beliebige Anzahl der Teilungen ist.Nimm die Länge jeder Teilung und finde das Maximum (
maximum.map length
).Eine Variante mit ebenfalls 87 Bytes:
Das funktioniert im Prinzip genauso, aber anstatt den gesamten Split in einer Liste zu behalten, behält es nur ein Paar
(r,x)
der Länge des Split undr
die erste Zahl im Split beix
.quelle
Python 3 ,
302282271 Bytes-10 Bytes dank dem Tipp von @ElPedro.
Übernimmt die Eingabe als Zeichenfolge. Grundsätzlich werden immer größere Abschnitte der Zahl von links benötigt, und es wird geprüft, ob für diesen Abschnitt der Zahl eine Sequenz unter Verwendung aller Zahlen gebildet werden kann.
Probieren Sie es online!
quelle
range
3-mal verwenden, können SieR=range
außerhalb beider Funktionen definieren und dannR(whatever)
anstelle vonrange(whatever)
4 Bytes speichern.Japt , 27 Bytes
Probieren Sie es online! oder Überprüfen Sie die meisten Testfälle
Dies schneidet nicht gut ab, verwendet jedoch eine einzigartige Methode und es gibt möglicherweise viel mehr Platz zum Golfen. Es funktioniert auch so gut, dass alle Testfälle außer
201200199198
Timeout vermieden werden.Erläuterung:
quelle
21201
weil sie nicht erzwingen, dass das Sequenzende korrekt ausgerichtet wird (in meiner ursprünglichen Version endet die Zeile mit einem Komma). Dies oder diese Alternative funktioniert.210
weil nach 0 kein Begrenzer angegeben ist. Hier ist ein festes 28-Byte, das funktioniert.Haskell, 65 Bytes
Die Eingabe ist eine Zeichenfolge.
Probieren Sie es online!
Ganz anders als meine andere Antwort . Eine einfache Brute Force, die alle Listen mit aufeinanderfolgenden absteigenden Zahlen ausprobiert, bis eine gefunden wird, die der Eingabeliste entspricht.
Wenn wir die Eingabenummer auf 64-Bit-Ganzzahlen beschränken, können wir durch
y
Durchlaufen 6 Bytes sparen[1..19]
, da die größte 64-Bit-Ganzzahl 19 Stellen hat und keine Listen mit mehr Elementen getestet werden müssen.Haskell, 59 Bytes
Probieren Sie es online!
quelle
Python 2 , 95 Bytes
Eine weitere langsame Brute-Force-Lösung.
Probieren Sie es online!
quelle
Dyalog APL, 138 Bytes
Ein bisschen bissig, aber es funktioniert auch bei großen Zahlen schnell. Wenn Sie es online versuchen, stellen Sie dem DFN das Präfix voran
⎕←
und geben Sie rechts eine Liste mit Ziffern ein.Erläuterung
Zuerst die innere dfn auf der rechten Seite, die rekursiv eine Liste möglicher Wege aufbaut, um
⊂
die Liste der Ziffern (mit ) zu partitionieren . Gibt beispielsweise1 0 1 0 ⊂ 2 0 1 9
den verschachtelten Vektor zurück(2 0)(1 9)
.Wir verwenden
1,
, um eine Spalte von 1s am Anfang und am Ende mit einer Matrix von gültigen Partitionen für ⍵ hinzuzufügen.Nun trainiert die Funktion links in Parens. Aufgrund
⍨
des linken Arguments ist der Zug die Zeile der Partitionsmatrix und das rechte Argument ist die Benutzereingabe. Der Zug ist ein Stapel Gabeln mit einer Spitze als äußerster linker Zinken.Wenn die Partition eine Folge von absteigenden Zahlen erstellt, gibt der Zug die Länge der Folge zurück. Sonst null
⍤1⊢
Wendet den Funktionszug zwischen der Benutzereingabe und jeder Zeile der Partitionsmatrix an und gibt einen Wert für jede Zeile der Matrix zurück.⊢
ist notwendig, um zwischen Operand⍤
und Argument für die abgeleitete Funktion von zu unterscheiden⍤
.⌈/
findet das Maximum.Konnte einen kürzeren Algorithmus finden, aber ich wollte diesen Weg ausprobieren, der der direkteste und aussagekräftigste ist, den ich mir vorstellen kann.
quelle
TSQL, 169 Bytes
Hinweis: Dies kann nur ausgeführt werden, wenn die Eingabe in eine Ganzzahl konvertiert werden kann.
Rekursives SQL, das zum Schleifen verwendet wird.
Golf gespielt:
Ungolfed:
Versuch es
quelle
R 101 Bytes
Probieren Sie es online!
Mehr als 2 Wochen sind vergangen, ohne eine Antwort von R zu bekommen, also habe ich beschlossen, meine eigenen zu posten :)
Der Code ist ziemlich schnell, da er einen "begrenzten" Brute-Force-Ansatz verwendet
Abgerollter Code und Erklärung:
quelle