introduction
Considérons une liste non vide L d'entiers. Une tranche de somme nulle de L est une sous-séquence contiguë de L dont la somme est égale à 0. Par exemple, [1, -3, 2] est une tranche de somme nulle de [-2, 4, 1, -3, 2, 2 , -1, -1] , mais [2, 2] n’est pas (car sa somme ne correspond pas à 0), ni non plus [4, -3, -1] (car il n’est pas contigu).
Une collection de tranches à somme nulle de L est une couverture à somme nulle de L si chaque élément appartient à au moins une des tranches. Par exemple:
L = [-2, 4, 1, -3, 2, 2, -1, -1]
A = [-2, 4, 1, -3]
B = [1, -3, 2]
C = [2, -1, -1]
Les trois tranches somme nulle A , B et C forment un couvercle somme nulle de L . Plusieurs copies de la même tranche peuvent apparaître dans une couverture à somme nulle, comme ceci:
L = [2, -1, -1, -1, 2, -1, -1]
A = [2, -1, -1]
B = [-1, -1, 2]
C = [2, -1, -1]
Bien sûr, toutes les listes n’ont pas une couverture à somme nulle; quelques exemples sont [2, -1] (chaque tranche a une valeur non nulle somme) et [2, 2, -1, -1, 0, 1] (la plus à gauche 2 ne fait pas partie d'une tranche de somme nulle).
La tâche
Votre entrée est une liste entière non vide L , prise dans n’importe quel format raisonnable. Votre sortie doit être une valeur de vérité si L a une couverture à somme nulle et une valeur de fausseté sinon.
Vous pouvez écrire un programme complet ou une fonction, et le nombre d'octets le plus faible gagne.
Cas de test
[-1] -> False
[2,-1] -> False
[2,2,-1,-1,0,1] -> False
[2,-2,1,2,-2,-2,4] -> False
[3,-5,-2,0,-3,-2,-1,-2,0,-2] -> False
[-2,6,3,-3,-3,-3,1,2,2,-2,-5,1] -> False
[5,-8,2,-1,-7,-4,4,1,-8,2,-1,-3,-3,-3,5,1] -> False
[-8,-8,4,1,3,10,9,-11,4,4,10,-2,-3,4,-10,-3,-5,0,6,9,7,-5,-3,-3] -> False
[10,8,6,-4,-2,-10,1,1,-5,-11,-3,4,11,6,-3,-4,-3,-9,-11,-12,-4,7,-10,-4] -> False
[0] -> True
[4,-2,-2] -> True
[2,2,-3,1,-2,3,1] -> True
[5,-3,-1,-2,1,5,-4] -> True
[2,-1,-1,-1,2,-1,-1] -> True
[-2,4,1,-3,2,2,-1,-1] -> True
[-4,-1,-1,6,3,6,-5,1,-5,-4,5,3] -> True
[-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3] -> True
[4,-9,12,12,-11,-11,9,-4,8,5,-10,-6,2,-9,10,-11,-9,-2,8,4,-11,7,12,-5] -> True
[2,2,-1,-1,0,1] -> False
être la vérité puisque les deux tranches[2,-1,-1]
et[-1,0,1]
add to zero et que tous leurs éléments sont dans la liste d'origine?Réponses:
Gelée ,
13 à12 octetsEssayez-le en ligne!
Comment ça marche
la source
Mathematica,
6665 octetsSauvé 1 octet, et j'espère appris une nouvelle astuce pour l'avenir, grâce à ngenisis!
Deux alternatives également longues, qui sont toutes deux des fonctions non nommées prenant une liste d’entiers en entrée et retournant
True
ouFalse
:Dans les deux cas,
Tr@#[[i;;j]]
calcule la somme de la tranche de l'entrée de positioni
en positionj
(indexé 1).Product[...,{i,k},{j,k,l}]
multiples ensemble toutes ces sommes de tranche, comme desi
plages sur des indices qui sont au plusk
et desj
plages sur des indices au moinsk
. (Notez quel=Tr[1^#]
définitl
comme étant la somme de1
toutes les puissances de la liste d'entrée, qui est simplement la longueur de la liste.) En d'autres termes, ce produit est égal à 0 si et seulement si l'k
élément th appartient à une tranche à somme nulle .Dans la première version, chacun de ces produits est comparé
0
et estAnd@@
renvoyéTrue
précisément lorsque tous les produits sont égaux0
. Dans la deuxième version, la fonctionNorm
(la longueur dul
vecteur -dimensional) agit sur la liste des produits , ce qui équivaut à0
si et seulement si toutes les entrées sont égales0
.la source
Tr[1^#]
enregistre1
octet deLength@#
.0^
travailler au lieu de0==
? Vous ne savez pas comment Mathematica gère cela. (vous reviendriez1
/0
au lieu detrue
/false
)Indeterminate
pour0^0
. En outre,1
/0
ne sont pas réellement truthy / falsy dans Mathematica-il est trop fortement typé pour faire des golfeurs heureux :)Mathematica,
6564 octetsMerci à ngenisis d’avoir économisé 1 octet.
Je préférerais trouver une solution de correspondance de modèle pure, mais elle s'avère délicate (et les choses comme
{___,a__,___}
sont toujours super longues).la source
Haskell, 94 octets
Exemple d'utilisation:
g [-11,8,-2,-6,2,-12,5,3,-7,4,-7,7,12,-1,-1,6,-7,-4,-5,-12,9,5,6,-3]
->True
.Comment ça marche (utilisons
[-1,1,5,-5]
pour la saisie):la source
powerslice
est un excellent nom de fonction.Ruby, 81 octets
Essayez-le en ligne
Solution simpliste de force brute; Pour chaque élément du tableau, essayez de trouver une tranche à somme nulle qui la contient.
la source
J,
3635 octetsPour chaque subsum, j'ajoute les index de l'élément et je garde les index ssi subsum est
0
, puis vérifie si tous les index sont présents.Astuce: les index basés sur 1 d'une liste peuvent être générés avec
#\
longueur de chaque préfixe.Usage:
Essayez-le en ligne ici.
la source
#\*/@e.&,]({:*0=1#.{.)@|:\.\@,.#\
JavaScript (ES6), 109 octets
Extrait de test
Afficher l'extrait de code
la source
Python,
123120 octets-3 octets grâce à @Zgarb
Remplit une liste avec la même taille que l'entrée avec des tranches à somme nulle et les écrase selon les index, en renvoyant son égalité à l'original à la fin.
la source
0
comme espace réservé au lieu deNone
. Il n'y aura pas de faux positifs, car chaque0
entrée est toujours une tranche ou une tranche à somme nulle.Scala, 49 octets
Essayez chez ideone
Usage:
Ungolfed:
Explication:
la source
%
comme nom de paramètre? Cool!.,;:()[]{}\"'
. Très utile pour jouer au golf, car ils sont séparés des lettres par l'analyse, ce qui vous permet d'économiser de l'espace.true
pour le deuxième cas de fausseté.Python, 86 octets
Vérité = 1 Falsy = Aucune
la source
1
pour le troisième cas de test.1
pour tous les tests sauf les deux premiers faux.Clojure, 109 octets
Génère toutes les partitions dont la somme est égale à zéro et vérifie qu’il possède des index distincts "longueur du vecteur d’entrée".
la source
PHP, 104 octets
Force brute et toujours plus de 99 octets. :-(
prend les arguments de la ligne de commande,
1
pour vérité, vide pour fausseté. Courez avec-r
.panne
$argv[0]
contient le nom du fichier; s'il est exécuté avec-r
, il le sera-
et sera évalué à0
des opérations numériques.la source
JavaScript (ES6), 102 octets
Calcule les sommes partielles pour tous les éléments
i..j
inclus et réinitialise les éléments pertinents deb
de1
à0
quand il trouve une somme nulle, vérifiant enfin qu'il ne reste plus de1
s.la source