チキンマクナゲット番号


29

説明

チキンマクナゲットの番号は、6、9、または20の合計として表現できる番号です。これは、マクドナルドが販売している有名なチキンマクナゲットボックスの初期サイズです。その合計では、数字は複数回出現する可能性があり、その6 + 6 = 12ような数字も同じであり、数字は前述のサイズの少なくとも1つを「含む」必要があります。最初のチキンマクナゲット番号は次のとおりです。

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

これはなので、バイト単位の最短回答が勝ち、標準的な抜け穴が適用されます!


15
「すべての整数は、1、2、3、4、5、7、8、10、11、13、14、16、17、19、22、23、25、28、31を除くすべての整数です。 34、37、43。」(mathworld
リーキー修道女

1
さて、それを圧縮の挑戦と考えてみましょう。しかし、注意してください
-racer290

3
誰もがこのためのOEISリンクを持っていますか???
CraigR8806

2
4ピースナゲットパックには何がありますか? mcdonalds.com/us/en-us/product/chicken-mcnuggets-4-piece.html
ダン・ニーリー

回答:


37

Python、27バイト

lambda n:0x82492cb6dbf>>n&1

オンラインでお試しください!


11
この魔法のコードo_Oとは何ですかこれは驚くべきことです
-HyperNeutrino

~出力を交換できるので、削除できます。
リーキー修道女

1
また、(読みやすさは劣りますが)8953174650303正確に同じ長さです 0x82492cb6dbf
リーキー修道女

2
@HyperNeutrinoマジックナンバーには、チキンマクナゲットナンバーではないナンバーに対応するビットのみが設定されています。そのバイナリ表現を見ると、より明確になります。
デビッドZ

1
残念ながら、この同じアイデアをBase 64で簡単に使用できない
ジェイコブガービー

29

Python 3、24バイト

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

オンラインでお試しください!

説明

6し、9一人で、1はすべての整数が割り切れることができます3どのよりも大きい3ように記載されて、チャレンジに対するOVSさんのコメント。人も作ることができると思われ0ます。結論として、を作成できます0,6,9,12,15,...

の1つのインスタンスで20、次を作成できます20,26,29,32,35,...

の2つのインスタンスを使用すると20、次のことができます40,46,49,52,55,...

のために、3つのインスタンスは必要ありません3 x 20 = 10 x 6


20不要なケースも3で割り切れることに注意してください。1つ20が必要な場合の残りは2; 2つ20が必要である場合の残りは残り1ます。

20したがって、必要な数はによって計算でき(-n)%3ます。次に、必要なn-(((-n)%3)*20)数を数から削除し20ます。次に、この数値が負でないことを確認しますが、そうではありません3



@ Mr.Xcoderが更新されました。
リーキー修道女

f=lambda n:n%3<1<n-2or n>20and f(n-20)それは動作しますか?
ザカリー

@Zacharýありがとう、更新しました。
リーキー修道女

1
f=再帰的ではないので、すぐに削除できます。
-notjagan

8

Python 2、28バイト

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

オンラインでお試しください!


試行錯誤を行い、最初の部分を範囲にマッピングすることで、それがどのように機能するかについて大まかな考えがあります。ただし、このソリューションをどのように考案したかを知りたいと思います。
リーキー修道女

@LeakyNunおかしい、私はこれが自然な方法だと思いました、そして、あなたのものは賢いものでした:)。(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

あなたの方法は除外リストの値をいじっていますが、私の方法は実際に問題を解決する必要がありますので、私の方法はより自然だと思います:)
Leaky Nun

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実際には、チキン・マクナゲット©とジェリーです。
coinheringaahing caird

@cairdcoinheringaahing実際には、ChickenMcNuggets®とJellyです。
ダン

5

Haskell、36バイト

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

オンラインでお試しください!

説明

このソリューションは、得られるほど簡単です。最初の行は、1未満の数値の場合、McNuggetの数値であることを宣言していますn==0。つまり、これは0McNuggetの数値であり、すべての負の数値はそうではありません。

2行目nは、他のすべての数値について、NuggetサイズのいずれかからMcNugget数を引いたものがMcNugget数であることを宣言しています。

これは非常に単純な再帰検索です。



3

ゼリー、11バイト

_20$%3$¿o>3

オンラインでお試しください!

私のPythonの答えのポートですが、わずかに変更されています:で20割り切れるまで減算し、入力にマッピングする3ことで属するかどうかを確認し(を使用して)、それがより大きいかどうかを確認します。0,6,9,...0or3

生成のみ3つの数字0の最初のステップが完了するとは020、または40最初のドメインの外にある、残りがより大きいことで、3


入力の入力方法が
わかりません。– racer290

@ racer290コマンドライン引数。
エリックアウトゴルファー

3

Mathematica、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

上記のバイトは、入力値がChicken McNugget番号であるかどうかを決定する64ビットx86マシンコードの関数を定義します。単一の正の整数パラメータがECXレジスタに渡され、次のWindowsで使用されるMicrosoft 64ビット呼び出し規約れます。結果は、EAXレジスタに返されるブール値です。

非ゴルフアセンブリニーモニック:

; 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

