Dada una secuencia aritmética finita de enteros positivos con algunos términos eliminados del medio, reconstruya toda la secuencia.
La tarea
Considere una secuencia aritmética: una lista de enteros positivos en los que la diferencia entre dos elementos sucesivos es la misma.
2 5 8 11 14 17
Ahora suponga que uno o más enteros se eliminan de la secuencia, sujeto a las siguientes restricciones:
- Los enteros eliminados serán términos consecutivos de la secuencia.
- El primer y el último número entero de la secuencia no se eliminarán.
- Al menos tres enteros permanecerán en la secuencia.
Para la secuencia anterior, las posibles eliminaciones incluyen:
2 5 8 14 17 (removed 11)
2 5 17 (removed 8 11 14)
2 14 17 (removed 5 8 11)
Su tarea: Dada una de estas secuencias parciales, reconstruya la secuencia completa original.
Detalles
Puede suponer que la entrada es válida (tiene una solución) y le falta al menos un término. Todos los números en la secuencia serán enteros positivos (> 0). La secuencia puede tener una diferencia positiva o negativa entre los términos (es decir, puede estar aumentando o disminuyendo). No será una secuencia constante (p 5 5 5
. Ej .).
Su solución puede ser un programa completo o una función . Cualquiera de los métodos de entrada y salida predeterminados son aceptables.
Su entrada y salida puede ser una cadena (con cualquier delimitador razonable), una lista de cadenas o una lista de números. Puede representar los números en cualquier base que sea conveniente para su idioma.
Mencione cualquier método / formato de E / S inusual en su envío, para que otros puedan probar su código más fácilmente.
Casos de prueba
In: 2 5 8 14 17
Out: 2 5 8 11 14 17
In: 2 5 17
Out: 2 5 8 11 14 17
In: 2 14 17
Out: 2 5 8 11 14 17
In: 21 9 6 3
Out: 21 18 15 12 9 6 3
In: 10 9 5
Out: 10 9 8 7 6 5
In: 1 10 91 100
Out: 1 10 19 28 37 46 55 64 73 82 91 100
Este es el código de golf ; gana la respuesta más corta en cada idioma.
2 5 ... 17
Respuestas:
Haskell , 63 bytes
Pruébalo en línea!
Básicamente funciona tratando de construir el resultado desde el frente y, si eso falla, desde la parte posterior. Esto utiliza el hecho de que el primer y el último miembro de la entrada siempre serán correctos, el hecho de que los miembros eliminados deben ser consecutivos y el hecho de que siempre habrá al menos tres elementos en la entrada. Todo lo que tengo que hacer es asumir que el segundo o el penúltimo miembro son precisos y verificar si funciona. Afortunadamente, Haskell tiene una sintaxis realmente hermosa para crear series aritméticas.
EDITAR: ¡gracias a @xnor por señalar un error y proporcionar una solución!
fuente
[1,3,4,5]
da[1,3,5]
.all(`elem`s)c
debería solucionarlo con el mismo número de bytes.05AB1E ,
98 bytesPruébalo en línea!
Explicación
Se guardó 1 byte usando en
gcd of deltas
lugar demin delta
, inspirado por el usuario202729fuente
Brachylog v2, 9 bytes
Pruébalo en línea!
Esta es una presentación de función. Se puede hacer que el intérprete Brachylog evalúe una función como si fuera un programa completo proporcionándola
Z
como un argumento de línea de comando; en este caso, la entrada se especifica en el formato, por ejemplo,[1, 2, 4]
y la salida se devuelve en un formato similar, por ejemploZ = [1, 2, 3, 4]
. (Por supuesto, para el envío de una función, la entrada y la salida no están en ningún formato; son solo listas).En realidad, esto resuelve un problema más difícil que el que solicitó el OP: resuelve la secuencia aritmética más corta de enteros que contienen los valores especificados en el orden especificado, independientemente de si las eliminaciones son consecutivas o no. Debido a que usa la fuerza bruta, puede ser muy lento si se eliminan muchos valores.
Explicación
El programa tiene tres partes principales.
⊆
encuentra una supersecuencia de la entrada (es decir, una secuencia que tiene la entrada como subsecuencia). Cuando hay más de una salida posible de un programa Brachylog, la salida elegida es la primera salida en orden de desempate, y el orden de desempate se determina por el primer comando en el programa que tiene una opinión al respecto; en este caso,⊆
especifica un orden que favorece las salidas cortas sobre las largas. Entonces, la salida que obtendremos será la supersecuencia más corta de la entrada que obedece a las restricciones en el resto del programa..
...∧
se utiliza para generar el valor que ve como entrada (es decir, la supersecuencia en este caso), pero también afirma que una condición específica se mantiene en él. En otras palabras, estamos generando la supersecuencia más corta que obedece a una condición específica (e ignoramos los resultados intermedios utilizados para ver si obedece a la condición).Finalmente, tenemos
s₂ᵇ-ᵐ
=
, es decir, "todos los deltas de la secuencia son iguales", la condición que estamos aplicando a la salida. (El valor de retorno de esto es una lista de deltas, en lugar de la supersecuencia en sí misma, por eso necesitamos.
...∧
para asegurarnos de que salga lo correcto).Brachylog se retiene aquí al no tener ningún componente interno que pueda manejar el cálculo de deltas, aplicando una operación a pares superpuestos de una lista o similares. En cambio, tenemos que decir lo que queremos decir explícitamente:
s₂ᵇ
encuentra todas (ᵇ
) las subcadenas (s
) de longitud 2 (₂
) (ᵇ
se requiere el uso de para mantener un vínculo entre las incógnitas en las subcadenas y en la supersecuencia; el uso más comúnᶠ
rompería esto enlazar). Luego-ᵐ
hace una resta en cada uno de estos pares para producir un delta. Es molesto tener que escribir cinco bytess₂ᵇ-ᵐ
para algo para lo que la mayoría de los lenguajes de golf modernos tienen incorporado, pero esa es la forma en que va el codegolf a veces, supongo.fuente
Python 2,
104978983716760 bytesGracias a Chas Brown por guardar 4 bytes.
Gracias a ovs por guardar 7 bytes.
Ingrese la lista por argumentos.
Pruébalo en línea!
Explicación:
Como los eliminados son consecutivos, es suficiente verificar las diferencias entre dos pares de elementos consecutivos.
fuente
b if b%c else c
con[c,b][b%c>0]
.key=abs
! Parece que por aquí, las personas a menudo omiten laf=
parte a menos que se use una función recursiva; para que pueda guardar 2 bytes de esa manera.a[-1]-a[-2]
cona[2]-a[1]
: la lógica es la misma y obtiene otros 2 bytes.Pyth , 11 bytes
Pruébalo aquí!
¡Gracias a Steven H. por guardar un byte!
Pyth , 12 bytes
Pruébalo aquí!
Cómo funciona
fuente
Q
para que pueda ordenar y tomar el primer elemento en lugar deabs(GCD(Q))
como en%hS.+SQ}hQe
11 bytes. Test suiteJalea , 8 bytes
Pruébalo en línea!
Notas:
Solo funciona en alguna versión antigua de Jelly. ( esta confirmación, por ejemplo) (donde
g
usefractions.gcd
, que tiene el signo de resultado igual que el signo de entrada, en lugar demath.gcd
, que siempre devuelve un valor positivo).El enlace TIO anterior es el enlace Python 3 TIO, el código Python consiste en el código fuente Jelly de la confirmación que mencioné anteriormente, con la excepción de todo (3 archivos) empaquetados en el mismo archivo (para que se ejecute TIO) y
dictionary.py
se ha reducido a Solo algunas líneas. Sin embargo,dictionary.py
no está relacionado con esta respuesta, ya que no utiliza una cadena comprimida. (la“...»
construcción)Explicación:
Primero, debido a que se elimina un segmento continuo y quedan al menos 3 elementos, quedan dos números consecutivos en la lista anterior, y todos los deltas serán múltiplos del paso. Por lo tanto, la lista
gcd
de diferencias (I
, incrementos) será el valor absoluto del paso.Afortunadamente el
gcd
está firmado (ver nota arriba)Entonces el programa hace:
Un rango entero creciente desde el
Ṃ
mínimo hasta elṀ
máximo.Modular, elige cada enésimo elemento.
Combinación de
$
cadena monádica ( )I
(incrementos, diferencias) yg/
(reduccióngcd
sobre elementos de la lista). Si los incrementos son positivos, entoncesgcd
será positivo y la lista de retorno será de izquierda a derecha (en aumento), y viceversa.fuente
gcd
lugar demin
hacernos atar. Lástima que obtengo un mcd con signo, de lo contrario estaría a las 7;)MATL , 13 bytes
Pruébalo en línea!
Explicación:
fuente
JavaScript (ES6),
9290Editar 2 bytes guardados gracias a Arnauld
Fácil, ya que es suficiente para comprobar las diferencias entre los dos primeros y los dos últimos. Pero aún así increíblemente largo.
Menos golf
Prueba
fuente
a-=d=e*e>d*d?d:e
debería funcionar y guardar 2 bytes.Wolfram Language (Mathematica) , 50 bytes
Pruébalo en línea!
fuente
{##}
y,Last@{##}
pero lo mejor que pude obtener con eso fue 51 bytes.Ruby ,
65 62 5554 bytesPruébalo en línea!
-1 byte gracias a Justin Mariner
fuente
h
, dejándolo cona,*,b,c
. Pruébalo en línea!Haskell ,
7369 bytesPruébalo en línea!
fuente
J ,
49, 4746 bytesInspirado en la solución de Emigna.
Cómo funciona:
Pruébalo en línea!
fuente
Casco , 9 bytes
Pruébalo en línea!
¡Muchas gracias a H.PWiz por reducir a la mitad el recuento de bytes, señalando que aplicar
…
en una lista lo rangifica! ...fuente
F⌋
ser reemplazado por▼
?gcd
era para hacer frente a los deltas negativosC # (.NET Core) ,
167 + 13 =180145 + 13 = 158 bytesPruébalo en línea!
+13 para
using System;
Sorprendentemente, este desafío tenía más matices de lo que inicialmente anticipé.
Expresiones de gratitud
-22 bytes guardados debido a algunas simplificaciones claras de @DLosc.
DeGolfed
fuente
Python 2 , 147 bytes
Pruébalo en línea!
fuente
Python 2 , 78 bytes
Pruébalo en línea!
fuente
Jalea , 8 bytes
Pruébalo en línea!
fuente
dc , 64 bytes
Pruébalo en línea!
fuente
Japt , 12 bytes
Intentalo
Explicación
Genere una matriz de enteros (
õ
) desde el último elemento de la matriz de entrada (Ì
) hasta el primero (Ug
). Calcule el paso entre elementos obteniendo los dos pares de elementos de la entrada y reduciéndolos por diferencia absoluta (Uäa
) luego ordenando (ñ
) esa matriz y tomando el primer elemento (g
).fuente