La mise en place:
Un réseau social rapporte le nombre de votes d'une publication de deux manières: le nombre de votes positifs nets (nombre total de votes positifs - nombre total de votes négatifs) et le % de votes qui étaient des votes positifs , arrondi à l'entier le plus proche (0,5 arrondi). Le nombre de votes positifs nets est un entier (pas nécessairement positif), et le second est garanti comme étant un entier compris entre 0 et +100 inclus. Le nombre de votes positifs et le nombre de votes négatifs sont tous deux des nombres entiers 32 bits positifs ou nuls (vous pouvez spécifier signé ou non signé). Supposons que s'il n'y a aucun total de votes, le pourcentage de votes positifs est signalé comme nul.
Le défi:
Compte tenu de ces deux entiers (votes positifs nets et% votes positifs), quel est le programme le plus court que vous pouvez écrire qui détermine le plus petit nombre total de votes positifs que le message a reçus, avec toutes les contraintes ci-dessus satisfaites?
Les contraintes d'entrée sont garanties. Si l'entrée ne satisfait pas aux contraintes ci-dessus, le comportement du programme dépend de vous. Bravo en prime s'il n'entre pas dans une boucle infinie ou s'il tombe en panne. Pensez à renvoyer un nombre négatif si vous souhaitez plus de conseils.
Règles générales:
- Il s'agit de code-golf , donc la solution valide la plus courte (mesurée en octets) l'emporte.
- Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. Bravo en prime pour un langage Web côté client comme Javascript.
- Si vous avez des solutions intéressantes dans plusieurs langues, postez-les séparément .
- Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres et le type de retour appropriés, ou des programmes complets. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code.
- Veuillez également ajouter une explication du fonctionnement du code.
- Gardez à l'esprit que si vous effectuez une opération de division entière qui tronque (par exemple 20/3 = 6) plutôt que des arrondis , cela pourrait ne pas être entièrement correct.
- Des cas de test supplémentaires qui explorent les cas limites dans les contraintes ci-dessus sont les bienvenus.
- Alors que le type de retour attendu est numérique, le booléen "false" peut être utilisé à la place de 0 .
Exemples de cas de test:
La première colonne est juste un numéro de référence inclus pour faciliter la discussion.
ref net %up answer
1 0 0 => 0
2 -5 0 => 0
3 -4 17 => 1
4 -3 29 => 2
5 -2 38 => 3
6 -1 44 => 4
7 0 50 => 1
8 5 100 => 5
9 4 83 => 5
10 3 71 => 5
11 2 63 => 5
12 1 56 => 5
13 1234 100 => 1234
14 800 90 => 894 (tip: don't refer to this as the "last test case;" others may be added.)
1000, 100
. Pouvez-vous confirmer que la réponse attendue est1000
?Réponses:
JavaScript (ES6), 47 octets
Prend la saisie dans la syntaxe de curry
(n)(p)
, où n est le nombre de votes positifs nets et p est le pourcentage de votes positifs. Peut revenirfalse
pour0
.Essayez-le en ligne!
Commenté
Cas de bord
Soit F n (u) = u / (u - n / 2) * 50 + 0,5
Si u = 0 et n = 0 , alors F n (u) = NaN et F n (u) XOR p = p . Donc, nous retournons u = 0 si n = p = 0 (première itération du premier cas de test) ou continuons avec la récursion si p! = 0 (première itération du 7ème cas de test).
Si u> 0 et u = n / 2 , alors F n (u) = + Infinity et - encore - F n (u) XOR p = p . À moins que p = 0 , nous continuons simplement avec l'itération suivante. (Cela se produit dans les 9e et 11e cas de test.)
la source
Stax , 17 octets
Exécuter et déboguer
C'est la force brute. Il commence par 0 pour les votes positifs candidats et augmente jusqu'à ce qu'il satisfasse la formule.
Déballé, non golfé et commenté, il ressemble à ceci.
Exécutez celui-ci
la source
Propre ,
114107104 octetsEssayez-le en ligne!
Définit la fonction
$ :: Int Int -> Real
, où les arguments sont des entiers signés et la valeur de retour est un flottant double précision exactement représentable par un entier signé 32 bits.Il vérifie chaque valeur de
c
dans l'équationb=-cd/(d+1)
pour trouver uneb
réponse satisfaisantea+c=b
etb/(b+c)=d
, puisque le plus petitc
donne le plus petitb
, prend le premier élément de l'ensemble de toutes les solutions.la source
05AB1E , 13 octets [légèrement cassé]
Essayez-le en ligne!
Explication:
Pour résoudre ce problème, j'ai supposé les entrées a, b et le résultat attendu x. Compte tenu des informations dans la configuration, cela m'a donné l'équation:
Réorganiser pour x donne
Le seul cas de test pour lequel cela ne fonctionne pas est 0, 50 - j'ai simplement codé en dur pour vérifier cela.
la source
Go 1.10, 154 octets
Essayez-le sur Go Playground! (TIO exécute Go 1.9, qui n'a pas de calcul mathématique).
Version non golfée
Afin d'ajouter une explication, la formule ci-dessus pour r peut être dérivée en résolvant simultanément
n=v-d
etu = 100 * v/(v + d)
pour v, où v et d sont le nombre de votes positifs et négatifs respectivement. La formule dérivée n'est pas définie pour v = 50, nous devons donc gérer ce cas (ce que nous faisons avec la première instruction if).la source