次の入力のいずれかを指定します。
スイートオニオンチキン照り焼き ローストチキン 七面鳥の胸肉 イタリアのBMT ツナ 黒い森のハム ミートボールマリナラ1〜7(または0〜6)の数字を出力します。月曜日を最低値として、その取引を取得する曜日を表します。入力は、必要に応じてすべて小文字または大文字にすることができます(つまり、「italian bmt」)。インターネットは許可されていません。
a
数とe
の数は、それぞれ[5,4,3,2,1,3,6]です。
次の入力のいずれかを指定します。
スイートオニオンチキン照り焼き ローストチキン 七面鳥の胸肉 イタリアのBMT ツナ 黒い森のハム ミートボールマリナラ1〜7(または0〜6)の数字を出力します。月曜日を最低値として、その取引を取得する曜日を表します。入力は、必要に応じてすべて小文字または大文字にすることができます(つまり、「italian bmt」)。インターネットは許可されていません。
a
数とe
の数は、それぞれ[5,4,3,2,1,3,6]です。
回答:
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バイトの答えはでした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]
-9114**28
小さい整数*でも機能します(*負の理由だけでなく絶対値でも-629ではなく111桁)。しかし、バイトを節約しません。
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
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ビットを取得するだけです。
このすべての「エンクラクト」ビジネスとは何ですか?
⁽ṃ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
コンボを見つけましたか?
⁽..
。の範囲)の間の唯一のものでした
⁽..
、実際には[-31349,32250] - [ - 99,999](一方が3つの以下のバイト等で表すことができる他の数も存在する7!!
またはȷ76
)
O5OHlO7KI6vjYm)
オンラインでお試しください!または、すべてのテストケースを確認します。
O5OHlO7KI6 % Push numbers 0, 5, 0, 2, 1, 0, 7, 4, 3, 6
v % Concatenate all numbers into a column vector
j % Push input as a string
Ym % Mean (of ASCII codes)
) % Index into the column vector (modular, 1-based, with implicit rounding)
% Implicit display
他の選択肢をいくつか投稿すると思いました
a=s=>(271474896&7<<s.Length)>>s.Length
説明:ビットマスクは揺れますか?
s=>"240350671"[s.length%10]
a=
a=
。
a=s=>{b=s.Length;return(271474896&7<<b)>>b}
enklactate
代わりに使用する場合を除きenklact
、その場合は11になります;)
enk
はなく、文字列でlactate
あり、単語です。編集:確認されたばかりenklactate
で、辞書にはありません。
0から始まる、小文字で入力を取ります。
`kÇXsm`bUg#
小文字の文字列の暗黙的な入力 U
`kÇXsm`
圧縮された文字列kotinsm
。
bUg#
のb
インデックス(g
)26(#
)にある文字の最初のインデックス()を取得しU
ます。(そう、インデックスのラッピング!)
整数結果の暗黙的な出力。
上記と同じ(および他のすべての人!)、代わりにインデックス3の文字を使用して、タイトルケースの入力を許可します。
`klact`bUg3
en
行きましたか?:P
en
印刷不能に圧縮されます。
bUg
はあなたのコードにあると思います。
"enklact"
->’enkl†¼’
’enkl†¼’
->.•ΛΓ2º•
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>
f=
唯一それが27になるだろう
{+}*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
Using the enklact
method:
=FIND(MID(A1,4,1),"enklact")
")
l1b93&(5#7%
A port of my GolfScript answer. It costs 1 byte to read the input explicitly, but we save two when summing the code points.
%7^5←n93ṁc
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...
%7^5←n93Σ
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.
x"enklact"@w3
Alternative:
x."atÖÅû"@w3
3
can be substituted by any of the following values: [3, 4, 11, 13, 21, 24, 25, 26]
Credit to @icrieverytim
Takes input as a char[]
s->"enklact".indexOf(s[3])
s->"enklact".indexOf(s[3])
if you specify that you take input as a char array.
-9 bytes thanks to H.PWiz.
f s=length$fst$span(/=s!!3)"enklact"
This uses the indexOf
function in Data.List
as elemIndex
.
import Data.List
(`elemIndex`"enklact").(!!3)
break
. Thanks!
-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...
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.
std::string("enklact").find(p[3])
works fine. This brings it down 3 characters.
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()));}}
'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.
Solution:
"enklact"?*3_
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