La description
Les numéros de Chicken McNugget sont des nombres qui peuvent être exprimés comme une somme de 6, 9 ou 20 - les tailles initiales des célèbres boîtes de Chicken McNuggets vendues par McDonald's. Dans cette somme, un nombre peut apparaître plusieurs fois, tout 6 + 6 = 12
comme un tel nombre, et le nombre doit "contenir" au moins une des tailles mentionnées. Les premiers numéros de Chicken McNugget sont:
6
9
6 + 6 = 12
6 + 9 = 15
9 + 9 = 6 + 6 + 6 = 18
20
6 + 6 + 9 = 21
...
Défi
Votre tâche consiste à écrire un programme ou une fonction qui, étant donné un entier positif, détermine si ce nombre peut être exprimé de la manière décrite, il s'agit donc d'un tel nombre Chicken McNugget. Il devrait ensuite produire une valeur vraie ou fausse en fonction de sa décision.
Cas de test
6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte et les lacunes standard s'appliquent!
la source
Réponses:
Python, 27 octets
Essayez-le en ligne!
la source
~
car vous pouvez échanger les sorties.8953174650303
a exactement la même longueur avec0x82492cb6dbf
(bien que moins lisible).Python 3 , 24 octets
Essayez-le en ligne!
Explication
Avec
6
et9
seul, on peut rendre tous les entiers divisibles par3
lesquels sont supérieurs à3
, comme indiqué dans le commentaire des ovs au défi . On suppose que l'on peut également faire0
. En conclusion, on peut faire0,6,9,12,15,...
.Avec une instance de
20
, on peut faire:20,26,29,32,35,...
.Avec deux instances de
20
, on peut faire:40,46,49,52,55,...
.Trois instances ne sont jamais nécessaires, car
3 x 20 = 10 x 6
.Notez que les cas où aucun
20
n'est nécessaire sont également divisibles par 3; les cas où l'on20
est nécessaire laisse un reste de2
; les cas où deux20
sont nécessaires laisse un reste de1
.Le nombre de
20
besoin peut donc être calculé par(-n)%3
. Ensuite, nous faisonsn-(((-n)%3)*20)
pour supprimer le nombre de20
nécessaire du nombre. Nous vérifions ensuite que ce nombre n'est pas négatif, mais ne l'est pas3
.la source
f=lambda n:n%3<1<n-2or n>20and f(n-20)
ça marche?f=
maintenant car il n'est pas récursif.Python 2 , 28 octets
Essayez-le en ligne!
la source
(n%3,n/20)
de votre liste d'exclusion sont{(2, 0), (1, 0), (1, 1)}
. Utiliser à la-n%3
place a donné une inégalitén/20>=(-n)%3
. À partir de là, j'ai joué un peu pour inverser{3,23,43}
qui sont 3 mod 20 sans affecter 63,83, ... J'ai trouvé que le décalage du point de terminaison des inégalités fonctionnait le mieux.Gelée , 11 octets
Essayez-le en ligne!
Comment ça marche
la source
Haskell , 36 octets
Essayez-le en ligne!
Explication
Cette solution est à peu près aussi simple que possible. La première ligne déclare que pour tout nombre inférieur à 1, il s'agit d'un nombre McNugget if
n==0
. C'est-à-dire que0
s'agit d'un nombre McNugget et que tous les nombres négatifs ne le sont pas.La deuxième ligne déclare que pour tous les autres numéros,
n
est un nombre McNugget si elle moins une des tailles Nugget est un nombre McNugget.Il s'agit d'une recherche récursive assez simple.
la source
Python 3 ,
484642 octetsEssayez-le en ligne!
Commutateurs
True
etFalse
.la source
True
etFalse
par défautGelée , 11 octets
Essayez-le en ligne!
Port de ma réponse Python , mais légèrement modifié: soustrayez
20
jusqu'à divisible par3
, puis vérifiez s'il appartient0,6,9,...
en mappant0
sur l'entrée (en utilisantor
), puis vérifiez s'il est supérieur à3
.Les trois seuls nombres qui produisent
0
à la fin de la première étape sont0
,20
ou40
, avec le premier étant hors du domaine, et le reste étant supérieur à3
.la source
Mathematica, 53 octets
la source
FrobeniusSolve
fonction.Mathematica, 30 octets
Essayez-le sur Wolfram Sandbox.
la source
Mathematica, 20 octets
Fonction anonyme. Prend un nombre en entrée et retourne
True
ouFalse
en sortie. Logique copiée de la réponse de Leaky Nun , avec quelques abus supplémentaires deInequality
.la source
Code machine x86-64, 22 octets
Les octets ci-dessus définissent une fonction dans le code machine x86 64 bits qui détermine si la valeur d'entrée est un nombre Chicken McNugget. Le paramètre entier positif unique est transmis dans le
ECX
registre, conformément à la convention d'appel Microsoft 64 bits utilisée sous Windows. Le résultat est une valeur booléenne renvoyée dans leEAX
registre.Mnémoniques d'assemblage non golfés:
De toute évidence, cela joue fortement hors de la solution Anders Kaseorg en Python , en ce sens qu'elle est basée sur un champ de bits représentant les valeurs qui sont des nombres de Chicken McNugget. Plus précisément, chaque bit de ce champ qui correspond à un numéro Chicken McNugget valide est défini sur 1; tous les autres bits sont définis sur 0. (Cela considère 0 comme un nombre valide de Chicken McNugget, mais si vous n'aimez pas cela, votre préférence est une modification à un seul bit.)
Nous commençons par charger simplement cette valeur dans un registre. C'est une valeur de 64 bits, qui prend déjà 8 octets à coder, et nous avons besoin d'un préfixe REX.W d'un octet, donc nous sommes vraiment très dépensiers en termes d'octets, mais c'est le cœur de la solution, donc Je suppose que ça vaut le coup.
Nous décalons ensuite le champ vers la droite de la valeur d'entrée. * Enfin, nous masquons tout sauf le bit de poids faible, et cela devient notre résultat booléen.
Cependant, puisque vous ne pouvez pas décaler de plus que le nombre de bits réellement dans la valeur, cela ne fonctionne que pour les entrées de 0 à 63. Pour prendre en charge des valeurs d'entrée plus élevées, nous insérons un test en haut de la fonction qui se ramifie au bas de la valeur d'entrée est> = 64. La seule chose intéressante à ce sujet est que nous préchargeons la constante de champ de bits dans
RAX
, puis branchons jusqu'à l'instruction qui masque le bit de poids faible, garantissant ainsi que nous renvoyons toujours 1.Essayez-le en ligne!
(L'appel de fonction C y est annoté avec un attribut qui fait que GCC l'appelle à l'aide de la convention d'appel Microsoft que mon code d'assembly utilise. Si TIO avait fourni MSVC, cela ne serait pas nécessaire.)
__
* Comme alternative à un shift, nous aurions pu utiliser l'
BT
instruction x86 , mais c'est 1 octet de plus à encoder, donc aucun avantage. Sauf si nous avons été obligés d'utiliser une convention d'appel différente qui ne transmettait pas commodément la valeur d'entrée dans leECX
registre. Ce serait un problème car ilSHR
faut que son opérande source soitCL
pour un compte de décalage dynamique. Par conséquent, une convention d'appel différente nécessiterait que nousMOV
éditions la valeur d'entrée du registre dansECX
lequel elle a été transmise , ce qui nous coûterait 2 octets. L'BT
instruction peut utiliser n'importe quelle registre comme opérande source, à un coût de seulement 1 octet. Donc, dans cette situation, ce serait préférable.BT
valeur pour mettre le bit correspondant dans l'indicateur de report (CF), vous utiliserez donc unSETC
instruction pour obtenir cette valeur dans un registre entier commeAL
pour qu'elle puisse être renvoyée à l'appelant.Implémentation alternative, 23 octets
Voici une implémentation alternative qui utilise des opérations de modulo et de multiplication pour déterminer si la valeur d'entrée est un nombre Chicken McNugget.
Il utilise la convention d'appel System V AMD64 , qui transmet la valeur d'entrée dans le
EDI
registre. Le résultat est toujours un booléen retournéEAX
.Notez, cependant, que contrairement au code ci-dessus, il s'agit d'un booléen inverse (pour la commodité de l'implémentation). Il renvoie
false
si la valeur d'entrée est un nombre Chicken McNugget outrue
si la valeur d'entrée n'est pas un nombre Chicken McNugget.Ce qui est laid à ce sujet, c'est la nécessité de gérer explicitement les valeurs d'entrée> = 43 par une comparaison et une branche en haut. Il existe évidemment d'autres façons de le faire qui ne nécessitent pas de branchement, comme l'algorithme de caird coinheringaahing , mais cela prendrait beaucoup plus d'octets à coder, ce n'est donc pas une solution raisonnable. Je pense qu'il me manque probablement une astuce de twiddling qui rendrait cela plus élégant et serait moins d'octets que la solution basée sur le champ de bits ci-dessus (car l'encodage du champ de bits lui-même prend tellement d'octets), mais j'ai étudié cela pour un moment et ne peut toujours pas le voir.
Eh bien, essayez quand même en ligne !
la source
05AB1E,
1716 octetsEssayez-le en ligne!
Explication
la source
…
pour la chaîne (il y a buitins pour 1, 2 et chaînes 3 caractères, étant'
,„
et…
respectivement). J'ai l'impression que l'on peut jouer davantage au golf, peut-être en utilisant une approche différente, mais quelle que soit la bonne première réponse. +1 de moi.Åœ
:… ÇIÅœåPOĀ
. C'est une approche complètement différente, donc si vous voulez que je l'affiche comme réponse séparée plutôt que comme un de vos golfs, faites le moi savoir. PS: je ne suis pas sûr à 100% si les non imprimables sont autorisés dans la page de code 05AB1E . Dans ce cas, le codage pourrait devoir être différent, ce qui ferait que certains caractères compteraient à la place pour 2 octets chacun. Dans ce cas, celaŽBo21в
pourrait être une alternative pour +1 octet.ŽGç₂в
place de la chaîne tout en enregistrant simultanément un octet dans le processus.JavaScript (ES6),
6964 octetsAfficher l'extrait de code
Sorties
false
pour les numéros de Chicken McNugget,true
sinon.la source
n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))
pour 63 octetsJava,
215724 octetsEssayez-le en ligne!
Golfé:
Non golfé:
la source
26 = 20 + 6
.Python 2, 51 bytes
-1 byte thanks to @LeakyNun
Try it online! Footer prints all non McNugget numbers
la source
n%3
can only be 0 or 1 or 2, son%3==2
is equivalent ton%3>1
.Pyth, 15 bytes
Try it online!
The string contains the characters corresponding to codepoints 6, 9, and 20.
la source
Haskell,
6456 bytesI didn't do any bit trickery, but looking at the other answers it might actually be shorter to import the
Bits
module and use those methods. This approach checks much more directly.la source
66
not64
. But you you can save a lot of parenthesis and put anx/=0
guard to save some bytes, see here.Javascript,
927872 bytes*saved 14 bytes thanks to @Jonasw
Uses the fact that "All integers are McNugget numbers except 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34, 37, and 43." from @LeakyNun's comment
la source
APL (Dyalog), 19 bytes
with
⎕IO←0
Same algorithm with Dennis's answer
Try it online!
la source
Retina, 26 bytes
Try it online!
la source
Add++, 35 bytes
Try it online!
Look ma, no while loops. Or strings. Or lists. Or really anything that helps save bytes. But mainly because Add++ doesn't know what any of those are.
3 months later, I realised that this was invalid, and fixed it. Somehow, that golfed it by 13 bytes. This is a function that takes one argument and tests whether that argument is a Chicken McNugget number or not.
How it works
la source
Excel, 87 bytes
Alternatively, 92 bytes:
la source
PHP, 69+1 bytes
exits with
1
for a Chicken McNugget Number,0
else.Run as pipe with
-n
or try it online.la source
Python 2, 61 bytes
Try it online!
la source
chr
.Mathematica, 59 bytes
la source
Javascript 37 bytes
Takes a positive integer
n
and outputstrue
for Chicken McNugget numbers andfalse
for others.Explanation
The recursion on this function is heinous, and for any sufficiently large
n
, you will exceed call stack limits. Here's a version that avoids those limits by checking ifn
is larger than the largest non-Chicken McNugget number (43 bytes [bonus points for being the largest non-Chicken McNugget number?]):Show code snippet
la source
JavaScript ES5, 46 bytes
Explicit boolean answer, 50 bytes:
Clumsy, but it gets the job done. Returns
false
or0
for every value that isn't 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34, 37, or 43, andtrue
,-1
, or1
for everything else.Explicit solution returns
true
orfalse
only.la source
Clojure 33 bytes
An on ok quick attempt:
#(-> %(rem 20)(rem 9)(rem 6)(= 0))
la source
Pari/GP, 48 bytes
0
is falsy. everything else is truthy.Try it online!
la source
0.25
test case.