Herausforderung
Erstellen Sie bei einer gegebenen Zahlenfolge eine Funktion, die die Folgenschritte zurückgibt.
- Angenommen, eine Sequenz wäre
N >= 3
- Die Sequenz wird die Schritte mindestens einmal wiederholen
- Die Sequenz enthält nur natürliche Zahlen
- Ihre Funktion oder Ihr Programm sollte die kürzestmögliche Folge von Schritten zurückgeben
Beispiel:
Eingang: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
Ausgabe: [1, 1, 2]
Erläuterung: Die Anfangssequenz geht von aus 1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps)
. Dann wiederholt es sich. Die Ausgabe ist dann[1 step, 1 step, 2 steps] => [1, 1, 2]
Ein anderes Beispiel:
Eingang: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
Ausgabe: [3, 1, 1, 1]
[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
\ /\ /\ /\ /
3 1 1 1 Then it repeats...
Testfälle
Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]
Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]
Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]
Input: [5, 6, 7] => Output: [1]
Klarstellungen
- Die Eingabelänge - 1 ist durch die Ausgabelänge teilbar
- Angenommen, die Reihenfolge wird immer größer
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
quelle
Antworten:
Gelee ,
97 BytesProbieren Sie es online!
Wie es funktioniert
quelle
JavaScript (ES6), 58 Byte
Gibt eine durch Kommas getrennte Zeichenfolge aus (mit einem führenden Komma).
Probieren Sie es online!
Oder 56 Bytes, wenn wir
,-
als Trennzeichen verwenden und davon ausgehen, dass die Reihenfolge immer strikt ansteigt.Wie?
Wir konvertieren zuerst das Eingabearray a [] in eine Liste aufeinanderfolgender Unterschiede mit:
Da p anfänglich auf einen nicht numerischen Wert gesetzt ist (die Rückruffunktion von map () ), ergibt die erste Iteration NaN .
Beispiel:
Wir setzen das Ergebnis dann in eine Zeichenkette um:
Schließlich suchen wir nach dem kürzesten 1- Muster von durch Kommas getrennten ganzen Zahlen (
,\d+
), die direkt nach "NaN" beginnen und sich bis zum Ende der Zeichenfolge wiederholen:1: mit der nicht gierig
*?
quelle
/(,.+?)\1*$/
.Brachylog , 11 Bytes
Probieren Sie es online!
Würden 5 Bytes sein, wenn es für aufeinanderfolgende Unterschiede ein eingebautes gäbe.
Erläuterung
quelle
Pyth, 11 Bytes
Probieren Sie es hier aus
Erläuterung
quelle
Japt ,
1412 BytesVersuch es
Erläuterung
Original
Versuch es
quelle
R ,
4946 BytesVolles Programm:
Probieren Sie es online!
R ,
725854 ByteOriginale Funktionsübermittlung mit allen Testfällen an einem Ort:
Probieren Sie es online!
Vielen Dank an JayCe für den Vorschlag der vollständigen Programmroute und -4 Bytes für die Funktion und an Giuseppe für weitere -3 Bytes.
quelle
a<-
hier auch nichtJ ,
2219 Bytes3 Bytes gespart dank FrownyFrog!
Probieren Sie es online!
[Online ausprobieren!] [TIO-ji2uiwla]
Wie?
quelle
/:
statt#\
, können Sie0{"1[:~.
1 Byte speichern."0 1
ist"{
05AB1E , 8 Bytes
3 Bytes gespart dank Kevin Cruijssen .
Probieren Sie es online!
05AB1E , 11 Bytes
Probieren Sie es online!
13 Bytes
Eine süße Alternative, IMO:
Probieren Sie es online!
quelle
.œ
.Javascript, 49
56BytesEdit 7 Bytes gespeichert danke (raten Sie mal, wer?) Arnauld
Selbe Regex-Idee wie Arnauld, aber seltsamerweise so unterschiedlich in der Umsetzung ...
Rückgabe einer Zeichenfolge mit durch Kommas getrennten Schritten (und einem führenden Komma)
Prüfung
quelle
match
war eine schlechte Entscheidung von mir. Du kannst mich noch ein bisschen übertreiben . :-)MATL ,
141312 BytesProbieren Sie es online!
Gerade entdeckt, dass MATL eine Kreislauffunktion hat!
Erläuterung
d
- Ermitteln Sie die Unterschiede zwischen aufeinanderfolgenden Begriffen als Arrayt5YL
- duplizieren Sie das und rufen Sie dann die FunktionYL
('gallery') mit der5
Option ('circulant') auf. Erstellt eine Matrix mit dem angegebenen Vektor als erste Zeile, dann werden aufeinanderfolgende Zeilen mit demselben Vektor zirkular verschoben, bis sie umbrochen werden.FTF#Xu
- Suchen Sie nach eindeutigen Zeilen und ermitteln Sie deren Zeilennummern (nicht sicher, ob dies auf kürzere Weise möglich ist). Wenn sich die Sequenzschritte wiederholen, ist die kreisförmig verschobene Reihe dieselbe wie die erste Reihe, und die nachfolgenden Reihen werden wiederholt. Damit werden die Indizes der ersten Sequenzschritte abgerufen, bevor sie sich wiederholen.)
- Indizieren Sie dies in das ursprüngliche Differenzen-Array, um die Antwort zu erhalten.Älter:
Probieren Sie es online!
(-1 Byte dank Giuseppe)
Erläuterung:
quelle
Python 2 , 101 Bytes
Probieren Sie es online!
Zuerst erzeugt die Deltas d , findet dann die erste Präfix p von d , daß bei wiederholten ⌊len (L) / Len (p) ⌋ Ausbeuten mal L , wobei L die Eingangsliste ist.
quelle
Rubin , 62 Bytes
Verlässt sich auf die Regex-Logik, die von Arnauld's Antwort übernommen wurde .
Probieren Sie es online!
Alternative Ermittlung von Schrittdifferenzen, auch 62 Bytes:
Probieren Sie es online!
quelle
Java 10,
104100 BytesRegex
( ?.+?)\1*$
für die kürzeste wiederholte Teilzeichenfolge aus @Neils Kommentar zur Antwort von @Arnauld auf JavaScript (ES6) .Probieren Sie es online aus.
Erläuterung:
quelle
APL + WIN, 39 Bytes
Eingabeaufforderung.
Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic
Erläuterung:
quelle
Python 2 ,
86-85BytesProbieren Sie es online!
Konstruiere die Unterschiede als
d
; wennd
wiederholt mit Einheitsgrößen
dannd[n:]==d[:-n]
; sonst rekursieren.quelle
Retina 0.8.2 , 42 Bytes
Probieren Sie es online!Link enthält Testfälle. Die Ausgabe enthält das führende Komma. Erläuterung:
In Unary konvertieren.
Berechnen Sie Vorwärtsdifferenzen mit Ausnahme der ersten Zahl, die zurückbleibt.
Übereinstimmende sich wiederholende Unterschiede.
In Dezimalzahl konvertieren.
quelle
05AB1E ,
1413 BytesProbieren Sie es online aus oder überprüfen Sie alle Testfälle .
Ich weiß, dass es bereits zwei kürzere 05AB1E-Antworten von gibt @ Mr.Xcoder gibt , aber ich wollte diesen alternativen Ansatz mithilfe von Rotation und Gleichheitsprüfung ausprobieren.
Könnte in der Lage sein, ein paar Bytes Golf zu spielen, ohne zu fallen
Á
.-1 Byte nach einem Tipp von @Emigna , um die global_variable-Register zu entfernen (
©
und 2x®
) und Duplicate (D
) und Triplicate () zu verwenden.Ð
stattdessen ) zu verwenden.Erläuterung:
quelle
Haskell, 107 Bytes
x ist das Eingabearray.
quelle
f x=
. Auch die Verwendung voninits
erfordertimport Data.List
, da es nicht Teil des Prelude ist: Probieren Sie es online!(init x)
kann nur daran liegen,x
dasszip
automatisch abgeschnitten wird, wenn eine der Listen länger als die andere ist. Und fürmap(uncurry(-))$zip
existiert eine Build-in:zipWith(-)
. Stattf x=let i=...in
Sie können ein Muster Wache benutzenf x|i<-...=
.filter
,!!0
anstelle vonhead
undcycle
anstelle vonconcat$repeat
: Probieren Sie es online aus!Stax ,
86 BytesFühren Sie es aus und debuggen Sie es
Hier ist eine entpackte kommentierte Version, um zu zeigen, wie es funktioniert.
Führen Sie dieses aus
quelle
Perl 6 , 57 Bytes
Probier es aus
Ausgabe ist durch Leerzeichen getrennt (
"1 1 2"
)Erweitert:
quelle
~(.skip Z-$_)
05AB1E , 9 Bytes
Erläuterung:
Alternative 9-Byte:
Das Gleiche gilt, aber anstatt mit der Liste der Deltas (die gespeichert / wiederhergestellt werden müssen) zu vergleichen, wird
.¥
(undelta) verwendet und dann mit der (impliziten) Eingabe verglichen.Probieren Sie es online!
quelle
K4 , 30 Bytes
Lösung:
Beispiele:
Erläuterung:
Scheint heftig für das, was wir zu lösen versuchen. Holen Sie sich die Deltas der Eingabe und erstellen Sie dann Sequenzen und bestimmen Sie die kürzeste, die dazu passt.
quelle
Wolfram Language (Mathematica) , 26 Byte
Probieren Sie es online!
Gibt ein zurück,
Sequence
das die Schritte enthält.+2 Bytes für die
List
Ausgabe:Probieren Sie es online!
quelle
Perl 5
-p
, 55 BytesProbieren Sie es online!
Zahlen werden als durch Leerzeichen getrennte Liste eingegeben. Die Ausgabe erfolgt im selben Format.
quelle