치킨 맥 너겟 번호


29

기술

Chicken McNugget 숫자는 McDonald 's가 판매 한 유명한 Chicken McNuggets 상자 의 초기 크기 인 6, 9 또는 20의 합계로 표현할 수있는 숫자입니다 . 그 합계에서, 숫자는 두 번 이상 발생할 수 있으며, 6 + 6 = 12그러한 숫자도 마찬가지이며, 숫자는 언급 된 크기 중 적어도 하나를 포함해야합니다. 최초의 Chicken McNugget 번호는 다음과 같습니다.

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

도전

당신의 임무는 양의 정수가 주어지면이 숫자가 설명 된 방식으로 표현 될 수 있는지 여부를 결정하는 프로그램이나 함수를 작성하는 것이므로 Chicken McNugget 숫자입니다. 그런 다음 결정에 따라 진실하거나 허위 가치를 산출해야합니다.

테스트 사례

6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true

이것은 이므로 바이트 단위의 최단 답변이 승리하고 표준 허점이 적용됩니다!


15
"모든 정수는 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31을 제외한 McNugget 숫자입니다. 34, 37 및 43. " ( mathworld )
Leaky Nun

1
그럼 이제 압축 과제로 보자하지만, 메모 주셔서 감사합니다
racer290

3
누구든지 이것에 대한 OEIS 링크가 있습니까?
CraigR8806

2
4 피스 너겟 팩에 대해 무엇을 가지고 있습니까? mcdonalds.com/us/en-us/product/chicken-mcnuggets-4-piece.html
Dan Neely

답변:


37

파이썬, 27 바이트

lambda n:0x82492cb6dbf>>n&1

온라인으로 사용해보십시오!


11
이 마법의 코드 o_O는 무엇입니까?
HyperNeutrino

~출력을 교환 할 수 있으므로를 제거 할 수 있습니다.
Leaky Nun

1
또한 8953174650303길이는 동일 0x82492cb6dbf하지만 ( 읽기가 쉽지는 않습니다 ).
Leaky Nun

2
@HyperNeutrino 매직 번호에는 Chicken McNugget 번호가 아닌 숫자에 해당하는 비트 세트 만 있습니다. 이진 표현을 보면 훨씬 더 명확합니다.
David Z

1
이 같은 생각을 base 64와 함께 쉽게 사용할 수 없습니다.
Jacob Garby

29

파이썬 3 , 24 바이트

lambda n:0<=n--n%3*20!=3

온라인으로 사용해보십시오!

설명

69단독, 하나는 모든 정수로 나눌 수 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합니다.



@ Mr.Xcoder가 업데이트되었습니다.
Leaky Nun

f=lambda n:n%3<1<n-2or n>20and f(n-20)작동합니까?
Zacharý

@ Zacharý 감사합니다.
Leaky Nun

1
f=재귀 적이 지 않으므로 지금 제거 할 수 있습니다 .
notjagan

8

파이썬 2 , 28 바이트

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

온라인으로 사용해보십시오!


시행 착오를 사용하고 첫 번째 부분을 범위에 매핑하면 작동 방식에 대한 대략적인 아이디어가 있습니다. 그러나이 솔루션을 어떻게 만들 었는지 알고 싶습니다.
Leaky Nun

@LeakyNun Funny, 나는 이것이 자연스러운 방법이라고 생각했고 당신은 영리한 방법이라고 생각했다. :). (n%3,n/20)제외 목록에서 가능한 값 은 {(2, 0), (1, 0), (1, 1)}입니다. -n%3대신 사용 하면 불평등이 생겼다 n/20>=(-n)%3. 거기에서 {3,23,43}63,83에 영향을주지 않고 3 mod 20 인 리버스로 잠시 동안 바이올린을 피 웠습니다.
xnor

글쎄, 내 방법은 실제로 문제를 해결하는 반면, 방법은 제외 목록의 값을 다루므로 내 방법이 더 자연
스럽다고

7

젤리 , 11 바이트

ṗ3’æ.“©µÞ‘ċ

온라인으로 사용해보십시오!

작동 원리

ṗ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).

4
치킨 맥 너겟 ™과 젤리! 음 !!!
CJ 데니스

@CJDennis 실제로는 Chicken McNuggets ©와 Jelly입니다.
caird coinheringaahing

@cairdcoinheringaahing 실제로는 Chicken McNuggets® 및 Jelly입니다.
Dan

5

하스켈 , 36 바이트

