我有几章?


18

圣经是有史以来最有影响力的书之一,通常被称为有史以来最畅销的书。它是由大约 40位不同的作者在数百年的时间里编写的然后才被编译成当前的形式。但是,《圣经》有趣的是它的分割方式。它分为2个不同的遗嘱,分为66个较小的书,每本书分成较小的章节,每个章节都分为单独的经文。

我认为尝试以尽可能短的代码编码每本书中的章节数将是一个有趣的挑战。因此,对于当今的挑战,您必须编写一个程序或函数,以其中一本书作为输入,并根据The King James Version输出该书中的章节数。

您可以采用任何合理格式的IO,例如读/写STDIN / STDOUT或文件,函数自变量/返回值,提示用户等。输入内容将始终是《圣经》的66本书之一,并且仅是小写字母。这意味着,如果给您任何其他输入,则允许未定义的行为。由于只有66可能的输入和输出,他们在这里都提供了,根据维基百科上关于圣经的章节中的国王詹姆斯版本页

genesis         50
exodus          40
leviticus       27
numbers         36
deuteronomy     34
joshua          24
judges          21
ruth            4
1 samuel        31
2 samuel        24
1 kings         22
2 kings         25
1 chronicles    29
2 chronicles    36
ezra            10
nehemiah        13
esther          10
job             42
psalms          150
proverbs        31
ecclesiastes    12
song of solomon 8
isaiah          66
jeremiah        52
lamentations    5
ezekiel         48
daniel          12
hosea           14
joel            3
amos            9
obadiah         1
jonah           4
micah           7
nahum           3
habakkuk        3
zephaniah       3
haggai          2
zechariah       14
malachi         4
matthew         28
mark            16
luke            24
john            21
acts            28
romans          16
1 corinthians   16
2 corinthians   13
galatians       6
ephesians       6
philippians     4
colossians      4
1 thessalonians 5
2 thessalonians 3
1 timothy       6
2 timothy       4
titus           3
philemon        1
hebrews         13
james           5
1 peter         5
2 peter         3
1 john          5
2 john          1
3 john          1
jude            1
revelation      22

由于这一挑战是要找到一种最佳的方式来编码每个书名和章节数,因此不允许使用任何提供有关圣经信息的内置函数。但是,由于查看哪些语言具有此类内置功能会很有趣,请随时与您的答案共享第二个非竞争版本。也不允许从外部来源获取信息(不允许使用任何标准漏洞,但我认为明确提及该漏洞会很有用)。

像往常一样,这是一个挑战,因此,请尝试制作尽可能短的程序(以字节为单位)。打高尔夫球吧!


3
输出不是固定的,那么为什么是kolmogorov-complexity
LyricLy

3
@LyricLy因为即使输出不是固定的,它仍然是寻找生成两组不同数据的最有效方法:1)书名(或名称的一部分足以识别它)和2 )相应的章节数。
DJMcMayhem

3
您只看到所有正常量的
食物

4
我想enklact走出这个挑战,但我不能...
完全人类的,2017年

3
@DJMcMayhem您已经忘记了没有66个唯一字母的事实。:P
完全人类的,2017年

Answers:


12

果冻,127字节

