Bei einer nicht leeren Liste positiver Ganzzahlen müssen Sie die Anzahl der eindeutigen Werte von ± x ± y ± z ± … bestimmen.
Betrachten Sie beispielsweise die Liste . Es gibt acht Möglichkeiten, Summen zu erstellen:
Es gibt sechs eindeutige Summen , daher lautet die Antwort 6 .
Testfälle
[1, 2] => 4
[1, 2, 2] => 6
[s]*n => n+1
[1, 2, 27] => 8
[1, 2, 3, 4, 5, 6, 7] => 29
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] => 45
[1, 7, 2, 8, 3, 1, 6, 8, 10, 9] => 56
[93, 28, 92, 100, 43, 66, 2, 98, 2, 52, 57, 75, 39, 77, 45, 15, 13, 82, 81, 20, 68, 14, 5, 3, 72, 56, 57, 1, 23, 25, 76, 59, 60, 71, 71, 24, 1, 3, 72, 84, 72, 28, 83, 62, 66, 45, 21, 28, 49, 57, 70, 3, 44, 47, 1, 54, 53, 56, 36, 20, 99, 9, 89, 74, 1, 14, 68, 47, 99, 61, 46, 26, 69, 21, 20, 82, 23, 39, 50, 58, 24, 22, 48, 32, 30, 11, 11, 48, 90, 44, 47, 90, 61, 86, 72, 20, 56, 6, 55, 59] => 4728
Referenzlösung (optimiert für Geschwindigkeit und nicht Größe).
Wenn Sie den letzten Fall nicht behandeln können, weil Sie eine Brute-Force-Methode oder ähnliches verwenden, ist das in Ordnung.
Wertung
Das ist Code-Golf , also gewinnt die kürzeste gültige Lösung (gemessen in Bytes).
code-golf
math
combinatorics
Esolanging Fruit
quelle
quelle
[2,2,2,2,...]
), sollte die Antwort die Länge des Arrays + 1 sein. Dies liegt daran, dass in diesem Fall die Position der Zeichen irrelevant ist und nur die Anzahl der einzelnenAntworten:
Wolfram Language (Mathematica) , 27 Byte
Probieren Sie es online!
Das Ermitteln der Anzahl der Summen für den Austausch eindeutiger Vorzeichen entspricht dem Ermitteln der Anzahl der Summen für eindeutige Teilmengen.
Ein Beweis würde das Addieren der Summe der Eingabe zu jeder der Vorzeichentauschsummen und das Teilen durch zwei beinhalten. Dann gibt es eine offensichtliche Verzweigung.
Erläuterung
Durchlaufen Sie die Eingabe mit dem Anfangswert
{0}
: Nehmen Sie die Vereinigung zwischen<current value>
und<current value> + input element
(ordnet auf Listen zu).Golf-Version der
Length
Funktion.quelle
Gelee , 6 Bytes
Probieren Sie es online!
Hintergrund
Sei L die Eingabeliste und {P, N} eine Aufteilung in algebraische Summanden mit positiven und negativen Vorzeichen. Die Herausforderungsspezifikation erfordert die Berechnung von s {P, N} = Summe (P) - Summe (N) .
Da jedoch Summe (P) + Summe (N) = Summe (L) und Summe (L) nicht von der Partition abhängen, haben wir s {P, N} = Summe (P) - Summe (N) = Summe ( P) - (Summe (L) - Summe (P)) = 2Summe (P) - Summe (L) .
Somit entspricht jeder eindeutige Wert von sum (P) einem eindeutigen Wert von s {P, N} .
Wie es funktioniert
quelle
MATL ,
1110 BytesProbieren Sie es online! Dies ist eine Portierung von Luis Mendos Octave / MATLAB- Antwort. Ich versuche immer noch, MATL zu lernen, und ich dachte, ich würde es zusammen mit einer Erklärung posten, da MATL die Sprache des Monats ist.
Erläuterung:
Hier finden Sie eine Anleitung für alle, die mit Stack-basierter Programmierung im Allgemeinen und MATL im Besonderen nicht vertraut sind.
Der Eingabevektor wird implizit auf den Stapel gelegt. Beachten Sie, dass beim Ausführen einer Operation für ein Element im Stapel dieses Element aus dem Stapel entfernt wird.
Und dann gibt es implizit das letzte Element auf dem Stapel aus.
quelle
Python 2 , 55 Bytes
Probieren Sie es online!
quelle
Python 2 , 52 Bytes
Probieren Sie es online!
Verwendet die binäre Darstellung einer Zahl zum Speichern der erreichbaren Teilmengen.
quelle
k<<n
addiert n zu jeder Summe. Wenn Siek
diese neuen Summen in den Läden kaufen,k
während Sie alle vorherigen behalten, werden keine duplizierten Sims aufgezeichnet05AB1E , 4 Bytes
Verwendet den gleichen Ansatz wie in Dennis 'Jelly-Antwort .
Probieren Sie es online!
quelle
Haskell, 46 Bytes
Probieren Sie es online!
Anstatt die Teilmengen der Eingabeliste zu summieren, werden alle Kombinationen vorgenommen, indem entweder eine Zahl beibehalten oder diese ersetzt wird
0
, zDies ist zwei Bytes kürzer als
subsequences
.quelle
f x=sum[1|i<-[0..sum x],elem i$sum<$>mapM(:[0])x]
kürzer sein würde als der Import, aber anscheinend ist es nicht.import Data.List;length.foldr((<*>)union.map.(+))[0]
R
8375 Bytes-8 Bytes dank JayCe und Giuseppe
Erstellt eine Matrix aller möglichen Kombinationen von (1, -1) für die Größe des Eingabevektors und multipliziert diese mit dem ursprünglichen Vektor, um die Summen zu erhalten. Dann einmalig und finde die Länge des Ergebnisses.
function(v)nrow(unique(t(t(expand.grid(rep(list(c(1,-1)),sum(v|1)))))%*%v))
vorherige Version:
f=function(v)nrow(unique(as.matrix(expand.grid(rep(list(c(1,-1)),length(v))))%*%v))
Ungolfed mit Kommentaren:
quelle
t
: TIOsum(v|1)
ist ein Byte kürzer alslength(v)
Octave / MATLAB,
454140 BytesDie Eingabe ist ein Spaltenvektor (mit
;
als Trennzeichen verwendet wird).Die Codefehler für den letzten Testfall aufgrund von Speicherbeschränkungen.
Hierbei wird eine Idee aus der Antwort von JungHwan Min verwendet (Teilmengen statt Wechselzeichen ), um einige Bytes zu sparen.
Probieren Sie es online!
quelle
Pari / GP , 39 Bytes
Probieren Sie es online!
quelle
Python 3 , 61 Bytes
Probieren Sie es online!
Rekursiver Ansatz, der die eindeutigen Summen von Teilmengen verfolgt.
Der wahre Spaß ist, dass dies
itertools
mit großem Abstand schlägt :76 Bytes
Probieren Sie es online!
quelle
Pyth , 5 Bytes
Verwendet den gleichen Ansatz wie in Dennis 'Jelly-Antwort .
Probieren Sie es hier aus.
quelle
Attache , 29 Bytes
Probieren Sie es online!
Dies funktioniert, indem der
±
Operator über die Eingabeliste gefaltet und dann genommen wird±
diese Liste dann genommen und die eindeutigen Atome des Arrays gezählt werden.Hier einige Beispiele, wie das Falten funktioniert:
Dann generieren wir alle Permutationen des Endzeichens, indem wir PlusMinus erneut anwenden.
Eine effizientere Version, 31 Bytes
Probieren Sie es online! Beim endgültigen Testfall tritt keine Zeitüberschreitung auf, da keine unnötigen Kombinationen generiert werden.
quelle
R , 62 Bytes
Probieren Sie es online!
Portiert Dennis 'Algorithmus. Es kommt den Octave / MATL-Antworten am nächsten, da es ein ähnliches Bitmap- und Matrixprodukt zum Einschließen / Ausschließen von Begriffen verwendet.
quelle
APL (Dyalog Classic) ,
12 bis11 Bytes-1 danke an H.PWiz
Probieren Sie es online!
quelle
-⍨
kann sein⊢
Perl 5
-p
, 39 BytesProbieren Sie es online!
quelle
JavaScript (ES6), 63 Byte
Probieren Sie es online!
quelle
Schale , 5 Bytes
Probieren Sie es online!
Port of Dennis 'Jelly Antwort.
Erläuterung
quelle
Perl 6 , 33 Bytes
Probieren Sie es online!
quelle
Bash + GNU-Dienstprogramme, 49 Bytes
Probieren Sie es online!
Eingabe in Form einer durch Kommas getrennten Liste in der Befehlszeile.
Erläuterung
quelle
x86_64 Maschinensprache für Linux,
31 bis29 ByteProbieren Sie es online!
Inspiriert von @ xnors Antwort. Benötigt eine Maschine mit der
POPCNT
Anweisung.quelle
C (GCC) ,
7469 BytesProbieren Sie es online!
C-Port von @ xnors Antwort
quelle
APL (Dyalog Classic) ,
343332 BytesProbieren Sie es online!
Danke an @ngn für -1 Byte!
quelle
1-⍨≢⍵
->≢1↓⍵
+.×⍨
->+.×
Sauber , 82 Bytes
Probieren Sie es online!
Definiert die Funktion,
? :: [Int] -> Int
mit derf :: [Int] -> ([Int] -> Int)
nach einer Addition oder Subtraktion über jede mögliche Summe gekürzt wird.quelle
APL (Dyalog Classic) , 21 Byte
Probieren Sie es online!
Erläuterung
Ein äquivalenter Funktionszug
{((⍴⍵)⍴2)⊤⍳(⍴⍵)}
, der eine Matrix generiert, die die binären Darstellungen von 0 bis zur Länge der Eingabe als Spalten enthältOrdnet
1
s zu-1
s und0
s zu1
s zuMatrixmultiplikation mit der Eingabe, die ein Array aller möglichen Summen ergibt
Duplikate entfernen und zählen
quelle
Java 8,
2078344 BytesPort von @ xnors Python 2-Antwort .
-39 Bytes dank @Jakob .
Probieren Sie es online aus .
quelle
Long
:s->Long.bitCount(s.reduce(1l,(a,e)->a|a<<e))
..reduce
(und.bitCount
ich könnte auch hinzufügen ..>.>) -39 Bytes genau dort! :)Java 8, 85 Bytes
Ein weiterer Java-Port von xnors Antwort . Wie bei der ursprünglichen Antwort wird eine Bitmap mit willkürlicher Genauigkeit verwendet, sodass die Größe einer Teilmenge nicht nach oben begrenzt ist.
Es ist ein Lambda von einer sequentiellen
java.util.stream.Stream<Integer>
zuint
.Probieren Sie es online
Beachten Sie, dass der Kombinierer (das dritte Argument für
reduce
) nicht verwendet wird, da der Stream sequentiell ist. Die von mir gewählte Funktion ist beliebig.quelle
Julia 0,6 ,
5452 BytesProbieren Sie es online!
( -2 Bytes durch Ersetzen
¬
durch~
, danke an Jo King )Funktioniert für alle Testfälle. Nutzt Broadcast, um alle möglichen Beträge zu sammeln und zählt sie dann.
Erläuterung:
Ältere Lösung:
Julia 0,6 , 64 Bytes
Probieren Sie es online!
Funktioniert für Eingabearrays mit einer Länge von bis zu 63 (funktioniert also nicht für den letzten Testfall, was laut OP in Ordnung ist).
Erläuterung:
quelle
JavaScript (Babel Node) , 64 Byte
Probieren Sie es online!
Dies funktioniert nicht für den letzten Testfall.
Effektivere Lösung (arbeitet am letzten Testfall):
JavaScript (Babel Node) , 71 Byte
Probieren Sie es online!
In einem echten Browser funktioniert dies aufgrund von nicht
Array#smoosh
.Dank Bubbler
[x+f,x-f]
->[x+f,x]
spart 2 Bytes.quelle
[x+f,x]
anstelle von[x+f,x-f]
( Nachweis durch JungHwan Min ) verwenden.F=([f,...r],s=[0])=>f?F(r,[...s,...s.map(x=>x+f)]):new Set(s).size
[...s,...s.map(x=>x+f)]
,s.concat(s.map(x=>x+f))
und,s,s.map(x=>s.push(x+f))
teilen die gleiche Länge ...Rot , 73 Bytes
Port of Dennis 'Python 2 Antwort. Behandelt nicht den letzten Testfall.
Probieren Sie es online!
quelle