サンドイッチはいつ入手できますか?


37

enter image description here

次の入力のいずれかを指定します。

スイートオニオンチキン照り焼き
ローストチキン
七面鳥の胸肉
イタリアのBMT
ツナ
黒い森のハム
ミートボールマリナラ
1〜7(または0〜6)の数字を出力します。月曜日を最低値として、その取引を取得する曜日を表します。入力は、必要に応じてすべて小文字または大文字にすることができます(つまり、「italian bmt」)。インターネットは許可されていません。


8
このコルモゴロフの複雑さを本当に見ないでください。テキストは入力です...数字は出力です。
— ジオカベル

5
また、日曜日は「ミートボールマリナラ」または「ミートボールマリナラ」と言っていますか?
— エリックアウトゴルファー

17
私はかなり確信して、それをすることになっていますよマリナーラしかしkeming ...画像ではかなりひどいです
— totallyhuman

6
誰にも役立つ場合:各入力ののa数とeの数は、それぞれ[5,4,3,2,1,3,6]です。
— ジオカベル

回答:


85

パイソン2、38の 30 28バイト

lambda S:`6793**164`[len(S)]

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

残念ながら、これまでのところ最高のPython 2の回答よりも1バイト長くなっています。ただし、enklact-approach は使用しません。

今私はcriのすべての回答よりも1バイト短くなっています!

どのように機能しますか?

たくさんのブルートフォースの後、ちょうど正しい桁の数字になる式を見つけました。
与えられた文字列の長さの特定の1桁だけを見るには3バイト(%10)が必要であることに気付きました。そこで、入力文字列の長さを曜日に直接マップする数字をさらに検索するために、別のPythonプログラム(Pastebinリンク)を作成しました。

マジックナンバーは次のようになります。6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801(印象的な10進数629の数字)

ご覧のとおり、この数字は[28、20、13、11、4、16、16、17]から[0、1、2、3、4、5、6](Python文字列は0-インデックス付き):

2871 4 733692 3 1 2 34 5 6 20 1 6711326 0 5758628406742167603868834... [4]^ [11]^ [13]^ [16]^ ^[17] ^[20] ^[28]

彼らはより多く取るのに私のプログラムはまた、必要な特性を有する他の式利回り番号を見つけました(29の代わりに、28)を表現するためにバイト:19439**540、34052**726、39311**604、44873**182、67930**164と78579**469。(これらはすべて、リンクされたプログラムで見つかった式です。実行には数時間かかりました。)

28バイトを必要とする代替関数:lambda S:`7954<<850`[len(S)]
29バイトlambda S:`9699<<2291`[len(S)]
を必要とするlambda S:`853<<4390`[len(S)+9]
代替関数:30バイトを必要とする代替関数:31バイトを必要とする代替関数:lambda S:`1052<<3330`[len(S)+8]

どのように機能しますか?その番号をどのように生成しましたか?(30バイトの回答)

30バイトの答えはでしたlambda S:`3879**41`[len(S)%10]。

入力文字列の長さを見ると、[28, 20, 13, 11, 4, 16, 17]10進数の最後の数字がすべて異なっていることに気付き、リストが作成されています[8, 0, 3, 1, 4, 6, 7]。そのため、そのリストから週7日すべてのリストへのマッピングのみが必要でした[0, 1, 2, 3, 4, 5, 6]。

最初のアプローチでは、文字列を使用してマッピングを実行しました。lambda S:"13*24*560"[len(S)%10]ただし、文字列には11バイト("13*24*560")が必要でした。
それで、私はPythonプログラム(Pastebinリンク)を書いて、一致する数字を持つ整数を生成する算術式をテストし、プログラムをさらにゴルフしたいと思っています。私がこれまでに思いついたのは`3879**41`(10バイトのみで、これが私のプログラムが見つける最小の表現です)。

もちろん、試すことができるさまざまな表現があります。幸運a**bなことに、私のニーズに合った適度に小さな結果のフォームが1つありました。

好奇心anyone盛な人のために3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147。

残念ながら32バイトを必要とする代替式を検索しているときに見つけた別の有効な関数: lambda S:`7**416`[len(S)%10+290]


1
その番号をどのように生成しましたか?:O
— totallyhuman

10
@icrieverytimブルートフォース。
— ジョナサンフレッチ

-9114**28小さい整数*でも機能します(*負の理由だけでなく絶対値でも-629ではなく111桁)。しかし、バイトを節約しません。
— ジョナサンアラン

4
時々、HNQでPCGの質問を確認しますが、ゴルフの言語が上位3位であることがわかってがっかりしています。今日、私は失望しませんでした。ありがとうございました!
— シドニー

4
@icrieverytimಠ_ಠそれは同じ数ですが、もう1つのシフト係数で半分になっていますಠ_ಠ:P
— HyperNeutrino