“£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘
OḄ;407;270;“ọḷḊḲɦ‘%/i@“¡Ṙ×!⁸Ọ5`ỊV-ṙQȷṖÞ(sĿȮ^k³M"ɓmEf¤*0C[ạƇŻȥ#BṚñİmZẓeȦUƈ!ċ€@Ȧʋ)ƙḅyẉ’b158¤ị¢

在线尝试!

测试用例

怎么运行的

本质上,这会尝试将输入的字符的ord转换为二进制值,例如"joel"-> [106, 111, 101, 108]-> 2^3*106 + 2^2*111 + 2^1*101 + 2^0*108

然后,此值取为mod 407,然后取为mod 270,然后取[几个mods],再取为mod160。这很有用,因为它将所有66个字符串输入都映射为0到158之间的整数(在最终mod上很幸运)。

从整数列表“ọḷḊḲɦ...ƙḅyẉ’b158¤对整数进行索引,以找到值,n以使输入n的章节数最少。乔尔恰好拥有第七章。

的这个值n会进一步索引到列表中,“£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘以找到确切的章节数。

可能的改进:具有相同章数的输入可以从mod哈希到相同的值(没有必要0%冲突),但是我没有在程序中考虑它来确定mod的顺序。



通过避免@%/i@“...’b158¤ị¢-> %/“...’b158¤iị¢)保存一个字节。通过在开头的单个代码页索引列表中使用160的偏移量来保存另一个字节(OḄ;407;270;“ọḷḊḲɦ‘-> OḄ;“ẋn=:!ס‘+160¤)。
乔纳森·艾伦

10

Excel,373个字节

从Mathematica答案(6a+b+8c+5d+3e modulo 151)中重用@Misha的方法:

=CHOOSE(MOD(6*CODE(LEFT(A1,1))+CODE(MID(A1,2,1))+8*CODE(MID(A1,3,1))+5*CODE(MID(A1&A1,4,1))+3*CODE(MID(A1&A1,5,1)),151)+1,30,,,,27,,,,3,12,,,9,,149,,,28,,,13,,,35,3,,35,7,,8,,20,,49,23,13,4,,,4,,,,,,,2,,,39,,,15,3,,3,9,,12,27,,,,,,51,15,,,,70,,65,,21,11,,,4,,24,,,6,,2,1,,,,,,2,,,30,,,,,,23,,,33,,20,,,15,,,4,,4,,,12,2,,2,47,23,,2,,,,,41,,,3,,,5,,,,,11,,21,5,,,,5,2,3,26)+1

查找返回章-1,然后添加一章。这将10变为9两次,然后,1,变为,,4次。

更新为旧方法。Excel,460401字节

另存为CSV,在第一行(C1)的末尾输入书名,结果显示在C2

1c,16,revelation
1co,29,"=VLOOKUP(LEFT(C1,1)&MID(C1,3,1)&MID(C1,6,1),A:B,2)"
1j,5
1k,22
1p,5
1s,31
1t,6
1ts,5
2c,13
2co,36
2j,1
2k,25
2p,3
2s,24
2t,4
2ts,3
3j,1
a,9
at,28
c,4
d,12
du,34
e,12
ee,48
eh,6
eo,40
er,10
g,6
gn,50
h,3
hbw,13
hg,2
hs,14
i,66
j,42
jd,1
jds,21
je,3
jh,21
jm,5
jn,4
jr,52
js,24
lm,5
lv,27
m,7
ml,4
mr,16
mt,28
n,3
nhi,13
nm,36
o,1
p,150
pi,1
pip,4
po,31
r,16
rt,4
rv,22
s,8
t,3
zc,14
zp,3

对于查找表,我们可以省略et 10l 24因为它们分别在er 10和上匹配js 24


我们看不到需要查找表的excel公式答案。支持新颖性和执行力。您可能要搜索/发布有关excel评分的一些元问题。具体来说,我认为您可能还需要为A列的布局增加几个字节。另外,您可能希望将A移至C,将B:C移至A:B,这样就不会对A中的所有空白单元格都“充电”。在我的头顶上方,我认为TSV /整个工作表的CSV文本文件可能是正确的分数?
Sparr

通常,我认为.csv文件中字符的字节数(在这种情况下,减去包含的输入值的字节数)应为这些类型的Excel答案的分数-以我的计算,以上结果为分数401字节
泰勒·斯科特

@TaylorScott,我将CR-LF作为换行符。假设401 v.464是因为这个原因吗?
Wernisch

@Wernisch,简而言之,是的-您可以假定换行符以字符代码10的ASCII字符文字形式存储,这意味着它们计为1个字节
Taylor Scott

9

的JavaScript(ES6),251个 197字节

s=>`-  cE1$ " +%&  %  &!!· $!#&!!)!'=6 &!6".!  -!!Q$"/  779@@= % & $'1 U( I>!!  K * "S< :  9$!C %  . $. 9E1/ %!!'" + $ % `.split`!`.join`   `.charCodeAt(parseInt(s[2]+s[0]+s[5],36)%913%168%147)-33

测试

格式化和评论

