ฉันมีกี่บท


18

พระคัมภีร์เป็นหนึ่งในหนังสือที่มีอิทธิพลมากที่สุดที่เคยเขียนและอ้างกันทั่วไปว่าเป็นหนังสือที่ขายดีที่สุดของเวลาทั้งหมด มันถูกเขียนขึ้นโดยนักเขียนที่แตกต่างกันประมาณ 40 คนในเวลาหลายร้อยปีก่อนที่จะรวบรวมเป็นรูปแบบปัจจุบัน แต่สิ่งที่น่าสนใจเกี่ยวกับพระคัมภีร์คือวิธีการแบ่งมัน มันถูกแบ่งออกเป็น 2 Testaments ที่แตกต่างกันซึ่งจะแบ่งออกเป็น 66 เล่มเล็ก ๆ ซึ่งแต่ละคนจะแบ่งออกเป็นบทเล็ก ๆ ซึ่งแต่ละคนจะแยกออกเป็นแต่ละบท

ฉันคิดว่ามันเป็นความท้าทายที่สนุกที่จะพยายามเข้ารหัสจำนวนบทในหนังสือแต่ละเล่มด้วยรหัสที่สั้นที่สุดเท่าที่จะเป็นไปได้ ดังนั้นสำหรับความท้าทายวันนี้คุณจะต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้เวลาหนึ่งของหนังสือที่เป็น input และผลจำนวนบทในหนังสือว่าตามที่The King James Version

คุณสามารถใช้ IO ในรูปแบบที่เหมาะสมเช่นการอ่าน / การเขียน STDIN / STDOUT หรือไฟล์อาร์กิวเมนต์ของฟังก์ชัน / ค่าส่งคืนการแจ้งเตือนผู้ใช้และอื่น ๆ ทั้งหมดได้รับอนุญาต ข้อมูลจะเป็นหนึ่งใน 66 เล่มของพระคัมภีร์เสมอและเป็นตัวพิมพ์เล็กเท่านั้น ซึ่งหมายความว่าหากคุณได้รับการป้อนข้อมูลอื่น ๆ พฤติกรรมที่ไม่ได้กำหนดจะได้รับอนุญาต เนื่องจากมีเพียงอินพุตและเอาต์พุตที่เป็นไปได้เพียง 66 รายการเท่านั้นดังนั้นจึงมีให้ที่นี่ตามหน้าวิกิพีเดียในบทไบเบิลใน The King James Version :

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นี้จึงมีความซับซ้อน ?
LyricLy

3
@LyricLy เพราะถึงแม้ว่าเอาต์พุตจะไม่ได้รับการแก้ไขก็ยังเกี่ยวกับวิธีที่มีประสิทธิภาพมากที่สุดในการสร้างชุดข้อมูลที่แตกต่างกันสองชุด: 1) ชื่อหนังสือ (หรือส่วนหนึ่งของชื่อยาวพอที่จะจดจำได้) และ 2 ) จำนวนบทที่สอดคล้องกัน
DJMcMayhem

3
คุณเพิ่งเห็นทุกคนที่มีจำนวนปกติแล้วเพียงแค่สดุดีซึ่งเป็นเหมือนครึ่งพระคัมภีร์
HyperNeutrino

4
ฉันต้องการenklactออกจากความท้าทายนี้ แต่ฉันไม่สามารถ ...
สิ้นเชิงมนุษย์

3
@DJMcMayhem คุณลืมความจริงที่ว่ามี 66 ตัวอักษรที่ไม่ซ้ำกัน : P
เต็มเปาโดยมนุษย์

คำตอบ:


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¤ị¢

ลองออนไลน์!

กรณีทดสอบ

มันทำงานอย่างไร

โดยพื้นฐานแล้วพยายามนี้เพื่อแปลง ords ของการป้อนตัวอักษรที่เป็นค่าไบนารีเช่น"joel"-> ->[106, 111, 101, 108]2^3*106 + 2^2*111 + 2^1*101 + 2^0*108

จากนั้นค่านี้จะได้รับ mod 407 จากนั้น mod 270 จากนั้น [mods เพิ่มเติมอีกไม่กี่] จากนั้น mod 160 ซึ่งมีประโยชน์เพราะจะแมปอินพุตสตริง 66 ทั้งหมดเป็นจำนวนเต็มตั้งแต่ 0 ถึง 158 (โชคดีใน mod สุดท้าย)

จำนวนเต็มถูกทำดัชนีจากรายการจำนวนเต็ม“ọḷḊḲɦ...ƙḅyẉ’b158¤เพื่อค้นหาค่าnที่อินพุตมีnจำนวนบทน้อยที่สุด โจเอลมีบทที่ 7 น้อยที่สุด

ค่านี้ของnจะถูกทำดัชนีเพิ่มเติมในรายการ“£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘เพื่อค้นหาจำนวนบทที่แน่นอน

