Codegolf - Числа Чикен Макнаггет

  • Автор темы Sewa58
  • Обновлено
  • 21, Oct 2024
  • #1

Описание

Числа Чикен МакНаггет — это числа, которые можно выразить в виде суммы 6, 9 или 20 — начальных размеров знаменитых чисел. Чикен МакНаггетс коробки, продаваемые Макдональдсом. В этой сумме число может встречаться более одного раза, поэтому

 
 6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
 
is such a number too, and the number must "contain" at least one of the mentioned sizes. The first Chicken McNugget numbers are:

6 9 6 + 6 = 12 6 + 9 = 15 9 + 9 = 6 + 6 + 6 = 18 20 6 + 6 + 9 = 21 ...

Испытание

Ваша задача — написать программу или функцию, которая по заданному положительному целому числу определяет, можно ли это число выразить описанным способом, поэтому является таким числом Чикен МакНаггет. Затем он должен вывести истинное или ложное значение в зависимости от своего решения.

Тестовые случаи

6 + 6 = 12

Это , поэтому побеждает самый короткий ответ в байтах и ​​применяются стандартные лазейки!

#код-гольф #код-гольф #число #проблема-решения

Sewa58


Рег
06 Feb, 2009

Тем
97

Постов
219

Баллов
744
  • 26, Oct 2024
  • #3

Питон 3, 24 байта

0

Попробуйте онлайн!

Объяснение

С #(-> %(rem 20)(rem 9)(rem 6)(= 0)) and n=>!!( ); forces Boolean type (optional) n>5 false for 0, 1, 2, 3, 4, 5 (and negative inputs) !(n%20) explicit true for 20, 40 n<24?!(n%3) false for 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23 n<44?n%3-1 false for 25, 28, 31, 34, 37, 43 в одиночку можно сделать все целые числа делящимися на false which are greater than true , как сказано в комментарий ovs к вызову. Предполагается, что можно также сделать 1 . In conclusion, one can make -1 .

С одним экземпляром true , one can make: 0 .

С двумя экземплярами false , one can make: n=>!!(n>5&&(!(n%20)||(n<24?!(n%3):n<44?n%3-1:1))); .

Три экземпляра никогда не нужны, поскольку n=>n>5&&(!(n%20)||(n<24?!(n%3):n<44?n%3-1:1)); .


Обратите внимание, что случаи, когда нет <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <input type="text" id="input" /> <span id="output"></span> is needed is also divisible by 3; the cases where one F=n=>n>43||!(n<0||(n%6&&!F(n-9)&&!F(n-20))) $('#input').on('keyup', () => $('#output').text(F(parseInt($('#input').val(), 10)))) необходимо оставляет остаток F=n=>n>43||!(n<0||(n%6&&!F(n-9)&&!F(n-20))) ; the cases where two n необходимо оставляет остаток n .