49

Python 2、29バイト

lambda s:'enklact'.find(s[3])

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

説明

魔法の文字列、はenklact、一意の文字を含む最初の列を探して見つかりました。

SOTITBM重複が含まれているため、最初の列は役に立ちません。彼らはあるので、第二と第三のものはまた、仕事をしませんwvutuleし、eeranaaそれぞれ。ただし、4列目はすべて一意の文字があるため機能します。

lambda s:'enklact'.find(s[3])

lambda s:                      # declare a function that takes a single paramater s
                  .find(    )  # find the index of the first instance of...
                        s[3]   # the fourth (0-indexing) character of s...
         'enklact'             # in the magic string

18

Python、26バイト

lambda S:1923136>>len(S)&7

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

おかげで(私の2番目のストレートコードゴルフトライ)のお​​かげで Jonathan Frechの答え。

このコードは、私の経験から派生しています De Bruijn Sequencesとチェスのプログラミングのます。

チェスでは、複数の64ビット整数を使用することがよくあります。各ビットは、チェス盤上の対応する正方形について「真っ白な部分があります」や「この正方形にポーンが含まれている」など、真か偽かを示します。

したがって2**n、n迅速かつ安価にすばやく変換できると便利です。CおよびC ++でこれを行う最も簡単な方法は、64ビットのDe Bruijnシーケンスを乗算することです-ビットでシフトするのと同等ですn-次に、右シフト58(最初の6ビットを最後に置く-確認してください '再署名なしintを使用するか、1秒の半分の時間を取得します)、対応する表を提供するこの0..63番号を検索しますnは、同じ範囲内にありますがめったに同じ数値ではありません。

これは一種の関連です。ただし、から2**nに変更する代わりに、から他の3ビット数nに変更しnます。したがって、3ビットの数値を魔法の31ビットの数値に隠します(28ビットのシフトには、28から30のビットが必要で、番号は0から始まります)。

どの値がどこに落ちなければならないかを見るだけで必要な数を生成しました(出力セットとして0..6と1..7の両方を試します)。幸いなことに、重複する値(14、16、および17)がうまくいきます!そして、最初の3ビットは000次であり、次は001なので、左端の7ビットは必要ありません。その結果、桁数が少なくなり、ソースのバイト数が少なくなります。

必要な数は000xxxx001110101011xxxx100xxxxで、xは1または0で、これらの特定のサブの結果には影響しません-番号を最小化するためだけに0に設定しますが、最後の8つのxのいずれを変更しても影響しませんソースコードの長さ。すべてのxsを0に設定し、開始を省略すると、10進数で1923136(または16進数で1D5840ですが、0xプレフィックスが必要です-恥!)最後の&7は最後の3ビットをマスクするだけです。 %8を使用しますが、Pythonの演算子優先順位ルールのために括弧が必要になります。

tl; dr:1923136は、0から6までの3ビットの組み合わせのそれぞれを、これらのサンドイッチ名がたまたま正しい場所にエンコードするので、右シフト後に最後の3ビットを取得するだけです。


私のビットマスクアプローチにかなり似ていますが、さらに良いです。
— ブルーノコスタ

12

ゼリー、10 バイト

このすべての「エンクラクト」ビジネスとは何ですか?

⁽ṃXị“Ð$¥»i

文字のリストを取得し、月曜日= 1の曜日を返すモナドリンク。

オンラインでお試しください!またはテストスイートを見る

どうやって?

⁽ṃXị“Ð$¥»i - Link: list of characters, sandwichName  e.g. "Tuna"
⁽ṃX        - base 250 literal                             -7761
   ị       - index into sandwichName (1-indexed & modular) 'n'
    “Ð$¥»  - dictionary word                               "retinal"
         i - index of                                           5

どのように-7761/retinalコンボを見つけましたか?
— エミナ

3
「単語」を作成し、辞書に存在するかどうかを確認するループを作成しました。「網膜」は、-32249から32250(⁽..。の範囲)の間の唯一のものでした
— ジョナサンアラン

...わずかなミスが-の範囲は⁽..、実際には[-31349,32250] - [ - 99,999](一方が3つの以下のバイト等で表すことができる他の数も存在する7!!またはȷ76)
— ジョナサンアラン

9

C(gcc)、72 71 56 46 41 39バイト

f(char*s){s=index(s="enklact",s[3])-s;}

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


i;char x[]="enklact";はより短いi,x[]={101,110,107,108,97,99,116};。
— ジョナサンフレッチ


また、を削除することもできますi=0。
— ジョナサンフレッチ

さらに短いバージョンを使用してindex:オンラインで試してみてください!
— スコチネット

@scottinetいいね!以前にindex()を使用したことはありません。ありがとう
— cleblanc



5

他の選択肢をいくつか投稿すると思いました

Javascript 38バイト

a=s=>(271474896&7<<s.Length)>>s.Length

説明:ビットマスクは揺れますか?

Javascript 27バイト

s=>"240350671"[s.length%10]

2番目の選択肢は29バイト長の忘れられたa=
— ブルーノコスタ

なぜa=部品が必要ですか?シャギーの答えを見てください。
— geokavel

1
@BrunoCostaこのサイトでは、関数に名前を付ける必要はありません。匿名のものは機能するため、を使用する必要はありませんa=。
— Rɪᴋᴇʀ

1
@BrunoCostaはかっこいいです、本当にあなた次第です。また、ヘッダーのバイトカウントにカウントせず、テストを容易にするためにスニペットに含めることもできます。
— Rɪᴋᴇʀ

1
@MichaelBoger foしみなく、私はそれができるとは思わない。なぜなら、その仕事をするための最小量のコードは、それが次のようなものだと信じているからだa=s=>{b=s.Length;return(271474896&7<<b)>>b}
— ブルーノ・コスタ

4

ゼリー、11バイト

4ị“-ƭɼoṚ0»i

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

説明:

4ị“-ƭɼoṚ0»i
4ị          4th element of z
  “-ƭɼoṚ0»i First index in "enklactate"

2
@ Mr.Xcoder は、文字列のenklactate代わりに使用する場合を除きenklact、その場合は11になります;)
— エリックアウトゴルファー