これは明らかに、 は、Chicken McNuggetの数値である値を表すビットフィールドに基づいているという点で、Python Anders Kaseorgのソリューションています。具体的には、有効なチキンマクナゲット番号に対応するこのフィールドの各ビットは1に設定されます。他のすべてのビットは0に設定されます(これは0が有効なチキンマクナゲット番号であると見なしますが、それが気に入らない場合は、1ビットの変更を優先します)。

この値をレジスタにロードすることから始めます。これは64ビット値であり、エンコードにはすでに8バイトが必要です。さらに、1バイトのREX.Wプレフィックスが必要です。したがって、実際にはバイトの面でかなりの節約をしていますが、これがソリューションの中心です。価値があると思います。

次に、入力値によってフィールドを右にシフトします。*最後に、最下位ビットを除くすべてをマスクし、それがブール結果になります。

ただし、実際に値のビット数を超えてシフトすることはできないため、これは0〜63の入力に対してのみ機能します。より高い入力値をサポートするために、入力値の下部に分岐する関数の上部にテストを挿入します> =64。これについて興味深いのは、ビットフィールド定数をプリロードRAX、次に分岐することです最下位ビットをマスクする命令まで、常に1を返すようにします。

オンラインでお試しください!
(そこのC関数呼び出しには、アセンブリコードが使用するMicrosoft呼び出し規約を使用してGCCが呼び出す属性が注釈されています。TIOがMSVCを提供した場合、これは必要ありません。)

__
*シフトの代替として、x86 BT命令を使用することもできましたが、エンコードに1バイト長いため、利点はありません。レジスタに入力値を渡すのに都合の悪い別の呼び出し規約を使用することを強制されない限りECX。これは、ソースオペランドが動的シフトカウント用であるSHR 必要があるため、問題になりCLます。したがって、異なる呼び出し規約MOVでは、渡されたレジスタから入力値を入力する必要があり、ECX2バイトのコストがかかります。BT命令は使用することができます任意の 1バイトのみの費用で、ソースオペランドとしてレジスタを。したがって、そのような状況では、それが望ましいでしょう。BT対応するビットの値をキャリーフラグ(CF)に入れます。そのため、SETC命令を使用して整数レジスターでその値を取得ALし、呼び出し元に返されるようにします。


代替実装、23バイト

次に、モジュロ演算と乗算演算を使用して、入力値がチキンマクナゲット数であるかどうかを判断する代替実装を示します。

System V AMD64呼び出し規約を使用して、入力値をEDIレジスタに渡します。結果はまだブール値であり、で返され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以上の入力値を処理する必要があることです。そこのように、分岐する必要はありませんこれを行うための他の方法は明らかにされているcaird 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バイトを見つけましたÅœ… ÇIÅœåPOĀ。それは完全に異なるアプローチですので、あなたのゴルフではなく個別の回答として投稿したい場合はお知らせください。PS:05AB1Eコードページで印刷不可が許可されているかどうか、100%確信はありません。その場合、別のエンコーディングにする必要があります。これにより、一部の文字が代わりにそれぞれ2バイトとしてカウントされます。その場合ŽBo21в、+ 1バイトの代替となる可能性があります。
ケビンクルーッセン

Kevinが言及しているように、文字列の3バイトは05ab1eコードページにないため、utf-8でプログラム全体をカウントせずに使用することはできません。ただしŽGç₂в、プロセスでバイトを保存しながら、文字列の代わりに使用できます。
エミグナ

ケビン、頑張って。さまざまなアプローチを見るのは良いことです。エミグナ、あなたの提案に感謝、私は変更を行います
revは

2

JavaScript(ES6)、69 64バイト

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

それ以外の場合はfalse、チキンマクナゲット番号の出力true


少なくとも「試してみてください」リンクが
欲しい

@ racer290が追加されました。
-darrylyeo

n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))63バイトの場合

2

Java、 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ます。
リーキー修道女

@LeakyNunアルゴリズムは素朴すぎました。いくつかのバイトを追加したプラン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を保存し、いくつかのバイトを保存するためにガードを置くことができますこちらをご覧ください
ბიმო

1

Javascript、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ためにバイトを救う
ジョナスウィルムス

アレイは108バイトである@Jonas、分割さの文字列は73バイトである
SuperStormer




1

Add ++、35バイト

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

オンラインでお試しください!

まあ、whileループはありません。または文字列。またはリスト。または本当にバイトを節約するのに役立つもの。しかし、主にAdd ++がそれらのいずれかを知らないためです。

3か月後、これが無効であることに気づき、修正しました。どういうわけか、それは13バイトでそれをゴルフしました。これは、1つの引数を取り、その引数が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

Excel、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

Mathematica, 59 bytes

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

0

Javascript 37 bytes

Takes a positive integer n and outputs true for Chicken McNugget numbers and false for others.

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

Explanation

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

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 if n is larger than the largest non-Chicken McNugget number (43 bytes [bonus points for being the largest non-Chicken McNugget number?]):

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


0

JavaScript ES5, 46 bytes

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

Explicit boolean answer, 50 bytes:

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

Clumsy, but it gets the job done. Returns false or 0 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, and true, -1, or 1 for everything else.

Explicit solution returns true or false only.

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

Clojure 33 bytes

An on ok quick attempt: #(-> %(rem 20)(rem 9)(rem 6)(= 0))


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.