Crédit aux Geobits en TNB pour l'idée
Un article sans suffisamment de détails a récemment proposé un jeu intéressant:
2 enfants sont assis devant une gamme de bonbons. Chaque bonbon est numéroté de 1 à x
, avec x
la quantité totale de bonbons présents. Il y a exactement 1 occurrence de chaque nombre.
Le but du jeu est que les enfants mangent des bonbons et multiplient les valeurs des bonbons qu'ils ont mangés pour arriver à un score final, le score le plus élevé gagnant.
Cependant, le message d'origine a manqué des informations clés, telles que la façon dont les bonbons sont sélectionnés, de sorte que les enfants de notre histoire ont décidé que le plus âgé allait d'abord et pouvait manger jusqu'à la moitié des bonbons, mais une fois qu'il annonçait la fin de son tour, il ne peut pas changer d'avis.
Un des enfants de ce jeu n'aime pas les bonbons, alors il veut manger le moins possible, et il a vu son père écrire une fois du code une fois, et il peut utiliser les compétences acquises pour calculer la quantité de bonbons il a besoin de manger pour assurer la victoire, tout en mangeant le moins possible.
Le défi
Étant donné le nombre total de bonbons x
, votre programme ou fonction devrait produire la plus petite quantité de bonbons qu'il doit manger pour assurer la victoire n
, même si son adversaire mange tous les bonbons restants.
Naturellement, de plus grands nombres font de plus grands nombres, donc quelle que soit la quantité que vous lui donnerez, il mangera le n
plus grand nombre.
Les règles
x
sera toujours un entier positif dans la plage0 < x! <= l
oùl
est la limite supérieure des capacités de gestion des nombres de votre langue- Il est garanti que l'enfant mange toujours le
n
plus grand nombre, par exemple pourx = 5
etn = 2
, il mange4
et5
Cas de test
x = 1
n = 1
(1 > 0)
x = 2
n = 1
(2 > 1)
x = 4
n = 2
(3 * 4 == 12 > 1 * 2 == 2)
x = 5
n = 2
(4 * 5 == 20 > 1 * 2 * 3 == 6)
x = 100
n = 42
(product([59..100]) > product([1..58]))
x = 500
n = 220
(product([281..500]) > product([1..280]))
Notation
Malheureusement, notre courageux concurrent n'a rien avec qui écrire son code, il doit donc disposer les bonbons en caractères du code, par conséquent, votre code doit être aussi petit que possible, le plus petit code en octets gagne!
la source
x = 0
également être géré, depuis0! = 1
? (Peut-êtrex
devrait - on également spécifier un entier positif?)Réponses:
Python 3 , 76 octets
Essayez-le en ligne!
S'appuie sur le fait que pour mangern bonbons pour gagner encore et le nombre total de bonbons étant x , x!(x−n)!>(x−n)! doit être vrai, ce qui signifiex!>((x−n)!)2 .
-1 de Skidsdev
-3-6 de BMO-3 de Sparr
+6 à corriger
x = 1
la source
from math import factorial as F
n*(F(x)>F(x-n)**2)or f(x,n+1)
. De mêmex<2or x*F(x-1)
pour le premier qui est plus court que l'importation.import math;F=math.factorial
lesquels je devrais probablement aller trouver la méta des astuces python à mentionner ...F=lambda x:x<2or x*F(x-1)
est-ce que trois octets de moins?JavaScript (ES6), 53 octets
Essayez-le en ligne!
Plage de travail
Fait intéressant, les différences entre les produits pour enfants sont toujours suffisamment importantes pour que la perte de précision inhérente au codage IEEE 754 ne soit pas un problème.
Par conséquent, cela fonctionne pour0≤n≤170 . Au-delà, à la fois la mantisse et le débordement d'exposant (donnant + Infinity ) et nous aurions besoin de BigInts (+1 octet).
Comment?
Soitp le bonbon de l'autre enfant et q soit notre propre bonbon.
On commence parp=n! (tous les bonbons pour l'autre enfant) et q=1 (rien pour nous).
On répète les opérations suivantes jusqu'àq≥p :
Le résultat est le nombre d'itérations requises. (À chaque itération, nous «prenons le bonbon suivant de l'autre enfant».)
Commenté
Ceci est implémenté comme une fonction récursive unique qui calcule d'abordn ! puis entre dans la boucle décrite ci-dessus.
la source
Gelée , 9 octets
Essayez-le en ligne! Ou consultez la suite de tests .
Comment?
la source
R ,
704138 octets-29 parce que Dennis connaît toutes les fonctions internes
-3 commutation sur l'entrée scan ()
Essayez-le en ligne!
Implémentation R assez simple de la réponse Python3 de nedla2004 .
J'ai l'impression qu'il y a une mise en œuvre plus propre de la manipulation 1, et j'aimerais perdre les accolades.Je suis fou, je n'ai pas recommencé à utiliser une approche qui, plus fou que j'ai utilisé un strict moins que, mais encore plus fou que je ne savais pas qu'il y avait une
cumprod()
fonction. Grande optimisation par Dennis.la source
APL (Dyalog Unicode) , 10 octets
Essayez-le en ligne!
Réponse de Port of Dennis . Merci à, bien, Dennis pour cela.
Comment:
Étant donné que cette réponse n'a pas été strictement faite par moi, je garderai ma réponse d'origine ci-dessous.
APL (Dyalog Unicode) ,
14 1211 octetsEssayez-le en ligne!
Fonction tacite de préfixe. Fondamentalement, un port Dyalog de la réponse de Jonathan .
Merci à ngn et H.PWiz pour l'aide dans le chat. Merci aussi à ngn de m'avoir sauvé un octet.
Merci à Dennis d'avoir souligné que mon code d'origine était incorrect. Il s'avère que cela m'a sauvé 2 octets.
Utilise
⎕IO←0
.Comment:
la source
+/
entre les parenthèses, une des compositions peut être omise:(+/!>×\)⌽∘⍳
Haskell ,
5251 octetsEssayez-le en ligne!
la source
Gelée , 7 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Python 3 ,
183176149 149 octetsEssayez-le en ligne!
C'est beaucoup plus rapide que certaines autres solutions - multiplications 0 (N) au lieu de O (N²) - mais je n'arrive pas à réduire la taille du code.
-27 de Jo King
la source
Nettoyer , 57 octets
Essayez-le en ligne!
Une solution simple.
la source
05AB1E ,
1511 octetsEssayez-le en ligne!
Utilise la même approche que ma soumission Python . Très nouveau sur 05AB1E, donc tous les conseils sur le code ou les explications sont grandement appréciés.
-4 octets grâce à Kevin Cruijssen
la source
1
. Si l'instruction if est véridique, elle poussera l'indexN
vers la pile et quittera le programme (sortie implicite de cet index). Pour l'entrée,1
l'instruction if sera falsey, mais elle affichera1
implicitement son entrée après cette boucle à une seule itération.!
, maintenant que la pile est vide puisque nous ne dupliquons / tripliquons plus le résultat if.1
produisant l'entrée implicitement lorsque la pile est vide. :)Gelée , 14 octets
Essayez-le en ligne!
Gère 1 correctement.
la source
charbon , 20 octets
Essayez-le en ligne!Le lien est vers la version détaillée du code. Explication:
Product
sur une liste vide dans Charcoal renvoieNone
plutôt que1
, donc je dois le logiquementOr
.la source
PHP , 107 octets
Essayez-le en ligne!
Utilise le mêmeX2> ( ( x - 1 ) ! )2 méthode que d'autres ont utilisé.
Utilise la fonction factorielle de la soumission PHP pour ce défi (merci à @ donutdan4114)
la source
Wolfram Language (Mathematica) , 43 octets
Essayez-le en ligne!
la source
05AB1E , 7 octets
Port de Dennis ♦ 'Jelly answer , alors assure-toi de voter pour lui si tu aimes cette réponse!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Japt
-x
, 7 octetsSolution de gelée du port de Dennis.
Ne fonctionne que dans la pratique jusqu'à ce
n=4
que nous entrions dans la notation scientifique ci-dessus.Essayez-le
la source
C # (.NET Core) , 93 octets
Essayez-le en ligne!
Basé sur la réponse javascript de @ Arnauld.
la source
C (gcc) , 68 octets
Essayez-le en ligne!
Edit: échange d'octets contre mults, pas de faire 2 * x mults au lieu de x + n
Edit: revenir à int au lieu de long par macro. Échouerait à 34 ans avec long.
Eh bien, je l'ai dans C. Échoue à 21 ans.
Il y a une ambiguïté possible quant à savoir si le bon garçon veut toujours gagner ou ne jamais perdre ... qu'en pensez-vous?
la source
Python 3 , 75 octets
Essayez-le en ligne!
Version 74 octets
mais cette version a débordé pour 500 ...
la source