Описание
Числа Chicken McNugget - это числа, которые можно выразить в виде суммы 6, 9 или 20 - начальных размеров известных коробок Chicken McNuggets, продаваемых McDonald's. В этой сумме число может встречаться более одного раза, так же 6 + 6 = 12
как и такое число, и число должно «содержать» хотя бы один из упомянутых размеров. Первые цифры Куриные МакНуггет:
6
9
6 + 6 = 12
6 + 9 = 15
9 + 9 = 6 + 6 + 6 = 18
20
6 + 6 + 9 = 21
...
Вызов
Ваша задача состоит в том, чтобы написать программу или функцию, которая, учитывая положительное целое число, определяет, может ли это число быть выражено описанным способом, и поэтому является таким числом Цыпленка МакНуггета. Затем он должен вывести истинное или ложное значение на основе своего решения.
Контрольные примеры
6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах и применяются стандартные лазейки!
источник
Ответы:
Python, 27 байт
Попробуйте онлайн!
источник
~
потому что вы можете поменять местами выходы.8953174650303
имеет точно такую же длину с0x82492cb6dbf
(хотя и менее читабельным).Python 3 , 24 байта
Попробуйте онлайн!
объяснение
С
6
и9
без него можно сделать все целые числа делимыми, на3
которые они больше, чем3
указано в комментарии ovs к вызову . Предполагается, что можно также сделать0
. В заключение можно сделать0,6,9,12,15,...
.С одним экземпляром
20
, можно сделать:20,26,29,32,35,...
.С двумя экземплярами
20
, можно сделать:40,46,49,52,55,...
.Три экземпляра никогда не нужны, для
3 x 20 = 10 x 6
.Обратите внимание, что случаи, когда нет
20
необходимости, также делятся на 3; случаи, когда20
это необходимо, оставляют остаток2
; случаи, когда20
необходимо два, оставляет остаток1
.Следовательно, количество
20
необходимых может быть рассчитано как(-n)%3
. Затем мы делаем,n-(((-n)%3)*20)
чтобы удалить количество20
нужных из числа. Затем мы проверяем, что это число неотрицательно, но не является3
.источник
f=lambda n:n%3<1<n-2or n>20and f(n-20)
это работает?f=
сейчас, так как это не рекурсивно.Python 2 , 28 байт
Попробуйте онлайн!
источник
(n%3,n/20)
из вашего исключенного списка{(2, 0), (1, 0), (1, 1)}
. Использование-n%3
вместо этого дало неравенствоn/20>=(-n)%3
. Оттуда я{3,23,43}
немного поиграл, чтобы изменить 3 мода 20, не влияя на 63,83, ... Я нашел смещение конечной точки неравенства для этих лучших работ.Желе , 11 байт
Попробуйте онлайн!
Как это работает
источник
Haskell , 36 байт
Попробуйте онлайн!
объяснение
Это решение настолько простое, насколько это возможно. Первая строка объявляет, что для любого числа меньше 1 это число МакНуггет, если
n==0
. То есть это0
это число МакНуггет, а все отрицательные числа - нет.Вторая строка объявляет, что для всех других чисел,
n
это число МакНуггет, если оно минус любой из размеров Наггетта, это число МакНуггет.Это довольно простой рекурсивный поиск.
источник
Python 3 ,
484642 байтаПопробуйте онлайн!
Переключатели
True
аFalse
.источник
True
иFalse
по умолчаниюЖеле , 11 байт
Попробуйте онлайн!
Порт моего ответа на Python , но немного измененный: вычитайте
20
до деления на3
, затем проверяйте, принадлежит ли он0,6,9,...
, сопоставляя0
с входом (используяor
), и затем проверяйте, больше ли он, чем3
.Единственные три числа, которые появляются
0
после завершения первого шага0
, это20
, или40
, если первый находится вне домена, а остальные больше чем3
.источник
Mathematica, 53 байта
источник
FrobeniusSolve
функцию.Mathematica, 30 байт
Попробуйте это на Wolfram Sandbox.
источник
Mathematica, 20 байтов
Анонимная функция. Принимает число как ввод и возвращает
True
илиFalse
как вывод. Логика скопирована из ответа Лики Нун , с некоторыми дополнительными злоупотреблениямиInequality
.источник
Машинный код x86-64, 22 байта
Вышеуказанные байты определяют функцию в 64-битном машинном коде x86, которая определяет, является ли входное значение числом Чикен МакНуггет. Один положительный целочисленный параметр передается в
ECX
регистр в соответствии с 64-битным соглашением о вызовах Microsoft, используемым в Windows. Результатом является логическое значение, возвращаемое вEAX
регистре.Неуправляемая сборка мнемоники:
Очевидно, что это сильно противоречит решению Андерса Касерга в Python , так как оно основано на битовом поле, представляющем значения, представляющие собой числа Чикен МакНуггет. В частности, каждый бит в этом поле, который соответствует действительному номеру Chicken McNugget, устанавливается в 1; все остальные биты установлены в 0. (Это считает, что 0 является действительным числом Chicken McNugget, но если вам это не нравится, ваши предпочтения - это однобитная модификация.)
Мы начинаем с простой загрузки этого значения в регистр. Это 64-битное значение, для кодирования которого уже требуется 8 байтов, плюс нам нужен однобайтовый префикс REX.W, так что мы действительно потратили немного времени на байты, но это суть решения, поэтому Я думаю, это того стоит.
Затем мы сдвигаем поле вправо на входное значение. * Наконец, мы маскировать все , кроме бита низшего порядка, и становится нашим Логическое результат.
Однако, поскольку вы не можете сдвинуться больше, чем на количество битов, фактически находящихся в значении, это работает только для входов от 0 до 63 Чтобы поддерживать более высокие входные значения, мы вставляем тест в верхней части функции, которая ветвится в нижней части входного значения:> = 64. Единственное, что интересно в этом, это то, что мы предварительно загружаем константу битового поля в
RAX
, а затем выполняем переход вплоть до инструкции, которая маскирует бит самого младшего порядка, гарантируя, что мы всегда возвращаем 1.Попробуйте онлайн!
(Вызов функции C там помечен атрибутом, который заставляет GCC вызывать его, используя соглашение о вызовах Microsoft, которое использует мой ассемблерный код. Если бы TIO предоставил MSVC, в этом не было бы необходимости.)
__
* В качестве альтернативы сдвигу мы могли бы использовать
BT
инструкцию x86 , но для кодирования это на 1 байт больше, так что никаких преимуществ. Если только мы не были вынуждены использовать другое соглашение о вызовах, в котором не было удобно передавать входное значение вECX
регистр. Это было бы проблемой, потому чтоSHR
требует, чтобы его исходный операнд былCL
для счетчика динамического сдвига. Поэтому другое соглашение о вызовах потребовало бы, чтобы мыMOV
редактировали входное значение из любого регистра, в который оно было переданоECX
, что стоило бы нам 2 байта.BT
Команда может использовать любой регистр в качестве операнда - источника, при стоимости только 1 байт. Так что в такой ситуации это было бы предпочтительнее.BT
заносит значение соответствующего бита в флаг переноса (CF), так что вы бы использоватьSETC
инструкция для получения этого значения в целочисленном регистре, например,AL
чтобы оно могло быть возвращено вызывающей стороне.Альтернативная реализация, 23 байта
Вот альтернативная реализация, которая использует операции по модулю и умножению, чтобы определить, является ли входное значение числом Чикен МакНуггет.
Он использует соглашение о вызовах System V AMD64 , которое передает входное значение в
EDI
регистр. Результат все еще логический, возвращенный вEAX
.Обратите внимание, что, в отличие от приведенного выше кода, это обратный логический тип (для удобства реализации). Он возвращает,
false
если входное значение является числом Чикен МакНуггет, илиtrue
если входное значение не является числом Чикен МакНуггет.Уродливым в этом является необходимость явной обработки входных значений> = 43 с помощью функции сравнения и ветвления вверху. Очевидно, есть другие способы сделать это, которые не требуют ветвления, например алгоритм caird coinheringaahing , но для кодирования потребуется намного больше байтов, так что это не является разумным решением. Я полагаю, что мне, вероятно, не хватает некоторого хитрого трюка, который сделал бы эту работу более элегантной и занимал бы меньше байтов, чем решение на основе битового поля выше (поскольку кодирование самого битового поля занимает так много байтов), но я изучил это для некоторое время и до сих пор не вижу этого.
Ну ладно, попробуйте в любом случае онлайн !
источник
05AB1E,
1716 байтПопробуйте онлайн!
объяснение
источник
…
для строки (есть buitins для 1-, 2- и 3-символьных строк, будучи'
,„
и…
соответственно). У меня такое чувство, что можно играть больше, возможно, используя другой подход, но, несмотря на это, это хороший первый ответ. +1 от меня.Åœ
:… ÇIÅœåPOĀ
. Это совершенно другой подход, поэтому, если вы хотите, чтобы я опубликовал его как отдельный ответ, а не как ваш гольф, дайте мне знать. PS: Я не уверен на 100%, разрешены ли непечатные файлы в кодовой странице 05AB1E . В этом случае, возможно, придется использовать другую кодировку, в результате чего некоторые символы будут считаться вместо 2 байтов каждый. В этом случаеŽBo21в
может быть альтернатива +1 байт.ŽGç₂в
вместо строки при одновременном сохранении байта в процессе.JavaScript (ES6),
6964 байтаПоказать фрагмент кода
Выходные данные
false
для чисел Chicken McNugget, вtrue
противном случае.источник
n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))
for 63 bytesJava,
215724 bytesTry it online!
Golfed:
Ungolfed:
источник
26 = 20 + 6
.Python 2, 51 bytes
-1 byte thanks to @LeakyNun
Try it online! Footer prints all non McNugget numbers
источник
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.
источник
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.источник
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
источник
APL (Dyalog), 19 bytes
with
⎕IO←0
Same algorithm with Dennis's answer
Try it online!
источник
Retina, 26 bytes
Try it online!
источник
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
источник
Excel, 87 bytes
Alternatively, 92 bytes:
источник
PHP, 69+1 bytes
exits with
1
for a Chicken McNugget Number,0
else.Run as pipe with
-n
or try it online.источник
Python 2, 61 bytes
Try it online!
источник
chr
.Mathematica, 59 bytes
источник
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
источник
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.источник
Clojure 33 bytes
An on ok quick attempt:
#(-> %(rem 20)(rem 9)(rem 6)(= 0))
источник
Pari/GP, 48 bytes
0
is falsy. everything else is truthy.Try it online!
источник
0.25
test case.