Encontre as execuções dentro de uma matriz
Uma execução é definida como três ou mais números que aumentam a partir da anterior com uma etapa constante. Por exemplo [1,2,3] seria uma corrida com a etapa 1, [1,3,5,7] seria uma corrida com a etapa 2 e [1,2,4,5] não é uma corrida.
Podemos expressar essas execuções pela notação "i a j por s", onde i é o primeiro número da execução, j é o último número da execução e s é a etapa. No entanto, as execuções da etapa 1 serão expressas "i a j".
Então, usando as matrizes anteriores, obtemos:
[1,2,3] -> "1 a 3"
[1,3,5,7] -> "1 a 7 por 2"
[1,2,4,5] -> "1 2 4 5"
Nesse desafio, é sua tarefa fazer isso para matrizes que podem ter várias execuções.
Exemplo de código Python com recursão:
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)
Entrada
Matriz de entradas positivas classificadas (sem duplicatas)
Resultado
Cadeia de execuções separada por um espaço ou uma matriz de cadeias de execuções
Não precisa ser ganancioso em uma direção específica
Pode ter espaço em branco à direita
Casos de teste
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"
Este é o código-golfe, pelo que o menor número de bytes vence.
[4, 5, 6, 7, 9, 11, 13, 15]
não ser 4to6 7to15by2
?)