5
ああ、ファッジのために、なぜJellyの辞書にenklactateがあるのですか?
— 完全に人間

3
@icrieverytimそうでenkはなく、文字列でlactateあり、単語です。編集:確認されたばかりenklactateで、辞書にはありません。
— エリックアウトゴルファー

1
私は@icrieverytim だと思うそれだけだ乳酸。
— ミスターXcoder

2
Aw maaan、私はJellyの辞書をモックする方法を見つけたかった…多分次回。:P
— totallyhuman

3

Japt、12バイト

0から始まる、小文字で入力を取ります。

`kÇXsm`bUg#

試して


説明

小文字の文字列の暗黙的な入力 U

`kÇXsm`

圧縮された文字列kotinsm。

bUg#

のbインデックス(g)26(#)にある文字の最初のインデックス()を取得しUます。(そう、インデックスのラッピング!)

整数結果の暗黙的な出力。


代替案

上記と同じ(および他のすべての人!)、代わりにインデックス3の文字を使用して、タイトルケースの入力を許可します。

`klact`bUg3

試して


どこにen行きましたか?:P
— totallyhuman

1
@icrieverytim:それは圧縮された文字列です。en印刷不能に圧縮されます。
— シャギー

7
私bUgはあなたのコードにあると思います。
— シェンレ

3

05AB1E、11バイト

Erik the Outgolferのおかげで1バイト、Magic Octopus Urnのおかげで1バイト節約されました。

.•ΛΓ2º•I3èk

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


"enklact"->’enkl†¼’
— エリック・ザ・アウトゴルファー

’enkl†¼’->.•ΛΓ2º•
— 魔法のタコUr

@MagicOctopusUrnああありがとう
— ミスターXcoder


@MagicOctopusUrnアーカイブに残ります、ありがとう:p
— Mr. Xcoder

3

JavaScript(ES6)、25バイト

0インデックス。

s=>"enklact".search(s[3])

試して

o.innerText=(f=
s=>"enklact".search(s[3])
)(i.value);oninput=_=>o.innerText=f(i.value)
<select id=i><option selected value="Sweet Onion Chicken Teriyaki">Sweet Onion Chicken Teriyaki</option><option value="Oven Roasted Chicken">Oven Roasted Chicken</option><option value="Turkey Breast">Turkey Breast</option><option value="Italian BMT">Italian BMT</option><option value="Tuna">Tuna</option><option value="Black Forest Ham">Black Forest Ham</option><option value="Meatball Marinara">Meatball Marinara</option></select><pre id=o>


1
これは25バイトです!
— geokavel

ありがとう、@ geokavel。余分な3バイトをどこから取得したかわかりません。でもカウントがf=唯一それが27になるだろう
— シャギー

シンプルで効果的なソリューション。+1 :)
— ブライアンH.

@Shaggy多分、3番目の余分なバイトは末尾の改行でした。
— マイケルボガー

3

GolfScript、12バイト

