Dados dos enteros positivos p y q , su tarea es devolver la matriz A creada mediante la aplicación del siguiente algoritmo:
- Start con A = [p, q] y d = 2
- Para cada par (x, y) de números contiguos en A cuya suma es divisible por d , inserte (x + y) / d entre x e y .
- Si se encontró al menos un par coincidente, incremente d y continúe con el paso 2. De lo contrario, la parada y el retorno Una .
Ejemplo
A continuación se detalla el proceso para p = 1 y q = 21 .
1 21 | Iteration #1: we start with d = 2 and A = [1, 21]
\/ | 1 + 21 is divisible by 2 -> we insert 11
22/2=11 |
|
1 11 21 | Iteration #2: d = 3, A = [1, 11, 21]
\/ | 1 + 11 is divisible by 3 -> we insert 4
12/3=4 |
|
1 4 11 21 | Iteration #3: d = 4, A = [1, 4, 11, 21]
\/ | 11 + 21 is divisible by 4 -> we insert 8
32/4=8 |
|
1 4 11 8 21 | Iteration #4: d = 5, A = [1, 4, 11, 8, 21]
\/ \/ | 1 + 4 is divisible by 5 -> we insert 1
5/5=1 15/5=3 | 4 + 11 is divisible by 5 -> we insert 3
|
1 1 4 3 11 8 21 | Iteration #5: d = 6, A = [1, 1, 4, 3, 11, 8, 21]
| no sum of two contiguous numbers is divisible by 6
| -> we stop here
De ahí el resultado esperado: [1, 1, 4, 3, 11, 8, 21]
Aclaraciones y reglas.
- La entrada y salida se pueden manejar en cualquier formato razonable. La enteros p y q se garantiza que sea mayor que 0. Si eso ayuda, se puede suponer q ≥ p .
- El segundo paso del algoritmo no debe aplicarse de forma recursiva a elementos que se acaban de insertar en la misma iteración. Por ejemplo, A = [1, 1] y d = 2 debería dar lugar a [1, 1, 1] (no una lista infinita de 1 de).
- Esto es código de golf , por lo que gana la respuesta más corta en bytes.
Casos de prueba
p | q | Output
----+-----+-------------------------------------------------------------------------------
1 | 1 | [1,1,1]
1 | 2 | [1,2]
1 | 3 | [1,1,2,3]
2 | 6 | [2,1,2,1,4,1,2,6]
3 | 13 | [3,1,8,1,3,1,7,1,2,1,5,1,3,2,13]
9 | 9 | [9,6,9,6,9]
60 | 68 | [60,13,1,4,31,2,3,5,2,19,64,7,13,1,2,5,2,27,44,3,4,8,2,1,12,1,5,3,28,2,4,16,1,
| | 2,12,1,2,1,10,1,6,68]
144 | 336 | [144,68,3,4,8,1,12,1,4,2,28,13,128,44,17,92,240,58,108,5,17,1,2,5,3,28,3,1,11,
| | 60,3,6,2,42,2,4,26,192,54,132,7,1,15,1,3,1,18,1,4,2,30,3,1,12,1,9,78,46,336]
Si desea probar su código en un caso de prueba un poco más grande, aquí está el resultado esperado para:
- p = 12096 (2 6 * 3 3 * 7)
- q = 24192 (2 7 * 3 3 * 7)
code-golf
array-manipulation
Arnauld
fuente
fuente
ü
funciona ... esto me permitió mejorar una de mis respuestas anteriores :-)[1,2,3,4] ü = [[1,2],[2,3],[3,4]]
, también si agrega "-d" en los argumentos al ejecutar 05AB1E, produce el resultado de "depuración" que he adjuntado anteriormente. (También se agregó el enlace de depuración anterior). La razón por la que pairwise es ordenado es porque para los comandos que se vectorizan automáticamente, solo aplica el comando pairwise (la ejecuciónü)
en una lista lo muestra bien).-d
... Lo encontré muuuy tarde, después de "depurar" con,q
"imprimir y detener". Fue doloroso.=
porque no aparece y solo imprime el último elemento que se aplicó a la pila.U
puede reemplazarX
conŠ
.Mathematica,
72645958 bytesPruébalo en línea!
Cómo funciona
Tomamos la entrada como una lista
{p,q}
. El paso de iteración se reformula como:(a+b)/d
entre cada dos elementosa
yb
:(x+{##2,}&@@x)
calcula la secuencia dea+b
's, con una+Null
al final. Dividimos pord
eRiffle
inserta cada uno(a+b)/d
entrea
yb
. Incrementod
.Integer
elementos de la lista resultante. (Esto también elimina elNull
introducido por{##2,}
).Esto se repite hasta que el resultado no cambie (lo que solo puede suceder porque eliminamos todos los elementos nuevos, porque ninguno de ellos eran enteros).
-8 bytes gracias a @MartinEnder por usar en
//.
lugar deFixedPoint
(y por tomar la entrada como una lista).-6 más porque en
ListConvolve
realidad no es tan genialfuente
//.
triunfaFixedPoint
, y simplemente tomaría la entrada como un par de enteros en lugar de dos enteros separados:(d=2;#//.x_:>x~Riffle~ListConvolve[{1,1}/d++,x]~Cases~_Integer)&
//.
conFixedPoint
, porque realmente me gustaFixedPoint
.Integer
.Rubí , 80 bytes.
Pruébalo en línea!
Función recursiva que
f
toma la entrada como la matriz[p, q]
.fuente
Haskell,
8581 bytesPruébalo en línea!
La entrada se toma como una lista, p. Ej.
[1,2]
.Editar: -4 bytes gracias a @Laikoni.
fuente
l%d|l==l#d=l|e<-d+1=l#d%e
.Pitón 2 ,
112110108105103 bytes-2 bytes gracias a Jonathan Frech
-5 bytes gracias a Erik the Outgolfer
Pruébalo en línea!
fuente
y+=[...]*(...);y+=b,
equivalente ay+=[...]*(...)+[b]
?Python 2 , 98 bytes
Invocar como
f([p,q])
.Pruébalo en línea!Jonathan Allan ahorró 12 bytes. Gracias ~!
Explicación
f
es una función recursiva:f(A, B, d)
evalúaf(next_A, A, d+1)
, a menos queA == B
, en cuyo caso regreseA
. (Esto es manejado porA*(A==B)or …
: si A ≠ B,A*(A==B)
es la lista vacía, que es falsa-y, por lo que…
se evalúa la parte; si A = B, entoncesA*(A==B)
esA
, que no está vacío y, por lo tanto, es verdadero, y se devuelve).next_A
se calcula como:Esto se explica mejor con un ejemplo. Cuando, por ejemplo,
d = 5
yA = [1, 4, 11, 8, 21]
:fuente
zip
en lugar de la enumeración y usando[A[0]]
como elsum
valor inicial de 's.[A[0]]
porA[:1]
:)A*(A==B)
.Python 2 , 111 bytes
Pruébalo en línea!
-8 gracias a Rod .
-2 gracias a Lynn .
fuente
i
ya[x:x]
es más corto quea.insert
o
: pzip
y ahorra dos bytes !for
ciclo porwhile A[o+1:]:o+=1;s=A[o-1]+A[o];b=s%d<1;A[o:o]=[s/d]*b;m|=b;o+=b
Casco , 22 bytes
Toma una lista de 2 elementos, devuelve una lista de enteros y flotantes. Pruébalo en línea!
Explicación
fuente
Perl 5 , 92 + 1 (
-a
) = 93 bytesPruébalo en línea!
fuente
Retina , 111 bytes
Pruébalo en línea!
Toma la entrada como números separados por espacios. De manera bastante ingenua sigue el algoritmo dado, y la única técnica notable es usar un símbolo de marcador,
a
, para observar cuándo se ha mantenido alguno de los números. Esto se utiliza para trabajar con las capacidades de bucle algo limitadas de Retina, que solo le permiten realizar bucles hasta que un conjunto de etapas no haga un cambio general en la entrada a esas etapas.Explicación:
Esto usará el mismo ejemplo que en la pregunta.
Cambiamos la matriz de entrada de números en una matriz unaria separada por punto y coma, por lo que tendríamos:
Poner
d
en nuestro código al principio, dándonos:Esto es un poco más complicado.
{
inicia un grupo de etapas que se ejecutarán hasta que alcancen un punto fijo. Luego,+
indica que esta etapa en sí misma debe ejecutarse hasta un punto fijo. Esta etapa agrega cada par de números adyacentes pero los inserta sin el punto y coma adicional. Ahora tendríamos:La otra etapa difícil, esta acumula nuestro divisor en el primer grupo de captura, y reemplaza cualquier número en nuestra lista sin punto y coma final con ese número dividido por
d
. También agregamos un encabezadoa
a estos números, para indicar que algo se guardó, junto con el;
para indicar que debería ser parte permanente de la matriz. Ahora tendríamos:Esto elimina números que no eran divisibles por
d
ni en la matriz antes de esta ronda. Esto no hace cambios en nuestro ejemplo.Esto codiciosamente coincide desde el comienzo de la cadena hasta la última letra
a
en la entrada. Esto significa que puede haber como máximo un partido. Si realizamos algún cambio, agregamos uno ad
, de lo contrario, lo dejamos igual para que podamos salir del ciclo.Esto
)
cierra el ciclo iniciado por{
(¡no lo cuestione!) Y de lo contrario, esta etapa simplemente elimina los marcadores que pusimos anteriormente. Como este es el final del ciclo, repetiríamos las etapas anteriores muchas veces, sin embargo, continuaré como si hubiera olvidado el ciclo, ya que hace que el ejemplo sea más continuo.Esta etapa elimina de nuestra salida:
Esta etapa reemplaza los números unarios con números decimales:
La etapa final se deshace de los puntos y comas:
Obviamente, omitir el ciclo nos hace tener un resultado incorrecto aquí, pero con suerte eso no es demasiado confuso.
fuente
JavaScript (ES6),
898782 bytesGracias @Arnauld por -2 bytes y por ayudar a ahorrar 5 bytes más.
Toma la entrada como una matriz:
f([p,q])
.Casos de prueba
fuente
v
(v+=b[++i]
) en lugar de usars
para guardar 1 byte. Puede guardar otro byte con en|r
lugar de&&r
(creo que es seguro, pero no lo verifiqué dos veces).|r
efectivamente pasó todos los casos de prueba.push()
.push
solo una vez en lugar de dos; Después de revisar esa idea, llegué a esto por 86 bytes. Tal vez eso se puede mejorar?push(v,...)
y luego usarlov+=
nuevamente para 84 bytes .Röda , 90 bytes
Pruébalo en línea!
fuente
Java 8, 180 bytes
Explicación:
Pruébalo aquí
fuente
C #, 280 bytes
Primer intento de código de golf, que es todo el programa. Pruébalo
Intento 2, 159 bytes
Quitando el andamiaje, ya que la tarea es proporcionar una función que pueda tomar un par de números (una matriz funciona) y devolver una matriz. Dado que un Func <int [], int []> F se puede utilizar para satisfacer los requisitos, solo defina F :
Prueba el programa completo aquí
Esto podría ser más pequeño si una lista genérica se considera una salida válida (suelte .ToArray () para guardar 10 bytes).
Si la entrada también se puede modificar, pasar una Lista <int> en lugar de una matriz elimina la necesidad de inicializar la salida (sale a 126 bytes).
Dando un paso más allá, en este caso no es necesario que haya un valor de retorno. El uso de una acción en su lugar elimina los 9 bytes utilizados por la declaración de devolución.
fuente
Jalea , 19 bytes
Pruébalo en línea!
fuente