给定以下输入之一:
甜洋葱鸡肉照烧 烤箱烤鸡 火鸡胸脯 意大利BMT 金枪鱼 黑森林火腿 肉丸玛丽娜从1-7(或0-6)中输出一个数字,代表您获得交易的星期几,最低的是星期一。输入可以全部为小写或大写(例如“ italian bmt”)。禁止上网。
a
的s加上的e
s分别为[5,4,3,2,1,3,6]。
给定以下输入之一:
甜洋葱鸡肉照烧 烤箱烤鸡 火鸡胸脯 意大利BMT 金枪鱼 黑森林火腿 肉丸玛丽娜从1-7(或0-6)中输出一个数字,代表您获得交易的星期几,最低的是星期一。输入可以全部为小写或大写(例如“ italian bmt”)。禁止上网。
a
的s加上的e
s分别为[5,4,3,2,1,3,6]。
Answers:
lambda S:`6793**164`[len(S)]
不幸的是,到目前为止,最佳答案仍比最佳Python 2答案还要长一个字节。尽管未使用 enklact
-approach。
现在比每个人的回答都短一个字节!
经过大量的暴力破解后,我发现了一个表达式,该表达式产生的数字只有正确的数字。
我注意到,仅查看给定字符串长度的一个特定数字就需要3个字节(%10
)。因此,我编写了另一个Python程序(Pastebin链接)来进一步搜索将输入字符串的长度直接映射到星期几的数字。
魔术数字如下所示:(6793**164 = 28714733692312345620167113260575862840674216760386883406587492336415023761043044176257567032312859371641211117824224067391750766520256112063756278010050204239810862527958109285342869876264808102743173594017101607983288521836082497514383184553444755034407847810524083812459571382103831904835921560285915349760536969265992879312869538914200854305957428078269094250817029486005437991820466986793657301214564264748923199288698278615871481529585816783654841131577178922192383679718074693535597651237893794976519274268917335387876260270630339777501802739852278932279775510324916969726203688466311848240746465178859847331248655567344801
一个具有令人印象深刻的629个十进制数字的数字)
如您所见,该数字提供了从[28,20,13,11,4,4,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)]
备用功能:需要30个字节的lambda S:`853<<4390`[len(S)+9]
备用功能:需要31个字节的备用功能:lambda S:`1052<<3330`[len(S)+8]
30字节的答案是lambda S:`3879**41`[len(S)%10]
。
在查看输入字符串的长度时[28, 20, 13, 11, 4, 16, 17]
,我注意到以10为底的所有最后一位数字都不同,从而得出list [8, 0, 3, 1, 4, 6, 7]
。因此,我只需要从该列表到一周中所有七天的列表的映射,[0, 1, 2, 3, 4, 5, 6]
。
我的第一种方法只是使用一个字符串来执行映射:lambda S:"13*24*560"[len(S)%10]
尽管该字符串需要11个字节("13*24*560"
)。
因此,我编写了一个Python程序(Pastebin链接)以测试算术表达式,该算术表达式产生具有匹配数字的整数,以期进一步完善该程序。到目前为止,我想到的是`3879**41`
(只有十个字节,这是我的程序找到的唯一且因此最小的表达式)。
当然,可以尝试许多不同的表达方式。我只是很幸运,表单中a**b
有一个结果很小,可以满足我的需要。
只为好奇的人3879**41 = 1372495608710279938309112732193682350992788476725725221643007306215781514348937145528919415861895033279220952836384201346579163035594383625990271079 = 1.372... * 10**147
。
我在搜索不幸需要32个字节的替代表达式时发现的另一个有效函数: lambda S:`7**416`[len(S)%10+290]
-9114**28
是一个较小的整数*,它也可以工作(*绝对值而言,不仅因为它是负数-111位,而不是629)。但是不保存在字节上。
lambda s:'enklact'.find(s[3])
enklact
通过寻找带有唯一字母的第一列来找到魔术字符串。
第一列SOTITBM
无效,因为它包含重复项。第二个和第三个也不起作用,因为它们分别是wvutule
和eeranaa
。但是,第四列有效,因为它具有所有唯一字母。
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
出于对乔纳森·弗雷奇(Jonathan Frech)的回答的感谢(对于我的第二次直接代码尝试),我不曾考虑使用字符串长度而不是区分字母!
该代码源于我对De Bruijn序列和国际象棋编程的经验。
在国际象棋中,您经常使用多个64位整数,其中每个位指示棋盘上相应正方形的正确与否,例如“此处有一块白色棋子”或“此正方形包含一个棋子”。
因此,能够快速且廉价地转换2**n
为有用的n
。在C和C ++中,执行此操作的最快方法是乘以64位的De Bruijn序列-等效于按位移n
位-然后右移58(将前六位放到最后-确保您重新使用一个无符号的int,否则您将获得一半的1s),并在表格中查找此0..63数字,该数字为您提供了n
在相同范围内的对应数字,但很少是相同数字。
这是相关的。但是,我们不想从更改2**n
为n
,而是要从更改n
为其他3位数字。因此,我们将3位数字隐藏在一个神奇的31位数字中(28位移位需要28-30位,且编号从0开始。)
我仅通过查看必须将哪些值降到哪里来生成了所需的数字(尝试将0..6和1..7都作为输出集)。幸运的是,重叠的值(14、16和17)正好可以解决!并且由于第一个三位是000
,第二个三位是001
,我们不需要最左边的7位,从而导致更少的数字->更少的源字节。
所需的数字是000xxxx001110101011xxxx100xxxx
,其中x可以是1或0,并且不会影响这些特定子的结果-我将它们设置为0只是为了最小化该数字,但是更改最后8个xs都不应该影响源代码的长度。将所有xs设置为0,并保留起始位置,则以十进制表示1923136(或以十六进制表示1D5840,但是您需要0x前缀-感到羞耻!)最后的&7仅掩盖了最后3位,您也可以使用%8,但由于python的运算符优先级规则,因此您需要括号。
tl; dr:1923136在这些三明治名称恰好就位的正确位置对从0到6的每个三位组合进行编码,然后在右移后取最后三位即可。
所有这些“ enklact”业务如何?
⁽ṃ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](还有可能用三个或三个以下字节表示的其他数字,例如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=
也只能使它变成
{+}*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
使用enklact
方法:
=FIND(MID(A1,4,1),"enklact")
")
归功于@icrieverytim
将输入作为char []
s->"enklact".indexOf(s[3])
s->"enklact".indexOf(s[3])
如果您指定将输入作为char数组,则可以执行此操作。
感谢Peter Cordes -41个
字节,感谢Zacharý-1个
字节,感谢Michael Boger -3个字节
在字符串索引3处,每个三明治的字符都不同
#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);
}
和一起打高尔夫球std::string
,这很明显...我在想什么...
std::string("enklact").find(p[3])
工作正常。这使它降低了3个字符。
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_
例子:
> "enklact"?*3_"Black Forest Ham"
5
> "enklact"?*3_"Turkey Breast"
2
说明:
从右向左解释,从输入中拉出第4个元素,并在“ enklact”列表中返回零索引位置:
"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