Écrivez une fonction qui prend une liste d'entiers positifs et renvoie une liste d'entiers approximativement le pourcentage du total pour l'entier correspondant dans la même position.
Tous les entiers dans la liste de retour doivent correspondre exactement à 100. Vous pouvez supposer que la somme des entiers transmis est supérieure à 0. La façon dont vous voulez arrondir ou tronquer les décimales dépend de vous tant que tout entier résultant résultant est renvoyé en pourcentage n'est pas décalé de plus de 1 dans les deux sens.
p([1,0,2]) -> [33,0,67] or [34,0,66]
p([1000,1000]) -> [50,50]
p([1,1,2,4]) -> [12,12,25,51] or [13,12,25,50] or [12,13,25,50] or [12,12,26,50]
p([0,0,0,5,0]) -> [0,0,0,100,0]
C'est le code-golf , donc le code le plus court en octets gagne!
code-golf
array-manipulation
DaveAlger
la source
la source
p([2,2,2,2,2,3])
. Il a de nombreuses réponses juridiques possibles, mais toutes ne2
peuvent pas être mappées à la même valeur. Cela élimine de nombreux algorithmes trop simples qui fonctionnent sur tous les cas de test précédents car l'arrondi n'est pas trop mauvais.p([1000,1000]) -> [49,51]
?Réponses:
Dyalog APL,
211916 octetsCe qui précède est un équivalent de train de
Essayez-le en ligne.
Comment ça marche
la source
TI-BASIC,
262316 octetsPour les calculatrices de la série TI-83 + / 84 +.
Merci à @Dennis pour un bel algorithme! Nous prenons la somme cumulée de la liste après la conversion en pourcentages, puis au sol, clouons un 0 sur le devant et prenons les différences.
ᴇ2
est un octet plus court que100
.Au même nombre d'octets:
Fait amusant:
%
est un jeton de deux octets qui multiplie un nombre par 0,01, mais il n'y a aucun moyen de le saisir dans la calculatrice! Vous devez soit modifier la source à l'extérieur, soit utiliser un programme d'assemblage.Ancien code:
La première ligne calcule tous les pourcentages au sol, puis la deuxième ligne ajoute 1 aux premiers
N
éléments, oùN
est le pourcentage restant.cumSum(
signifie "somme cumulée".Exemple avec
{1,1,2,4}
:Nous n'en aurons pas
N>dim([list]
, car aucun pourcentage n'est diminué de plus de 1 dans le revêtement de sol.la source
int(
,sum(
,Ans
, etc.) occupent un seul octet.%
symbole? J'aurais pensé qu'il pourrait être trouvé dans le catalogue de symboles ... Aussi, je devrais sortir ma TI-84 + Silver. Je ne l'ai pas utilisé depuis un moment. Block Dude est génial.CJam,
252322 octetsMerci à @ Sp3000 pour 25 → 24.
Essayez-le en ligne.
Comment ça marche
la source
Mathematica, 41 octets
la source
N
éléments, oùN
est le pourcentage restant.J (8.04 bêta) , 59 octets (30 octets volés)
Port J littéral de 30 octets de la réponse APL de Dennis :
59 octets de réponse, le mieux que je puisse faire moi-même:
(Sur la base du reste devant atteindre les valeurs les plus élevées, pas plus de +1 chacune, réparties sur plusieurs valeurs dans le cas d'un reste> 1 ou d'une égalité pour la valeur la plus élevée).
par exemple
Explication
f=.3 : 0
- 'f' est une variable, qui est un type de verbe (3), défini ci-dessous (: 0):p=.
variable 'p', construite à partir de:y
est une liste de nombres1 0 2
+/y
est '+' mis entre chaque valeur '/', la somme de la liste3
y % (+/y)
est les valeurs y originales divisées par la somme:0.333333 0 0.666667
100 * (y%+/y)
est 100x ces valeurs:33.33.. 0 0.66...
pour obtenir les pourcentages.<. (100*y%+/y)
est l'opérateur de plancher appliqué aux pourcentages:33 0 66
r=.
variable 'r', construite à partir de:+/p
est la somme des pourcentages plancher:99
100 - (+/p)
est 100 - la somme ou les points de pourcentage restants nécessaires pour faire la somme des pourcentages à 100.r $ 1
est une liste de 1, tant que le nombre d'éléments que nous devons incrémenter:1 [1 1 ..]
#p
est la longueur de la liste de pourcentage(#p - r)
est le nombre d'éléments qui ne seront pas incrémentés(#p-r) $ 0
est une liste de 0 tant que ce nombre compte:0 0 [0 ..]
((r$1) , (#p-r)$0)
est la liste des 1 suivie de la liste des 0:1 0 0
\: p
est une liste d'index à partirp
de laquelle le mettre en ordre décroissant./: (\:p)
est une liste d'index à partir\:p
de laquelle mettre en ordre croissant((r$1),(#p-r)$0)/:\:p
prend les éléments du 1 1 0 0 .. .. liste de masque et le tri donc il y a 1 s dans les positions des pourcentages les plus élevés, un pour chaque numéro nous avons besoin d'incrémenter et 0s pour d' autres numéros:0 0 1
.p + ((r$1),(#p-r)$0)/:\:p
est les pourcentages + le masque, pour faire la liste des résultats qui résume à 100%, qui est la valeur de retour de la fonction.par exemple
et
)
fin de définition.Je ne suis pas très expérimenté avec J; Je ne serais pas trop surpris s'il y avait une "liste de tours en pourcentages du total" opération intégrée, et une manière plus propre de "incrémenter n les plus grandes valeurs" aussi. (C'est 11 octets de moins que ma première tentative).
la source
list[0:100-n] + list[:-100-n]
approche - et je n'ai pas pensé à une autre façon de l'aborder.JavaScript (ES6), 81 octets
Cette condition "doit être égal à 100" (plutôt que d'arrondir et d'additionner) a presque doublé mon code (de 44 à 81). L'astuce consistait à ajouter un pot pour les valeurs décimales qui, une fois qu'il atteint 1, prend 1 de lui-même et l'ajoute au nombre actuel. Le problème était alors les virgules flottantes, ce qui signifie que quelque chose comme [1,1,1] laisse un reste de .9999999999999858. J'ai donc changé le chèque pour qu'il soit supérieur à .999, et j'ai décidé d'appeler cela assez précisément.
la source
Haskell,
4227 octetsÀ peu près la méthode triviale à Haskell, avec quelques espaces supprimés pour le golf.
Console (supports inclus pour être cohérent avec l'exemple):
Edit: pratiqué mon putting, fait des remplacements évidents.
Original:
la source
Gelée , 7 octets
-2 merci à Dennis, me rappelant d'utiliser une autre nouvelle fonctionnalité (
Ä
) et d'utiliser à la:
place de ce que j'avais initialement.Essayez-le en ligne!
Gelée , 11 octets
Essayez-le en ligne!
Fait aux côtés de caird coinheringaahing et user202729 dans le chat .
Comment ça marche
la source
Haskell,
635655 octetsla source
Perl, 42 octets
Basé sur l'algorithme de Dennis
Comprend +1 pour
-p
Exécuter avec la liste des numéros sur STDIN, par exemple
percent.pl
:la source
Octave, 40 octets
la source
Python 2, 89 octets
la source
Brain-Flak , 150 octets
Essayez-le en ligne!
Partant de la fin et travaillant en arrière, ce code garantit à chaque étape que la somme des numéros de sortie jusqu'à présent est égale au pourcentage total rencontré, arrondi vers le bas.
la source
JavaScript (ES6) 60
63 95Adapté et simplifié de ma (mauvaise) réponse à un autre défi
Thk à @ l4m2 pour avoir découvert que c'était faux aussi
Correction de l'enregistrement de 1 octet (et 2 octets de moins, sans compter le nom
F=
)Testez l'exécution de l'extrait ci-dessous dans n'importe quel navigateur compatible EcmaScript 6
la source
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,980]
any single resulting integer returned as a percentage is off by no more than 1 in either direction.
Rouille, 85 octets
Cela utilise des vecteurs au lieu de tableaux car, à ma connaissance, il n'y a aucun moyen d'accepter des tableaux de plusieurs longueurs différentes.
la source
JavaScript, 48 octets
la source
Jq 1,5 , 46 octets
Étendu
Essayez-le en ligne!
la source
PHP, 82 octets
prend l'entrée des arguments de la ligne de commande, imprime les pourcentages délimités par un trait de soulignement.
Courez avec
-nr
ou essayez-le en ligne .la source
15_15_15_15_15_25
quand on lui donne l'entrée[2,2,2,2,3]
, ce qui n'est pas correct car3/13 ~= 23.1%