Hacer cero a partir de los primeros números 'n'

15

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 , por lo que gana el código más corto.

Manish Kundu
fuente
Tenga en cuenta que este no es un engaño de codegolf.stackexchange.com/questions/8655/… , porque este desafío está destinado a tomar solo n como entrada y usar todos los números 1-n en orden.
Manish Kundu
¿Podemos representar +as Ny -as -N, o eso es llevarlo demasiado lejos? (por ejemplo, 3-> [[-3,-3,3], [3,3,-3]])
Jonathan Allan
@ JonathanAllan ¿No se menciona eso en la lista de formatos de salida? ¿O interpreté mal tu pregunta?
Manish Kundu
Me refiero a la opción 0y 1, pero usando Ny -N(ver mi edición anterior)
Jonathan Allan
2
@JonathanAllan Sí, eso ciertamente está permitido. Asegúrate de mencionar eso en la respuesta.
Manish Kundu

Respuestas:

5

Jalea , 9 bytes

1,-ṗ×RSÐḟ

Pruébalo en línea!

Exp

1,-ṗ×RSÐḟ  Main link. Input = n. Assume n=2.
1,-        Literal list [1, -1].
   ṗ       Cartesian power n. Get [[1, 1], [1, -1], [-1, 1], [-1, -1]]
    ×R     Multiply (each list) by Range 1..n.
       Ðḟ  ilter out lists with truthy (nonzero)
      S      Sum.

Jalea , 9 bytes

La sugerencia de Jonathan Allan , muestra una lista de señales.

1,-ṗæ.ÐḟR

Pruébalo en línea!

usuario202729
fuente
1
¿Qué tal (ab?) Con el formato de salida lax con ,Nṗæ.ÐḟR?
Jonathan Allan
O, alternativamente, esta salida multiplica las salidas por n.
user202729
El Ny la -Nsalida que sugerí se han permitido, por lo que ahorra un byte :) (solo necesito mencionar el formato en la respuesta)
Jonathan Allan
5

Python 2 , 62 bytes

f=lambda n,*l:f(n-1,n,*l)+f(n-1,-n,*l)if n else[l]*(sum(l)==0)

Pruébalo en línea!

El Sr. Xcoder ahorró 4 bytes con un ingenioso uso de argumentos destacados.

xnor
fuente
1
62 bytes usando en *llugar del=[]
Sr. Xcoder
3

Perl, 37 36 bytes

perl -E 'map eval||say,glob join"{+,-}",0..<>' <<< 7
Ton Hospel
fuente
Bien hecho. Puede soltar -ny <<<si lo reemplaza $_con pop. En realidad, no mejora su puntaje, pero acorta la expresión general;)
Chris
2

05AB1E , 11 bytes

®X‚¹ãʒ¹L*O_

Pruébalo en línea!

El formato de salida para, por ejemplo, la entrada 3es:

[[-1, -1, 1], [1, 1, -1]]

Es decir, -1-2+3, 1+2-3.

Erik el Outgolfer
fuente
2

Casco , 10 bytes

fo¬ΣΠmSe_ḣ

Pruébalo en línea!

Explicación

No muy complicado

fo¬ΣΠmSe_ḣ  Implicit input, say n=4
         ḣ  Range: [1,2,3,4]
     m      Map over the range:
      Se     pair element with
        _    its negation.
            Result: [[1,-1],[2,-2],[3,-3],[4,-4]]
    Π       Cartesian product: [[1,2,3,4],[1,2,3,-4],..,[-1,-2,-3,-4]]
f           Keep those
   Σ        whose sum
 o¬         is falsy (equals 0): [[-1,2,3,-4],[1,-2,-3,4]]
Zgarb
fuente
1

Rápido , 116 bytes

func f(n:Int){var r=[[Int]()]
for i in 1...n{r=r.flatMap{[$0+[i],$0+[-i]]}}
print(r.filter{$0.reduce(0){$0+$1}==0})}

Pruébalo en línea!

Explicación

func f(n:Int){
  var r=[[Int]()]                         // Initialize r with [[]]
                                          // (list with one empty list)
  for i in 1...n{                         // For i from 1 to n:
    r=r.flatMap{[$0+[i],$0+[-i]]}         //   Replace every list in r with the list
  }                                       //   prepended with i and prepended with -i
  print(r.filter{$0.reduce(0){$0+$1}==0}) // Print all lists in r that sums to 0
}
Herman L
fuente
1

Python 2 , 91 bytes

lambda x:[s for s in[[~j*[1,-1][i>>j&1]for j in range(x)]for i in range(2**x)]if sum(s)==0]

Pruébalo en línea!

Devuelve una lista de listas satisfactorias (p. Ej., F (3) = [[- 1, -2,3], [1,2, -3]])

Chas Brown
fuente
1

