Desafío
Dada una secuencia de números, cree una función que devuelva los pasos de la secuencia.
- Suponga que una secuencia será
N >= 3
- La secuencia repetirá los pasos al menos una vez
- La secuencia solo contendrá números naturales
- Su función o programa debe devolver la secuencia de pasos más corta posible
Ejemplo:
Entrada: [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17]
Salida: [1, 1, 2]
Explicación: La secuencia inicial va de 1 => 2 (1 step), 2 => 3 (1 step), 3 => 5 (2 steps)
. Entonces se repite. La salida entonces es[1 step, 1 step, 2 steps] => [1, 1, 2]
Otro ejemplo:
Entrada: [2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
Salida: [3, 1, 1, 1]
[2, 5, 6, 7, 8, 11, 12, 13, 14, 17, 18, 19, 20]
\ /\ /\ /\ /
3 1 1 1 Then it repeats...
Casos de prueba
Input: [1, 4, 8, 9, 10, 13, 17, 18, 19, 22, 26, 27, 28] => Output: [3,4,1,1]
Input: [6, 11, 13, 18, 20, 25, 27, 32, 34, 39, 41] => Output: [5,2]
Input: [2, 6, 10, 13, 17, 21, 25, 28, 32, 36, 40, 43, 47] => Output: [4,4,3,4]
Input: [5, 6, 7] => Output: [1]
Aclaraciones
- La longitud de entrada - 1 es divisible por la longitud de salida
- Suponga que la secuencia siempre va a estar aumentando
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
fuente
Respuestas:
Jalea ,
97 bytesPruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6), 58 bytes
Emite una cadena separada por comas (con una coma inicial).
Pruébalo en línea!
O 56 bytes si usamos
,-
como separador y asumimos que la secuencia es siempre aumentando estrictamente .¿Cómo?
Primero convertimos la matriz de entrada a [] en una lista de diferencias consecutivas con:
Debido a que p se establece inicialmente en un valor no numérico (la función de devolución de llamada de map () ), la primera iteración produce NaN .
Ejemplo:
Luego coaccionamos el resultado a una cadena:
Finalmente, buscamos el patrón 1 más corto de enteros separados por comas (
,\d+
) que comienzan justo después de "NaN" y se repiten hasta el final de la cadena:1: usando el no codicioso
*?
fuente
/(,.+?)\1*$/
.Brachylog , 11 bytes
Pruébalo en línea!
Sería de 5 bytes si hubiera una función integrada para diferencias consecutivas.
Explicación
fuente
Pyth, 11 bytes
Pruébalo aquí
Explicación
fuente
Japt ,
1412 bytesIntentalo
Explicación
Original
Intentalo
fuente
R ,
4946 bytesPrograma completo:
Pruébalo en línea!
R ,
725854 bytesPresentación de la función original con todos los casos de prueba en un solo lugar:
Pruébalo en línea!
Gracias a JayCe por sugerir la ruta completa del programa y -4 bytes en la función, y a Giuseppe por más -3.
fuente
a<-
aquíJ ,
2219 bytes¡3 bytes guardados gracias a FrownyFrog!
Pruébalo en línea!
[¡Pruébalo en línea!] [TIO-ji2uiwla]
¿Cómo?
fuente
/:
lugar de#\
, puede0{"1[:~.
guardar 1 byte."0 1
es"{
05AB1E , 8 bytes
Guardado 3 bytes gracias a Kevin Cruijssen .
Pruébalo en línea!
05AB1E , 11 bytes
Pruébalo en línea!
13 bytes
Una linda alternativa, OMI:
Pruébalo en línea!
fuente
.œ
.Javascript, 49
56bytesEditar 7 bytes guardados gracias (¿adivina quién?) Arnauld
La misma idea regex que Arnauld, pero curiosamente tan diferente en la implementación ...
Devolver una cadena con pasos separados por comas (y una coma inicial)
Prueba
fuente
match
fue una mala decisión mía. Puedes superarme en golf un poco más . :-)MATL ,
141312 bytesPruébalo en línea!
¡Acabo de descubrir que MATL tiene una función circulante!
Explicación
d
- Obtenga las diferencias entre términos sucesivos, como una matrizt5YL
- duplica eso, luego llama a la funciónYL
('galería') con5
la opción ('circulante'). Crea una matriz con el vector dado como primera fila, luego las filas sucesivas son el mismo vector desplazado circularmente, hasta que se envuelve.FTF#Xu
- Busque filas únicas y obtenga sus números de fila (no estoy seguro si hay una forma más corta de hacerlo). Cuando se repiten los pasos de la secuencia, la fila desplazada circularmente será la misma que la primera fila, y las filas posteriores se repetirán. Entonces esto obtiene los índices de la primera ejecución de los pasos de la secuencia antes de que comiencen a repetirse.)
- indexe eso en la matriz de diferencias original, para obtener la respuesta.Mayor:
Pruébalo en línea!
(-1 byte gracias a Giuseppe)
Explicación:
fuente
Python 2 , 101 bytes
Pruébalo en línea!
Primero genera los deltas d , luego encuentra el primer prefijo p de d que cuando se repite ⌊len (L) / len (p) ⌋ veces produce L , donde L es la lista de entrada.
fuente
Ruby , 62 bytes
Se basa en la lógica Regex adaptada de la respuesta de Arnauld .
Pruébalo en línea!
Determinación alternativa de diferencias de pasos, también 62 bytes:
Pruébalo en línea!
fuente
Java 10,
104100 bytesExpresiones regulares
( ?.+?)\1*$
para repetir más corto subcadena de @Neil 's comentario sobre @Arnauld ' JavaScript respuesta s (ES6) .Pruébalo en línea.
Explicación:
fuente
APL + WIN, 39 bytes
Solicitud de entrada.
Pruébalo en línea! Cortesía de Dyalog Classic.
Explicación:
fuente
Python 2 ,
8685 bytesPruébalo en línea!
Construya las diferencias como
d
; si sed
repite con el tamaño de la unidadn
entoncesd[n:]==d[:-n]
; De lo contrario, recurse.fuente
Retina 0.8.2 , 42 bytes
Pruébalo en línea! El enlace incluye casos de prueba. La salida incluye comas iniciales. Explicación:
Convierte a unario.
Calcule las diferencias hacia adelante, excepto el primer número, que se queda atrás.
Empareja las diferencias repetitivas.
Convierte a decimal.
fuente
05AB1E ,
1413 bytesPruébelo en línea o verifique todos los casos de prueba .
Sé que ya hay dos respuestas 05AB1E más cortas publicadas por @ Mr.Xcoder , pero quería probar este enfoque alternativo utilizando la rotación y la verificación de igualdad.
Podría ser capaz de jugarlo unos pocos bytes sin caer
Á
.-1 byte después de una sugerencia de @Emigna para eliminar los registros global_variable (
©
y 2x®
) y utilizar un Duplicate (D
) y un Triplicate (Ð
) en su lugar.Explicación:
fuente
Haskell, 107 bytes
x es la matriz de entrada.
fuente
f x=
. Además, el uso deinits
requiereimport Data.List
, ya que no es parte de Prelude: ¡ Pruébelo en línea!(init x)
puede serx
porque sezip
trunca automáticamente si una de las listas es más larga que la otra. Y paramap(uncurry(-))$zip
existe una acumulación en:zipWith(-)
. En lugar def x=let i=...in
que se utilice un protector patrón:f x|i<-...=
.filter
, en!!0
lugar dehead
y encycle
lugar deconcat$repeat
: ¡ Pruébelo en línea!Stax ,
86 bytesEjecutar y depurarlo
Aquí hay una versión anotada desempaquetada para mostrar cómo funciona.
Ejecute este
fuente
Perl 6 , 57 bytes
Pruébalo
La salida está separada por espacios (
"1 1 2"
)Expandido:
fuente
~(.skip Z-$_)
05AB1E , 9 bytes
Explicación:
Alternativa de 9 bytes:
Lo mismo, pero en lugar de comparar con la lista de deltas (que debe guardarse / restaurarse), esto usa
.¥
(undelta) y luego se compara con la entrada (implícita).Pruébalo en línea!
fuente
K4 , 30 bytes
Solución:
Ejemplos:
Explicación:
Parece considerable para lo que estamos tratando de resolver. Obtenga los deltas de la entrada y luego cree secuencias y determine la más corta que coincida.
fuente
Wolfram Language (Mathematica) , 26 bytes
Pruébalo en línea!
Devuelve un que
Sequence
contiene los pasos.+2 bytes para
List
salida:Pruébalo en línea!
fuente
Perl 5
-p
, 55 bytesPruébalo en línea!
Los números se ingresan como una lista separada por espacios. La salida es el mismo formato.
fuente