Definimos um binarray como uma matriz que satisfaz as seguintes propriedades:
- não está vazio
- o primeiro valor é um
1
- o último valor é um
1
- todos os outros valores são
0
ou1
Por exemplo, a matriz [ 1, 1, 0, 1 ]
é um binarray válido .
A tarefa
Dada uma matriz não vazia A de números inteiros não negativos e um número inteiro positivo N , sua tarefa é encontrar um binarray B de comprimento N que permita gerar A somando um número irrestrito de cópias de B , deslocadas por um número irrestrito de posições.
Exemplo
A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
N = 4
Para esta entrada, o binarray B = [ 1, 1, 0, 1 ]
seria uma resposta válida porque podemos fazer:
[ 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 ]
Regras
- A entrada pode ser obtida em qualquer formato razoável.
- A saída pode ser uma matriz nativa (por exemplo
[1, 1, 0, 1]
) ou uma string binária com ou sem um separador (por exemplo"1,1,0,1"
ou"1101"
) - Você só precisa imprimir ou devolver um binarray válido . Como alternativa, você pode optar por imprimir ou devolver todos eles quando existirem várias soluções.
- Você não precisa dar suporte a entradas que não levam a nenhuma solução.
- A soma pode incluir zeros implícitos que não se sobreponham com qualquer cópia de B . O segundo zero na soma acima é um zero tão implícito.
- Você pode assumir que o tamanho máximo de A é 100 e o tamanho máximo de B é 30.
- Isso é código-golfe, então a resposta mais curta em bytes vence. As brechas padrão são proibidas.
Casos de teste
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
fonte
fonte
N
disso que deve ser razoavelmente suportado?N=4, A = [ 1, 1, 2, 4, 1, 2, 2, 2, 1, 2, 2, 1, 2, 0, 1 ]
, você tem 30459 que é divisível por ambos 11 e 13 ainda apenas um dos[ 1, 1, 0, 1 ]
e[ 1, 0, 1, 1 ]
é uma resposta válida.Respostas:
PHP,
105 92 9086 bytesA solução da Jörg fixa e golfada:
pega
N
no primeiro argumento da linha de comando, valores depois disso; executar-r
ou testá-lo online .imprime número binário (formato
10001
); imprime uma solução inválida ou fica sem energia se não houver uma solução válida.primeira versão (agora 97 bytes) que não imprime nada para entrada inválida: teste on-line
demolir
fonte
111
onde o único resultado correto é [1, 0, 1].PHP , 219 bytes
Experimente online!
-4 bytes usando
[$g,$z]=$_GET
PHP 7.1 em vez delist($g,$z)=$_GET
fonte
[1,0,1,0,1,0,1,0,1]
uma resposta válida ( ) e inválida ([1,0,0,0,1,0,1,1,1]
) para o último caso de teste.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
Experimente online!
Como funciona
Considere A e B como os dígitos da base k números u e v . Por exemplo (usaremos k = 1000 para ilustração):
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 muitos dos outros respondentes notaram, se B é uma resposta válida, u é divisível por v . Nesse caso,
u = 1 002 001 002 ⋅ v
Esse quociente, traduzido de volta para a matriz [1, 2, 1, 2], nos diz exatamente quantas cópias de B precisamos para cada posição.
(Por quê? Porque é exatamente assim que a multiplicação funciona na base k .)
O que os outros respondentes não perceberam é que a condição acima não é suficiente . Por exemplo:
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
Matematicamente falando, ainda podemos converter esse quociente de volta para a matriz [1, 1, -1, 2], que funciona bem se tivermos permissão para usar cópias negativas de B:
mas é claro que o desafio não permite cópias negativas. Então, precisamos de uma verificação adicional.
Para esse fim, selecionamos uma base k = 10 e onde k > 10 ⋅ soma (A) e verificamos que nenhum dos dígitos base k transborda para o próximo dígito base k quando multiplicamos o quociente por dez. Isto é, cada e th dez dígitos de base, a partir da extremidade, na representação base dez vezes o quociente de dez, deve ser 0. Isto garante que o quociente traduz volta para uma matriz com elementos não negativos.
fonte
PHP, 213 bytes
Da mesma forma um pouco de golfe
Experimente online!
PHP, 344 bytes trabalhando pela primeira vez
Após minha primeira resposta, decidi fazer uma tentativa mais longa que devolvesse todas as soluções válidas.
Versão Online
Demolir
fonte
=
no primeiro loop para a versão mais curta Na versão maior ele precisa eliminar quatro BytesPython, 205 bytes
Retorna uma string binária sem separador. Como o @AndersKaseorg aponta, existem entradas para as quais a solução do @ fəˈnɛtɪk não funciona porque a divisão representa um coeficiente negativo que não é permitido. Para contornar isso, uso uma base muito grande e testo que não há empréstimos na divisão.
fonte
f([1, 1, 1, 0, 0, 0, 1, 1, 1], 3)
retorna incorretamente101
.f([1, 0, 2, 0, 2, 0, 1], 3)
e as variantes direta e reversa falhamf([1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0], 5)
.i
, as variantes de avanço e reversão falhamf([1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0]*10, 5)
.(x^kn-1)/(x^k-1)
sempre tem(x^n-1)/(x-1)
como um fator que engana a solução do @ f @nɛtɪk em qualquer base.Pitão, 32 bytes
Experimente online
Como funciona
A estratégia é semelhante à minha resposta do Python , exceto que, como o Pyth possui embutidos para a conversão de base, podemos usar uma base mais eficiente k = 2 ⋅ soma (A) e verificar diretamente se cada dígito do quociente é no máximo (A )
fonte
Pari / GP ,
77749680 bytesRetorna todas as soluções.
Primeiro converte a matriz
a
em um polinômiob
. Em seguida, escolhe dos divisoresb
os polinômios ded
modo que os coeficientes ded
são todos1
e0
, e os coeficientes deb / d
são todos não-negativos, ed(0) = 1
, edeg(d) = n + 1
. Por fim, converte-os novamente em matrizes.Experimente online!
fonte