Tôi có bao nhiêu chương?


18

Kinh Thánh là một trong những cuốn sách có ảnh hưởng nhất từng được viết và thường được trích dẫn là cuốn sách bán chạy nhất mọi thời đại . Nó được viết bởi khoảng 40 tác giả khác nhau trong hàng trăm năm trước khi được biên soạn thành dạng hiện tại. Nhưng điều thú vị về Kinh thánh là cách nó được chia ra. Nó được chia thành 2 bản di chúc khác nhau, được chia thành 66 cuốn sách nhỏ hơn, mỗi cuốn được chia thành các chương nhỏ hơn, mỗi phần được chia thành các câu thơ riêng lẻ.

Tôi nghĩ rằng sẽ là một thử thách thú vị khi cố gắng mã hóa số lượng chương trong mỗi cuốn sách theo mã ngắn nhất có thể. Vì vậy, đối với thử thách ngày nay, bạn phải viết một chương trình hoặc chức năng lấy một trong những cuốn sách làm đầu vào và xuất số lượng chương trong cuốn sách đó theo Phiên bản King James .

Bạn có thể sử dụng IO ở bất kỳ định dạng hợp lý nào, ví dụ đọc / ghi STDIN / STDOUT hoặc tệp, đối số hàm / giá trị trả về, nhắc nhở người dùng, v.v ... đều được cho phép. Đầu vào sẽ luôn là một trong 66 cuốn Kinh thánh và chỉ viết thường. Điều này có nghĩa là nếu bạn được cung cấp bất kỳ đầu vào nào khác, hành vi không xác định được cho phép. Vì chỉ có 66 đầu vào và đầu ra có thể, tất cả chúng đều được cung cấp ở đây, theo trang Wikipedia về các chương Kinh thánh trong Phiên bản King James :

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

Vì thử thách này là tìm ra cách tối ưu để mã hóa mọi tên sách và số chương, nên sử dụng bất kỳ nội dung cung cấp thông tin nào về Kinh Thánh đều không được phép. Tuy nhiên, vì sẽ rất thú vị khi xem ngôn ngữ nào có nội dung như vậy, vui lòng chia sẻ phiên bản không cạnh tranh thứ hai cùng với câu trả lời của bạn.Tìm nạp thông tin từ các nguồn bên ngoài cũng không được phép (không có lỗ hổng tiêu chuẩn nào được cho phép, nhưng tôi nghĩ rằng sẽ hữu ích khi đề cập rõ ràng đến vấn đề đó).

Như thường lệ, đây là một thử thách , vì vậy hãy cố gắng thực hiện chương trình ngắn nhất có thể (tính bằng byte) như bạn có thể. Chúc bạn chơi golf vui vẻ!


3
Đầu ra không cố định, vậy tại sao độ phức tạp kolmogorov này ?
LyricLy

3
@LyricLy Bởi vì mặc dù đầu ra không cố định, nhưng vẫn cần xem cách hiệu quả nhất để tạo hai bộ dữ liệu khác nhau: 1) Tên của các cuốn sách (hoặc một phần của tên đủ dài để nhận ra nó) và 2 ) Số chương tương ứng.
DJMcMayhem

3
bạn chỉ nhìn thấy tất cả những cái có số lượng bình thường và sau đó chỉ là các thánh giống như HALF THE BIBLE
HyperNeutrino

4
Tôi muốn enklactthoát khỏi thử thách này nhưng tôi không thể ...
hoàn toàn là

3
@DJMcMayhem Bạn đã quên thực tế là không có 66 chữ cái duy nhất. : P
hoàn toàn là

Câu trả lời:


12

Thạch , 127 byte

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

Hãy thử trực tuyến!

Các trường hợp thử nghiệm

Làm thế nào nó hoạt động

Về cơ bản, điều này cố gắng chuyển đổi các quỹ đạo của các ký tự đầu vào thành một giá trị nhị phân, ví dụ "joel"-> [106, 111, 101, 108]->2^3*106 + 2^2*111 + 2^1*101 + 2^0*108 .