f n|n<1=n==0
f n=any(f.(n-))[6,9,20]

온라인으로 사용해보십시오!

설명

이 솔루션은 최대한 간단합니다. 첫 번째 줄은 1보다 작은 숫자의 경우 McNugget 숫자임을 선언합니다 n==0. 즉, 그것은 0McNugget 숫자이고 모든 음수는 아닙니다.

두 번째 줄은 다른 모든 n숫자의 경우 Nugget 크기를 뺀 McNugget 숫자 인 경우 McNugget 숫자임을 선언합니다 .

이것은 매우 간단한 재귀 검색입니다.



3

젤리 , 11 바이트

_20$%3$¿o>3

온라인으로 사용해보십시오!

내 파이썬 응답 포트 이지만 약간 수정되었습니다 : 20로 나눌 때까지 빼고 입력 을 매핑 하여 (을 사용하여 ) 3소속 여부 를 확인한 다음 이보다 큰지 확인하십시오 .0,6,9,...0or3

0첫 번째 단계를 완료 할 때 생성 되는 세 개의 숫자 는 0, 20또는 첫 번째 숫자가 40도메인 외부에 있고 나머지는 숫자 보다 큽니다 3.


입력을 입력하는 방법을
모르겠어요

@ racer290 명령 줄 인수.
Outgolfer Erik

3

수학, 53 바이트

