몇 개의 챕터가 있습니까?


18

성서 는 지금까지 기록 된 가장 영향력있는 책 중 하나이며, 가장 많이 팔리는 책 으로 일반적으로 인용됩니다. 이 책은 수백 년 동안 40 명의 저술가들이 현재 양식으로 편집하기 전에 작성했습니다. 그러나 성서에서 흥미로운 점은 성경이 나누어지는 방식입니다. 이 책은 두 개의 서로 다른 유언으로 나뉘어져 있으며, 66 권의 작은 책으로 나뉘어져 있으며, 각 책은 작은 장으로 나뉘어져 있으며, 각각은 개별 구절로 나뉩니다.

가능한 한 가장 짧은 코드로 각 책의 챕터 수를 인코딩하는 것이 재미있는 도전이라고 생각했습니다. 따라서 오늘날의 과제를 해결하려면 책 중 하나를 입력으로 사용하고 The King James Version 에 따라 해당 책의 장 수를 출력하는 프로그램이나 기능을 작성해야합니다 .

STDIN / STDOUT 또는 파일 읽기 / 쓰기, 함수 인수 / 반환 값, 사용자 프롬프트 등 모든 합리적인 형식으로 IO를 사용할 수 있습니다. 입력은 항상 성서 66 권 중 하나이며 소문자 일뿐입니다. 이것은 다른 입력이 주어지면 정의되지 않은 동작이 허용됨을 의미합니다. 66 개의 가능한 입력과 출력이 있기 때문에, 킹 제임스 성경의 성경 장에 관한 Wikipedia의 페이지에 따르면, 모두 여기에 제공됩니다 .

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) 책의 이름 (또는 인식하기에 충분한 이름의 일부) ) 해당 장 수.
DJMcMayhem

3
당신은 단지 정상적인 양을 가진 모든 것들을 본 다음 반 성경과 같은 시편
HyperNeutrino

4
나는 싶어 enklact이 도전의 길을하지만 ... 할 수 없습니다
totallyhuman

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

온라인으로 사용해보십시오!

테스트 사례

작동 원리

