Definimos un binarray como una matriz que satisface las siguientes propiedades:
- no está vacío
- el primer valor es un
1
- el último valor es un
1
- todos los demás valores son
0
o1
Por ejemplo, la matriz [ 1, 1, 0, 1 ]
es una matriz binaria válida .
La tarea
Dada una matriz no vacía A de enteros no negativos y un entero positivo N , su trabajo es encontrar una matriz binaria B de longitud N que permita generar A al sumar un número ilimitado de copias de B , desplazado por un número ilimitado de puestos.
Ejemplo
A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
N = 4
Para esta entrada, el binarray B = [ 1, 1, 0, 1 ]
sería una respuesta válida porque podemos hacer:
[ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
+ [ 1, 1, 0, 1 ]
-----------------------------------------------
= [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
Reglas
- La entrada puede tomarse en cualquier formato razonable.
- La salida puede ser una matriz nativa (por ejemplo
[1, 1, 0, 1]
) o una cadena binaria con o sin separador (por ejemplo,"1,1,0,1"
o"1101"
) - Solo debe imprimir o devolver un binarray válido . Alternativamente, usted puede optar por imprimir o devolver todos ellos cuando existen varias soluciones.
- No está obligado a admitir entradas que no conducen a ninguna solución.
- La suma puede incluir ceros implícitos que no se solapan con cualquier copia de B . El segundo cero en la suma anterior es un cero implícito.
- Puede suponer que el tamaño máximo de A es 100 y el tamaño máximo de B es 30.
- Este es el código de golf, por lo que gana la respuesta más corta en bytes. Las lagunas estándar están prohibidas.
Casos de prueba
Input : N = 1 / A = [ 1, 2, 3, 4, 5 ]
Output: [ 1 ]
Input : N = 2 / A = [ 1, 2, 100, 99 ]
Output: [ 1, 1 ]
Input : N = 3 / A = [ 1, 1, 1 ]
Output: [ 1, 1, 1 ]
Input : N = 3 / A = [ 1, 1, 3, 2, 2 ]
Output: [ 1, 1, 1 ]
Input : N = 3 / A = [ 1, 0, 2, 1, 1, 1, 0, 0, 1, 0, 1 ]
Output: [ 1, 0, 1 ]
Input : N = 4 / A = [ 1, 2, 2, 2, 1 ]
Output: [ 1, 1, 1, 1 ]
Input : N = 4 / A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
Output: [ 1, 1, 0, 1 ]
Input : N = 4 / A = [ 1, 1, 0, 2, 1, 0, 1 ]
Output: [ 1, 0, 0, 1 ] or [ 1, 1, 0, 1 ]
Input : N = 5 / A = [ 1, 3, 6, 9, 8, 6, 3, 4 ]
Output: [ 1, 1, 1, 0, 1 ]
Input : N = 8 / A = [ 2, 1, 0, 2, 3, 3, 1, 2, 1 ]
Output: [ 1, 0, 0, 1, 1, 1, 0, 1 ]
Input : N = 10 / A = [ 1, 2, 1, 2, 2, 1, 3, 3, 3, 2, 3, 0, 2, 1, 1, 0, 1 ]
Output: [ 1, 1, 0, 1, 0, 1, 1, 1, 0, 1 ]
Input : N = 13 / A = [ 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ]
Output: [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
Input : N = 5 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 1, 1, 1, 1 ]
Input : N = 6 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 0, 0, 0, 0, 1 ]
Input : N = 7 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 1, 0, 0, 0, 1, 1 ]
Input : N = 9 / A = [ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1 ]
Output: [ 1, 0, 1, 0, 1, 0, 1, 0, 1 ]
code-golf
array-manipulation
polynomials
Arnauld
fuente
fuente
N
eso razonablemente debe ser compatible?N=4, A = [ 1, 1, 2, 4, 1, 2, 2, 2, 1, 2, 2, 1, 2, 0, 1 ]
, obtienes 30459 que es divisible por 11 y 13 pero solo uno de[ 1, 1, 0, 1 ]
y[ 1, 0, 1, 1 ]
es una respuesta válida.Respuestas:
PHP,
105 92 9086 bytesLa solución de Jörg fija y golfizada:
toma
N
del primer argumento de la línea de comando, valores después de eso; ejecutarlo-r
o probarlo en línea .imprime número binario (formato
10001
); imprime una solución no válida o se agota si no hay una solución válida.primera versión (ahora 97 bytes) que no imprime nada para entradas no válidas: pruébelo en línea
Descompostura
fuente
111
donde el único resultado correcto es [1, 0, 1].PHP , 219 bytes
Pruébalo en línea!
-4 Bytes usando
[$g,$z]=$_GET
PHP 7.1 en lugar delist($g,$z)=$_GET
fuente
[1,0,1,0,1,0,1,0,1]
respuesta válida ( ) y una respuesta no válida ([1,0,0,0,1,0,1,1,1]
) para el último caso de prueba.while($_GET[0])$s+=2**$i++*array_pop($_GET[0]);
. -5 Bytes:range(1|.5*$m=2**$_GET[1],$m,2)
.[ 1,0,1,1,1,0,2,2,2,2,2,1 ]
.for($g=$_GET[0];$g;)
.Python, 166 bytes
Pruébalo en línea!
Cómo funciona
Considere A y B como los dígitos de los números base k u y v . Por ejemplo (usaremos k = 1000 como ilustración):
A = [1, 2, 1, 3, 2, 1, 2]
B = [1, 0, 0, 1]
u = 1 002 001 003 002 001 002
v = 1 000 000 001
Como muchos de los otros respondedores notaron, si B es una respuesta válida, entonces u es divisible por v . En este caso,
u = 1 002 001 002 ⋅ v
Este cociente, traducido de nuevo a la matriz [1, 2, 1, 2], nos dice exactamente cuántas copias de B necesitamos desplazar a cada posición.
(¿Por qué? Porque eso es exactamente cuánto tiempo funciona la multiplicación en base k .)
Lo que los otros respondedores no notaron es que la condición anterior no es suficiente . Por ejemplo:
A = [1, 2, 1, 3, 2, 1, 2]
B = [1, 1, 1, 1]
u = 1 002 001 003 002 001 002
v = 1 001 001 001
u = 1 000 999 002 ⋅ v
Hablando matemáticamente, aún podemos traducir ese cociente de nuevo a la matriz [1, 1, −1, 2], que funciona bien si se nos permite usar copias negativas de B:
pero, por supuesto, el desafío no permite copias negativas. Entonces necesitamos un cheque adicional.
Con ese fin, seleccionamos una base k = 10 e donde k > 10 ⋅ suma (A), y verificamos que ninguno de los dígitos k base se desborde en el siguiente dígito k base cuando multiplicamos el cociente por diez. Es decir, cada e º dígitos diez base, comenzando en el extremo, en la representación de diez base de la veces cociente diez, debe ser 0. Esto garantiza que el cociente se traduce de nuevo a una matriz con elementos no negativos.
fuente
PHP, 213 bytes
De la misma manera un poco golfizado
Pruébalo en línea!
PHP, 344 Bytes primero trabajando
Después de mi primera respuesta, he decidido hacer un intento más largo para devolver todas las soluciones válidas.
Versión en línea
Descompostura
fuente
=
en el primer bucle para la versión más corta En la versión más grande necesita eliminar cuatro BytesPython, 205 bytes
Devuelve una cadena binaria sin separador. Como @AndersKaseorg señala, hay entradas para las cuales la solución de @ fəˈnɛtɪk no funciona porque la división representa un coeficiente negativo que no está permitido. Para evitar esto, utilizo una base muy grande y pruebo que no hay préstamos en la división.
fuente
f([1, 1, 1, 0, 0, 0, 1, 1, 1], 3)
devuelve incorrectamente101
.f([1, 0, 2, 0, 2, 0, 1], 3)
y las variantes directa e inversa fallanf([1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0], 5)
.i
es extraño, tanto las variantes hacia adelante como hacia atrás fallanf([1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0]*10, 5)
.(x^kn-1)/(x^k-1)
siempre tiene(x^n-1)/(x-1)
como factor, lo que engaña a la solución de @ fəˈnɛtɪk en cualquier base.Pyth, 32 bytes
Pruébalo en línea
Cómo funciona
La estrategia es similar a mi respuesta de Python , excepto que debido a que Pyth tiene funciones integradas para la conversión de bases, podemos usar una base más eficiente k = 2 ⋅ sum (A), y verificar directamente que cada dígito del cociente sea como máximo sum (A )
fuente
Pari / GP ,
77749680 bytesDevuelve todas las soluciones.
Primero convierte la matriz
a
en un polinomiob
. Luego elige de los divisoresb
los polinomios ded
modo que los coeficientes ded
son todos1
y0
, y los coeficientes deb / d
todos son no negativos, yd(0) = 1
, ydeg(d) = n + 1
. Finalmente, los convierte nuevamente en matrices.Pruébalo en línea!
fuente