C (gcc) , 171 bytes

k,s;f(S,n,j)int*S;{if(j--)S[j]=~0,f(S,n,j),S[j]=1,f(S,n,j);else{for(s=k=0;k<n;k++)s+=S[k]*-~k;if(!s&&puts(""))for(k=0;k<n;)printf("%d",S[k++]+1);}}F(n){int S[n];f(S,n,n);}

Pruébalo en línea! Usos 0para 2signos negativos y positivos.

Jonathan Frech
fuente
1

Python 3 + numpy, 104 103 bytes

import itertools as I,numpy as P
lambda N:[r for r in I.product(*[[-1,1]]*N)if sum(P.arange(N)*r+r)==0]

La salida es [-1, 1] correspondiente al signo.

usuario2699
fuente
Puede eliminar el espacio antes ifpara -1 byte
ovs
0

JavaScript (ES6), 69 61 bytes

Ahorró 8 bytes al deshacerse de k , como lo sugiere @Neil

Imprime todas las soluciones con alert () .

f=(n,o='')=>n?f(n-1,o+'+'+n)&f(n-1,o+'-'+n):eval(o)||alert(o)

Casos de prueba

Usando console.log () en lugar de alert () para facilidad de uso.

Arnauld
fuente
¿Necesita k? Algo así:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Neil
@Neil Realmente no ... Gracias.
Arnauld
0

Retina , 73 bytes

.+
*
_
=_$`
+0`=
-$%"+
(-(_)+|\+(_)+)+
$&=$#2=$#3=
G`(=.+)\1=
=.*

_+
$.&

Pruébalo en línea! Explicación:

.+
*

Convierta la entrada a unario.

_
=_$`

Convierta el número a una lista de =números prefijados.

+0`=
-$%"+

Reemplace cada uno =a su vez con ambos -y +, duplicando el número de líneas cada vez.

(-(_)+|\+(_)+)+
$&=$#2=$#3=

Cuente por separado el número de _s después de -sy +s. Esto suma los números negativos y positivos.

G`(=.+)\1=

Mantener sólo aquellas líneas en las que los -s y +s se cancelan.

=.*

Eliminar los recuentos.

_+
$.&

Convierte a decimal.

Neil
fuente
0

Perl 6 , 43 bytes

{grep *.sum==0,[X] (1..$_ X*1,-1).rotor(2)}

Pruébelo
Devuelve una secuencia de listas

Expandido:

{  # bare block lambda with implicit parameter 「$_」

  grep              # only return the ones
    *.sum == 0,     # that sum to zero

    [X]             # reduce with cross meta operator

      (
          1 .. $_   # Range from 1 to the input

        X*          # cross multiplied by

          1, -1

      ).rotor(2)    # take 2 at a time (positive and negative)
}

1..$_ X* 1,-1(1, -1, 2, -2)
(…).rotor(2)((1, -1), (2, -2))
[X] …((1, 2), (1, -2), (-1, 2), (-1, -2))

Brad Gilbert b2gills
fuente
0

J , 35 30 bytes

-5 bytes gracias a FrownyFrog!

>:@i.(]#~0=1#.*"1)_1^2#:@i.@^]

Pruébalo en línea!

Original:

J , 35 bytes

[:(#~0=+/"1)>:@i.*"1(_1^[:#:@i.2^])

Cómo funciona

Multiplico la lista 1..n con todas las listas posibles de coeficientes 1 / -1 y encuentro las que suman cero.

                    (             ) - the list of coefficients
                             i.     - list 0 to 
                               2^]  - 2 to the power of the input
                     _1^[:          - -1 to the power of 
                          #:@       - each binary digit of each number in 0..n-1 to 
                 *"1                - each row multiplied by
            >:@i.                   - list 1..n
  (#~      )                        - copy those rows
     0=+/"1                         - that add up to 0
[:                                  - compose   

Pruébalo en línea!

Como alternativa probé un verbo explícito, utilizando el enfoque del producto cartesiano de +/-:

J , 37 bytes

3 :'(#~0=+/"1)(-y)]\;{(<"1@,.-)1+i.y'

{(<"1@,.-) encuentra los productos cartesianos, por ejemplo:

{(<"1@,.-) 1 2 3
┌───────┬────────┐
│1 2 3  │1 2 _3  │
├───────┼────────┤
│1 _2 3 │1 _2 _3 │
└───────┴────────┘

┌───────┬────────┐
│_1 2 3 │_1 2 _3 │
├───────┼────────┤
│_1 _2 3│_1 _2 _3│
└───────┴────────┘

Lástima que encajone el resultado, así que pasé algunos bytes para desempaquetar los valores

Pruébalo en línea!

Galen Ivanov
fuente
@FrownyFrog Gracias, no estaba contento con el lado derecho de mi código.
Galen Ivanov