Ecrivez un programme ou une fonction qui prend une liste non vide d’entiers positifs. Vous pouvez supposer qu'il s'agit d'un format pratique convenable, tel que "1 2 3 4"
ou [1, 2, 3, 4]
.
Les nombres dans la liste d'entrée représentent les tranches d'un graphique à secteurs complet , chaque taille de tranche étant proportionnelle à son nombre correspondant et toutes les tranches étant disposées autour du graphique dans l'ordre indiqué.
Par exemple, la tarte pour 1 2 3 4
est:
La question à laquelle votre code doit répondre est la suivante: le diagramme à secteurs est-il déjà divisé en deux ? En d’autres termes, existe-t-il une ligne parfaitement droite d’un côté à l’autre du cercle, qui le divise symétriquement en deux?
Vous devez générer une valeur de vérité s'il existe au moins une bissectrice et une valeur de fausseté s'il n'en existe aucune .
Dans l' 1 2 3 4
exemple, il y a une bissection entre 4 1
et 2 3
le résultat serait donc véridique.
Mais pour l'entrée, 1 2 3 4 5
il n'y a pas de bissectrice, donc le résultat serait faux:
Exemples supplémentaires
Arranger les nombres différemment peut enlever les bissectrices.
par exemple 2 1 3 4
→ fausseté:
Si un seul numéro figure dans la liste de saisie, le graphique n'est pas divisé en deux.
par exemple 10
→ fausseté:
Il peut y avoir plusieurs bissectrices. Tant qu'il y a plus que zéro, le résultat est la vérité.
par exemple 6 6 12 12 12 11 1 12
→ vérité: (il y a 3 bissectrices ici)
Des bisections peuvent exister même si elles ne sont pas évidentes visuellement.
par exemple 1000000 1000001
→ fausseté:
par exemple 1000000 1000001 1
→ vérité:
(Merci à nces.ed.gov pour la génération des camemberts.)
Cas de test
Truthy
1 2 3 4
6 6 12 12 12 11 1 12
1000000 1000001 1
1 2 3
1 1
42 42
1 17 9 13 2 7 3
3 1 2
10 20 10
Falsy
1 2 3 4 5
2 1 3 4
10
1000000 1000001
1
1 2
3 1 1
1 2 1 2 1 2
10 20 10 1
Notation
Le code le plus court en octets gagne. Tiebreaker est une réponse plus tôt.
la source
Réponses:
J, 18 octets
5 octets grâce à Dennis.
@ HelkaHomba : Nope.
Usage
Ungolfed
Version précédente de 23 octets:
Usage
Ungolfed
Explication
La somme de toutes les sous-chaînes est calculée par black_magic. Le
+/\
calcul des sommes partielles.Par exemple,
a b c d
devienta a+b a+b+c a+b+c+d
.La
-/~
construction alors une table de soustraction basée sur l'entrée,x y z
devient ainsi :Appliqué à
a a+b a+b+c a+b+c+d
, le résultat serait:Ceci calcule les sommes de toutes les sous-chaînes qui ne contiennent pas
a
.Cela garantit d'être suffisant, car si une bissection contient
a
, l'autre bissection ne contiendra pasa
et ne sera pas enveloppante.la source
+/e.&,2*+/\\.
Gelée ,
9 à8 octetsRenvoie une liste non vide (vérité) ou une liste vide (fausseté). Essayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
la source
Julia,
343029 octetsMerci à @GlenO pour avoir joué 1 octet!
Essayez-le en ligne!
Comment ça marche
Après avoir stocké la somme cumulée de 2x dans x , nous soustrayons le vecteur de rangée x ' du vecteur de colonne x , ce qui donne la matrice de toutes les différences possibles. Essentiellement, ceci calcule les sommes de tous les sous-tableaux adjacents de x qui ne contiennent pas la première valeur, leurs négatifs et les 0 de la diagonale.
Enfin, nous testons si la somme du tableau d'origine x appartient à la matrice générée. Si tel est le cas, la somme d'au moins une des sous-listes adjacentes est égale à exactement la moitié de la somme de la liste complète, ce qui signifie qu'il existe au moins une bissectrice.
la source
Python 2, 64 octets
Essaie de manière récursive de supprimer des éléments du début ou de la fin jusqu'à ce que la somme de ce qui reste soit égale à la somme de ce qui a été supprimé et stocké
s
. Prend du temps exponentiel dans la longueur de la liste.Dennis a sauvegardé 3 octets avec
pop
.la source
f=lambda l,s=0:l and(sum(l)==s)*l+f(l[1:],s+l[0])+f(l,s+l.pop())
Haskell, 41 octets
L'idée est de vérifier s'il existe une sous-liste
l
dont la somme est égalesum l/2
. Nous générons les sommes de ces sous-listes en tant quescanr(:)[]l>>=scanl(+)0
. Regardons comment cela fonctionne avecl=[1,2,3]
Vieux 43 octets:
Génère la liste
c
des sommes cumulées. Ensuite, vérifie si deux de ces sommes diffèrent ensum l/2
vérifiant s’il s’agit d’un élément de la liste des différences(-)<$>c<*>c
.la source
Pyth,
10 à9 octetsTestez-le dans le compilateur Pyth .
Comment ça marche
la source
En fait, 21 octets
Essayez-le en ligne!
Ce programme affiche un
0
pour les faux cas et un entier positif pour les vrais.Explication:
Version non concurrente, 10 octets
Essayez-le en ligne!
Ce programme génère une liste vide pour les faux cas et une liste non vide sinon. C'est essentiellement une réponse de Dennis's Jelly . Il n’est pas en concurrence car les fonctionnalités de somme cumulative et de différence vectorisée post-datent le défi.
Explication:
la source
Python 2,
76747066 octetsMerci à @xnor pour avoir joué au golf
48 octets!Testez-le sur Ideone . (cas de test plus grands exclus)
la source
n=sum(x)
fairen in ...
; il ne fait pas mal d'utiliser une valeur plus grande pourn
.MATL , 10 octets
La sortie est le nombre de bissectrices.
Essayez-le en ligne!
Explication
Même approche que Julia répond à Dennis .
la source
Rubis,
6053 octetsGénère toutes les partitions possibles en effectuant chaque rotation du tableau d'entrée, puis toutes les tranches de longueur 1 ..
n
, oùn
est la taille du tableau d'entrée. Puis vérifie s'il existe une partition avec une somme égale à la moitié de la somme totale du tableau d'entrée.la source
JavaScript (ES6), 83 octets
Génère toutes les sommes possibles, puis vérifie si la moitié de la dernière somme (somme de la liste complète) apparaît dans la liste. (Générer les sommes dans l’ordre légèrement délicat pour organiser la somme dont je dois être le dernier sauve 4 octets.)
la source
Dyalog APL, 12 octets
Testez-le avec TryAPL .
Comment ça marche
la source
Python 2 , 47 octets
Essayez-le en ligne!
Je suis de retour 2.75 ans plus tard pour battre mon ancienne solution de plus de 25% en utilisant une nouvelle méthode.
Cette version plus longue de 1 octet est un peu plus claire.
Essayez-le en ligne!
L'idée est de stocker l'ensemble des sommes cumulées
t
sous forme de bitsk
, le bit de réglage2*t
indiquant qu'ilt
s'agit d'une somme cumulée. Ensuite, nous vérifions si deux sommes cumulées diffèrent par la moitié de la somme de liste (finalet
) en décalantk
autant ce décalage et en procédant au niveau du bit&
avec l'original pour voir que le résultat est non nul (vérité).la source
APL, 25 caractères
En supposant que la liste est donnée dansX ← 1 2 3 4
.Explication:
Tout d'abord, notez que APL évalue le formulaire de droite à gauche. Ensuite:
X←⎕
prend la saisie de l'utilisateur et la stocke dansX
⍴X
donne la longueur deX
⍳⍴X
les nombres de 1 à⍴X
Le
⍺
et⍵
dans{2×+/⍺↑⍵↓X,X}
sont les arguments gauche et droit d'une fonction dyadique que nous définissons à l'intérieur des accolades.⍺↑⍵↓X,X
partie: ilX,X
suffit de concaténer X avec lui-même;↑
et↓
sont prendre et laisser tomber.+/
réduit / plie+
la liste à sa droiteSo
2 {2×+/⍺↑⍵↓X,X} 1
=2×+/2↑1↓X,X
=2×+/2↑1↓1 2 3 4 1 2 3 4
==
2×+/2↑2 3 4 1 2 3 4
=2×+/2 3
=2×5
=10
.∘.brace⍨idx
est justeidx ∘.brace idx
. (⍨
est la carte en diagonale;∘.
est le produit extérieur)Cela nous donne donc une matrice
⍴X
par⍴X
qui contient deux fois la somme de toutes les sous-listes connectées.La dernière chose à faire est de vérifier si la somme de se
X
situe quelque part dans cette matrice.(+/X)∊matrix
.la source
Brachylog , 6 octets
Essayez-le en ligne!
Les sorties ont réussi ou échoué, étaient imprimées
true.
oufalse.
exécutées comme un programme.la source
C,
161145129 octetsUngolfed essayer en ligne
la source
i<n;i++
ài++<n
(bien que vous ayez peut-être besoin de traiter certains décalages.Haskell, 68 octets
La fonction
f
crée d’abord une liste des sommes de toutes les tranches possibles de la liste donnée. Ensuite, il se compare à la somme totale des éléments de la liste. Si nous obtenons à un moment donné la moitié de la somme totale, alors nous savons que nous avons une bissection. J'utilise aussi le fait que si voustake
oudrop
plus d'éléments que la liste, Haskell ne génère pas d'erreur.la source
Mathematica, 48 octets
Fonction anonyme, semblable en action aux nombreuses autres réponses.
Outer[Plus, #, -#]
, lorsqu’on agit surAccumulate@#
(qui agit à son tour sur la liste d’entrée en donnant une liste de totaux successifs) génère essentiellement le même tableau, comme au bas de la réponse de Leaky Nun.!FreeQ[..., Last@#/2]
vérifie si(Last@#)/2
n'est pas absent du tableau résultant etLast@#
est le dernier des totaux successifs, c'est-à-dire la somme de tous les éléments de la liste d'entrée.Si cette réponse est quelque peu intéressante, ce n’est pas à cause d’un nouvel algorithme, mais plutôt des astuces spécifiques à Mathematica; eg
!FreeQ
est agréable, comparé àMemberQ
, car il ne nécessite pas un aplatissement de la table qu’il vérifie et il enregistre un octet.la source
!FreeQ[2Tr/@Subsequences@#,Tr@#]&
devrait fonctionner, mais je ne disposerai pas de la version 10.4 pour la tester pendant les 10 prochains jours environ.APL (NARS), caractères 95, octets 190
Considérez un tableau d’entrée de 4 éléments: 1 2 3 4. Comment choisir l’utile pour cette partition d’exercice de cet ensemble? D'autres pensent que la partition de ces 4 éléments que nous pouvons utiliser est décrite dans le nombre binaire à gauche:
(1001 ou 1011 ecc pourrait être dans cet ensemble mais nous avons déjà 0110 et 0100 ecc) donc un chapeau pour écrire une fonction qui, à partir du nombre d'éléments du tableau en entrée, construit ces nombres binaires ... ce serait:
celui de l'entrée 1 2 4 8 [2 ^ 0..lenBytesArgument-1] trouve 3 6 12, 7 14, 15; donc trouvez les nombres binaires de ces nombres et utilisez-les pour trouver les bonnes partitions du tableau d’entrée ... j’ai testé la fonction c uniquement pour cette entrée 4 éléments, mais il semble que c’est acceptable pour un nombre d’éléments différent ...
tester:
la source