Nous définissons un tableau binaire comme un tableau satisfaisant les propriétés suivantes:
- c'est non vide
- la première valeur est un
1
- la dernière valeur est un
1
- toutes les autres valeurs sont soit
0
ou1
Par exemple, le tableau [ 1, 1, 0, 1 ]
est un tableau de binaires valide .
La tâche
Étant donné un tableau non vide A d'entiers non négatifs et un entier positif N , votre travail consiste à trouver un tableau binaire B de longueur N qui permet de générer A en sommant un nombre illimité de copies de B , décalé d'un nombre illimité de postes.
Exemple
A = [ 1, 1, 2, 4, 1, 2, 2, 1, 0, 1, 0, 1, 1, 0, 1 ]
N = 4
Pour cette entrée, le binarray B = [ 1, 1, 0, 1 ]
serait une réponse valide car nous pouvons faire:
[ 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 ]
Règles
- L'entrée peut être prise dans n'importe quel format raisonnable.
- La sortie peut être un tableau natif (par exemple
[1, 1, 0, 1]
) ou une chaîne binaire avec ou sans séparateur (par exemple"1,1,0,1"
ou"1101"
) - Vous n'êtes tenu d'imprimer ou de retourner qu'un seul binarray valide . Vous pouvez également choisir d'imprimer ou de retourner tous lorsqu'il existe plusieurs solutions.
- Vous n'êtes pas tenu de prendre en charge les entrées qui ne conduisent à aucune solution.
- La somme peut inclure des zéros implicites qui ne se chevauchent pas avec une copie de B . Le deuxième zéro de la somme ci-dessus est un tel zéro implicite.
- Vous pouvez supposer que la taille maximale de A est 100 et la taille maximale de B est 30.
- Il s'agit de code-golf, donc la réponse la plus courte en octets l'emporte. Les failles standard sont interdites.
Cas de test
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 ]
N
cela qui devrait raisonnablement être prise en charge?N=4, A = [ 1, 1, 2, 4, 1, 2, 2, 2, 1, 2, 2, 1, 2, 0, 1 ]
, vous obtenez 30459 qui est divisible par 11 et 13 mais un seul[ 1, 1, 0, 1 ]
et[ 1, 0, 1, 1 ]
est une réponse valide.Réponses:
PHP,
105 92 9086 octetsSolution de Jörg fixe et golfée:
prend à
N
partir du premier argument de ligne de commande, les valeurs après cela; exécutez-le-r
ou testez-le en ligne .imprime le nombre binaire (format
10001
); imprime une solution non valide ou s'exécute s'il n'y a pas de solution valide.première version (maintenant 97 octets) qui n'imprime rien pour une entrée invalide: testez-la en ligne
panne
la source
111
où le seul résultat correct est [1, 0, 1].PHP , 219 octets
Essayez-le en ligne!
-4 octets en utilisant
[$g,$z]=$_GET
PHP 7.1 au lieu delist($g,$z)=$_GET
la source
[1,0,1,0,1,0,1,0,1]
réponse valide ( ) et non valide ([1,0,0,0,1,0,1,1,1]
) pour le dernier cas de test.while($_GET[0])$s+=2**$i++*array_pop($_GET[0]);
. -5 octets: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 octets
Essayez-le en ligne!
Comment ça marche
Considérons A et B comme les chiffres des nombres k de base u et v . Par exemple (nous utiliserons k = 1000 pour illustration):
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
Comme beaucoup d'autres répondants l'ont remarqué, si B est une réponse valide, alors u est divisible par v . Dans ce cas,
u = 1 002 001 002 ⋅ v
Ce quotient, traduit de nouveau dans le tableau [1, 2, 1, 2], nous dit exactement combien de copies de B nous avons besoin de déplacer à chaque position.
(Pourquoi? Parce que c'est exactement la durée de la multiplication en base k .)
Ce que les autres répondeurs n'ont pas remarqué, c'est que la condition ci-dessus n'est pas suffisante . Par exemple:
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
Mathématiquement parlant, nous pouvons toujours traduire ce quotient dans le tableau [1, 1, −1, 2], ce qui fonctionne bien si nous sommes autorisés à utiliser des copies négatives de B:
mais bien sûr, le défi ne permet pas de copies négatives. Nous avons donc besoin d'un contrôle supplémentaire.
À cette fin, on choisit une base k = 10 e où k > 10 ⋅ somme (A), et de vérifier qu'aucune de la base k chiffres débordement dans la base suivante k chiffres lorsque l' on multiplie le quotient par dix. C'est, chaque e e dix chiffres de base, à partir de la fin, dans la représentation de dix base du temps de quotient dix, doit être 0. Cela garantit que le quotient reconvertit un tableau avec des éléments non négatifs.
la source
PHP, 213 octets
De la même façon, un peu de golf
Essayez-le en ligne!
PHP, 344 octets pour la première fois
Après ma première réponse, j'ai décidé de faire un essai plus long qui rendra toutes les solutions valides.
Version en ligne
Panne
la source
=
dans la première boucle pour la version courte Dans la version supérieure, il doit supprimer quatre octetsPython, 205 octets
Renvoie une chaîne binaire sans séparateur. Comme le souligne @AndersKaseorg, il existe des entrées pour lesquelles la solution de @ fəˈnɛtɪk ne fonctionne pas car la division représente un coefficient négatif qui n'est pas autorisé. Pour contourner cela, j'utilise une très grande base et teste qu'il n'y a pas d'emprunt dans la division.
la source
f([1, 1, 1, 0, 0, 0, 1, 1, 1], 3)
renvoie incorrectement101
.f([1, 0, 2, 0, 2, 0, 1], 3)
, et les variantes avant et arrière échouentf([1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0], 5)
.i
c'est étrange, les variantes avant et arrière échouentf([1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0]*10, 5)
.(x^kn-1)/(x^k-1)
toujours(x^n-1)/(x-1)
comme facteur, ce qui trompe la solution de @ fəˈnɛtɪk dans n'importe quelle base.Pyth, 32 octets
Essayez-le en ligne
Comment ça marche
La stratégie est similaire à ma réponse Python , sauf que puisque Pyth a des fonctions intégrées pour la conversion de base, nous pouvons utiliser une base k = 2 ⋅ somme (A) plus efficace et vérifier directement que chaque chiffre du quotient est au plus somme (A ).
la source
Pari / GP ,
77749680 octetsRenvoie toutes les solutions.
Convertit d'abord le tableau
a
en polynômeb
. Choisit ensuite parmi les diviseursb
les polynômesd
tels que les coefficients ded
sont tous1
et0
, et les coefficients deb / d
sont tous non négatifs, etd(0) = 1
, etdeg(d) = n + 1
. Enfin, les reconvertit en tableaux.Essayez-le en ligne!
la source