introduction
Étant donné un ensemble de pourcentages de choix dans un sondage, calculez le nombre minimum d'électeurs qu'il doit y avoir dans le sondage pour générer ces statistiques.
Exemple: Quel est votre animal préféré?
- Chien:
44.4%
- Chat:
44.4%
- Souris:
11.1%
Sortie: 9
(nombre minimum d'électeurs possible)
Spécifications
Voici les exigences de votre programme / fonction:
- Vous disposez d'un tableau de valeurs de pourcentage en entrée (sur stdin, comme argument de fonction, etc.)
- Chaque pourcentage est un nombre arrondi à une décimale (par exemple,
44.4 44.4 11.1
). - Calculez le nombre minimum possible d'électeurs dans le sondage dont les résultats donneraient ces pourcentages exacts lorsqu'ils sont arrondis à une décimale (sur stdout ou valeur de retour de fonction).
- Bonus : -15 caractères si vous pouvez résoudre de manière "non triviale" (c'est-à-dire, n'implique pas d'itérer sur tous les # d'électeurs possibles jusqu'à ce que vous trouviez le premier qui fonctionne)
Exemple
>./pollreverse 44.4 44.4 11.1
9
>./pollreverse 26.7 53.3 20.0
15
>./pollreverse 48.4 13.7 21.6 6.5 9.8
153
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6
2000
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7
667
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7
2000
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8
401
Notation
Il s'agit de code-golf, donc les personnages les plus courts possibles gagnent. Tous les bonus sont encore soustraits du nombre total de personnages.
code-golf
math
reverse-engineering
mellamokb
la source
la source
26.7 53.3 20.0
(4 8 3 de 15),48.4 13.7 21.6 6.5 9.8
(74 21 33 10 15 de 153) etc.0.5%
du total, et chaque fois qu'il y a un arrondi vers le haut, vous ajoutez0.5%
au total. Les quatre derniers cas de test ont été délibérément construits pour exploiter de manière optimale ce phénomène. Dans le premier cas de test qui en résulte2000
, chacune des 9 premières entrées représente le1
vote (et sont toutes arrondies0.5%
), tandis que la dernière représente les1991
votes (et est arrondie vers le bas ~0.5%
). Si vous calculez ces pourcentages manuellement et arrondissez à 1 décimale, vous verrez qu'ils sont tous corrects.Réponses:
APL (Dyalog Classic) ,
4843 octets-5 octets par Adám
Programme complet en prenant l'entrée de stdin.
Essayez-le en ligne! Le lien est vers la version dfn.
Non golfé
Essayez-le en ligne!
normalize
divise (÷
) tous les éléments de son argument de droite (⊢
) par sa somme (+/
).round(y)
arrondit y à 3 décimales en formatant (⍕
) puis en évaluant (⍎
) chaque élément de y.find_max(y)
renvoie un tableau avec 1 où max (y) est trouvé et 0 ailleurs.increase(x,y)
prend x (les pourcentages des objectifs) et y (le tableau des totaux de vote actuels) et calcule où ajouter 1 en y pour rapprocher les pourcentages de x.vote_totals(x,y)
prend x (les pourcentages d'objectif) et y (le total des votes de départ) et exécute f à plusieurs reprises, en ajoutant des votes jusqu'à ce que les pourcentages soient arrondis à x.f ⍣ g
signifie d'exécuter àf
plusieurs reprises jusqu'à ce queg(y,f(y))
soit vrai. Dans ce cas, nous ignoronsf(y)
.h(x)
met y à 0 (équivalent à un tableau de 0 en raison de la vectorisation), exécute g et additionne le total des votes finaux.la source
Python, 154
Cela fonctionne pour le dernier exemple maintenant.
L'exemple s'exécute:
la source
99.1
comme la dernière valeur1/2000 = 0.05%
(0.1%
arrondi) et1991/2000 = 99.55%
(99.6%
arrondi). Donc, s'il y a dix options dans un sondage et que neuf d'entre elles sont votées pour une fois tandis que la dernière obtient 1991, alors cela donnerait ces pourcentages.J, 57 caractères
J'ai utilisé la méthode triviale. Il prend l'entrée du clavier.
t
crée une table de recherche et la deuxième ligne recherche l'entrée dans la table. Je peux fournir une explication détaillée du code si quelqu'un est intéressé.J'avais cherché à utiliser le pourcentage pour créer une fraction, puis à obtenir la forme la plus basse de la fraction pour déterminer le nombre, mais je ne pouvais pas trouver un moyen de le faire fonctionner avec l'arrondi des résultats.
la source
Python, 154
la source
[0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,99.6]
?1/2000 = 0.05%
(0.1%
arrondi) et1991/2000 = 99.55%
(99.6%
arrondi). Le total est donc de 100%, mais l'arrondi le rend vraiment déroutant.VBA - 541
Cela a des erreurs flagrantes, mais c'était ma tentative de trouver une solution non triviale / en boucle jusqu'à ce que j'obtienne le bon numéro. Je ne l'ai pas entièrement joué au golf, bien que je ne pense pas qu'il y ait beaucoup à ajouter à cet égard. Cependant, j'ai passé trop de temps là-dessus et ça me fait mal à la tête maintenant. Sans oublier que les règles sont probablement très brisées et s'appliquent plus ou moins à ces exemples uniquement.
Cela fonctionne très bien pour de nombreux tests simples que j'ai exécutés (c'est-à-dire même des totaux, 2 ou 3 entrées) mais cela échoue pour certains des tests présentés par le défi. Cependant, j'ai trouvé que si vous augmentez la précision décimale de l'entrée (en dehors de la portée du défi), la précision s'améliore.
Une grande partie du travail consiste à trouver le gcd pour l'ensemble des nombres fournis, et j'ai en quelque sorte réussi à le faire
Function g()
, bien qu'il soit à coup sûr incomplet et probablement une source d'au moins certaines des erreurs dans mes sorties.L'entrée est une chaîne de valeurs délimitée par des espaces.
Cas de test (entrée ==> attendu / retourné):
la source
Debug.Print
enDebug.?
C # (.NET Core) , 286 octets
Essayez-le en ligne!
Beaucoup d'octets enregistrés grâce à Peter Taylor et Embodiment of Ignorance
la source
}
à la fin.Zip
méthode Linq .1>0
est plus court quetrue
, il est préféré.Python 3 ,
140139137 137 octetsEssayez-le en ligne!
Donne la bonne réponse pour les deux premiers cas de test et se heurte aux limites de récursivité de Python pour les autres. Ce n'est pas très surprenant, car chaque vérification est effectuée à un nouveau niveau de récursivité. C'est court, cependant ...
(Une explication des variables utilisées peut être trouvée dans le lien TIO)
devrait fonctionner pour 136 octets, mais ne fonctionne pas en raison de la précision du flottant.
la source