Défi
Le défi consiste à écrire un code qui prend un entier positif 'n' comme entrée et affiche toutes les façons possibles d'écrire les nombres de 1 à n, avec un signe positif ou négatif entre les deux, de sorte que leur somme soit égal à zéro. N'oubliez pas que vous ne pouvez utiliser que l'addition ou la soustraction.
Par exemple, si l'entrée est 3, il y a 2 façons de faire la somme 0:
1+2-3=0
-1-2+3=0
Notez que les nombres sont en ordre, à partir de 1 jusqu'à n (ce qui est 3 dans ce cas). Comme il ressort de l'exemple, le signe du premier nombre peut également être négatif, alors soyez prudent.
Maintenant, 3 était à peu près simple. Énumérons toutes les façons lorsque nous considérons le nombre 7.
1+2-3+4-5-6+7=0
1+2-3-4+5+6-7=0
1-2+3+4-5+6-7=0
1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0
Donc, ici, nous avons un total de 8 façons possibles.
Entrée et sortie
Comme indiqué précédemment, l' entrée serait un entier positif . Votre sortie doit contenir toutes les manières possibles dont les nombres donnent une somme de zéro. Dans le cas où il n'y a aucun moyen de faire la même chose, vous pouvez sortir tout ce que vous voulez.
En outre, vous pouvez imprimer la sortie dans un format que vous souhaitez . Mais cela devrait être compréhensible . Par exemple, vous pouvez l'imprimer comme dans l'exemple ci-dessus. Ou, vous pouvez simplement imprimer les signes des nombres dans l'ordre. Sinon, vous pouvez également imprimer les «0» et les «1» dans l'ordre, où «0» afficherait un signe négatif et «1» afficherait un signe positif (ou vice versa).
Par exemple, vous pouvez représenter 1 + 2-3 = 0 en utilisant:
1+2-3=0
1+2-3
[1,2,-3]
++-
110
001
Cependant, je recommanderais d'utiliser l'un des trois premiers formats pour plus de simplicité. Vous pouvez supposer que toutes les entrées sont valides.
Exemples
7 ->
1+2-3+4-5-6+7=0
1+2-3-4+5+6-7=0
1-2+3+4-5+6-7=0
1-2-3-4-5+6+7=0
-1+2+3+4+5-6-7=0
-1+2-3-4+5-6+7=0
-1-2+3+4-5-6+7=0
-1-2+3-4+5+6-7=0
4 ->
1-2-3+4=0
-1+2+3-4=0
2 -> -
8 ->
1+2+3+4-5-6-7+8=0
1+2+3-4+5-6+7-8=0
1+2-3+4+5+6-7-8=0
1+2-3-4-5-6+7+8=0
1-2+3-4-5+6-7+8=0
1-2-3+4+5-6-7+8=0
1-2-3+4-5+6+7-8=0
-1+2+3-4+5-6-7+8=0
-1+2+3-4-5+6+7-8=0
-1+2-3+4+5-6+7-8=0
-1-2+3+4+5+6-7-8=0
-1-2+3-4-5-6+7+8=0
-1-2-3+4-5+6-7+8=0
-1-2-3-4+5+6+7-8=0
Notation
C'est le code-golf , donc le code le plus court gagne!
la source
+
furN
et à-
mesure-N
, ou est-ce que cela va trop loin? (par exemple3
->[[-3,-3,3], [3,3,-3]]
)0
et1
mais en utilisantN
et-N
(voir ma modification ci-dessus)Réponses:
Haskell , 42 octets
Essayez-le en ligne!
la source
0==
?Gelée , 9 octets
Essayez-le en ligne!
Exp
Gelée , 9 octets
La suggestion de Jonathan Allan a produit une liste de signes.
Essayez-le en ligne!
la source
,Nṗæ.ÐḟR
?n
.N
et-N
sortie je l' ai suggéré a été autorisée, de sorte que enregistre un octet :) (juste besoin de mentionner le format dans la réponse)Python 2 , 62 octets
Essayez-le en ligne!
M. Xcoder a économisé 4 octets avec une utilisation astucieuse des arguments étoilés.
la source
*l
au lieu del=[]
Perl,
3736 octetsla source
-n
et<<<
si vous remplacez$_
parpop
. Cela n'améliore pas réellement votre score, mais cela raccourcit l'expression globale;)05AB1E , 11 octets
Essayez-le en ligne!
Le format de sortie pour, par exemple, l'entrée
3
est:C'est
-1-2+3, 1+2-3
.la source
Wolfram Language (Mathematica) , 36 octets
Essayez-le en ligne!
la source
Husk , 10 octets
Essayez-le en ligne!
Explication
Pas trop compliqué.
la source
Python 3 , 105 octets
Essayez-le en ligne!
la source
Swift , 116 octets
Essayez-le en ligne!
Explication
la source
Python 2 , 91 octets
Essayez-le en ligne!
Renvoie une liste de listes satisfaisantes (par exemple, f (3) = [[- 1, -2,3], [1,2, -3]])
la source
APL (Dyalog) , 38 octets
Essayez-le en ligne!
la source
Pyth , 13 octets
Essayez-le ici!
la source
C (gcc) , 171 octets
Essayez-le en ligne! Utilise
0
pour les2
signes négatifs et positifs.la source
Nettoyer , 79 octets
Essayez-le en ligne!
la source
Python 3 + numpy,
104103 octetsLa sortie est [-1, 1] correspondant au signe.
la source
if
pour -1 octetJavaScript (ES6),
6961 octets8 octets enregistrés en se débarrassant de k , comme suggéré par @Neil
Imprime toutes les solutions avec alert () .
Cas de test
Utilisation de console.log () au lieu de alert () pour plus de convivialité.
Afficher l'extrait de code
la source
k
? Quelque chose comme ça:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Rétine , 73 octets
Essayez-le en ligne! Explication:
Convertissez l'entrée en unaire.
Convertissez le nombre en une liste de
=
nombres préfixés.Remplacez chacun
=
à son tour par les deux-
et+
, en dupliquant le nombre de lignes à chaque fois.Comptez séparément le nombre de
_
s après-
s et+
s. Cela résume les nombres négatifs et positifs.Conservez uniquement les lignes où les
-
s et+
s s'annulent.Supprimez les comptes.
Convertissez en décimal.
la source
Perl 6 , 43 octets
Try it
Renvoie une séquence de listes
Étendu:
1..$_ X* 1,-1
⇒(1, -1, 2, -2)
(…).rotor(2)
⇒((1, -1), (2, -2))
[X] …
⇒((1, 2), (1, -2), (-1, 2), (-1, -2))
la source
J ,
3530 octets-5 octets grâce à FrownyFrog!
Essayez-le en ligne!
Original:
J , 35 octets
Comment ça fonctionne
Je multiplie la liste 1..n avec toutes les listes possibles de coefficients 1 / -1 et je trouve celles qui s'additionnent à zéro.
Essayez-le en ligne!
Comme alternative, j'ai essayé un verbe explicite, en utilisant l'approche du produit cartésien de +/-:
J , 37 octets
{(<"1@,.-)
trouve les produits cartésiens par exemple:Dommage qu'il contienne le résultat, j'ai donc dépensé quelques octets pour déballer les valeurs
Essayez-le en ligne!
la source