Sau đó, giá trị này được lấy mod 407, sau đó là mod 270, sau đó [thêm một vài mod], sau đó là mod 160. Điều này rất hữu ích vì nó ánh xạ tất cả 66 đầu vào chuỗi thành số nguyên từ 0 đến 158 (may mắn trên mod cuối cùng).

Số nguyên được lập chỉ mục từ danh sách số nguyên “ọḷḊḲɦ...ƙḅyẉ’b158¤để tìm giá trị nsao cho đầu vào có nsố chương ít nhất -th. Joel tình cờ có số lượng chương ít nhất là 7.

Giá trị nnày được tiếp tục lập chỉ mục vào danh sách “£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘để tìm số chương chính xác.

Cải thiện có thể có: các đầu vào có cùng số chương có thể băm đến cùng một giá trị từ các mod (không cần xung đột 0%), nhưng tôi không tính đến điều đó trong chương trình của mình để xác định chuỗi mod.



Lưu một byte bằng cách tránh @( %/i@“...’b158¤ị¢-> %/“...’b158¤iị¢). Lưu một byte khác bằng cách sử dụng offset 160 vào danh sách chỉ mục trang mã khi bắt đầu ( OḄ;407;270;“ọḷḊḲɦ‘-> OḄ;“ẋn=:!ס‘+160¤).
Jonathan Allan

10

Excel, 373 byte

Sử dụng lại cách tiếp cận của @ Misha từ câu trả lời Mathicala ( 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

Tra cứu trả về các chương -1, và sau đó thêm một chương. Điều này thay đổi 10thành 9hai lần, và ,1,thành ,,4 lần.

Cập nhật cách tiếp cận cũ. Excel, 460 401 byte

Lưu dưới dạng CSV, Tên sách được nhập ở cuối dòng đầu tiên ( C1), kết quả được hiển thị trong 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

Đối với các bảng tra cứu, chúng ta có thể bỏ qua et 10l 24vì những trận đấu trên er 10js 24tương ứng.


Chúng tôi không thấy câu trả lời công thức excel rất thường xuyên yêu cầu bảng tra cứu. Upvote cho sự mới lạ và thực hiện. Bạn có thể muốn tìm kiếm / đăng một số câu hỏi meta về việc ghi điểm trong excel. Cụ thể, tôi nghĩ rằng bạn có thể nợ thêm một vài byte cho bố cục của cột A. Ngoài ra, bạn có thể muốn chuyển A sang C và B: C sang A: B để bạn không bị "tính phí" cho tất cả các ô trống trong A. Ngoài đỉnh đầu của tôi, tôi nghĩ rằng kích thước của TSV / Tệp văn bản CSV cho toàn bộ trang tính có thể là điểm số phù hợp?
Sparr

Nói chung, tôi nghĩ rằng số lượng ký tự của các ký tự trong tệp .csv (trong trường hợp này trừ đi giá trị phụ của giá trị đầu vào được bao gồm) phải là điểm của các loại câu trả lời Excel này - theo số đếm của tôi để lại ở trên điểm số 401 byte
Taylor Scott

@TaylorScott, tôi đã có CR-LF là nhân vật dòng mới. Giả sử 401 v. 464 là vì điều này?
Wernisch

@Wernisch, nói ngắn gọn là có - bạn có thể giả sử rằng các nguồn cấp dữ liệu được lưu trữ dưới dạng ký tự ASCII bằng ký tự 10, có nghĩa là chúng được tính là 1 byte
Taylor Scott

9

JavaScript (ES6), 251 197 byte

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

Kiểm tra

Định dạng và nhận xét

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
Bạn chính thức là bậc thầy trong việc tìm ra phương pháp băm hiệu quả nhất trong JS ... Hay bạn có một chương trình tìm phương thức cho bạn không? ;)
Sản xuất ETH

@ETHproductions Tôi đã viết một chương trình Node chung vào một lúc nào đó, nhưng nó không đặc biệt nhanh nên cuối cùng tôi viết mã tùy chỉnh ... O_o
Arnauld

9

Toán học: 323 294 byte

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