Количество F=n=>!( // negate the internal test for non-Chicken McNugget numbers n<0 || ( // if n < 0, or n%6 && // if n % 6 is truthy, !F(n-9) && // and n-9 is not a Chicken McNugget number !F(n-20) // and n-20 is not a Chicken McNugget number // then n is not a Chicken McNugget number ) ) needed can hence be calculated by F=n=>!(n<0||(n%6&&!F(n-9)&&!F(n-20))) . Затем мы делаем false to remove the number of true нужно с номера. Затем мы проверяем, что это число неотрицательно, но не n .

 

Wowan2311


Рег
10 Nov, 2011

Тем
56

Постов
230

Баллов
530
  • 26, Oct 2024
  • #5

Желе, 11 байт

lambda n:n in[int(c,36)for c in'1234578ABDEGHJMNPSV']+[37,43]

Попробуйте онлайн!

Как это работает

-n ||answer||

Хаскелл, 36 байт

0

Попробуйте онлайн!

Объяснение

Это решение настолько простое, насколько это возможно. В первой строке объявляется, что любое число меньше 1 является числом МакНаггет, если 1 . That is to say that for($n=$argn;$n>0;$n-=20)if($n%3<1)for($k=$n;$k>0;$k-=9)$k%6||die(1); является числом МакНаггетта, а все отрицательные числа таковыми не являются.

Вторая строка объявляет, что для всех остальных чисел =CHOOSE(MOD(A1,3)+1,A1>3,IF(A1>43,MOD(A1-40,3)=0,A1=40),IF(A1>23,MOD(ABS(A1-20),3)=0,A1=20)) is a McNugget number if it minus any of the Nugget sizes is a McNugget number.

Это довольно простой рекурсивный поиск.

 

Vitali1970


Рег
18 Jan, 2007

Тем
69

Постов
212

Баллов
567
  • 26, Oct 2024
  • #6

Питон 3, 48 46 42 байта

=AND(OR(MOD(A1,3)*MOD(A1,20)*IF(A1>43,MOD(A1-40,3),1)*IF(A1>23,MOD(A1-20,3),1)=0),A1>5)

Попробуйте онлайн!

Переключатели D,f,@, - Create a monadic (one argument) function called f (example argument: 3) A - Push the argument again; STACK = [3 3] 6 - Push 6; STACK = [3 3 6] $ - Swap the top two values; STACK = [3 6 3] % - Modulo; STACK = [3 3] 0 - Push 0; STACK = [3 3 0] = - Are they equal? STACK = [3 0] @ - Reverse the stack; STACK = [0 3] 20 - Push 20; STACK = [0 3 20] $ - Swap the top two values; STACK = [0 20 3] % - Modulo; STACK = [0 3] 0 - Push 0; STACK = [0 3 0] = - Are they equal? STACK = [0 0] A - Push the argument; STACK = [0 0 3] 3 - Push 3; STACK = [0 0 3 3] $ - Swap the top two values; STACK = [0 0 3 3] % - Modulo; STACK = [0 0 0] 0 - Push 0; STACK = [0 0 0 0] = - Are they equal? STACK = [0 0 1] A - Push the argument; STACK = [0 0 1 3] 8 - Push 8; STACK = [0 0 1 3 8] < - Less than; STACK = [0 0 1 0] A - Push the argument; STACK = [0 0 1 0 3] 43 - Push 43; STACK = [0 0 1 0 3 43] < - Less than; STACK = [0 0 1 0 0] s - Sum; STACK = [1] 1 - Push 1; STACK = [1 1] < - Less than; STACK = [0] and D,f,@,A6$%0=@20$%0=A3$%0=A8<A43<s1< .

 

Doylehowkkwz92


Рег
25 Oct, 2024

Тем
58

Постов
180

Баллов
480
  • 26, Oct 2024
  • #7

Желе, 11 байт

.+ $* ^(1{6}|1{9}|1{20})+$

Попробуйте онлайн!

Порт мой ответ на Python, но немного изменено: вычесть ⎕IO←0 until divisible by ⊢∊6 9 20+.×⍨∘↑∘⍳3⍴⊢ , затем проверьте, принадлежит ли он a=>!(a in[0,1,2,3,4,5,7,8,10,11,13,14,16,17,19,22,23,25,28,31,34,37,43]) by mapping f x=(\l->elem x[i*6+j*9+k*20|i<-l,j<-l,k<-l,x/=0])[0..x] на вход (с помощью Bits ), and then check if it is greater than fg.{CM" "{T./ .

Единственные три числа, которые производят lambda n:max(n>43,25<n>n%3>1,5<n>n%3<1,n in[20,40]) upon completing the first step is import java.util.*; public class ChickenMcNuggetNumbers { private static final Set<Integer> FALSE_VALUES = new HashSet<>(Arrays.asList( new Integer[] { 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34, 37, 43 })); public static void main(String[] args) { for (int i = 0; i < 45; ++i) { System.out.println(i + " -> expected=" + !FALSE_VALUES.contains(i) + ", actual=" + f(n->(n-=n*2%3*20)>=0&n!=3, i)); } } public static boolean f(java.util.function.Function<Integer, Boolean> f, int n) { return f.apply(n); } } , n->(n-=n*2%3*20)>=0&n!=3 , или true , причем первый из них находится вне домена, а остальные превышают false .

 

Zadil


Рег
24 Apr, 2013

Тем
67

Постов
218

Баллов
573
  • 26, Oct 2024
  • #9

Математика, 20 байт

n=>'ABCDEFHIKLNOQRTWXZ]`cfl'.includes(String.fromCharCode(n+65))

Анонимная функция. Принимает число в качестве входных данных и возвращает ŽGç₂в The list [6, 9, 20] © Store this list in register_c IE Loop <input> number of times ®â Cartesian product stack contents with list in register_c O Sum up the contents of each sub array D « List duplicated before taking Cartesian product, concat ] End for loop I¢ Count occurences of input or ŽGç₂в©IED®âO«]I¢ в качестве вывода. Логика скопирована с Ответ Дырявой Монахини, с некоторыми дополнительными злоупотреблениями ; bool IsNotMcNuggetNumber(int n) ; n is passed in EDI 8D 04 3F lea eax, [rdi+rdi*1] ; multiply input by 2, and put result in EAX 83 FF 2B cmp edi, 43 7D 0E jge TheEnd ; everything >= 43 is a McNugget number 99 cdq ; zero EDX in only 1 byte 6A 03 push 3 59 pop rcx ; short way to put 3 in ECX for DIV F7 F1 div ecx ; divide input value by 3 6B D2 14 imul edx, edx, 20 ; multiply remainder of division by 20 39 D7 cmp edi, edx 0F 9C C0 setl al ; AL = (original input) < (input % 3 * 20) TheEnd: C3 ret .

 

Stypsussy30


Рег
24 Aug, 2010

Тем
77

Постов
195

Баллов
610
  • 26, Oct 2024
  • #10

Машинный код x86-64, 22 байта

true

Приведенные выше байты определяют функцию в 64-битном машинном коде x86, которая определяет, является ли входное значение числом Чикен МакНаггет. Единственный положительный целочисленный параметр передается в false register, following the Соглашение о 64-битных вызовах Microsoft используется в Windows. Результатом является логическое значение, возвращаемое в EAX register.

Мнемоника сборки без гольфа:

EDI

Очевидно, это сильно влияет на Решение Андерса Касеорга на Python, поскольку оно основано на битовом поле, представляющем значения, являющиеся числами Чикен МакНаггет. В частности, каждый бит в этом поле, соответствующий допустимому номеру Чикен МакНаггет, установлен в 1; все остальные биты установлены в 0. (При этом 0 считается действительным числом Чикен МакНаггет, но если вам это не нравится, вы предпочитаете изменить однобитовое значение.)

Мы начнем с простой загрузки этого значения в регистр. Это 64-битное значение, для кодирования которого уже требуется 8 байт, плюс нам нужен однобайтовый префикс REX.W, поэтому мы действительно довольно расточительны с точки зрения байтов, но это суть решения, поэтому Я думаю, оно того стоит.

Затем мы сдвигаем поле вправо на входное значение.* Наконец, мы маскируем все, кроме младшего бита, и это становится нашим логическим результатом.

Однако, поскольку вы не можете сдвинуть значение больше, чем фактическое количество битов, это работает только для входных значений от 0 до 63. Чтобы поддерживать более высокие входные значения, мы вставляем тест вверху функции, который разветвляется до нижней части входного значения >= 64. Единственное, что интересно в этом, это то, что мы предварительная загрузка константа битового поля в AL , and then branch down to the instruction that masks off the lowest-order bit, thus ensuring that we always return 1.

Попробуйте онлайн!
(Вызов функции C там аннотирован атрибутом, который заставляет GCC вызывать ее, используя соглашение о вызовах Microsoft, которое использует мой ассемблерный код. Если бы TIO предоставил MSVC, в этом не было бы необходимости.)

__
* В качестве альтернативы сдвигу мы могли бы использовать x86. SETC instruction, but that's 1 byte longer to encode, so no advantage. Unless we were принужденный использовать другое соглашение о вызовах, которое не позволяет удобно передавать входное значение в BT register. This would be a problem because BT требует что его исходный операнд будет ECX for a dynamic shift count. Therefore, a different calling convention would require that we MOV отредактировал входное значение из любого регистра, в который оно было передано CL , which would cost us 2 bytes. The SHR инструкция может использовать любой зарегистрироваться в качестве исходного операнда, затрачивая всего 1 байт. Так что в такой ситуации это было бы предпочтительнее. ECX puts the value of the corresponding bit into the carry flag (CF), so you would use a BT инструкция для получения этого значения в целочисленном регистре, например RAX so it could be returned to the caller.


Альтернативная реализация, 23 байта

Вот альтернативная реализация, которая использует операции по модулю и умножения, чтобы определить, является ли входное значение числом Чикен МакНаггет.

Он использует Соглашение о вызовах System V AMD64, который передает входное значение в ; bool IsMcNuggetNumber(int n) ; n is passed in ECX movabs rax, 0xFFFFF7DB6D349241 ; load a 64-bit constant (the bit field) cmp ecx, 64 jge TheEnd ; if input value >= 64, branch to end shr rax, cl TheEnd: and eax, 1 ; mask off all but LSB ret register. The result is still a Boolean, returned in EAX .

Однако обратите внимание: в отличие от приведенного выше кода, это обратный Логическое значение (для удобства реализации). Он возвращает ECX if the input value is a Chicken McNugget number, or 48 B8 41 92 34 6D DB F7 FF FF 83 F9 40 7D 03 48 D3 E8 83 E0 01 C3 если входное значение нет номер Чикен МакНаггет.

Inequality

Что некрасиво в этом, так это необходимость явно обрабатывать входные значения >= 43 с помощью сравнения и перехода вверху. Очевидно, есть и другие способы сделать это, не требующие ветвления, например Алгоритм Кэрда Коинхерингаахинга, но это займет много больше байтов для кодирования, поэтому это неразумное решение. Я полагаю, что мне, вероятно, не хватает какого-то трюка с битовым изменением, который сделал бы эту работу более элегантной и занимал бы меньше байтов, чем решение на основе битового поля, описанное выше (поскольку кодирование самого битового поля занимает очень много байтов), но я изучил это для какое-то время и до сих пор не вижу этого.

Ну что ж, попробуй онлайн в любом случае!

 

Juliya_oleini


Рег
01 May, 2020

Тем
93

Постов
208

Баллов
713
  • 26, Oct 2024
  • #11

05AB1E, 17 16 байт

False

Попробуйте онлайн!

Объяснение

True ||answer||

JavaScript (ES6), 69 64 байта

0<=#-20Mod[-#,3]!=3& {6,9,20}~FrobeniusSolve~#!={}& !Flatten@Table[Tr/@Tuples[{6,9,20},i],{i,#}]~FreeQ~#&

Выходы 3 for Chicken McNugget numbers, 40 в противном случае.

 

Салма


Рег
23 Oct, 2011

Тем
71

Постов
177

Баллов
552
  • 26, Oct 2024
  • #14

Хаскель, 64 56 байт

Я не делал никаких хитростей, но, глядя на другие ответы, на самом деле импорт может быть короче. or module and use those methods. This approach checks much more directly.

0 ||answer||

Javascript, 92 78 72 байта

*сэкономлено 14 байт благодаря @Jonasw

0,6,9,...

Использует тот факт, что «Все целые числа являются числами МакНаггет, кроме 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34». , 37 и 43». из комментария @LeakyNun

 

МишОк


Рег
20 Nov, 2007

Тем
69

Постов
201

Баллов
576
  • 26, Oct 2024
  • #17

Добавить++, 35 байт

False

Попробуйте онлайн!

Послушай, мам, никаких циклов while. Или струны. Или списки. Или вообще что-нибудь, что помогает экономить байты. Но главным образом потому, что Add++ не знает, что это такое.

Спустя 3 месяца я понял, что это неверно, и исправил это. Каким-то образом это увеличило его на 13 байт. Это функция, которая принимает один аргумент и проверяет, является ли этот аргумент числом Чикен МакНаггет или нет.

Как это работает

True ||answer||

Эксель, 87 байт

lambda n:n+50in b'2345679:<=?@BCEHIKNQTW]'

Альтернативно, 92 байта:

n ||answer||

PHP, 69+1 байт

0

выходит с n==0 for a Chicken McNugget Number, f n|n<1=n==0 f n=any(f.(n-))[6,9,20] еще.

Запустить как трубу с ṗ3’æ.“©µÞ‘ċ Main link. Argument: n ṗ3 Cartesian power; yield all 3-tuples over [1, ..., n]. ’ Decrement all coordinates. “©µÞ‘ Yield [6, 9, 20]. æ. Take the dot product of each 3-tuple and [6, 9, 20]. ċ Count the occurrences of n (Positive for Chicken McNuggets numbers). or попробуй онлайн.

 

Demon63


Рег
02 May, 2011

Тем
63

Постов
189

Баллов
544
  • 26, Oct 2024
  • #19

Математика, 59 байт

lambda n:-n%3-n/20<(n%20!=3) ||answer||

Javascript 37 байт

Принимает положительное целое число 3 and outputs 20 для чисел Чикен МакНаггет и n-(((-n)%3)*20) for others.

(-n)%3

Объяснение

20

Рекурсия для этой функции отвратительна, и для любого достаточно большого 1 , you will exceed call stack limits. Here's a version that avoids those limits by checking if 20 больше, чем самое большое число, не принадлежащее Чикену МакНаггету (43 байта [бонусные баллы за самое большое число, не принадлежащее Чикену МакНаггету?]):

2 20 20 ||answer||

JavaScript ES5, 46 байт

3 x 20 = 10 x 6

Явный логический ответ, 50 байт:

40,46,49,52,55,...

Неуклюже, но со своей задачей справляется. Возврат 20 or 20,26,29,32,35,... для каждого значения, отличного от 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34, 37 , или 43, и 20 , 0,6,9,12,15,... , or 0 for everything else.

Явное решение возвращает 3 or 3 только.

9 ||answer||

Clojure 33 байта

Хорошо, быстрая попытка: 6

 

BaBulia


Рег
20 May, 2016

Тем
66

Постов
173

Баллов
513
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно