Descrição
Os números do Chicken McNugget são números que podem ser expressos como uma soma de 6, 9 ou 20 - os tamanhos iniciais das famosas caixas Chicken McNuggets vendidas pelo McDonald's. Nessa soma, um número pode ocorrer mais de uma vez, o mesmo 6 + 6 = 12
ocorre também, e o número deve "conter" pelo menos um dos tamanhos mencionados. Os primeiros números do Chicken McNugget são:
6
9
6 + 6 = 12
6 + 9 = 15
9 + 9 = 6 + 6 + 6 = 18
20
6 + 6 + 9 = 21
...
Desafio
Sua tarefa é escrever um programa ou função que, dado um número inteiro positivo, determine se esse número pode ser expresso da maneira descrita, portanto, é um número do Chicken McNugget. Em seguida, deve gerar um valor verdadeiro ou falso com base em sua decisão.
Casos de teste
6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
Isso é código-golfe , então a resposta mais curta em bytes vence e as brechas padrão se aplicam!
code-golf
number
decision-problem
racer290
fonte
fonte
Respostas:
Python, 27 bytes
Experimente online!
fonte
~
porque você pode trocar as saídas.8953174650303
tem exatamente o mesmo comprimento de0x82492cb6dbf
(embora menos legível).Python 3 , 24 bytes
Experimente online!
Explicação
Com
6
e9
sozinho, é possível tornar todos os números inteiros divisíveis pelos3
quais são maiores que3
, como é afirmado no comentário de ovs ao desafio . Supõe-se que também se pode fazer0
. Em conclusão, pode-se fazer0,6,9,12,15,...
.Com uma instância de
20
, pode-se fazer:20,26,29,32,35,...
.Com duas instâncias de
20
, pode-se fazer:40,46,49,52,55,...
.Três instâncias nunca são necessárias, para
3 x 20 = 10 x 6
.Observe que os casos em que não
20
é necessário também são divisíveis por 3; os casos em que um20
é necessário deixa um restante2
; Nos casos em que20
são necessários dois, resta um1
.O número de
20
itens necessários pode, portanto, ser calculado por(-n)%3
. Então, fazemosn-(((-n)%3)*20)
para remover o número20
necessário do número. Depois, verificamos que esse número não é negativo, mas não é3
.fonte
f=lambda n:n%3<1<n-2or n>20and f(n-20)
isso funciona?f=
agora, pois não é recursivo.Python 2 , 28 bytes
Experimente online!
fonte
(n%3,n/20)
sua lista de excluídos{(2, 0), (1, 0), (1, 1)}
. Usar em-n%3
vez disso deu uma desigualdaden/20>=(-n)%3
. A partir daí, dediquei um tempo para reverter{3,23,43}
3 mod 20 sem afetar 63,83 ... Descobri que mudar o ponto final da desigualdade para esses funcionava melhor.Gelatina , 11 bytes
Experimente online!
Como funciona
fonte
Haskell , 36 bytes
Experimente online!
Explicação
Esta solução é a mais simples possível. A primeira linha declara que, para qualquer número menor que 1, é um número McNugget if
n==0
. Ou seja, esse0
é um número McNugget e todos os números negativos não são.A segunda linha declara que, para todos os outros números,
n
é um número McNugget se menos um dos tamanhos de Nugget for um número McNugget.Esta é uma pesquisa recursiva bastante simples.
fonte
Python 3 ,
484642 bytesExperimente online!
Interruptores
True
eFalse
.fonte
True
e,False
por padrãoGelatina , 11 bytes
Experimente online!
Porta da minha resposta Python , mas ligeiramente modificada: subtraia
20
até ser divisível por3
, verifique se ela pertence0,6,9,...
mapeando0
a entrada (usandoor
) e verifique se é maior que3
.Os únicos três números produzidos
0
após a conclusão da primeira etapa são0
,20
ou40
, com a primeira fora do domínio e o restante sendo maior que3
.fonte
Mathematica, 53 bytes
fonte
FrobeniusSolve
funçãoMathematica, 30 bytes
Experimente na Wolfram Sandbox.
fonte
Mathematica, 20 bytes
Função anônima. Toma um número como entrada e retorna
True
ouFalse
como saída. A lógica foi copiada da resposta de Leaky Nun , com alguns abusos adicionaisInequality
.fonte
Código da máquina x86-64, 22 bytes
Os bytes acima definem uma função no código de máquina x86 de 64 bits que determina se o valor de entrada é um número do Chicken McNugget. O parâmetro inteiro positivo único é passado no
ECX
registro, seguindo a convenção de chamada da Microsoft de 64 bits usada no Windows. O resultado é um valor booleano retornado noEAX
registro.Mnemônicos de montagem não destruídos:
Obviamente, isso se assemelha bastante à solução de Anders Kaseorg em Python , na medida em que é baseada em um campo de bits que representa os valores que são números de Chicken McNugget. Especificamente, cada bit nesse campo que corresponde a um número válido de Chicken McNugget é definido como 1; todos os outros bits são definidos como 0. (Isso considera 0 como um número válido do Chicken McNugget, mas se você não gosta disso, sua preferência é modificar um bit).
Começamos simplesmente carregando esse valor em um registro. É um valor de 64 bits, que já leva 8 bytes para codificar, além de precisarmos de um prefixo REX.W de um byte; portanto, estamos realmente perdendo o peso em termos de bytes, mas esse é o coração da solução. Eu acho que vale a pena.
Em seguida, deslocamos o campo para a direita pelo valor de entrada. * Finalmente, mascaramos tudo, exceto o bit de ordem mais baixa, e isso se torna nosso resultado booleano.
No entanto, como você não pode mudar mais do que o número de bits realmente no valor, isso funciona apenas para entradas de 0 a 63. Para oferecer suporte a valores de entrada mais altos, inserimos um teste na parte superior da função que se ramifica na parte inferior do valor de entrada é> = 64. A única coisa interessante sobre isso é que pré - carregamos a constante do campo de bits em
RAX
e depois ramificamos até a instrução que mascara o bit de ordem mais baixa, garantindo assim que sempre retornemos 1.Experimente online!
(A chamada de função C é anotada com um atributo que faz com que o GCC a chame usando a convenção de chamada da Microsoft que meu código de assembly usa. Se o TIO tivesse fornecido o MSVC, isso não seria necessário.)
__
* Como alternativa a um turno, poderíamos ter usado a
BT
instrução x86 , mas é um byte a mais para codificar, portanto não há vantagem. A menos que fôssemos forçados a usar uma convenção de chamada diferente que não passasse convenientemente o valor de entrada noECX
registro. Isso seria um problema, porqueSHR
requer que seu operando de origem sejaCL
para uma contagem de turnos dinâmicos. Portanto, uma convenção de chamada diferente exigiria queMOV
editássemos o valor de entrada de qualquer registro para o qual fosse passadoECX
, o que nos custaria 2 bytes. ABT
instrução pode usar qualquer um registro como um operando de origem, a um custo de apenas 1 byte. Então, nessa situação, seria preferível.BT
coloca o valor do bit correspondente no sinalizador de transporte (CF), portanto você usaria umSETC
instrução para obter esse valor em um registro inteiro, comoAL
para que ele pudesse ser retornado ao chamador.Implementação alternativa, 23 bytes
Aqui está uma implementação alternativa que usa operações de módulo e multiplicação para determinar se o valor de entrada é um número do Chicken McNugget.
Ele usa a convenção de chamada System64 AMD64 , que passa o valor de entrada no
EDI
registro. O resultado ainda é um booleano, retornadoEAX
.Observe, porém, que, diferentemente do código acima, esse é um booleano inverso (para conveniência da implementação). Retorna
false
se o valor de entrada for um número do Chicken McNugget outrue
se o valor de entrada não for um número do Chicken McNugget.O que é feio nisso é a necessidade de lidar explicitamente com valores de entrada> = 43 por meio de uma comparação e ramificação na parte superior. Obviamente, existem outras maneiras de fazer isso que não exigem ramificação, como o algoritmo de caird coinheringaahing , mas isso levaria muito mais bytes para codificar, portanto, não é uma solução razoável. Eu acho que provavelmente estou perdendo algum truque de manipulação de bits que faria isso funcionar com mais elegância e ter menos bytes do que a solução baseada em campo de bits acima (já que a codificação do próprio campo de bits leva tantos bytes), mas eu o estudei um tempo e ainda não consigo vê-lo.
Bem, tente online de qualquer maneira!
fonte
05AB1E,
1716 bytesExperimente online!
Explicação
fonte
…
para a cadeia (existem buitins para cordas 1-, 2-, e 3-carvão animal, sendo'
,„
e,…
respectivamente). Acho que mais pode ser jogado, talvez usando uma abordagem diferente, mas, independentemente disso, essa é uma boa primeira resposta. +1 de mim.Åœ
:… ÇIÅœåPOĀ
. É uma abordagem completamente diferente. Se você quiser que eu a publique como uma resposta separada, e não como um golfe seu, informe-me. PS: Não tenho 100% de certeza se os imprimíveis são permitidos na página de códigos 05AB1E . Pode ser necessário que haja uma codificação diferente nesse caso, o que faria com que alguns caracteres contassem com 2 bytes cada um. Nesse caso,ŽBo21в
poderia ser uma alternativa para +1 byte.ŽGç₂в
vez da string e, ao mesmo tempo, salvar um byte no processo.JavaScript (ES6),
6964 bytesMostrar snippet de código
Saídas
false
para números Chicken McNugget,true
caso contrário.fonte
n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))
para 63 bytesJava,
215724 bytesExperimente online!
Golfe:
Ungolfed:
fonte
26 = 20 + 6
.Python 2 , 51 bytes
-1 byte graças a @LeakyNun
Experimente online! Rodapé imprime todos os números que não são do McNugget
fonte
n%3
só pode ser 0 ou 1 ou 2, portanton%3==2
é equivalente an%3>1
.Pitão , 15 bytes
Experimente online!
A sequência contém os caracteres correspondentes aos pontos de código 6, 9 e 20.
fonte
Haskell,
6456 bytesEu não fiz nenhum truque, mas olhando para as outras respostas, pode ser mais curto importar o
Bits
módulo e usar esses métodos. Essa abordagem verifica muito mais diretamente.fonte
66
não é64
. Mas você pode salvar muitos parênteses e colocar umax/=0
proteção para salvar alguns bytes, veja aqui .Javascript,
927872 bytes* salvou 14 bytes graças a @Jonasw
Usa o fato de que "Todos os números inteiros são números McNugget, exceto 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 , 37 e 43. " do comentário de @ LeakyNun
fonte
APL (Dyalog) , 19 bytes
com
⎕IO←0
Mesmo algoritmo com a resposta de Dennis
Experimente online!
fonte
Retina , 26 bytes
Experimente online!
fonte
Adicionar ++ , 35 bytes
Experimente online!
Olhe ma, não enquanto os loops. Ou cordas. Ou listas. Ou realmente qualquer coisa que ajude a salvar bytes. Mas principalmente porque o Add ++ não sabe o que é isso.
Três meses depois, percebi que isso era inválido e o corrigi. De alguma forma, isso aumentou em 13 bytes. Essa é uma função que pega um argumento e testa se esse argumento é ou não um número Chicken McNugget.
Como funciona
fonte
Excel, 87 bytes
Como alternativa, 92 bytes:
fonte
PHP, 69 + 1 bytes
sai com
1
para um número Chicken McNugget, caso0
contrário.Execute como pipe
-n
ou experimente online .fonte
Python 2 , 61 bytes
Experimente online!
fonte
chr
.Mathematica, 59 bytes
fonte
Javascript 37 bytes
Obtém um número inteiro positivo
n
e gera resultadostrue
para números do Chicken McNugget efalse
para outros.Explicação
A recursão nessa função é hedionda e, para qualquer suficientemente grande
n
, você excederá os limites da pilha de chamadas. Aqui está uma versão que evita esses limites, verificando sen
é maior que o maior número não-Chicken McNugget (43 bytes [pontos de bônus por ser o maior número não-Chicken McNugget?]):Mostrar snippet de código
fonte
JavaScript ES5, 46 bytes
Resposta booleana explícita, 50 bytes:
Desajeitado, mas faz o trabalho. Retorna
false
ou0
para todo valor que não seja 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 , 37, ou 43, etrue
,-1
, ou1
para tudo o resto.Solução explícita retorna
true
oufalse
apenas.fonte
Clojure 33 bytes
Uma tentativa rápida e ok:
#(-> %(rem 20)(rem 9)(rem 6)(= 0))
fonte
Pari / GP , 48 bytes
0
é falso. tudo o resto é verdade.Experimente online!
fonte
0.25
caso de teste.