Finde die Läufe in einem Array
Ein Lauf ist definiert als drei oder mehr Zahlen, die mit einem konstanten Schritt vom vorherigen inkrementiert werden. Zum Beispiel wäre [1,2,3] ein Lauf mit Schritt 1, [1,3,5,7] wäre ein Lauf mit Schritt 2 und [1,2,4,5] ist kein Lauf.
Wir können diese Läufe durch die Notation "i bis j durch s" ausdrücken, wobei i die erste Nummer des Laufs ist, j die letzte Nummer des Laufs ist und s der Schritt ist. Läufe von Schritt 1 werden jedoch mit "i bis j" ausgedrückt.
Wenn wir also die Arrays vorher verwenden, erhalten wir:
[1,2,3] -> "1to3"
[1,3,5,7] -> "1bis7by2"
[1,2,4,5] -> 1 2 4 5
In dieser Herausforderung ist es Ihre Aufgabe, dies für Arrays zu tun, die möglicherweise mehrere Läufe haben.
Beispiel Python-Code mit Rekursion:
def arr_comp_rec(a, start_index):
# Early exit and recursion end point
if start_index == len(a)-1:
return str(a[-1])
elif start_index == len(a):
return ''
# Keep track of first delta to compare while searching
first_delta = a[start_index+1] - a[start_index]
last = True
for i in range(start_index, len(a)-1):
delta = a[i+1] - a[i]
if delta != first_delta:
last = False
break
# If it ran through the for loop, we need to make sure it gets the last value
if last: i += 1
if i - start_index > 1:
# There is more than 2 numbers between the indexes
if first_delta == 1:
# We don't need by if step = 1
return "{}to{} ".format(a[start_index], a[i]) + arr_comp_rec(a, i+1)
else:
return "{}to{}by{} ".format(a[start_index], a[i], first_delta) + arr_comp_rec(a, i+1)
else:
# There is only one number we can return
return "{} ".format(a[start_index]) + arr_comp_rec(a, i)
Eingang
Array von sortierten positiven Ints (keine Duplikate)
Ausgabe
Zeichenfolge der durch ein Leerzeichen getrennten Läufe oder ein Zeichenfolgenarray der Läufe
Muss nicht in eine bestimmte Richtung gierig sein
Kann abschließende Leerzeichen enthalten
Testfälle
In: [1000, 1002, 1004, 1006, 1008, 1010]
Out: "1000to1010by2"
In: [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
Out: "1to3 5 8 13 21 34 55 89 144 233"
In: [10, 20, 30, 40, 60]
Out: "10to40by10 60"
In: [5, 6, 8, 11, 15, 16, 17]
Out: "5 6 8 11 15to17"
In: [1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 15, 30, 45, 50, 60, 70, 80, 90, 91, 93]
Out: "1to7 9to15by2 30 45 50to90by10 91 93"
Dies ist Code-Golf, also gewinnt die geringste Anzahl von Bytes.
quelle
[4, 5, 6, 7, 9, 11, 13, 15]
nicht sein4to6 7to15by2
?)Antworten:
Jelly ,
4240 Bytes-2 Dank an Kevin Cruijssen (Zwei herausfiltern
ḟ2
, anstatt Zwei durch Nullen zu ersetzen2,0y
)Ein volles Programm druckt das Ergebnis aus.
(Als monadischer Link wird eine Liste mit einer Mischung aus ganzen Zahlen und Zeichen ausgegeben.)
Probieren Sie es online!
(Zu ineffizient, als dass der größte Testfall innerhalb von 60 Sekunden abgeschlossen werden könnte, deshalb habe ich ihn entfernt
[1,2,3,4]
.)Wie?
quelle
2,0ySƲÞ
kannḟ2SƊÞ
für -2 Bytes golfen werden .P
, anstatt mit einer Summe,S
und hätte die Nullen gebraucht.Schnell, 246 Bytes
Probieren Sie es online!
quelle
K (ngn / k) , 102 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6), 129 Byte
Gibt ein Array von Zeichenfolgen zurück.
Probieren Sie es online!
Wie?
Schritt 1
Wir hängen zuerst an jede Zahl ein Suffix an, das aus einem vorangestellten
'-'
gefolgt von der Differenz zur nächsten Zahl besteht, mit Ausnahme des letzten Eintrags, der unverändert bleibt. Dieses neue Array wird in eine Zeichenfolge umgewandelt.Beispiel:
Schritt 2
Wir identifizieren alle Läufe in der resultierenden Zeichenfolge und ersetzen sie durch die entsprechende Notation.
Beispiel:
Schritt 3
Schließlich teilen wir die Zeichenfolge auf die verbleibenden Suffixe auf, einschließlich der nachgestellten Kommas.
Beispiel:
quelle
Ruby ,
125118 BytesProbieren Sie es online!
Erläuterung
Ruby's Enumerable hat eine nützliche
chunk
Methode, die genau das tut, was wir hier brauchen - sie gruppiert Elemente nach aufeinanderfolgenden Läufen desselben Rückgabewerts aus dem Block, in unserem Fall der Differenz zwischen dem aktuellen (x
) und dem vorherigen (y
) Wert.Der Vorbehalt ist, dass eine solche Strategie nicht das erste Element des Laufs erfasst, z. B. werden hier nur die beiden letzten Elemente zusammengefasst:
Daher müssen wir beim Zuordnen zu den korrekt formatierten Zeichenfolgen nachverfolgen, ob das vorherige Element einzeln (
i=1
) oder bereits in einem anderen Lauf (i=0
) verwendet wurde , wenn wir auf einen neuen potenziellen Lauf stoßen (Block mit> 1 Element ). Wenn ein einzelnes Element nicht verwendet wird, wird es zum Startpunkt des Laufs und senkt den Schwellenwert für die Blockgröße von 3 auf 2.quelle
R ,
180175 BytesProbieren Sie es online!
Konzeptionell ist dies eine Portierung meiner Ruby-Antwort , obwohl technisch natürlich einiges anders.
5 Bytes von JayCe gespeichert.
quelle
rle
war aber zu faul ... Sie 1 Byte speichern kann dabeisum(1|x)
anstelle vonlength(x)
: TIOcat
für 175 Bytes nur 1 haben : TIOR ,
238217 BytesVielen Dank an @digEmAll für -19 Bytes.
Probieren Sie es online!
quelle
F
stattn
wie es schon initialisiert ist0
, was ein paar Bytes einsparen sollte, denke ich.split
,diff
undrle
. Leider ist die gierige Suche nach Läufen mit viel Fummelei verbunden.'by'[D>1]
ist ein guter Trick.JavaScript (Node.js) ,
177173 BytesProbieren Sie es online!
quelle
Sauber ,
208... 185 BytesProbieren Sie es online!
quelle
Gelee , 41 Bytes
Probieren Sie es online!
Volles Programm.
quelle
Python 2 ,
170166 BytesProbieren Sie es online!
quelle
Python 2 ,
138136 Bytes-2 Bytes dank Erik dem Outgolfer .
Probieren Sie es online!
quelle
gvm (commit 2612106 ) Bytecode, 108 Byte
Erwartet die Größe des Arrays in einer Zeile, dann die Mitglieder jeweils in einer Zeile.
Hexdump:
Testläufe:
Manuell zusammengestellt daraus:
quelle
05AB1E (Legacy) ,
49 bis50 ByteViel zu lange, aber ich bin schon froh, dass es funktioniert. Diese Herausforderung ist viel schwieriger als es imo aussieht. Kann ohne Zweifel weiter golfen werden.
Σ€g2KO>}¤
ist eine Portierung2,0ySƲÞṪ
von @JonathanAllans Jelly-Antwort (danke!).Probieren Sie es online aus. (HINWEIS: Zeitüberschreitung für die großen Testfälle.)
+1 Byte als Bugfix, da
0
beim Sortieren immer eine nachgestellte Position angegeben wird.Erläuterung:
quelle
Perl 5 , 154 Bytes
Gleiches gilt für Leerzeichen, Zeilenumbrüche, #Kommentare und
sub by
:Probieren Sie es online!
... um Tests vom OP zu bestehen.
quelle
Retina 0.8.2 , 77 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
In Unary konvertieren.
Berechnen Sie aufeinanderfolgende Differenzen.
Läufe in
to...by
Syntax konvertieren .Entfernen Sie nicht umgesetzte Differenzen und
by1
.In Dezimalzahl konvertieren.
quelle