การปรับปรุงที่เป็นไปได้: อินพุตที่มีจำนวนบทเท่ากันสามารถแฮชเป็นค่าเดียวกันจาก mods (ไม่จำเป็นต้องมีการชนกัน 0%) แต่ฉันไม่ได้อธิบายถึงสิ่งที่อยู่ในโปรแกรมของฉันเพื่อกำหนดลำดับของ mods



บันทึกไบต์โดยหลีกเลี่ยง@( %/i@“...’b158¤ị¢-> %/“...’b158¤iị¢) บันทึกไบต์อื่นโดยใช้อ็อฟเซ็ต 160 ไปยังรายการดัชนีโค้ดเพจเดียวที่จุดเริ่มต้น ( OḄ;407;270;“ọḷḊḲɦ‘-> OḄ;“ẋn=:!ס‘+160¤)
Jonathan Allan

10

Excel, 373 ไบต์

การนำ @ Misha กลับมาใช้ใหม่จากคำตอบ Mathematica ( 6a+b+8c+5d+3e modulo 151):

=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, 460 401 ไบต์

บันทึกเป็น 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 10และl 24เพราะการแข่งขันเหล่านี้er 10และjs 24ตามลำดับ


เราไม่เห็นคำตอบสูตร excel บ่อยครั้งที่ต้องใช้ตารางการค้นหา โหวตขึ้นสำหรับความแปลกใหม่และการดำเนินการ คุณอาจต้องการค้นหา / โพสต์คำถามเมตาบางส่วนเกี่ยวกับการให้คะแนนใน excel โดยเฉพาะฉันคิดว่าคุณอาจค้างชำระอีกสองไบต์สำหรับโครงร่างของคอลัมน์ A นอกจากนี้คุณอาจต้องการย้าย A ถึง C และ B: C ไปยัง A: B ดังนั้นคุณจะไม่ได้รับการ "เรียกเก็บ" สำหรับเซลล์ว่างใน A จากด้านบนของหัวของฉันฉันคิดว่าขนาดของ TSV / ไฟล์ข้อความ CSV สำหรับทั้งแผ่นอาจเป็นคะแนนใช่ไหม
Sparr

โดยทั่วไปฉันคิดว่าจำนวนไบต์ของตัวละครในไฟล์. csv (ในกรณีนี้ลบด้วยจำนวนรวมของค่าอินพุตที่รวม) ควรเป็นคะแนนของคำตอบ Excel ประเภทนี้ - ซึ่งโดยการนับของฉันจะอยู่ด้านบนด้วยคะแนน 401 bytes
Taylor Scott

@TaylorScott ฉันมี CR-LF เป็นอักขระบรรทัดใหม่ สมมติว่า 401 v. 464 เป็นเพราะเหตุนี้
Wernisch

@Wernisch ในระยะสั้นใช่ - คุณสามารถสันนิษฐานได้ว่า linefeeds ถูกจัดเก็บเป็นตัวอักษร ASCII ที่มีอักขระรหัส 10 หมายความว่าพวกเขานับเป็น 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

Mathematica: 323 294 ไบต์

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

มันทำงานอย่างไร

สำหรับหนังสือที่ขึ้นต้นด้วยรหัสอักขระa, b, c, d, e(ห่อรอบถ้าจำเป็น) คำนวณ6a+b+8c+5d+3eแบบโมดูโล 151 ที่เกิดขึ้นจะไม่ซ้ำกันและจากนั้นเงยหน้าขึ้นจำนวนบทในรายการที่บีบอัดที่มีความยาว 151 (รายการที่ไม่ได้ใช้ในรายการที่มี เต็มไปด้วยรายการที่ซ้ำกันของรายการก่อนหน้าซึ่งจะส่งเสริมการเข้ารหัสแบบรันไทม์หรืออาจจะเป็นยังไงก็ตามช่วยได้)

ขอบคุณ @numbermaniac สำหรับแนวคิดการบีบอัดรายการซึ่งยากที่จะใส่ตัวเลข แต่เป็นส่วนสำคัญของการปรับปรุงที่นี่

เวอร์ชันเก่า: Mathematica, 548 435 407 bytes

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

มันทำงานอย่างไร

เราแปลงแต่ละชื่อnameตัวละครที่ 1, 3 และ 6 ของnamename(เช่นleviticusกลายเป็นlvi, jobกลายเป็นjbb) ก่อนที่จะมองมันขึ้นมา

รายการที่เราค้นหามีการบีบอัดเล็กน้อยโดยการใส่หมายเลข 1 หลักและ 2 หลักพร้อมกันในสตริง

Mathematica: 40 ไบท์, ไม่ใช่การแข่งขัน

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

ใช่.


