Une séquence d'entiers est une séquence unique si la différence entre deux nombres consécutifs dans cette séquence est -1 ou 1 et son premier élément est 0.
Plus précisément: a1, a2, ..., an est une séquence unique si:
For any k (1 ≤ k < n): |a[k] - a[k+1]|=1,
a[1]=0
Contribution
n
- nombre d'éléments dans la séquences
- somme des éléments de la séquence
Production
- un ensemble / liste / tableau / etc d'une séquence de longueur
n
avec une somme d'élémentss
, si possible - un ensemble / liste / tableau / etc vide si pas possible
Exemples
Pour l'entrée 8 4
, la sortie pourrait être [0 1 2 1 0 -1 0 1]
ou [0 -1 0 1 0 1 2 1]
. Il peut y avoir d'autres possibilités.
Pour l'entrée 3 5
, la sortie est vide []
, car elle ne peut pas être effectuée.
Règles
Il s'agit d'un code de golf, la réponse la plus courte en octets gagne. Les soumissions doivent être un programme ou une fonction. L'entrée / sortie peut être donnée de n'importe quelle manière standard .
(l-1)*l/2
et-(l-1)*l/2
qui ont la même parité que(l-1)*l/2
.Réponses:
CJam,
56 47 4434 octetsBeaucoup de possibilités d'amélioration ici, mais voici la première tentative:
Remerciements à Dennis pour une manière efficace de faire la
{ ... }%
partie.Imprime la représentation du tableau si possible, sinon
""
Essayez-le en ligne ici
la source
{}%
partie de votre code ne ressemble en rien au mien (qui est juste le code de @ PeterTaylor, remplaçant les points par des traits de soulignement). Si j'ai contribué à votre code, c'est l'{}=
opérateur ..._{_W=)+}%\{_W=(+}%+
qui faisait d'abord deux copies, ajoutez 1 à la première, en soustrayant 1 des autres. Votre exemple m'a fait comprendre comment faire cela en un seul{ ... }%
bloc. En ce qui concerne le{ ... }=
, je l'avais déjà réduit autant dans mon expérimentation, mais pas encore posté.3 5
la sortie devrait être[]
et non""
[]p
dans CJam sort juste vers""
. C'est donc la façon dont le langage représente les tableaux vides.JavaScript (E6) 79
82Pas besoin de force brute ou d'énumération de tous les tuples.
Voir une séquence de longueur n comme n -1 étapes, chaque étape étant incrémentée ou décrémentée.
Notez que vous ne pouvez échanger qu'un incrément contre un décrément, la somme varie de 2, donc pour une longueur donnée, la somme est toujours paire ou toujours impaire.
Ayant tous les incréments, la séquence est 0, 1, 2, 3, ..., n-1 et nous savons que la somme est (n-1) * n / 2
En changeant la dernière étape, la somme change de 2, donc le la dernière étape pèse 2.
En changeant l'avant-dernière étape, la somme change par 4, donc la dernière étape pèse 4. C'est parce que l'étape successive s'appuie sur la somme partielle jusqu'à présent.
En changeant l'étape précédente, la somme change par 6, donc la dernière étape pèse 6 (pas 8, ce ne sont pas des nombres binaires).
...
Modification du premier pas pèse (n-1) * 2
Algorithme
Code non golfé
Tester dans la console Firefox / FireBug
Production
la source
GolfScript (
4139 octets)Démo en ligne
Merci à Dennis pour 41-> 39.
la source
,0=
à?
. Un port simple vers CJam serait 5 octets plus court:L1,al~:S;({{_W=(+_)))+}%}*{:+S=}=p
{ ... }%
bloc. Dans mon code, j'en avais deux, j'essayais de le réduire à 1. Comme pour le vrai algorithme, je pense que Peter et moi avons publié le même algorithme presque en même temps.Mathematica, 73 octets
Solution simple de force brute.
Je génère tous les choix d'étapes. Ensuite, je les transforme en listes accumulées pour obtenir les séquences uniques. Et puis je cherche le premier dont la somme est égale au deuxième paramètre. S'il n'y a pas, la valeur par défaut est
{}
.la source
Haskell, 56 octets
Explication:
1,-1
et la longueur n-1:replicateM n-1[-1,1]
Exemple:
replicateM 2 [-1,1]
==[[-1,-1],[-1,1],[1,-1],[1,1]]
scanl
a de mauvaises performances, mais il fait le bon travail ici.n
où la somme ests
la source
Control.Monad
juste pour utiliserreplicateM
ce qui est déjà trop long. quelle autre fonction monadique pouvez-vous utiliser pour simulerreplicateM
?head$
à votre solution.head
ne revient pas[]
pour[] :: [[a]]
- et je déteste les erreurs.mapM(\x->[1,-1])[2..n]
place desequence
etreplicate
.Python, 138
la source
CJam,
655854 octetsÀ peine plus courte que ma solution Mathematica, mais c'est surtout ma faute si je n'utilise toujours pas CJam correctement:
C'est littéralement le même algorithme: obtenir tous les
n-1
-tuples de{1, -1}
. Trouvez le premier dont l'accumulation est la même ques
, ajoutez a0
. Imprime un tableau vide s'il n'en trouve aucun.la source
CJam, 40
Une autre approche dans CJam.
la source
Rubis (136)
la source
J, 47 caractères
Vérifie chaque séquence comme beaucoup d'autres réponses. Va essayer de faire une solution O (n) plus courte.
la source
APL 38
Exemple:
Celui-ci, comme beaucoup d'autres, force simplement toutes les combinaisons à en trouver une qui correspond, si elle n'est pas trouvée, ne renvoie rien. En fait, il essaie plusieurs fois plusieurs combinaisons pour raccourcir le code.
la source