Ha estado recolectando datos de un Advanced Collecting Device Controller ™ durante mucho tiempo. Revisas los registros y, para tu horror, descubres que algo ha salido terriblemente mal: ¡los datos solo contienen los últimos bits de los números!
Afortunadamente, sabes el valor inicial y que el valor nunca cambia rápidamente. Eso significa que puede recuperar el resto simplemente encontrando la distancia desde el principio.
Desafío
Escribirás un programa o una función para calcular la cantidad que ha cambiado un valor, dado un módulo N
y una lista de los módulos de valores intermedios N
.
El cambio entre cada par de números siempre es menor queN/2
, por lo que solo habrá una respuesta válida para cada caso de prueba.
Se le dará como entrada un número entero N
> 2 y una lista de valores, en el formato que elija. La entrada puede darse a través de STDIN o la línea de comando o argumentos de función.
Producirá un solo entero, la cantidad que ha cambiado el valor original. La salida puede imprimirse en STDOUT o devolverse.
Reglas
- Su programa debe funcionar para cualquier distancia y módulo menor que
2^20
. - Puede suponer que:
N
es por lo menos3
.- La lista tiene al menos 2 valores.
- Todos los valores en la lista son al menos 0 y menores que
N
. - Todos los cambios en los números son menores que
N/2
.
- Cualquier otra cosa es una entrada no válida, y su programa puede hacer lo que quiera.
- Las lagunas estándar, las bibliotecas no estándar y las funciones integradas para este propósito exacto están prohibidas.
- Este es el código de golf , por lo que gana el programa más corto en bytes.
Ejemplos de casos de prueba
Entrada:
3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Salida:
4
Explicación (con valor de ejemplo):
Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value: 0 1 2 2 3 4 3 2 1 2 3 4 5 4 4
Entrada:
10
5 2 8 9 5
Salida:
-10
Explicación (con valor de ejemplo):
Value mod 10: 5 2 8 9 5
Value: 15 12 8 9 5
Entradas inválidas:
2
0 0 0 0 0
(módulo demasiado pequeño)
6
2 5 4 2
(cambio demasiado grande entre 2 y 5)
:^;[5 2 8 9 5](\
?Respuestas:
TI-BASIC, 15 bytes
Toma la lista de
Ans
y el módulo deInput
.fuente
Python 2, 53 bytes
Súper respuesta directa. Me pregunto si hay un camino más corto.
fuente
.:_2
generar pares hasta que vi tu respuesta, estaba usando zip.Mathematica, 30 bytes
Esta es una función anónima que toma dos argumentos. Ejemplo de uso:
Esto funciona tomando los
Differences
elementos sucesivos, envolviéndolos en el rango-n/2
a+n/2
conMod
y su parámetro de compensación, y luego tomando el total conTr
(trazo de matriz, suma de elementos diagonales).¡Tenga en cuenta que incluso sin golfizar solo tiene 43 bytes!
fuente
@
es innecesario cuando ya está llamando a la función entre corchetes. Tener ambos es un error de sintaxis.J, 24 bytes
Uso:
Intentaré jugar más al golf y agregaré alguna explicación después de eso.
Pruébelo en línea aquí.
fuente
Pyth,
2019 bytesRobó
.:_2
de Jakube, idea de Mauris.fuente
R, 38 bytes
Esto crea una función sin nombre que acepta un entero y un vector como entrada y devuelve un solo entero. Para llamarlo, asígnele un nombre, por ejemplo
f=function(n,v)...
.Ungolfed + explicación:
Ejemplos:
fuente
MatLab, 33 bytes
Mis disculpas, esta es mi primera respuesta en este sitio web. Al escribir esto en MatLab y luego usar la entrada,
ans(modulus_value, [intermediate_values])
se devolverá el valor solicitado, donde 'modulus_value' es el valor del módulo y 'intermedio_valores' es una lista de los valores intermedios separados por espacios o comas.Ejemplo:
La función anónima se aprovecha de Matlab
mod
,diff
ysum
funciones para calcular la respuesta. Primero, se calcula la diferencia entre cada uno de los valores intermedios. El resultado se compensa con el módulo dividido por dos, lo que da como resultado un conjunto de valores de diferencia que está unido por [módulo / módulo 2/2]. El resultado se compensa y suma de nuevo.Creo que esto se puede jugar más, volveré pronto con una actualización. Un agradecimiento especial a @ 2012rcampion por la idea.
Editar: la
unwrap
función de Matlab casi funciona aquí, pero es difícil jugar al golf. El siguiente código devuelve una matriz donde el último valor es la cantidad que ha cambiado el primer valor:@(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)
Los valores intermedios se escalan al rango de [-pi pi], luego se "desenvuelven" de modo que ningún valor consecutivo esté más separado que pi. Estos valores se vuelven a escalar y desplazar, lo que da como resultado una serie de distancias desde el valor inicial.
Interesante, pero no muy práctico para este desafío: D
fuente
Pyth, 29 bytes
Pruébelo en línea: Pyth Compiler / Executor
fuente
CJam, 27 bytes
Pruébalo aquí.
fuente
Pip , 39 bytes
Requiere la lista de datos como argumentos de línea de comandos y el módulo en STDIN. Si eso es demasiado, tengo una versión que toma dos argumentos de línea de comando para 5 bytes más.
Explicación:
Y solo para demostrar que este puntaje no tan competitivo refleja más mis habilidades de golf que mi idioma, aquí hay un puerto de la solución Python de Mauris en 30 bytes :
fuente
Gelatina , no competidora
6 bytes Esta respuesta no es competitiva, ya que el desafío es anterior a la creación de Jelly.
Pruébalo en línea!
Cómo funciona
fuente