!Flatten@Table[Tr/@Tuples[{6,9,20},i],{i,#}]~FreeQ~#&

어쩌면 당신은 FrobeniusSolve기능을 사용할 수 있습니다 .
alephalpha


3

Mathematica, 20 바이트

0<=#-20Mod[-#,3]!=3&

익명의 기능. 숫자를 입력 및 리턴 True또는 False출력으로 사용합니다. 논리는 Leaky Nun의 답변 에서 복사되었으며 일부가 남용되었습니다 Inequality.


3

x86-64 기계 코드, 22 바이트

48 B8 41 92 34 6D DB F7 FF FF 83 F9 40 7D 03 48 D3 E8 83 E0 01 C3

위의 바이트는 64 비트 x86 기계 코드에서 입력 값이 Chicken McNugget 숫자인지 여부를 결정하는 함수를 정의합니다. 단일 양의 정수 매개 변수는 Windows에서 사용되는 Microsoft 64 비트 호출 규칙 에 따라 ECX레지스터에 전달됩니다 . 결과는 레지스터에 반환 된 부울 값 입니다.EAX

ungolfed 어셈블리 니모닉 :

; 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

분명히 이것은 Python에서 Anders Kaseorg의 솔루션에서 많은 부분을 차지 합니다. Chicken McNugget 숫자 값을 나타내는 비트 필드를 기반으로한다는 점입니다. 특히, 유효한 Chicken McNugget 번호에 해당하는이 필드의 각 비트는 1로 설정됩니다. 다른 모든 비트는 0으로 설정됩니다. (0은 유효한 Chicken McNugget 번호로 간주되지만, 마음에 들지 않으면 선호하는 설정은 단일 비트 수정입니다.)

먼저이 값을 레지스터에로드하여 시작합니다. 64 비트 값으로 이미 인코딩하는 데 8 바이트가 필요하고 1 바이트 REX.W 접두사가 필요하므로 바이트 단위로 실제로 소비되고 있지만 솔루션의 핵심입니다. 그만한 가치가 있다고 생각합니다.

그런 다음 입력 값만큼 필드를 오른쪽으로 이동합니다. * 마지막으로, 우리는 최하위 비트를 제외한 모든 것을 가려서 부울 결과가됩니다.

그러나 실제로 값에 포함 된 비트 수보다 많은 비트 수만큼 이동할 수 없으므로 0-63의 입력에 대해서만 작동합니다. 더 높은 입력 값을 지원하기 위해 입력 값의 맨 아래로 분기하는 함수의 상단에> = 64 인 테스트를 삽입합니다. 이것에 대해 흥미로운 점은 에서 비트 필드 상수를 미리로드RAX 한 다음 분기입니다 최하위 비트를 마스킹하는 명령까지 내려서 항상 1을 반환합니다.

온라인으로 사용해보십시오!
(C 함수 호출에는 GCC가 어셈블리 코드에서 사용하는 Microsoft 호출 규칙을 사용하여 호출하는 속성이 주석으로 표시됩니다. TIO가 MSVC를 제공 한 경우에는 필요하지 않습니다.)

__
* 시프트의 대안으로 x86 BT명령어를 사용할 수 있었지만 인코딩하는 데 1 바이트 더 길어 졌으므로 이점이 없습니다. 우리는 한하지 않는 한 강제 편리에 입력 값을 통과하지 못한 다른 호출 규칙을 사용하는 ECX레지스터. 소스 피연산자가 동적 시프트 카운트를 위해 SHR 필요 하기 때문에 이것은 문제가 될 CL수 있습니다. 따라서 다른 호출 규칙 MOV에 따라 전달 된 레지스터의 입력 값을 가져와야하므로 ECX2 바이트가 필요합니다. 이 BT명령어는 1 바이트의 비용으로 모든 레지스터를 소스 피연산자로 사용할 수 있습니다 . 따라서 그러한 상황에서는 바람직 할 것입니다.BT해당 비트의 값을 캐리 플래그 (CF)에 넣습니다. 따라서 SETC명령어를 사용하여 해당 값을 정수 레지스터에서 가져와 AL호출자에게 반환 할 수 있습니다.


대체 구현, 23 바이트

다음은 모듈로 및 곱셈 연산을 사용하여 입력 값이 Chicken McNugget 수인지 확인하는 대체 구현입니다.

레지스터 의 입력 값을 전달 하는 System V AMD64 호출 규칙을 사용합니다 EDI. 결과는 여전히 Boolean이며로 반환됩니다 EAX.

그러나 위의 코드와 달리 이는 역의 부울입니다 (구현 편의상). 그것은 반환 false입력 값이 치킨 McNugget 번호 인 경우, 또는 true입력 값이있는 경우 없는 치킨 McNugget 번호.

                    ; 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

추악한 점은 상단의 비교 및 ​​분기로 입력 값> = 43을 명시 적으로 처리해야한다는 것입니다. 이 같은 분기 필요로하지 않는이 일을 다른 방법으로 분명하다 케어 드 coinheringaahing의 알고리즘은 , 그러나 이것은 걸릴 것이다 많은 그래서 합리적인 해결책이 아니라, 더 인코딩 할 바이트를. 비트 필드 자체를 인코딩하는 데 너무 많은 바이트가 있기 때문에 위의 비트 필드 기반 솔루션보다 더 우아하고 바이트 수가 적은 비트 트위들 링 트릭이 누락되었을 것으로 생각합니다. 잠시 동안 여전히 볼 수 없습니다.

아 글쎄, 온라인으로 시도 어쨌든!


3

05AB1E, 17 16 바이트

ŽGç₂в©IED®âO«]I¢

온라인으로 사용해보십시오!

설명

  Ž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

1
중복 된 TIO 링크가 있습니다.
무지의 구현

1
좋은 대답입니다. PPCG와 05AB1E의 세계에 오신 것을 환영합니다. : 골프에 한 가지가 사용하는 문자열에 대한 (buitins은 1, 2, 3 - 문자 문자열을가, 인 ', 각각). 아마도 다른 접근법을 사용하여 더 골프를 칠 수 있다고 생각하지만 이것이 관계없이 좋은 첫 번째 대답입니다. 나에게서 +1
케빈 크루이 센

1
실제로 맞았습니다. 내장을 이용하여 12 byter 발견 Åœ: … ÇIÅœåPOĀ. 완전히 다른 접근 방식이므로 귀하의 골프가 아닌 별도의 답변으로 게시하려면 알려주세요. 추신 : 05AB1E 코드 페이지 에서 인쇄 할 수없는 것이 허용되는지 100 % 확실하지 않습니다 . 이 경우 다른 인코딩으로되어 있어야하므로 일부 문자는 각각 2 바이트로 계산됩니다.이 경우 ŽBo21в+1 바이트를 대신 할 수 있습니다.
Kevin Cruijssen

Kevin이 언급했듯이 문자열의 3 바이트 중 어느 것도 05ab1e 코드 페이지에 없으므로 utf-8의 전체 프로그램을 계산하지 않으면 더 오래 사용할 수 없습니다. 그러나 ŽGç₂в프로세스에서 바이트를 동시에 저장하는 동안 문자열 대신 사용할 수 있습니다 .
Emigna

케빈,가요 다른 접근법을 보는 것이 좋을 것입니다. Emigna, 제안 해 주셔서 감사합니다. 변경하겠습니다
rev

2

자바 스크립트 (ES6), 69 64 바이트

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

그렇지 않으면 falseChicken McNugget 숫자에 대한 출력 입니다 true.


나는 적어도 "시도"링크를
원합니다

@ racer290가 추가되었습니다.
darrylyeo

n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))63 바이트
Oki

