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.
[4, 5, 6, 7, 9, 11, 13, 15]
nicht sein 4to6 7to15by2
?)