Crea zero dai primi 'n' numeri


15

Sfida

La sfida è scrivere un codice che prenda un input positivo 'n' come input e mostri tutti i modi possibili in cui i numeri da 1 - n possono essere scritti, con un segno positivo o negativo tra loro, in modo tale che la loro somma sia uguale a zero. Ricorda che puoi utilizzare solo addizioni o sottrazioni.

Ad esempio, se l'input è 3, allora ci sono 2 modi per rendere la somma 0:

 1+2-3=0
-1-2+3=0

Si noti che, i numeri sono in ordine, a partire da 1 a n (che in questo caso è 3). Come risulta evidente dall'esempio, anche il segno del primo numero può essere negativo, quindi fai attenzione.

Ora, 3 era praticamente semplice. Elenchiamo tutti i modi quando consideriamo il numero 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

Quindi qui abbiamo un totale di 8 possibili modi.


Ingresso e uscita

Come affermato in precedenza, l' input sarebbe un numero intero positivo . Il tuo output dovrebbe contenere tutti i modi possibili in cui i numeri danno una somma di zero. Nel caso in cui non ci sia modo di fare lo stesso, puoi produrre tutto quello che vuoi.

Inoltre, è possibile stampare l'output in qualsiasi formato desiderato . Ma dovrebbe essere comprensibile . Ad esempio, è possibile stamparlo come nell'esempio sopra. Oppure, puoi semplicemente stampare i segni dei numeri in ordine. Altrimenti, puoi anche stampare '0' e '1' in ordine, dove '0' mostrerebbe un segno negativo e '1' mostrerebbe un segno positivo (o viceversa).

Ad esempio, puoi rappresentare 1 + 2-3 = 0 usando:

1+2-3=0
1+2-3
[1,2,-3]
++-
110
001    

Tuttavia, consiglierei di utilizzare uno dei primi tre formati per semplicità. Puoi presumere che tutti gli input siano validi.


Esempi

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

punteggio

Questo è , quindi vince il codice più corto!


Si noti che questo non è un duplicato di codegolf.stackexchange.com/questions/8655/… , perché questa sfida ha lo scopo di prendere solo n come input e utilizzare tutti i numeri 1-n in ordine.
Manish Kundu,

Possiamo rappresentare +come Ne -come -N, o sta andando troppo lontano? (es. 3-> [[-3,-3,3], [3,3,-3]])
Jonathan Allan,

@JonathanAllan Non è menzionato nell'elenco dei formati di output? O ho interpretato erroneamente la tua domanda?
Manish Kundu,

Intendo come l' opzione 0e 1ma usando Ne -N(vedi la mia modifica sopra)
Jonathan Allan,

2
@JonathanAllan Sì, questo è certamente permesso. Assicurati di menzionarlo nella risposta.
Manish Kundu,

Risposte:



5

Gelatina , 9 byte

1,-ṗ×RSÐḟ

Provalo online!

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.

Gelatina , 9 byte

Il suggerimento di Jonathan Allan , ha prodotto un elenco di segni.

1,-ṗæ.ÐḟR

Provalo online!


1
Che ne dici di (ab?) Usare il formato di output lassista con ,Nṗæ.ÐḟR?
Jonathan Allan,

O in alternativa, questo output ha moltiplicato gli output per n.
user202729,

L' output Ne -Nl'ho suggerito sono stati consentiti, in modo da risparmiare un byte :) (basta menzionare il formato nella risposta)
Jonathan Allan,


3

Perl, 37 36 byte

perl -E 'map eval||say,glob join"{+,-}",0..<>' <<< 7

Ben fatto. Puoi rilasciarlo -ne <<<se lo sostituisci $_con pop. In realtà non migliora il tuo punteggio, ma rende l'espressione generale più breve;)
Chris



2

Buccia , 10 byte

fo¬ΣΠmSe_ḣ

Provalo online!

Spiegazione

Non troppo complicato.

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]]


1

Rapido , 116 byte

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})}

Provalo online!

Spiegazione

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
}

1

Python 2 , 91 byte

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]

Provalo online!

Restituisce un elenco di elenchi soddisfacenti (ad es. F (3) = [[- 1, -2,3], [1,2, -3]])




1

C (gcc) , 171 byte

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);}

Provalo online! Utilizza 0per 2segni negativi e positivi.



1

Python 3 + numpy, 104 103 byte

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]

L'output è [-1, 1] corrispondente al segno.


Puoi rimuovere prima lo spazio ifper -1 byte
ovs

0

JavaScript (ES6), 69 61 byte

Hai salvato 8 byte eliminando k , come suggerito da @Neil

Stampa tutte le soluzioni con alert () .

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

Casi test

Utilizzo di console.log () invece di alert () per facilità d'uso.


Ti serve k? Qualcosa del genere:f=(n,o='')=>n?['+','-'].map(c=>f(n-1,c+n+o)):eval(o)||alert(o)
Neil,

@Neil davvero non ... Grazie.
Arnauld,

0

Retina , 73 byte

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

_+
$.&

Provalo online! Spiegazione:

.+
*

Converti l'input in unario.

_
=_$`

Converti il ​​numero in un elenco di =numeri prefissati.

+0`=
-$%"+

Sostituisci ciascuno =a turno con entrambi -e +, duplicando il numero di righe ogni volta.

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

Conta separatamente il numero di _s dopo -s e +s. Questo somma i numeri negativi e positivi.

G`(=.+)\1=

Mantieni solo quelle righe in cui si cancellano le -s e +s

=.*

Elimina i conteggi.

_+
$.&

Converti in decimale.


0

Perl 6 , 43 byte

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

Provalo
Restituisce una sequenza di elenchi

Allargato:

{  # 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))


0

J , 35 30 byte

-5 byte grazie a FrownyFrog!

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

Provalo online!

Originale:

J , 35 byte

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

Come funziona

Moltiplico la lista 1..n con tutte le possibili liste di coefficienti 1 / -1 e trovo quelle che si sommano a zero.

                    (             ) - 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   

Provalo online!

In alternativa ho provato un verbo esplicito, usando l'approccio del prodotto cartesiano di +/-:

J , 37 byte

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

{(<"1@,.-) trova ad esempio i prodotti cartesiani:

{(<"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│
└───────┴────────┘

Peccato che racchiuda il risultato, quindi ho speso alcuni byte per decomprimere i valori

Provalo online!


@FrownyFrog Grazie, non ero contento del lato destro del mio codice.
Galen Ivanov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.