{+}*93&(5?7%

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

マップの入力(そのコードポイントの合計を経由して)0へ6ます。

説明

少し前に書いたGolfScriptスニペットのブルートフォースツールで見つかりました...

{+}*  # Sum all code points.
93&   # ... AND 93.
(     # Decrement.
5?    # ... raised to the fifth power.
7%    # ... modulo 7.

これが、各入力を目的の結果に変換する方法です。

                                 {+}*   93&     (            5?   7%
Sweet Onion Chicken Teriyaki     2658    64    63     992436543    0
Oven Roasted Chicken             1887    93    92    6590815232    1
Turkey Breast                    1285     5     4          1024    2
Italian BMT                       965    69    68    1453933568    3
Tuna                              408    24    23       6436343    4
Black Forest Ham                 1446     4     3           243    5
Meatball Marinara                1645    77    76    2535525376    6

2

Excel, 28 bytes

Using the enklact method:

=FIND(MID(A1,4,1),"enklact")

You can drop 2 bytes by converting this to Google Sheets and dropping the ")
— Taylor Scott

2

Perl 6, 22 bytes

tr/enklact/^6/.comb[3]

Try it online!


perl 2017.07 accepts tr/enklact/^6/.comb[3] which would be 22 bytes, but tio.run apparently does not have it yet.
— Massa

(tio.run runs perl6 v2017.6)
— Massa

1
As long as an interpreter exists that can run the 22 byte version, it's valid.
— Shaggy


2

Husk, 10 bytes

%7^5←n93ṁc

Try it online!

Another port of my GolfScript answer. I'm sure eventually I'll find a language that can sum the code points for a single byte...

Husk (post-challenge update), 9 bytes

%7^5←n93Σ

Try it online!

Now, Σ does sum code points directly. Since this was added per a request after I answered this challenge, I'm not going to use it as my primary score though.





1

Perl 5, 43 + 1 (-p) = 44 bytes

for$i(S,O,TUR,I,TUN,B,M){$"++;$_=$"if/^$i/}

Try it online!

Requires the first three characters of input to be upper case.


It has to be all uppercase, all lowercase, or regular.
— geokavel

Call it all uppercase, then. Anything beyond the first three characters is ignored.
— Xcali

1

Java 8, 26 bytes

Credit to @icrieverytim

Takes input as a char[]

s->"enklact".indexOf(s[3])

You can do s->"enklact".indexOf(s[3]) if you specify that you take input as a char array.
— shooqie

Is that okay? I've a few answers that can be shortened like that
— Roberto Graham


1

C++, 119 118 77 76 73 bytes

-41 bytes thanks to Peter Cordes
-1 byte thanks to Zacharý
-3 bytes thanks to Michael Boger

At the string index 3, character for every sandwich is different

#include<string>
int s(char*p){return std::string("enklact").find(p[3]);}
std::initializer_list<char*> t{
    "Sweet Onion Chicken Teriyaki",
    "Oven Roasted Chicken",
    "Turkey Breast",
    "Italian BMT",
    "Tuna",
    "Black Forest Ham",
    "Meatball Marinara"
};

for (auto& a : t) {
    std::cout << s(a);
}

Golfing with std::string, that was obvious ofc... what was i thinking...


1
std::find in a string literal (or maybe a std::string) seems like the obvious way to go. Basically the same idea as index or strchr that the C answers are using, in a data structure where the 0-5 is implicit from the position.
— Peter Cordes

You can remove the newline inbetween lines 2 and 3.
— Zacharý

You don't need a variable to store enklact. std::string("enklact").find(p[3]) works fine. This brings it down 3 characters.
— Michael Boger

You CAN pass string literals to your function (g++ only raises a warning) so the memcpy stuff isn't needed.
— Michael Boger

0

C# (.NET Core), 289 bytes

using System;class c{delegate int s(string r);static void Main(){s y=x=>{if(x[0]==83)return 1;if(x[0]==79)return 2;if (x[0]==84&x[2]=='r')return 3;if(x[0]==73)return 4;if(x[0]==84)return 5;if(x[0] ==66)return 6;if(x[0]==77)return 7;return 0;};Console.Write(y.Invoke(Console.ReadLine()));}}

Run online


0

Golfscript, 13 bytes

Try it online!

'enklact'\3=?

Takes the 4th character (which, for each, will be unique) and looks it up in the string "enklact".

Alternatively:

'nklact'\3=?)

This takes advantage of the fact that Golfscript's ? function returns -1 if the element searched for is not found (which, for Monday, it will not). If this were allowed, the solution could be reduced by 1 byte.



0

K (oK), 13 bytes

Solution:

"enklact"?*3_

Try it online!

Examples:

> "enklact"?*3_"Black Forest Ham"
5
> "enklact"?*3_"Turkey Breast"
2

Explanation:

Interpretted right-to-left, pull out the 4th element from the input and return the zero-index location in the "enklact" list:

"enklact"?*3_  / the solution
           3_  / 3 drop, 3_"Turkey Breast" => "key Breast" 
          *    / first, *"key Breast" => "k"
         ?     / lookup right in left
"enklact"      / list to lookup element in
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.