我什么时候吃三明治?


37

在此处输入图片说明

给定以下输入之一:

甜洋葱鸡肉照烧
烤箱烤鸡
火鸡胸脯
意大利BMT
金枪鱼
黑森林火腿
肉丸玛丽娜
从1-7(或0-6)中输出一个数字,代表您获得交易的星期几,最低的是星期一。输入可以全部为小写或大写(例如“ italian bmt”)。禁止上网。


8
真的不了解这种Kolmogorov的复杂性。文本是输入...数字是输出。
geokavel

5
周日还会说“ Meatball Marinara”或“ Meatball Marina Ra”吗?
Erik the Outgolfer

17
我敢肯定它应该是Marinara酒店,但克明图像中是相当可怕的...
totallyhuman

6
如果对任何人有用:每个输入中a的s加上的es分别为[5,4,3,2,1,3,6]。
geokavel

Answers:


85

Python 2中38个 30 28字节

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**54034052**72639311**60444873**18267930**16478579**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个字节的答案)

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]


1
您是如何生成该数字的?:o
totallyhuman

10
@icrieverytim蛮力。
乔纳森·弗雷希

-9114**28是一个较小的整数*,它也可以工作(*绝对值而言,不仅因为它是负数-111位,而不是629)。但是不保存在字节上。
乔纳森·艾伦

4
我不时地检查HNQ中的PCG问题,通常对发现高尔夫球语言是前三名感到失望。今天我并不失望。谢谢!
悉尼,

4
@icrieverytimಠ_ಠ的数字相同,但移动因子减少了一半ಠ_ಠ:P
HyperNeutrino

49

Python 2,29个字节

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

在线尝试!

说明

enklact通过寻找带有唯一字母的第一列来找到魔术字符串。

第一列SOTITBM无效,因为它包含重复项。第二个和第三个也不起作用,因为它们分别是wvutuleeeranaa。但是,第四列有效,因为它具有所有唯一字母。

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

在线尝试!

出于对乔纳森·弗雷奇Jonathan Frech)的回答的感谢(对于我的第二次直接代码尝试),我不曾考虑使用字符串长度而不是区分字母!

该代码源于我对De Bruijn序列和国际象棋编程的经验。

在国际象棋中,您经常使用多个64位整数,其中每个位指示棋盘上相应正方形的正确与否,例如“此处有一块白色棋子”或“此正方形包含一个棋子”。

因此,能够快速且廉价地转换2**n为有用的n。在C和C ++中,执行此操作的最快方法是乘以64位的De Bruijn序列-等效于按位移n位-然后右移58(将前六位放到最后-确保您重新使用一个无符号的int,否则您将获得一半的1s),并在表格中查找此0..63数字,该数字为您提供了n在相同范围内的对应数字,但很少是相同数字。

这是相关的。但是,我们不想从更改2**nn,而是要从更改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的每个三位组合进行编码,然后在右移后取最后三位即可。


与我的位掩码方法非常相似,但更好。
布鲁诺·科斯塔

12

果冻,10 字节

所有这些“ 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组合的?
Emigna

3
编写了一个循环,遍历了创建“单词”并查看它们是否存在于字典中的过程。“视网膜”是-32249和32250之间的唯一一个(的范围⁽..)。
乔纳森艾伦

...轻微错误-的范围⁽..实际上是[-31349,32250]-[-99,999](还有可能用三个或三个以下字节表示的其他数字,例如7!!ȷ76
Jonathan Allan


7

MATL16 15字节

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


5

我以为我会发布其他几种选择

Javascript 38字节

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

说明:掩膜岩?

Javascript 27字节

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

第二个替代方法是忘记了29个字节长a=
Bruno Costa

为什么a=需要零件?看一下Shaggy的答案
geokavel

1
@BrunoCosta在此站点上,我们不需要您命名函数。匿名的有效,因此您不需要a=
Rɪᴋᴇʀ

1
@BrunoCosta很酷,这完全取决于您。您也可以不将其计入标头字节数,而将其包括在代码段中以便于测试。
Rɪᴋᴇʀ

1
@MichaelBoger我不认为这是可以的,因为完成该工作的最少代码我相信是这样的a=s=>{b=s.Length;return(271474896&7<<b)>>b}
Bruno Costa

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;)
Erik the Outgolfer

5
哦,为了福吉的缘故,为什么在果冻的字典中写得太夸张
完全人类

3
@icrieverytim不是,enk是字符串,lactate而是单词。编辑:刚刚确认,enklactate不在词典中。
Erik the Outgolfer

1
@icrieverytim我认为这只是乳酸
Xcoder先生17年

2
噢,我想找到一种模拟果冻字典的方法……也许下次。:P
totallyhuman

3

Japt,12个字节

0索引,以小写形式输入。

`kÇXsm`bUg#

测试一下


说明

小写字符串的隐式输入 U

`kÇXsm`

压缩的字符串kotinsm

bUg#

b在中的索引(g)26(#)中获取字符的第一个索引()U。(是的,索引包装!)

隐式输出整数结果。


另类

与上述(和其他所有人!)相同,只是使用索引3处的字符,允许输入标题大小写。

`klact`bUg3

测试一下


在哪儿en去?:P
totallyhuman 2017年

1
@icrieverytim:这是一个压缩的字符串;en被压缩为不可打印。
毛茸茸的

7
我想我bUg在您的代码中看到了。
shenles


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。– Shaggy

简单有效的解决方案。+1 :)
Brian H.

@Shaggy也许您的第三个额外字节是结尾的换行符。
Michael Boger

3

GolfScript,12个字节

{+}*93&(5?7%

在线尝试!

将输入(通过其代码点的总和)映射06

说明

使用我之前写的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个字节

使用enklact方法:

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

您可以删除2个字节,方法是将其转换为Google表格,然后删除")
Taylor Scott







1

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

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

在线尝试!

要求输入的前三个字符为大写。


它必须全部为大写,全部为小写或常规。
geokavel

然后将其全部大写。前三个字符以外的任何内容都将被忽略。
Xcali

1

Java 8,26字节

归功于@icrieverytim

将输入作为char []

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

s->"enklact".indexOf(s[3])如果您指定将输入作为char数组,则可以执行此操作。
shooqie

这样可以吗?我有几个可以缩短的答案
Roberto Graham


1

C ++,119个 118 77 76 73字节

感谢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,这很明显...我在想什么...


1
std::find用字符串文字(或也许是std::string)似乎是显而易见的方法。在从位置隐含0-5的数据结构中,基本上与C答案所使用的想法相同index或相同strchr
彼得·科德斯

您可以删除第2行和第3行之间的换行符。
Zacharý17年

您不需要存储变量的变量。std::string("enklact").find(p[3])工作正常。这使它降低了3个字符。
Michael Boger

您可以将字符串文字传递给函数(g ++仅发出警告),因此不需要memcpy东西。
Michael Boger

0

C#(.NET Core),289字节

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

在线运行


0

Golfscript,13个字节

在线尝试!

'enklact'\3=?

接受第四个字符(每个字符将是唯一的)并在字符串“ enklact”中查找。

或者:

'nklact'\3=?)

这利用了以下事实:?如果没有找到要搜索的元素,Golfscript的函数将返回-1(对于星期一,则不会)。如果允许这样做,则解决方案可以减少1个字节。



0

K(oK),13个字节

解:

"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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.