Desafio
O desafio é escrever um código que use um número inteiro positivo 'n' como entrada e exiba todas as maneiras possíveis pelas quais os números de 1 - n podem ser escritos, com sinal positivo ou negativo entre eles, de forma que sua soma seja igual a zero. Lembre-se de que você só pode usar adição ou subtração.
Por exemplo, se a entrada for 3, existem 2 maneiras de fazer a soma 0:
1+2-3=0
-1-2+3=0
Observe que os números estão em ordem, começando de 1 até n (que é 3 neste caso). Como é evidente no exemplo, o sinal do primeiro número também pode ser negativo, portanto, tenha cuidado.
Agora, 3 era praticamente simples. Vamos listar todas as maneiras quando consideramos o número 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
Então aqui temos um total de 8 maneiras possíveis.
Entrada e saída
Como afirmado anteriormente, a entrada seria um número inteiro positivo . Sua saída deve conter todas as formas possíveis pelas quais os números dão uma soma de zero. Caso não exista uma maneira possível de fazer o mesmo, você pode produzir o que quiser.
Além disso, você pode imprimir a saída em qualquer formato que desejar . Mas, deve ser compreensível . Por exemplo, você pode imprimi-lo como no exemplo acima. Ou você pode apenas imprimir os sinais dos números em ordem. Caso contrário, você também pode imprimir '0 e' 1 'em ordem, onde' 0 'exibirá sinal negativo e' 1 'exibirá sinal positivo (ou vice-versa).
Por exemplo, você pode representar 1 + 2-3 = 0 usando:
1+2-3=0
1+2-3
[1,2,-3]
++-
110
001
No entanto, eu recomendaria o uso de qualquer um dos três primeiros formatos para simplificar. Você pode assumir que todas as entradas são válidas.
Exemplos
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
Pontuação
Isso é código-golfe , então o código mais curto vence!
fonte
+
comoN
e-
como-N
, ou isso está levando isso longe demais? (eg3
->[[-3,-3,3], [3,3,-3]]
)0
e,1
mas usandoN
e-N
(veja minha edição acima)Respostas:
Haskell , 42 bytes
Experimente online!
fonte
0==
?Geléia , 9 bytes
Experimente online!
Exp
Geléia , 9 bytes
A sugestão de Jonathan Allan apresenta uma lista de sinais.
Experimente online!
fonte
,Nṗæ.ÐḟR
?n
.N
e-N
saída sugeri foi permitido, de modo que economiza um byte :) (apenas preciso mencionar o formato da resposta)Python 2 , 62 bytes
Experimente online!
O Sr. Xcoder economizou 4 bytes com um uso bacana de argumentos estrelados.
fonte
*l
vez del=[]
Perl,
3736 bytesfonte
-n
e<<<
se substituir$_
porpop
. Na verdade, não melhorar a sua pontuação, mas faz a expressão geral mais curto;)05AB1E , 11 bytes
Experimente online!
O formato de saída para, por exemplo, entrada
3
é:Isto é
-1-2+3, 1+2-3
.fonte
Wolfram Language (Mathematica) , 36 bytes
Experimente online!
fonte
Casca , 10 bytes
Experimente online!
Explicação
Não é muito complicado.
fonte
Python 3 , 105 bytes
Experimente online!
fonte
Rápido , 116 bytes
Experimente online!
Explicação
fonte
Python 2 , 91 bytes
Experimente online!
Retorna uma lista de listas satisfatórias (por exemplo, f (3) = [[- 1, -2,3], [1,2, -3]])
fonte
APL (Dyalog) , 38 bytes
Experimente online!
fonte
Pitão , 13 bytes
Experimente aqui!
fonte
C (gcc) , 171 bytes
Experimente online! Usa
0
para2
sinais negativos e positivos.fonte
Limpo , 79 bytes
Experimente online!
fonte
Python 3 + numpy,
104103 bytesA saída é [-1, 1] correspondente ao sinal.
fonte
if
para -1 byteJavaScript (ES6),
6961 bytesEconomizou 8 bytes ao se livrar de k , como sugerido por @Neil
Imprime todas as soluções com alerta () .
Casos de teste
Usando console.log () em vez de alert () para facilidade de uso.
Mostrar snippet de código
fonte
k
? Algo parecido com isto: #f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Retina , 73 bytes
Experimente online! Explicação:
Converta a entrada para unário.
Converta o número em uma lista de
=
números prefixados.Substitua cada um
=
por um-
e ambos+
, duplicando o número de linhas a cada vez.Conte separadamente o número de
_
s após-
s e+
s. Isso soma os números negativos e positivos.Mantenha apenas as linhas em que os
-
es e os+
cancelam.Exclua as contagens.
Converta para decimal.
fonte
Perl 6 , 43 bytes
Tente
Retorna uma sequência de listas
Expandido:
1..$_ X* 1,-1
⇒(1, -1, 2, -2)
(…).rotor(2)
⇒((1, -1), (2, -2))
[X] …
⇒((1, 2), (1, -2), (-1, 2), (-1, -2))
fonte
J ,
3530 bytes-5 bytes graças ao FrownyFrog!
Experimente online!
Original:
J , 35 bytes
Como funciona
Multiplico a lista 1..n por todas as listas possíveis de coeficientes 1 / -1 e encontro as que somam zero.
Experimente online!
Como alternativa, tentei um verbo explícito, usando a abordagem do produto cartesiano de +/-:
J , 37 bytes
{(<"1@,.-)
encontra os produtos cartesianos, por exemplo:Pena que ele caixas o resultado, então eu gastei alguns bytes para desmarcar os valores
Experimente online!
fonte