기본적으로 문자 입력의 순서를 이진 값으로 변환하려고합니다 (예 : "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 사이의 정수에 매핑하기 때문에 유용합니다 (최종 모드에서는 운이 좋음).

정수는 정수 목록에서 인덱싱되어 입력에 가장 적은 수의 챕터 수가 “ọḷḊḲɦ...ƙḅyẉ’b158¤있도록 값을 찾습니다 . Joel은 7 번째로 가장 적은 수의 챕터를 갖습니다.nn

이 값은 정확한 장 수를 찾기 위해 n목록 “£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘에 추가로 색인됩니다 .

가능한 개선 : 동일한 수의 챕터를 가진 입력은 mods에서 동일한 값으로 해시 할 수 있지만 (0 % 충돌은 필요하지 않음), 프로그램에서 mod 시퀀스를 결정하기 위해 설명하지 않았습니다.



@( %/i@“...’b158¤ị¢-> %/“...’b158¤iị¢) 를 피하여 바이트를 저장하십시오 . 시작시 단일 코드 페이지 인덱스 목록 (160)에 오프셋 160을 사용하여 다른 바이트를 저장하십시오 ( OḄ;407;270;“ọḷḊḲɦ‘-> OḄ;“ẋn=:!ס‘+160¤).
Jonathan Allan

10

엑셀, 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한 다음 추가합니다. 이 변화 109두 번, 그리고 ,1,,,4 번.

기존 방식으로 업데이트되었습니다. 엑셀, 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 10하고 l 24있기 때문 입니다.er 10js 24


조회 테이블이 필요한 엑셀 수식이 자주 표시되지 않습니다. 참신과 집행에 대한 찬성. Excel에서 점수 매기기에 대한 메타 질문을 검색하거나 게시하고 싶을 수도 있습니다. 특히 A 열의 레이아웃에 몇 바이트가 더 필요할 수 있습니다. 또한 A에서 C로, B : C에서 A : B로 이동하여 A의 모든 빈 셀에 대해 "충전"되지 않도록 할 수 있습니다. 내 머리 꼭대기에서 TSV / 전체 시트의 CSV 텍스트 파일이 올바른 점수입니까?
Sparr

일반적으로 .csv 파일의 문자 바이트 수 (이 경우 포함 된 입력 값의 바이트 수를 뺀 값)는 이러한 유형의 Excel 응답 점수이어야합니다. 내 카운트에 의해 위의 점수는 401 바이트
Taylor Scott

@TaylorScott, CR-LF를 줄 바꿈 문자로 사용했습니다. 401 v. 464가이 때문이라고 가정하십시오.
Wernisch

@Wernisch, 짧은에, 예 - 당신은 1 바이트로 계산 있음을 의미하는 줄 바꿈이 charCode 값 10 ASCII 문자 리터럴로 저장되어 있다고 가정 할 수 있습니다
테일러 스콧

9

자바 스크립트 (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 어느 시점에서 일반 노드 프로그램을 작성했지만 특히 빠르지 않으므로 대부분 사용자 정의 코드를 작성하게됩니다 ... O_o
Arnauld

9

수학 : 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 435407 바이트

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 자리 챕터 숫자를 문자열로 묶어 약간 압축됩니다.

수학 : 40 바이트, 비경쟁

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

네.


당신이 사용하는 경우 Compress목록에, 당신은 함께 목록에 다시 설정할 수 있습니다 문자열을 얻을 Uncompress귀하의 프로그램을; 전체 기능을 사용하면 5 : 절약, 430 바이트로 나온다
numbermaniac을

감사! 프로그램의 버전 목록을 단축하기 위해 더 나은 방법이 있었다, 그러나 이것은 내가 :) 볼 수있는 새로운 접근 방식에 대해 매우 잘 일
미샤 라브 로프

4
나는 두 번째 Mathematica 답변에 성경이 내장되기를 바랐습니다
SztupY

내장이 없습니다. 이 WolframAlpha["number of chapters of "<>#,"Result"]&있지만 어떻게 든 똑같은 느낌이 들지 않습니다.
Misha Lavrov

1
그것은 표준 허점과 명시 적으로 질문에 부정 행위라고 불리는 Wolfram Alpha에 대한 답변을 찾습니다. (나는 바이트 수의 볼프람 알파의 소스 코드 및 데이터베이스를 포함하는 경우, 괜찮아요 다시 만들 것이라고 생각하지만.)
미샤 라브 로프


4

젤리 ,  117 (115)  114 바이트

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

온라인으로 사용해보십시오! 또는 시험 스위트를 참조하십시오

어떻게?

개의 세 개의 나눗셈 나머지 3 를 가져 와서 입력 문자열의 문자 서수를 곱하고 결과를 목록 목록에서 찾은 다음 찾은 색인을 사용하여 책 길이 목록에서 결과를 찾습니다.

해시 함수를 찾을 때 코드 페이지 인덱싱을 허용하기 위해 최대 255 개의 결과가있는 버킷을 하나만 고려한 다음 인코딩 할 총 값 수를 최소화 한 값을 선택했습니다 ( "불량"버킷을 제거한 후 또는 가장 긴 버킷이 존재하지 않습니다). 세 개의 모듈로가있는 66에서 59 ( %731%381%258) 58 ( %731%399%239)을 찾은 다음 56 개의 항목이있는 하나 ( %1241%865%251) [117 바이트 만들기]를 찾았습니다. 그 다음 두 개의 나머지 ( %1987%251)를 사용하여 58을 찾았습니다
. 그런 다음 3 개의 나머지를 사용하여 55를 찾았습니다. 두 개의 더미 항목이 추가되면 조회 목록을 추가로 압축 할 수 있습니다 ...

코드:

1.

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

코드 페이지 색인 ( “...“...“...“...“...“...‘) 목록 5 개 :

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

파이썬 (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" (output 50).

중요 : 프로그램이 온라인 데모와 같이 디스크에서로드 된 경우 new먼저 명령을 실행하십시오! 머신 프로그램을로드하면 일부 C64 BASIC 포인터가 손상되기 때문에 이것은 필수입니다.

케이스에 대한 힌트 : C64의 기본 모드에서는 입력이 대문자로 나타납니다. 이것은 이다 사실 소문자로하지만, C64 두 가지 모드를 가지고 있으며, 대문자와 대문자 그래픽 상징으로 나타나는 상단의 기본에 / 그래픽 모드는 소문자가 나타납니다.


*) 물론 이것은 밀도가 높지 않습니다 ... 아, 나중에 더 나은 해결책을 찾을 수 있습니다.)


1

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

for 루프를 스트림으로 변경하여 @Nevay 덕분에 -7 바이트 .

확실히 더 많은 골프를하실 수 있습니다. 테스트를 더해야합니다.
긴 대답으로는 가장 짧은 답변이 아닐 수도 있고 기존 답변을 포팅하여 골프를 칠 수도 있지만 여전히 무언가를 내놓은 것을 자랑스럽게 생각합니다 .. :)

설명:

여기에서 시도하십시오.

  1. 입력 문자열에서 각 문자의 3의 거듭 제곱 (ASCII 값)을 취합니다.
  2. 그것들의 합계를 취합니다
  3. 결과 13595를 정수 나누기로 나눕니다 (Java에서는 자동으로 결과를 자르거나 플로어합니다).
  4. 이 잎 (65 개) 고유 값 (단지 habakkukmatthew모두의 값이 674)
  5. 그리고, 하나의 원 - 거대한 경우 소수 값은 단일 원 문에 결합하여 (올바른 결과를 반환 가능한 ( 3813821, 425그리고 436모두 4, 649663모두 13, 95210184, 11221229모두 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.