Desafío
El desafío es escribir un código que tome un entero positivo 'n' como entrada y muestre todas las formas posibles en que se pueden escribir los números del 1 - n, con signo positivo o negativo en el medio, de modo que su suma sea igual a cero Recuerde que solo puede usar sumas o restas.
Por ejemplo, si la entrada es 3, entonces hay 2 formas de hacer que la suma sea 0:
1+2-3=0
-1-2+3=0
Tenga en cuenta que los números están en orden, comenzando desde 1 hasta n (que es 3 en este caso). Como es evidente en el ejemplo, el signo del primer número también puede ser negativo, así que tenga cuidado.
Ahora, 3 era bastante simple. Hagamos una lista de todas las formas cuando consideramos el 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
Entonces, aquí tenemos un total de 8 formas posibles.
Entrada y salida
Como se indicó anteriormente, la entrada sería un número entero positivo . Su salida debe contener todas las formas posibles en que los números dan una suma de cero. En caso de que no haya una manera posible de hacer lo mismo, puede generar lo que desee.
Además, puede imprimir la salida en cualquier formato que desee . Pero, debería ser comprensible . Por ejemplo, puede imprimirlo como en el ejemplo anterior. O bien, puede imprimir los signos de los números en orden. De lo contrario, también puede imprimir '0' y '1' en orden, donde '0' mostrará un signo negativo y '1' mostrará un signo positivo (o viceversa).
Por ejemplo, puede representar 1 + 2-3 = 0 usando:
1+2-3=0
1+2-3
[1,2,-3]
++-
110
001
Sin embargo, recomendaría usar cualquiera de los primeros tres formatos por simplicidad. Puede asumir que todas las entradas son válidas.
Ejemplos
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
Puntuación
Este es el código de golf , por lo que gana el código más corto.
fuente
+
asN
y-
as-N
, o eso es llevarlo demasiado lejos? (por ejemplo,3
->[[-3,-3,3], [3,3,-3]]
)0
y1
, pero usandoN
y-N
(ver mi edición anterior)Respuestas:
Haskell , 42 bytes
Pruébalo en línea!
fuente
0==
?Jalea , 9 bytes
Pruébalo en línea!
Exp
Jalea , 9 bytes
La sugerencia de Jonathan Allan , muestra una lista de señales.
Pruébalo en línea!
fuente
,Nṗæ.ÐḟR
?n
.N
y la-N
salida que sugerí se han permitido, por lo que ahorra un byte :) (solo necesito mencionar el formato en la respuesta)Python 2 , 62 bytes
Pruébalo en línea!
El Sr. Xcoder ahorró 4 bytes con un ingenioso uso de argumentos destacados.
fuente
*l
lugar del=[]
Perl,
3736 bytesfuente
-n
y<<<
si lo reemplaza$_
conpop
. En realidad, no mejora su puntaje, pero acorta la expresión general;)05AB1E , 11 bytes
Pruébalo en línea!
El formato de salida para, por ejemplo, la entrada
3
es:Es decir,
-1-2+3, 1+2-3
.fuente
Wolfram Language (Mathematica) , 36 bytes
Pruébalo en línea!
fuente
Casco , 10 bytes
Pruébalo en línea!
Explicación
No muy complicado
fuente
Python 3 , 105 bytes
Pruébalo en línea!
fuente
Rápido , 116 bytes
Pruébalo en línea!
Explicación
fuente
Python 2 , 91 bytes
Pruébalo en línea!
Devuelve una lista de listas satisfactorias (p. Ej., F (3) = [[- 1, -2,3], [1,2, -3]])
fuente
APL (Dyalog) , 38 bytes
Pruébalo en línea!
fuente
Pyth , 13 bytes
Pruébalo aquí!
fuente
C (gcc) , 171 bytes
Pruébalo en línea! Usos
0
para2
signos negativos y positivos.fuente
Limpio , 79 bytes
Pruébalo en línea!
fuente
Python 3 + numpy,
104103 bytesLa salida es [-1, 1] correspondiente al signo.
fuente
if
para -1 byteJavaScript (ES6),
6961 bytesAhorró 8 bytes al deshacerse de k , como lo sugiere @Neil
Imprime todas las soluciones con alert () .
Casos de prueba
Usando console.log () en lugar de alert () para facilidad de uso.
Mostrar fragmento de código
fuente
k
? Algo así:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Retina , 73 bytes
Pruébalo en línea! Explicación:
Convierta la entrada a unario.
Convierta el número a una lista de
=
números prefijados.Reemplace cada uno
=
a su vez con ambos-
y+
, duplicando el número de líneas cada vez.Cuente por separado el número de
_
s después de-
sy+
s. Esto suma los números negativos y positivos.Mantener sólo aquellas líneas en las que los
-
s y+
s se cancelan.Eliminar los recuentos.
Convierte a decimal.
fuente
Perl 6 , 43 bytes
Pruébelo
Devuelve una secuencia 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))
fuente
J ,
3530 bytes-5 bytes gracias a FrownyFrog!
Pruébalo en línea!
Original:
J , 35 bytes
Cómo funciona
Multiplico la lista 1..n con todas las listas posibles de coeficientes 1 / -1 y encuentro las que suman cero.
Pruébalo en línea!
Como alternativa probé un verbo explícito, utilizando el enfoque del producto cartesiano de +/-:
J , 37 bytes
{(<"1@,.-)
encuentra los productos cartesianos, por ejemplo:Lástima que encajone el resultado, así que pasé algunos bytes para desempaquetar los valores
Pruébalo en línea!
fuente