s =>                                 // s = book name
  `-  cE1$ " +%&  %  &!!· (...)`     // data string (truncated)
  .split`!`.join`   `                // inflate padding characters '!' -> 3 spaces
  .charCodeAt(                       // read the ASCII code at the position found by
    parseInt(s[2] + s[0] + s[5], 36) // parsing 3 characters of the input in this exact
    % 913 % 168 % 147                // order as base 36 and applying three consecutive
  ) - 33                             // modulo operations, then subtract 33

2
您正式是在JS中找到最有效的哈希方法的大师...还是您有一个可以为您找到方法的程序?;)
ETHproductions

@ETHproductions我确实在某个时候编写了一个通用的Node程序,但是它并不是特别快,所以我最终大部分时间都在编写自定义代码... O_o
Arnauld

9

数学:323个 294字节

Uncompress["1:eJxTTMoPSpvOwMBQzAIkfDKLSzJlgAwCBEhtJi8qwQUnpqESsqgEHyqhAjePBc7lgBOccEIUThiBCAm4AayECUZUghmV0EAlBFAdxILqN17CgWMCNwUn4QQnxEAEDyqBcLgkKsGO6gUmLAROX8rjJSRQCSU4IYpKILzAiDfEebG4wADVDmZchBYqgRYVbLgIRPiJ4VXHDDdKGuZ9AAP6TUg="][[Mod[ToCharacterCode@StringTake[#<>#,5].{6,1,8,5,3},151,1]]]&

怎么运行的

对于一本书字符代码开始abcde计算(如果有必要缠绕)6a+b+8c+5d+3e模151,这恰好是唯一的,然后查找章节数长度151(未使用的条目的压缩列表在列表中填充上一个条目的重复项。这可能会鼓励游程长度编码,无论如何,它会有所帮助。)

感谢@numbermaniac提供了列表压缩的想法,虽然很难在上面加上数字,但是在这里改进是很大的一部分。

旧版本:Mathematica,548 435 407字节

Join["111112333333344444455555666789"~(p=StringPartition)~1,"1010121213131314141616162121222224242425272828293131343636404248505266"~p~2,{"150"}][[Max@StringPosition["2jn3jnjduoaapimhgi2pe2tshbkjeonhntttzpn2toclsjnjmlhpiprtu1jn1pe1tsjmjlmt1toehiglimcmsnoaometrerzdnlecs2cihbwnhihshzcr1cimrarmsjhojds1kgrva2sujsalku2kglviatcmte1co1supordur2conmreosjbbeeegnijriiahpas",""<>#&@Characters[#<>#][[{1,3,6}]]]/3]]&

怎么运行的

在查找之前,我们将每个名称转换name为1,3和6个字符namename(例如,leviticus变为lvijob变为jbb)。

通过将1位数字和2位数字的章节编号放在字符串中,可以稍微压缩我们查找的列表。

Mathematica:40个字节,无竞争

WolframAlpha["# chapters "<>#,"Result"]&

是的


如果Compress在列表上使用,则会得到一个字符串,可以Uncompress在程序中将其转换回列表。整个功能为430字节,为您节省了5 :)
numbermaniac

谢谢!该程序的版本具有缩短列表的更好方法,但这对于我发现的新方法非常有效:)
Misha Lavrov

4
我真的希望Mathematica的第二个答案可以包含内置的圣经
SztupY

没有内置的。有WolframAlpha["number of chapters of "<>#,"Result"]&,但不知何故感觉不一样。
米莎·拉夫罗夫

1
它在Wolfram Alpha上查找了答案,在标准漏洞中和在问题中明确都被称为作弊。(尽管我认为,如果我将Wolfram Alpha的源代码和数据库包括在字节数中,那将再次使其正常。)
Misha Lavrov


4

果冻 117个115  114 字节

OP%⁽µW%⁽£İ%237
“ĿḊƘ⁹ƙƬṂ;ɓṭ6-ạʋ⁵%$Ẋf,¥ÆÑƈø¬ȦṘd⁾“ʂụṿⱮẆƊ¦ẠLjƒ~Ḅr©“Ẏw|!¡¢o“ŻɗṢ“3ɠ‘Zċ€ÇTḢị“£ẆJQ+k⁽’ḃ6¤+\;“£¬®µıñø"BƝ¤‘¤

在线尝试!或见测试人员

怎么样?

通过取三, 二,三除法余数来对输入字符串的字符的序数的乘积进行哈希处理,在列表列表中查找结果,并使用找到的索引在书本长度列表中查找结果。

当找到一个散列函数时,我只考虑那些导致最多一个存储桶(超过255个结果)的存储桶,以允许代码页索引,然后选择一个将要编码的值总数最小化的存储桶(在删除“有问题的”存储桶之后,或者没有一个是最长的存储桶)。从66的三个模中,我发现了59(%731%381%258)a 58(%731%399%239),然后发现了56个条目(%1241%865%251)中的一个[产生117个字节] ...然后,我发现仅使用两个余数(%1987%251)的58(形成了115个字节)
.. 。然后我发现55使用三个余数,当添加两个虚拟条目时,可以进一步压缩查找列表...

代码:

1。

“ĿḊƘ⁹ƙƬṂ;ɓṭ6-ạʋ⁵%$Ẋf,¥ÆÑƈø¬ȦṘd⁾“ʂụṿⱮẆƊ¦ẠLjƒ~Ḅr©“Ẏw|!¡¢o“ŻɗṢ“3ɠ‘

是五个代码页索引列表(“...“...“...“...“...“...‘)的列表:

[[199,193,148,137,161,152,179,59,155,224,54,45,211,169,133,37,36,208,102,44,4,13,16,156,29,7,190,204,100,142],[167,225,226,149,207,145,5,171,76,106,158,126,172,114,6],[209,119,124,33,0,1,111],[210,157,183],[51,159]]

这是使用原子Z进行转置以获取存储桶的;称它为B:

[[199,167,209,210,51],[193,225,119,157,159],[148,226,124,183],[137,149,33],[161,207,0],[152,145,1],[179,5,111],[59,171],[155,76],[224,106],[54,158],[45,126],[211,172],[169,114],[133,6],37,36,208,102,44,4,13,16,156,29,7,190,204,100,142]

01是虚拟键,允许[179,5,111]其向右移两个-转置要求更长的条目位于左侧)

2。

“£ẆJQ+k⁽’ḃ6¤+\;“£¬®µıñø"BƝ¤‘¤

将此称为C(本章很重要)-它是整数列表:

[1,4,5,6,10,12,13,14,16,21,22,24,28,31,36,40,42,48,50,52,2,7,8,9,25,27,29,34,66,150,3]

并按以下方式构造(因此10,12,13,上面的两个虚拟密钥可以按升序排列):

“£ẆJQ+k⁽’ḃ6¤+\;“£¬®µıñø"BƝ¤‘¤
                            ¤ - nilad followed by link(s) as a nilad:
           ¤                  -   nilad followed by link(s) as a nilad:
“£ẆJQ+k⁽’                     -     base 250 number = 935841127777142
         ḃ6                   -     converted to bijective base 6 = [1,3,1,1,4,2,1,1,2,5,1,2,4,3,5,4,2,6,2,2]
            +\                -     cumulative reduce with addition = [1,4,5,6,10,12,13,14,16,21,22,24,28,31,36,40,42,48,50,52]
               “£¬®µıñø"BƝ¤‘  -   code-page indices = [2,7,8,9,25,27,29,34,66,150,3]
              ;               -   concatenate = [1,4,5,6,10,12,13,14,16,21,22,24,28,31,36,40,42,48,50,52,2,7,8,9,25,27,29,34,66,150,3]

现在,该代码的简化版本为:

OP%⁽µW%⁽£İ%237 - Link 1, hash function: list of characters   e.g. "genesis"
O              - cast to ordinals             [103,101,110,101,115,105,115]
 P             - product                                    160493569871250
   ⁽µW         - base 250 literal                                      3338
  %            - modulo                                                1050
       ⁽£İ     - base 250 literal                                      1699
      %        - modulo                                                1050
           237 - literal                                                237
          %    - modulo                                                 102

Bċ€ÇTḢịC - Main link: list of characters                     e.g. "genesis"
B        - the list of buckets, B, described  in (1) above
   Ç     - call the last link as a monad (get the hashed value)         102
 ċ€      - count for €ach - yields 29 zeros and a one or 30 zeros       [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0]
    T    - truthy indexes - yields a list of length one or zero         [19]
     Ḣ   - head - extracts that value or zero if it was empty            19  ----------------------------------------------v
       C - the list of chapter lengths, C, described in (2) above       [1,4,5,6,10,12,13,14,16,21,22,24,28,31,36,40,42,48,50,52,2,7,8,9,25,27,29,34,66,150,3]
      ị  - index (the head value) into (the chapter list, c)             50
         -       - 1-indexed and modular so 0 yields 3 (the rightmost)

3

Python 2中438个 429 416 411 409字节

lambda s:[c for x,c in zip('A|m|C|h|2|th|2 Co|D|y|E|Ep|Ec|x|ze|G|Ge|H|gg|He|Ho|I|Jo|oe|oh|na|sh|Ju|dg|Ja|Je| J|1 J|K|2 K|L|Le|Lu|M|ch|rk|tt|N|Ne|Nu|O|P|Pr|Ph|pp|Pe|2 P|R|Ro|Ru|S|Sa|2 S|T| T|2 T| Ti|2 Ti|Z|Zep'.split('|'),(28,9,4,29,36,16,13,12,34,10,6,12,40,48,6,50,3,2,13,14,66,42,3,21,4,24,1,21,5,52,1,5,22,25,5,27,24,7,4,16,28,3,13,36,1,150,31,1,4,5,3,22,16,4,8,31,24,3,5,3,6,4,14,3))if x in s.title()][-1]

在线尝试!

通过将输入更改为“标题大小写”并在列表中找到最后一个匹配的子字符串来工作。

[('A', 28), ('m', 9), ('C', 4), ('h', 29), ('2', 36), ('th', 16), ('2 Co', 13), ...

例如。'1 samuel' -> '1 Samuel'哪个匹配('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24)。最后一场比赛是('2 S', 24),所以答案是24


3

6502机器代码(C64),204字节

00 C0 20 FD AE 20 9E AD 85 FD 20 A3 B6 A9 1E 85 FB A9 00 85 FC A8 B1 22 18 69
4A 65 FC 45 FB 85 FC E6 FB C8 C4 FD D0 EE A5 FC 4A 4A 4A 4A A8 A5 FC 29 0F 19
BA C0 A8 BE 3D C0 A9 00 4C CD BD 16 34 42 0D 01 00 04 03 04 1C 0A 00 06 15 07
00 16 00 22 03 02 0E 00 24 00 00 01 00 08 03 00 1C 03 01 00 00 00 00 00 03 03
00 00 00 24 10 1F 18 0E 10 00 00 00 32 30 1F 2A 00 0D 00 05 00 1B 00 0A 00 01
28 00 00 0C 96 00 10 00 00 00 18 00 00 03 00 00 00 00 00 00 15 09 00 05 00 04
00 00 04 00 00 04 00 00 18 00 1D 05 00 00 19 00 0D 00 00 06 06 0C 00 00 00 00
05 00 01 00 05 00 04 30 10 20 10 40 70 00 00 20 50 00 10 60 30 20

说明

这里的关键是使用特殊的哈希函数,该函数将不冲突的情况映射0125*的值。然后将章节编号放在126字节表中。哈希以全8位完成,通过在另一个表中查找高半字节来调整最终值,这种方式将不同的高半字节合并在一起,而低半字节不会发生冲突。

这是代码部分的注释反汇编清单:

.C:c000  20 FD AE    JSR $AEFD          ; consume comma
.C:c003  20 9E AD    JSR $AD9E          ; evaluate argument
.C:c006  85 FD       STA $FD            ; remember string length
.C:c008  20 A3 B6    JSR $B6A3          ; free string ....
.C:c00b  A9 1E       LDA #$1E           ; initial xor key for hash
.C:c00d  85 FB       STA $FB
.C:c00f  A9 00       LDA #$00           ; initial hash value
.C:c011  85 FC       STA $FC
.C:c013  A8          TAY
.C:c014   .hashloop:
.C:c014  B1 22       LDA ($22),Y        ; load next string character
.C:c016  18          CLC                ; clear carry for additions
.C:c017  69 4A       ADC #$4A           ; add fixed offset
.C:c019  65 FC       ADC $FC            ; add previous hash value
.C:c01b  45 FB       EOR $FB            ; xor with key
.C:c01d  85 FC       STA $FC            ; store hash value
.C:c01f  E6 FB       INC $FB            ; increment xor key
.C:c021  C8          INY                ; next character
.C:c022  C4 FD       CPY $FD            ; check for string length
.C:c024  D0 EE       BNE .hashloop      ; end of string not reached -> repeat
.C:c026   .hashadjust:
.C:c026  A5 FC       LDA $FC            ; load hash
.C:c028  4A          LSR A              ; shift left four times
.C:c029  4A          LSR A
.C:c02a  4A          LSR A
.C:c02b  4A          LSR A
.C:c02c  A8          TAY                ; and copy to y index register
.C:c02d  A5 FC       LDA $FC            ; load hash again
.C:c02f  29 0F       AND #$0F           ; mask low nibble
.C:c031  19 BA C0    ORA $C0BA,Y        ; and add high nibble from table
.C:c034  A8          TAY                ; copy to y index register
.C:c035  BE 3D C0    LDX .chapters,Y    ; load chapter number from table
.C:c038  A9 00       LDA #$00           ; accu must be 0 for OS function:
.C:c03a  4C CD BD    JMP $BDCD          ; print 16bit value in A/X

之后是章节编号表,最后是哈希值高半字节的表。

在线演示

用法: sys49152,"name"例如,sys49152,"genesis"(输出50)。

重要:如果程序是从磁盘加载的(如在线演示中一样),请new首先发出命令!这是必需的,因为加载机器程序会浪费一些C64 BASIC指针。

关于外壳的提示:在C64的默认模式下,输入将显示为大写。实际上,这小写字母,但是C64有两种模式,在默认的大写/图形模式下,小写字母显示为大写字母,大写字母显示为图形符号。


*)当然,它并不像它可能的那么密集...哦,好吧,也许我以后会找到更好的解决方案;)


1

Java的8,623个 597 590字节

s->{int i=s.chars().map(c->c*c*c).sum()/13595;return s.contains("tt")?28:i<258?42:i<355?1:i<357?3:i<362?16:i<366?28:i<369?21:i<375?9:i<377?24:i<380?5:i<382?1:i<386?10:i<402?7:i<436?4:i<438?5:i<439?14:i<461?3:i<463?2:i<477?22:i<478?25:i<490?5:i<491?3:i<493?12:i<500?66:i<545?3:i<546?1:i<548?21:i<562?4:i<568?24:i<570?10:i<572?31:i<573?24:i<582?16:i<583?150:i<607?40:i<629?48:i<639?50:i<663?13:i<675?3:i<677?36:i<679?52:i<734?1:i<735?6:i<736?4:i<775?14:i<785?6:i<796?3:i<800?31:i<812?6:i<876?27:i<910?29:i<911?36:i<940?22:i<1018?4:i<1035?16:i<1036?13:i<1066?12:i<1092?34:i<1229?5:i<1230?3:8;}

@Nevay通过将for循环更改为流而获得了-7个字节。

绝对可以打更多的球。只是需要做更多的测试。
从长远来看,这可能不是最短的答案,也可以通过移植一些现有的答案来打高尔夫,但我仍然为自己想出一些办法而感到自豪。

说明:

在这里尝试。

  1. 输入字符串中每个字符的3的幂(作为ASCII值)
  2. 取那些的总和
  3. 将结果除以 13595整数除法(在Java中,这会自动截断/浮动结果)。
  4. 这样就留下了65个唯一值(仅habakkukmatthew都具有的值674
  5. 然后一个巨大的三元仿佛回到正确的结果(有几个值的单一三元语句组合在可能的情况(381382两个1; 425以及436两个4; 649以及663两个13; 952以及1018两个4; 1122以及1229两个5)。

1
您可以使用int i=s.chars().map(c->c*c*c).sum()/13595;代替int i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;
涅瓦
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.