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 sumaS
y 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
chunk
mé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 (y
valor ).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
rle
pero era demasiado vago ... puedes guardar 1 bytesum(1|x)
en lugar delength(x)
: TIOcat
por 175 bytes: TIOR ,
238217 bytesGracias @digEmAll por -19 bytes.
Pruébalo en línea!
fuente
F
lugar den
como ya está inicializado0
, lo que debería ahorrar algunos bytes, creo.split
,diff
yrle
. 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
0
siempre 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...by
sintaxis.Eliminar las diferencias no convertidas y
by1
.Convierte a decimal.
fuente