Làm thế nào nó hoạt động

Đối với một cuốn sách bắt đầu với mã ký tự a, b, c,d , e(gói xung quanh nếu cần thiết) Tính6a+b+8c+5d+3e modulo 151, mà sẽ xảy ra là độc đáo, và sau đó nhìn lên số chương trong một danh sách nén chiều dài 151. (mục không sử dụng trong danh sách được điền vào các bản sao của mục trước. Điều này khuyến khích mã hóa độ dài chạy, có thể? Dù sao, nó sẽ giúp.)

Cảm ơn @numbermaniac cho ý tưởng nén danh sách, khó có thể đưa ra một con số nhưng là một phần rất lớn của sự cải thiện ở đây.

Phiên bản cũ: Mathicala, 548 435 407 byte

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

Làm thế nào nó hoạt động

Chúng tôi chuyển đổi mỗi tên namecho nhân vật 1, 3 và 6 namename(ví dụ như leviticustrở thành lvi, jobtrở thành jbb) trước khi nhìn nó lên.

Danh sách chúng tôi tìm kiếm mọi thứ được nén lại một chút bằng cách đặt các số chương 1 chữ số và 2 chữ số thành các chuỗi.

Toán học: 40 byte, không cạnh tranh

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

Vâng.


Nếu bạn sử dụng Compresstrong danh sách, bạn sẽ nhận được một chuỗi có thể được quay lại vào danh sách Uncompresstrong chương trình của bạn; toàn bộ chức năng đạt tới 430 byte, giúp bạn tiết kiệm 5 :)
numbermaniac

Cảm ơn! Phiên bản đó của chương trình có những cách tốt hơn để rút ngắn danh sách, nhưng điều này rất hiệu quả đối với cách tiếp cận mới mà tôi tìm thấy :)
Misha Lavrov

4
Tôi thực sự hy vọng câu trả lời
Mathicala

Không có tích hợp; Có WolframAlpha["number of chapters of "<>#,"Result"]&, nhưng bằng cách nào đó, nó không cảm thấy giống như điều tương tự.
Misha Lavrov

1
Nó tìm kiếm câu trả lời trên Wolfram Alpha, được gọi là gian lận cả trong các sơ hở tiêu chuẩn và rõ ràng trong câu hỏi. (Mặc dù tôi nghĩ rằng nếu tôi đưa mã nguồn và cơ sở dữ liệu của Wolfram Alpha vào số byte, điều đó sẽ khiến nó ổn trở lại.)
Misha Lavrov


4

Thạch ,  117 115  114 byte

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

Hãy thử trực tuyến! hoặc xem bộ thử nghiệm

Làm sao?

Băm sản phẩm thứ tự của các ký tự của chuỗi đầu vào bằng cách lấy ba hai ba dư chia, nhìn lên kết quả trong một danh sách liệt kê và sử dụng các chỉ số phát hiện tìm kiếm kết quả trong một danh sách có độ dài cuốn sách.

Khi tìm hàm băm, tôi chỉ xem xét các hàm dẫn đến nhiều nhất một nhóm với bất kỳ kết quả nào trên 255 để cho phép lập chỉ mục trang mã và sau đó chọn các hàm tối thiểu hóa tổng số giá trị để mã hóa (sau khi xóa nhóm "vi phạm" hoặc nếu không tồn tại cái xô dài nhất). Từ 66 với ba modul tôi tìm thấy một 59 (%731%381%258 ) a 58 ( %731%399%239) rồi một với 56 mục ( %1241%865%251) [tạo 117 byte] ... Sau đó tôi tìm thấy 58 chỉ sử dụng hai phần dư ( %1987%251) [tạo cho 115 byte]
.. . tôi đã tìm thấy 55 bằng ba phần còn lại, khi thêm hai mục giả cho phép nén thêm danh sách tra cứu ...

Mật mã:

1.

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

là danh sách năm danh sách các chỉ mục trang mã (“...“...“...“...“...“...‘ ):

[[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]]

Điều này được hoán vị bằng cách sử dụng nguyên tử Z để lấy các thùng; gọi đây là 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]