2

자바, 21 57 24 바이트

온라인으로 사용해보십시오!

골프 :

n->(n-=n*2%3*20)>=0&n!=3

언 골프 드 :

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);
  }
}

에 대한 결과가 잘못되었습니다 26 = 20 + 6.
Leaky Nun

@LeakyNun 알고리즘이 너무 순진했습니다. 나는 바이트 B를 추가 한 계획 B를 사용해야했지만 지금은 항상 올바른 결과를 얻는 것처럼 보입니다. 문제의 테스트 사례에 의존하는 대신 시작하기 위해 모든 값을 반복해야했습니다.


1
24 바이트 (위 참조)
Leaky Nun

1
@LeakyNun 감사합니다! 나는 아직도 골프에 대해 배울 것이 많다.



1

하스켈, 64 56 바이트

나는 약간의 속임수를하지 않았지만 다른 답변을 보면 실제로 Bits모듈 을 가져 와서 해당 방법을 사용하는 것이 더 짧을 수 있습니다 . 이 방법은 훨씬 더 직접 검사합니다.

f x=(\l->elem x[i*6+j*9+k*20|i<-l,j<-l,k<-l,x/=0])[0..x]

1
바이트 수가 66아닙니다 64. 그러나 많은 괄호 x/=0를 저장하고 바이트를 저장하기 위해 가드를 넣을 수 있습니다 (here 참조) .
ბიმო

1

자바 스크립트, 92 78 72 바이트

@Jonasw 덕분에 14 바이트 절약

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])

"모든 정수는 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34를 제외한 McNugget 숫자입니다. , 37 및 43. " @LeakyNun의 댓글에서


간단한 배열을 사용하면 .split의 바이트를 절약 할 수 있습니다 ...
Jonas Wilms

@Jonas 배열은 108 바이트, 분할 된 문자열은 73 바이트
SuperStormer




1

추가 ++ , 35 바이트

D,f,@,A6$%0=@20$%0=A3$%0=A8<A43<s1<

온라인으로 사용해보십시오!

ma, while 루프는 보이지 않습니다. 또는 문자열. 또는 목록. 또는 실제로 바이트를 절약하는 데 도움이되는 모든 것. 그러나 주로 Add ++는 그 중 어떤 것이 무엇인지 알지 못하기 때문에.

3 개월 후, 나는 이것이 유효하지 않다는 것을 깨달았습니다. 어떻게 든 13 바이트만큼 골퍼했습니다. 이것은 하나의 인수를 사용하여 해당 인수가 Chicken McNugget 번호인지 여부를 테스트하는 함수입니다.

작동 원리

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]

1

엑셀, 87 바이트

=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)

또는 92 바이트 :

=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))



0

수학, 59 바이트

!Select[IntegerPartitions@#,{6,9,20}~SubsetQ~#&]=={}&&#!=0&

0

자바 스크립트 37 바이트

Chicken McNugget 수 및 기타에 대해 양의 정수 n와 출력 truefalse받습니다.

F=n=>!(n<0||(n%6&&!F(n-9)&&!F(n-20)))

설명

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
    )
)

이 함수의 재귀는 엄청 나며, 충분히 큰 경우 n에는 호출 스택 제한을 초과하게됩니다. 다음 n은 가장 큰 비 치킨 맥 너겟 수보다 큰지 확인하여 이러한 제한을 피하는 버전입니다 (43 바이트 [비 치킨 맥 너겟이 아닌 가장 큰 수는 보너스 포인트]) :

F=n=>n>43||!(n<0||(n%6&&!F(n-9)&&!F(n-20)))


0

자바 스크립트 ES5, 46 바이트

n=>n>5&&(!(n%20)||(n<24?!(n%3):n<44?n%3-1:1));

명시 적 부울 응답, 50 바이트 :

n=>!!(n>5&&(!(n%20)||(n<24?!(n%3):n<44?n%3-1:1)));

서투른 일이지만 일을 마칩니다. 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34가 아닌 모든 값을 반환 false하거나 0(37) 또는 (43)과 true, -1또는1 다른 모든 것들에 대한.

명시 솔루션 반환 true또는 false전용.

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

0

클로저 33 바이트

빠른 시도 : #(-> %(rem 20)(rem 9)(rem 6)(= 0))


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.