Descripción
Los números de Chicken McNugget son números que se pueden expresar como una suma de 6, 9 o 20, los tamaños iniciales de las famosas cajas de Chicken McNugget vendidas por McDonald's. En esa suma, un número puede aparecer más de una vez, también lo 6 + 6 = 12
es, y el número debe "contener" al menos uno de los tamaños mencionados. Los primeros números de Chicken McNugget son:
6
9
6 + 6 = 12
6 + 9 = 15
9 + 9 = 6 + 6 + 6 = 18
20
6 + 6 + 9 = 21
...
Reto
Su tarea es escribir un programa o función, que, dado un número entero positivo, determina si este número puede expresarse de la manera descrita, por lo tanto, es un número de Chicken McNugget. Luego debería generar un valor verdadero o falso basado en su decisión.
Casos de prueba
6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
Este es el código de golf , por lo que gana la respuesta más corta en bytes y se aplican las lagunas estándar.
fuente
Respuestas:
Python, 27 bytes
Pruébalo en línea!
fuente
~
porque puede intercambiar las salidas.8953174650303
tiene exactamente la misma longitud con0x82492cb6dbf
(aunque menos legible).Python 3 , 24 bytes
Pruébalo en línea!
Explicación
Con
6
y9
solos, se puede hacer todos los números enteros divisibles por3
lo que son mayores que3
, como se dice en el comentario de ovs al desafío . Se supone que también se puede hacer0
. En conclusión, uno puede hacer0,6,9,12,15,...
.Con una instancia de
20
, uno puede hacer:20,26,29,32,35,...
.Con dos instancias de
20
, uno puede hacer:40,46,49,52,55,...
.Tres instancias nunca son necesarias, para
3 x 20 = 10 x 6
.Tenga en cuenta que los casos en los que no
20
se necesita también es divisible por 3; los casos donde20
se necesita uno deja un resto de2
; los casos en que20
se necesitan dos dejan un resto de1
.Por lo tanto, el número de
20
necesarios puede calcularse mediante(-n)%3
. Luego, hacemosn-(((-n)%3)*20)
para eliminar el número de20
necesarios del número. Luego verificamos que este número no es negativo, pero no lo es3
.fuente
f=lambda n:n%3<1<n-2or n>20and f(n-20)
¿Eso funciona?f=
ahora ya que no es recursivo.Python 2 , 28 bytes
Pruébalo en línea!
fuente
(n%3,n/20)
su lista excluida son{(2, 0), (1, 0), (1, 1)}
. Usar en-n%3
cambio dio una desigualdadn/20>=(-n)%3
. A partir de ahí, jugué un rato para revertir{3,23,43}
cuáles son 3 mod 20 sin afectar 63,83, ... encontré que cambiar el punto final de desigualdad para estos funcionó mejor.Jalea , 11 bytes
Pruébalo en línea!
Cómo funciona
fuente
Haskell , 36 bytes
Pruébalo en línea!
Explicación
Esta solución es tan sencilla como puede ser. La primera línea declara que para cualquier número menor que 1 es un número de McNugget si
n==0
. Es decir que0
es un número de McNugget y todos los números negativos no lo son.La segunda línea declara que para todos los demás números,
n
es un número de McNugget si menos uno de los tamaños de Nugget es un número de McNugget.Esta es una búsqueda recursiva bastante simple.
fuente
Python 3 ,
484642 bytesPruébalo en línea!
Interruptores
True
yFalse
.fuente
True
y,False
de forma predeterminadaJalea , 11 bytes
Pruébalo en línea!
Puerto de mi respuesta de Python , pero ligeramente modificado: reste
20
hasta que sea divisible por3
, luego verifique si pertenece al0,6,9,...
mapeo0
a la entrada (usandoor
), y luego verifique si es mayor que3
.Los únicos tres números que se producen
0
al completar el primer paso son0
,20
o40
, con el primero fuera del dominio, y el resto es mayor que3
.fuente
Mathematica, 53 bytes
fuente
FrobeniusSolve
función.Mathematica, 30 bytes
Pruébalo en Wolfram Sandbox.
fuente
Mathematica, 20 bytes
Función anónima. Toma un número como entrada y devuelve
True
oFalse
como salida. Lógica copiada de la respuesta de Leaky Nun , con algún abuso adicional deInequality
.fuente
Código de máquina x86-64, 22 bytes
Los bytes anteriores definen una función en el código de máquina x86 de 64 bits que determina si el valor de entrada es un número Chicken McNugget. El parámetro entero positivo único se pasa en el
ECX
registro, siguiendo la convención de llamadas de Microsoft de 64 bits utilizada en Windows. El resultado es un valor booleano devuelto en elEAX
registro.Mnemónicos de ensamblaje sin golf:
Obviamente, esto juega mucho con la solución de Anders Kaseorg en Python , ya que se basa en un campo de bits que representa los valores que son números de Chicken McNugget. Específicamente, cada bit en este campo que corresponde a un número válido de Chicken McNugget se establece en 1; todos los demás bits se establecen en 0. (Esto considera que 0 es un número válido de Chicken McNugget, pero si no le gusta, su preferencia es una modificación de un solo bit).
Comenzamos simplemente cargando este valor en un registro. Es un valor de 64 bits, que ya requiere 8 bytes para codificar, además de que necesitamos un prefijo REX.W de un byte, por lo que realmente estamos siendo bastante derrochadores en términos de bytes, pero este es el corazón de la solución, por lo que Supongo que vale la pena.
Luego cambiamos el campo a la derecha por el valor de entrada. * Finalmente, enmascaramos todo excepto el bit de orden inferior, y ese se convierte en nuestro resultado booleano.
Sin embargo, dado que no puede cambiar más de la cantidad de bits realmente en el valor, esto solo funciona para entradas de 0 a 63. Para admitir valores de entrada más altos, insertamos una prueba en la parte superior de la función que se bifurca en la parte inferior del valor de entrada es> = 64. Lo único interesante de esto es que precargamos la constante del campo de bits
RAX
y luego se bifurca hasta la instrucción que enmascara el bit de orden más bajo, asegurando así que siempre devolvamos 1.Pruébalo en línea!
(La llamada de función C allí está anotada con un atributo que hace que GCC lo llame usando la convención de llamadas de Microsoft que usa mi código de ensamblaje. Si TIO hubiera proporcionado MSVC, esto no sería necesario).
__
* Como alternativa a un cambio, podríamos haber usado la
BT
instrucción x86 , pero eso es 1 byte más para codificar, por lo que no es una ventaja. A menos que nos veamos obligados a usar una convención de llamada diferente que no pasa convenientemente el valor de entrada en elECX
registro. Esto sería un problema porqueSHR
requiere que su operando de origen seaCL
para un conteo de desplazamiento dinámico. Por lo tanto, una convención de llamada diferente requeriría queMOV
editemos el valor de entrada del registro al que se pasóECX
, lo que nos costaría 2 bytes. LaBT
instrucción puede usar cualquier registro como operando de origen, a un costo de solo 1 byte. Entonces, en esa situación, sería preferible.BT
coloca el valor del bit correspondiente en el indicador de acarreo (CF), por lo que usaría unaSETC
instrucción para obtener ese valor en un registro entero comoAL
para que pueda devolverse al llamante.Implementación alternativa, 23 bytes
Aquí hay una implementación alternativa que usa operaciones de módulo y multiplicación para determinar si el valor de entrada es un número Chicken McNugget.
Utiliza la convención de llamadas System V AMD64 , que pasa el valor de entrada en el
EDI
registro. El resultado sigue siendo un booleano, devuelto enEAX
.Sin embargo, tenga en cuenta que, a diferencia del código anterior, este es un booleano inverso (por conveniencia de implementación). Devuelve
false
si el valor de entrada es un número de Chicken McNugget, otrue
si el valor de entrada no es un número de Chicken McNugget.Lo feo de esto es la necesidad de manejar explícitamente los valores de entrada> = 43 mediante una comparación y ramificación en la parte superior. Obviamente, hay otras formas de hacerlo que no requieren ramificación, como el algoritmo de caird coinheringaahing , pero esto requeriría muchos más bytes para codificar, por lo que no es una solución razonable. Supongo que probablemente me estoy perdiendo algún truco que hace que esto funcione de manera más elegante y tenga menos bytes que la solución basada en el campo de bits anterior (ya que codificar el campo de bits en sí toma tantos bytes), pero he estudiado esto para un rato y todavía no puedo verlo.
Oh, bueno, pruébalo en línea de todos modos
fuente
05AB1E,
1716 bytesPruébalo en línea!
Explicación
fuente
…
para la cadena (hay buitins para cuerdas de 1, 2, y 3-char, siendo'
,„
y…
respectivamente). Tengo la sensación de que se puede jugar más al golf, tal vez utilizando un enfoque diferente, pero independientemente de que esta sea una buena primera respuesta. +1 de mi parteÅœ
:… ÇIÅœåPOĀ
. Es un enfoque completamente diferente, así que si quieres que lo publique como una respuesta separada en lugar de un golf tuyo, házmelo saber. PD: no estoy 100% seguro de si los no imprimibles están permitidos en la página de códigos 05AB1E . Puede que tenga que estar en una codificación diferente en ese caso, lo que haría que algunos caracteres cuenten como 2 bytes cada uno. En ese caso,ŽBo21в
podría ser una alternativa para +1 byte.ŽGç₂в
lugar de la cadena mientras guarda simultáneamente un byte en el proceso.JavaScript (ES6),
6964 bytesMostrar fragmento de código
Salidas
false
para números de Chicken McNugget, de lotrue
contrario.fuente
n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))
para 63 bytesJava,
215724 bytesPruébalo en línea!
Golfizado:
Sin golf:
fuente
26 = 20 + 6
.Python 2 , 51 bytes
-1 byte gracias a @LeakyNun
Pruébalo en línea! El pie de página imprime todos los números que no son de McNugget
fuente
n%3
solo puede ser 0 o 1 o 2, por lo quen%3==2
es equivalente an%3>1
.Pyth , 15 bytes
Pruébalo en línea!
La cadena contiene los caracteres correspondientes a los puntos de código 6, 9 y 20.
fuente
Haskell,
6456 bytesNo hice ningún truco, pero al mirar las otras respuestas, en realidad podría ser más corto importar el
Bits
módulo y usar esos métodos. Este enfoque verifica mucho más directamente.fuente
66
no lo es64
. Pero puedes guardar muchos paréntesis y poner unax/=0
guardia para guardar algunos bytes, mira aquí .Javascript,
927872 bytes* guardado 14 bytes gracias a @Jonasw
Utiliza el hecho de que "Todos los enteros son números de McNugget, excepto 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 , 37 y 43. " del comentario de @ LeakyNun
fuente
APL (Dyalog) , 19 bytes
con
⎕IO←0
Mismo algoritmo con la respuesta de Dennis
Pruébalo en línea!
fuente
Retina , 26 bytes
Pruébalo en línea!
fuente
Agregar ++ , 35 bytes
Pruébalo en línea!
Mira ma, no mientras bucles. O cuerdas. O listas. O realmente cualquier cosa que ayude a guardar bytes. Pero principalmente porque Add ++ no sabe cuáles son esos.
3 meses después, me di cuenta de que esto no era válido y lo solucioné. De alguna manera, eso lo jugó por 13 bytes. Esta es una función que toma un argumento y prueba si ese argumento es un número de Chicken McNugget o no.
Cómo funciona
fuente
Excel, 87 bytes
Alternativamente, 92 bytes:
fuente
PHP, 69 + 1 bytes
sale con
1
un número de Chicken McNugget, de lo0
contrario.Ejecutar como tubería
-n
o probarlo en línea .fuente
Python 2 , 61 bytes
Pruébalo en línea!
fuente
chr
.Mathematica, 59 bytes
fuente
Javascript 37 bytes
Toma un entero positivo
n
y genera resultadostrue
para los números de Chicken McNugget yfalse
para otros.Explicación
La recurrencia en esta función es atroz, y para cualquier lo suficientemente grande
n
, excederá los límites de la pila de llamadas. Aquí hay una versión que evita esos límites al verificar sin
es mayor que el número más grande que no es Chicken McNugget (43 bytes [¿puntos de bonificación por ser el número más grande que no es Chicken McNugget?]):Mostrar fragmento de código
fuente
JavaScript ES5, 46 bytes
Respuesta booleana explícita, 50 bytes:
Torpe, pero hace el trabajo. Devuelve
false
o0
para cada valor que no sea 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 , 37, o 43, ytrue
,-1
o1
para todo lo demás.La solución explícita devuelve
true
ofalse
solo.fuente
Clojure 33 bytes
Un intento rápido de ok:
#(-> %(rem 20)(rem 9)(rem 6)(= 0))
fuente
Pari / GP , 48 bytes
0
es falso todo lo demás es verdad.Pruébalo en línea!
fuente
0.25
caso de prueba.