Étant donné une liste non vide d'entiers positifs , votre travail consiste à déterminer le nombre de valeurs uniques de± x ± y ± z ± …
Par exemple, considérez la liste . Il existe huit façons possibles de créer des sommes:
Il y a six sommes uniques , donc la réponse est .6
Cas de test
[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
Solution de référence (optimise la vitesse et non la taille).
Si vous ne pouvez pas gérer le dernier cas parce que vous utilisez une méthode de force brute ou similaire, ça va.
Notation
Il s'agit de code-golf , donc la solution valide la plus courte (mesurée en octets) l'emporte.
code-golf
math
combinatorics
Esolanging Fruit
la source
la source
[2,2,2,2,...]
) la réponse doit être la longueur du tableau + 1. C'est parce que dans ce cas, la position des signes n'est pas pertinente et que le nombre de chaque matièreRéponses:
Wolfram Language (Mathematica) , 27 octets
Essayez-le en ligne!
Trouver le nombre de sommes d'échange de signes uniques équivaut à trouver le nombre de sommes de sous-ensembles uniques.
Une preuve impliquerait d'ajouter la somme de l'entrée à chacune des sommes d'échange de signes et de la diviser par deux. Ensuite, il y a une bijection évidente.
Explication
Parcourez l'entrée, la valeur initiale étant
{0}
: prenez l'union entre<current value>
et<current value> + input element
(mappe sur des listes).Version Golfy de la
Length
fonction.la source
Gelée , 6 octets
Essayez-le en ligne!
Contexte
Soit L la liste d'entrée et {P, N} une partition en sommets algébriques avec des signes positifs et négatifs. La spécification de défi nécessite de calculer s {P, N} = somme (P) - somme (N) .
Cependant, puisque somme (P) + somme (N) = somme (L) et somme (L) ne dépend pas de la partition, nous avons s {P, N} = somme (P) - somme (N) = somme ( P) - (somme (L) - somme (P)) = 2 somme (P) - somme (L) .
Ainsi, chaque valeur unique de somme (P) correspond à une valeur unique de s {P, N} .
Comment ça marche
la source
MATL ,
1110 octetsEssayez-le en ligne! Ceci est un portage de la réponse Octave / MATLAB de Luis Mendo . J'essaie toujours d'apprendre MATL, et j'ai pensé que je le posterais, avec une explication, puisque MATL est la langue du mois.
Explication:
Voici une lecture pour tous ceux qui ne connaissent pas la programmation basée sur la pile en général, et MATL en particulier.
Le vecteur d'entrée est implicitement placé sur la pile. Notez que lorsqu'une opération est effectuée sur un élément de la pile, cet élément est supprimé de la pile.
Et puis il renvoie implicitement le dernier élément de la pile.
la source
Python 2 , 55 octets
Essayez-le en ligne!
la source
Python 2 , 52 octets
Essayez-le en ligne!
Utilise la représentation binaire d'un nombre pour stocker les sommes des sous-ensembles accessibles.
la source
k<<n
ajoute n à chaque somme. Oring aveck
stocke ces nouvelles sommesk
tout en conservant toutes les précédentes, et les Sims dupliqués ne sont pas enregistrés05AB1E , 4 octets
Utilise la même approche que celle utilisée dans la réponse Jelly de Dennis .
Essayez-le en ligne!
la source
Haskell, 46 octets
Essayez-le en ligne!
Au lieu de sommer les sous-ensembles de la liste d'entrée, nous faisons toutes les combinaisons soit en conservant un nombre, soit en le remplaçant par
0
, par exempleC'est deux octets de moins que
subsequences
.la source
f x=sum[1|i<-[0..sum x],elem i$sum<$>mapM(:[0])x]
serait plus court que l'importation, mais apparemment, ce n'est pas le cas.import Data.List;length.foldr((<*>)union.map.(+))[0]
R,
8375 octets-8 octets grâce à JayCe et Giuseppe
Crée une matrice de toutes les combinaisons possibles de (1, -1) pour la taille du vecteur d'entrée, multiplie cela par le vecteur d'origine pour obtenir les sommes. Ensuite, unique et trouvez la longueur du résultat.
function(v)nrow(unique(t(t(expand.grid(rep(list(c(1,-1)),sum(v|1)))))%*%v))
la version précédente:
f=function(v)nrow(unique(as.matrix(expand.grid(rep(list(c(1,-1)),length(v))))%*%v))
Non golfé avec des commentaires:
la source
t
: TIOsum(v|1)
est un octet plus court quelength(v)
Octave / MATLAB,
454140 octetsL'entrée est un vecteur de colonne (utilisé
;
comme séparateur).Les erreurs de code pour le dernier cas de test en raison de restrictions de mémoire.
Cela utilise une idée de la réponse de JungHwan Min (sous-ensembles au lieu de signes alternés) pour économiser quelques octets.
Essayez-le en ligne!
la source
Pari / GP , 39 octets
Essayez-le en ligne!
la source
Python 3 , 61 octets
Essayez-le en ligne!
Approche récursive, gardant une trace des sommes de sous-ensembles uniques.
Le vrai plaisir est que cela bat
itertools
par une grande marge:76 octets
Essayez-le en ligne!
la source
Pyth , 5 octets
Utilise la même approche que celle utilisée dans la réponse Jelly de Dennis .
Essayez-le ici.
la source
Attaché , 29 octets
Essayez-le en ligne!
Cela fonctionne en repliant l'
±
opérateur sur la liste d'entrée, puis en prenant±
cette liste, puis en comptant les atomes uniques du tableau.Voici quelques exemples du fonctionnement du pliage:
Ensuite, nous générons toutes les permutations du signe final en appliquant à nouveau PlusMinus.
Une version plus efficace, 31 octets
Essayez-le en ligne! Cela n'expire pas sur le cas de test final, car il ne génère pas de combinaisons inutiles.
la source
R , 62 octets
Essayez-le en ligne!
Algorithme de Ports Dennis. Il est le plus proche des réponses Octave / MATL car il utilise un produit bitmap et matrice similaire pour l'inclusion / exclusion de termes.
la source
APL (Dyalog Classic) ,
1211 octets-1 merci à H.PWiz
Essayez-le en ligne!
la source
-⍨
peut être⊢
Perl 5
-p
, 39 octetsEssayez-le en ligne!
la source
JavaScript (ES6), 63 octets
Essayez-le en ligne!
la source
Husk , 5 octets
Essayez-le en ligne!
Réponse de Jelly du port de Dennis.
Explication
la source
Perl 6 , 33 octets
Essayez-le en ligne!
la source
Utilitaires Bash + GNU, 49 octets
Essayez-le en ligne!
Entrée donnée sous forme de liste séparée par des virgules sur la ligne de commande.
Explication
la source
Langage machine x86_64 pour Linux,
3129 octetsEssayez-le en ligne!
Inspiré par la réponse de @ xnor. Nécessite une machine avec l'
POPCNT
instruction.la source
C (gcc) ,
7469 octetsEssayez-le en ligne!
Port C de la réponse de @ xnor
la source
APL (Dyalog Classic) ,
343332 octetsEssayez-le en ligne!
Merci à @ngn pour -1 octet!
la source
1-⍨≢⍵
->≢1↓⍵
+.×⍨
->+.×
Nettoyer , 82 octets
Essayez-le en ligne!
Définit la fonction en
? :: [Int] -> Int
utilisantf :: [Int] -> ([Int] -> Int)
comme aide pour réduire chaque somme possible après un ajout ou une soustraction.la source
APL (Dyalog Classic) , 21 octets
Essayez-le en ligne!
Explication
Un train de fonctions équivalent à
{((⍴⍵)⍴2)⊤⍳(⍴⍵)}
, qui génère une matrice qui a les représentations binaires de 0 à la longueur de l'entrée sous forme de colonnesMappe
1
s à-1
s et0
s à1
sMultiplication matricielle avec l'entrée, qui donne un tableau de toutes les sommes possibles
Supprimer les doublons, puis compter
la source
Java 8,
2078344 octetsPort de @ xnor réponse Python 2 .
-39 octets grâce à @Jakob .
Essayez-le en ligne .
la source
Long
:s->Long.bitCount(s.reduce(1l,(a,e)->a|a<<e))
..reduce
(et.bitCount
aussi je pourrais ajouter ..>.>) -39 octets juste là! :)Java 8, 85 octets
Un autre port Java de xnor réponse de . Comme la réponse d'origine, cela utilise un bitmap de précision arbitraire afin qu'il n'y ait pas de limite supérieure sur la taille d'une somme de sous-ensemble.
C'est un lambda d'un séquentiel
java.util.stream.Stream<Integer>
àint
.Essayez-le en ligne
Notez que le combineur (le troisième argument de
reduce
) n'est pas utilisé car le flux est séquentiel. La fonction que j'ai choisie est arbitraire.la source
Julia 0,6 ,
5452 octetsEssayez-le en ligne!
( -2 octets en remplaçant
¬
par~
, merci à Jo King )Fonctionne pour tous les cas de test. Utilise la diffusion pour collecter toutes les sommes possibles, puis les compte.
Explication:
Solution plus ancienne:
Julia 0,6 , 64 octets
Essayez-le en ligne!
Fonctionne pour les tableaux d'entrée avec une longueur jusqu'à 63 (donc ne fonctionne pas pour le dernier cas de test, ce qui est bien selon OP).
Explication:
la source
JavaScript (nœud Babel) , 64 octets
Essayez-le en ligne!
Cela ne fonctionnera pas pour le dernier test.
Solution plus efficace (fonctionne sur le dernier testcase):
JavaScript (Babel Node) , 71 octets
Essayez-le en ligne!
Cela ne fonctionnera pas dans un vrai navigateur à cause de
Array#smoosh
.Merci à Bubbler,
[x+f,x-f]
->[x+f,x]
enregistre 2 octets.la source
[x+f,x]
à la place de[x+f,x-f]
( preuve par JungHwan Min ).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))
et,s,s.map(x=>s.push(x+f))
part même longueur ...Rouge , 73 octets
Réponse de Python 2 du port de Dennis. Ne gère pas le dernier cas de test.
Essayez-le en ligne!
la source