Encuentra las carreras dentro de una matriz
Una ejecución se define como tres o más números que se incrementan desde el anterior con un paso constante. Por ejemplo, [1,2,3] sería una ejecución con el paso 1, [1,3,5,7] sería una ejecución con el paso 2 y [1,2,4,5] no es una ejecución.
Podemos expresar estas ejecuciones mediante la notación "i to j by s" donde i es el primer número de la ejecución, j es el último número de la ejecución y s es el paso. Sin embargo, las ejecuciones del paso 1 se expresarán "i a j".
Entonces, usando las matrices anteriores, obtenemos:
[1,2,3] -> "1to3"
[1,3,5,7] -> "1to7by2"
[1,2,4,5] -> "1 2 4 5"
En este desafío, es su tarea hacer esto para las matrices que pueden tener múltiples ejecuciones.
Ejemplo de código Python con recursión:
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 ordenadas (sin duplicados)
Salida
Cadena de las ejecuciones separadas por un espacio, o una matriz de cadenas de las ejecuciones
No necesita ser codicioso en una dirección particular
Puede tener espacios en blanco al final
Casos de prueba
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 es el código de golf, por lo que gana el menor número de bytes.
fuente

[4, 5, 6, 7, 9, 11, 13, 15]no puede ser4to6 7to15by2?)Respuestas:
Gelatina ,
4240 bytes-2 gracias a Kevin Cruijssen (filtre dos
ḟ2, en lugar de reemplazar dos por ceros2,0y)Un programa completo que imprime el resultado.
(Como enlace monádico, se generaría una lista que contiene una mezcla de enteros y caracteres)
Pruébalo en línea!
(Demasiado ineficiente para que el caso de prueba más grande se complete dentro de los 60, así que lo eliminé
[1,2,3,4]).¿Cómo?
fuente
2,0ySƲÞse puede jugar a golfḟ2SƊÞpor -2 bytes.P, en lugar de una sumaSy habría necesitado los ceros.Rápido, 246 bytes
Pruébalo en línea!
fuente
K (ngn / k) , 102 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 129 bytes
Devuelve una matriz de cadenas.
Pruébalo en línea!
¿Cómo?
Paso 1
Primero agregamos a cada número un sufijo que consiste en un encabezado
'-'seguido de la diferencia con el siguiente número, a excepción de la última entrada que no se modifica. Esta nueva matriz se convierte en una cadena.Ejemplo:
Paso 2
Identificamos todas las ejecuciones en la cadena resultante y las reemplazamos con la notación apropiada.
Ejemplo:
Paso 3
Finalmente, dividimos la cadena en los sufijos restantes, incluidas las comas finales.
Ejemplo:
fuente
Rubí ,
125118 bytesPruébalo en línea!
Explicación
Ruby's Enumerable tiene un
chunkmétodo útil que hace precisamente lo que necesitamos aquí: agrupa elementos por ejecuciones consecutivas del mismo valor de retorno del bloque, en nuestro caso, la diferencia entre el actual (x) y el anterior (yvalor ).La advertencia es que dicha estrategia no capturará el primer elemento de la ejecución, por ejemplo, aquí solo se agrupan los dos últimos elementos:
Por lo tanto, al mapear las cadenas formateadas correctamente, cuando encontramos una nueva ejecución potencial (fragmento con> 1 elemento), debemos rastrear si el elemento anterior era único (
i=1) o si ya se utilizó en otra ejecución (i=0). Si hay un elemento único no utilizado, se convierte en el punto de partida de la ejecución y reduce el umbral de tamaño de fragmento de 3 a 2.fuente
R ,
180175 bytesPruébalo en línea!
Conceptualmente, este es un puerto de mi respuesta de Ruby , aunque obviamente es bastante diferente técnicamente.
5 bytes guardados por JayCe.
fuente
rlepero era demasiado vago ... puedes guardar 1 bytesum(1|x)en lugar delength(x): TIOcatpor 175 bytes: TIOR ,
238217 bytesGracias @digEmAll por -19 bytes.
Pruébalo en línea!
fuente
Flugar dencomo ya está inicializado0, lo que debería ahorrar algunos bytes, creo.split,diffyrle. Desafortunadamente, la búsqueda codiciosa de carreras significa mucho juguetear.'by'[D>1]es un buen truco.JavaScript (Node.js) ,
177173 bytesPruébalo en línea!
fuente
Limpio ,
208... 185 bytesPruébalo en línea!
fuente
Jalea , 41 bytes
Pruébalo en línea!
Programa completo
fuente
Python 2 ,
170166 bytesPruébalo en línea!
fuente
Python 2 ,
138136 bytes-2 bytes gracias a Erik the Outgolfer .
Pruébalo en línea!
fuente
gvm (commit 2612106 ) bytecode, 108 bytes
Espera el tamaño de la matriz en una línea, luego los miembros cada uno en una línea.
Hexdump:
Pruebas de funcionamiento:
Ensamblado manualmente de esto:
fuente
05AB1E (heredado) ,
4950 bytesDemasiado tiempo, pero ya me alegro de que esté funcionando. Este desafío es mucho más difícil de lo que parece. Sin duda, se puede jugar más golf.
Σ€g2KO>}¤es un puerto de la respuesta Jelly2,0ySƲÞṪde @JonathanAllan (¡gracias!).Pruébalo en línea. (NOTA: Se agota el tiempo de espera para los grandes casos de prueba).
+1 byte como corrección de errores porque
0siempre se coloca en una posición final al ordenar.Explicación:
fuente
Perl 5 , 154 bytes
Lo mismo con espacios, líneas nuevas, # comentarios y
sub by:Pruébalo en línea!
... para pasar las pruebas de OP.
fuente
Retina 0.8.2 , 77 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Convierte a unario.
Calcular diferencias consecutivas.
Convertir ejecuciones a
to...bysintaxis.Eliminar las diferencias no convertidas y
by1.Convierte a decimal.
fuente