หากคุณใช้Compressในรายการคุณจะได้รับสตริงที่สามารถเปลี่ยนกลับเป็นรายการได้Uncompressในโปรแกรมของคุณ ฟังก์ชั่นทั้งหมดออกมาเป็น 430 ไบต์ช่วยให้คุณประหยัด 5 :)
numbermaniac

ขอบคุณ! รุ่นของโปรแกรมที่มีวิธีที่ดีกว่าที่จะลดลงในรายการ แต่นี้ทำงานออกเป็นอย่างดีสำหรับวิธีการใหม่ที่ฉันพบ :)
Misha Lavrov

4
ฉันหวังว่าคำตอบทางคณิตศาสตร์ที่สองจะมีคัมภีร์ไบเบิลในตัว
SztupY

ไม่มีในตัว; มีWolframAlpha["number of chapters of "<>#,"Result"]&แต่อย่างใดที่ไม่รู้สึกเหมือนกันมาก
Misha Lavrov

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Ɲ¤‘¤

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

แฮชผลิตภัณฑ์ของเลขลำดับของอักขระของสตริงป้อนข้อมูลโดยใช้ส่วนที่เหลือสาม สองสามส่วนค้นหาผลลัพธ์ในรายการของรายการและใช้ดัชนีที่พบเพื่อค้นหาผลลัพธ์ในรายการความยาวหนังสือ

เมื่อค้นหาฟังก์ชั่นแฮชฉันจะพิจารณาเฉพาะสิ่งที่ส่งผลมากที่สุดหนึ่ง bucket ด้วยผลลัพธ์ใด ๆ ที่เกิน 255 เพื่ออนุญาตการจัดทำดัชนีโค้ดเพจจากนั้นเลือกรายการที่ลดจำนวนทั้งหมดของค่าการเข้ารหัส (หลังจากลบที่ฝากข้อมูล ไม่มีถังที่ยาวที่สุด) จาก 66 ด้วยสาม modulos ฉันพบ 59 ( %731%381%258) a 58 (%731%399%239 ) จากนั้นหนึ่งรายการที่มี 56 รายการ ( %1241%865%251) [สร้างสำหรับ 117 bytes] ... จากนั้นฉันพบ 58 ใช้เหลือเพียงสอง ( %1987%251) [ทำให้ 115 bytes]
.. . จากนั้นฉันพบว่า 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]

( 0และ1เป็นปุ่มจำลองที่อนุญาตให้[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

คำอธิบาย :

กุญแจสำคัญในที่นี้คือการใช้ฟังก์ชั่นการแฮ็กพิเศษที่แมปโดยไม่มีการชนกับค่า 0ไป125*) หมายเลขของบทจะถูกวางไว้ในตาราง 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 พื้นฐานบางส่วนเสียหาย

คำแนะนำเกี่ยวกับปลอก: ในโหมดเริ่มต้นของ C64 อินพุตจะปรากฏเป็นตัวพิมพ์ใหญ่ นี่คือในความเป็นจริงตัวพิมพ์เล็ก แต่ศตวรรษที่ 64 มีสองโหมดและเริ่มต้นบน / โหมดกราฟิกตัวอักษรตัวพิมพ์เล็กปรากฏเป็นตัวพิมพ์ใหญ่และอักษรตัวพิมพ์ใหญ่ปรากฏเป็นสัญลักษณ์กราฟิก


*) แน่นอนว่านี่ไม่หนาแน่นเท่าที่ควร ... โอ้ดีบางทีฉันอาจจะหาทางออกที่ดีกว่าในภายหลัง;)


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

-7 ไบต์ขอบคุณ@Nevayโดยการเปลี่ยน for-loop เป็นสตรีม

สามารถตีกอล์ฟได้มากกว่านี้แน่นอนต้องทำการทดสอบเพิ่มเติม
อาจไม่ใช่คำตอบที่สั้นที่สุดโดยการยิงระยะไกลและอาจตีกอล์ฟด้วยคำตอบที่มีอยู่ แต่ฉันก็ยังภูมิใจที่ได้คิดอะไรบางอย่างด้วยตัวเอง .. :)

คำอธิบาย:

ลองที่นี่

  1. รับกำลัง 3 ของอักขระแต่ละตัว (เป็นค่า ASCII) ในอินพุตสตริง
  2. รับผลรวมของเหล่านั้น
  3. หารผลลัพธ์ด้วย 13595หารจำนวนเต็ม (ใน Java สิ่งนี้จะตัด /อัตโนมัติ)
  4. ทำให้มีค่าที่ไม่ซ้ำกัน 65 ค่า (เฉพาะhabakkukและmatthewทั้งคู่มีค่าเป็น674)
  5. และจากนั้นหนึ่งในยักษ์ใหญ่ประกอบไปด้วยถ้าจะกลับมาผลที่ถูกต้อง (มีค่าไม่กี่รวมใน ternary-คำเดียวที่เป็นไปได้ ( 381และ382ทั้ง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;
Nevay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.