(các 01là các phím giả, cho phép[179,5,111] hai nữa ở bên phải - chuyển vị yêu cầu các mục dài hơn ở bên trái)

2.

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

Gọi C này (số chương) - đó là danh sách các số nguyên:

[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]

và được xây dựng như sau (hai phím giả ở trên do đó cho phép 10,12,13theo thứ tự tăng dần):

“£Ẇ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]

Bây giờ phiên bản đơn giản của mã là:

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 byte

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]

Hãy thử trực tuyến!

Hoạt động bằng cách thay đổi đầu vào thành Trường hợp tiêu đề và tìm chuỗi con phù hợp cuối cùng trong danh sách.

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

Ví dụ. '1 samuel' -> '1 Samuel'phù hợp với ('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24). Trận đấu cuối cùng là ('2 S', 24)vậy, câu trả lời là24


3

Mã máy 6502 (C64), 204 byte

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

Giải trình :

Chìa khóa ở đây là sử dụng chức năng băm đặc biệt ánh xạ mà không cần thu thập các giá trị 0thành125 *). Các số chương sau đó được đặt trong một bảng 126 byte. Băm được thực hiện trong 8 bit đầy đủ, giá trị cuối cùng được điều chỉnh bằng cách tra cứu các nib cao trong một bảng khác, theo cách này kết hợp các nib cao khác nhau trong đó các nib thấp không va chạm.

Dưới đây là danh sách tháo gỡ nhận xét của phần mã:

.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

sau đó theo một bảng các số chương và cuối cùng là một bảng các mức cao cho giá trị băm.

Bản demo trực tuyến

Cách sử dụng : sys49152,"name" , ví dụ sys49152,"genesis"(đầu ra50 ).

Quan trọng: Nếu chương trình được tải từ đĩa (như trong bản demo trực tuyến), hãy đưa ra mộtnew trước tiên hãy ra lệnh! Điều này là cần thiết bởi vì tải một chương trình máy bỏ qua một số con trỏ C64 BASIC.

Gợi ý về vỏ: Trong chế độ mặc định của C64, đầu vào sẽ xuất hiện dưới dạng chữ hoa. Điều này thực tế chữ thường, nhưng C64 có hai chế độ và trong mặc định trên / chế độ đồ họa, ký tự chữ thường xuất hiện như là chữ hoa và ký tự chữ hoa xuất hiện như là biểu tượng đồ họa.


*) tất nhiên, điều này không dày đặc như nó có thể ... ồ, có lẽ tôi sẽ tìm thấy một giải pháp thậm chí tốt hơn sau này;)


1

Java 8, 623 597 590 byte

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 byte nhờ @Nevay bằng cách thay đổi vòng lặp for thành luồng.

Chắc chắn có thể được chơi gôn nhiều hơn .. Chỉ cần làm thêm một số thử nghiệm.
Nó có thể không phải là câu trả lời ngắn nhất bằng một cú sút xa, và có thể bị đánh gôn bằng cách chuyển một số câu trả lời hiện có, nhưng tôi vẫn tự hào khi tự mình nghĩ ra điều gì đó .. :)

Giải trình:

Hãy thử nó ở đây.

  1. Có sức mạnh bằng 3 của mỗi ký tự (dưới dạng giá trị ASCII) trong Chuỗi đầu vào
  2. Lấy tổng của những
  3. Chia kết quả bằng 13595 chia số nguyên (trong Java, phần này tự động cắt / tầng kết quả).
  4. Điều này để lại 65 giá trị duy nhất (chỉ habakkukmatthewcả hai đều có giá trị 674)
  5. Và rồi một ternary-nếu khổng lồ để trả lại kết quả chính xác (với một vài giá trị kết hợp trong một ternary-tuyên bố đơn nếu có thể ( 381382cả 1; 425436cả 4; 649663cả 13; 9521018cả 4; 11221229cả hai 5).

1
Bạn có thể sử dụng int i=s.chars().map(c->c*c*c).sum()/13595;thay vì int i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;.
Nevay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.