Ile mam rozdziałów?

18

Biblia jest jedną z najbardziej wpływowych książek, jakie kiedykolwiek napisano, i jest często cytowana jako najlepiej sprzedająca się książka wszechczasów . Zostało napisane przez około 40 różnych autorów na przestrzeni setek lat zanim został skompilowany w jego obecnej formie. Ciekawe jest to, że Biblia jest podzielona. Jest on podzielony na 2 różne testamenty, które są podzielone na 66 mniejszych książek, z których każda jest podzielona na mniejsze rozdziały, z których każdy jest podzielony na poszczególne wersety.

Pomyślałem, że fajnym wyzwaniem będzie zakodowanie liczby rozdziałów w każdej książce w możliwie najkrótszym kodzie. Dlatego na dzisiejsze wyzwanie musisz napisać program lub funkcję, która pobiera jedną z książek jako dane wejściowe i wyświetla liczbę rozdziałów w tej książce zgodnie z The King James Version .

Możesz wziąć IO w dowolnym rozsądnym formacie, na przykład odczyt / zapis STDIN / STDOUT lub plik, argumenty funkcji / zwracane wartości, monitowanie użytkownika itp. Są dozwolone. Wkładem będzie zawsze jedna z 66 ksiąg Biblii i tylko małe litery. Oznacza to, że jeśli otrzymasz jakiekolwiek inne dane wejściowe, niezdefiniowane zachowanie jest dozwolone. Ponieważ istnieje tylko 66 możliwych danych wejściowych i wyjściowych, wszystkie zostały tutaj podane, zgodnie ze stroną Wikipedii na temat rozdziałów biblijnych w 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

Ponieważ wyzwanie polega na znalezieniu optymalnego sposobu zakodowania każdej nazwy książki i liczby rozdziałów, użycie jakichkolwiek wbudowanych elementów, które zawierają informacje o Biblii, jest niedozwolone. Ponieważ jednak interesujące byłoby sprawdzenie, które języki mają takie wbudowane funkcje, możesz udostępnić drugą, nie konkurującą wersję wraz z odpowiedzią. Pobieranie informacji ze źródeł zewnętrznych również nie jest dozwolone (żadna ze standardowych luk nie jest dozwolona, ​​ale pomyślałem, że dobrze byłoby wyraźnie o tym wspomnieć).

Jak zwykle jest to wyzwanie związane z , więc postaraj się stworzyć możliwie najkrótszy program (mierzony w bajtach). Miłej zabawy w golfa!

DJMcMayhem
źródło
3
Wynik nie jest ustalony, więc dlaczego ta złożoność kolmogorowa ?
LyricLy,
3
@LyricLy Ponieważ mimo że dane wyjściowe nie są naprawione, wciąż chodzi o to, aby znaleźć najbardziej efektywny sposób generowania dwóch różnych zestawów danych: 1) Nazwy książek (lub część nazwy wystarczająco długa, aby ją rozpoznać) i 2 ) Odpowiednia liczba rozdziałów.
DJMcMayhem
3
po prostu widzisz wszystkie z normalną ilością, a potem tylko psalmy, które są jak POŁOWA BIBLII
HyperNeutrino
4
Chcę enklactwyjść z tego wyzwania, ale nie mogę ...
całkowicie ludzki
3
@DJMcMayhem Zapomniałeś, że nie ma 66 unikalnych liter. : P
totalnie ludzki

Odpowiedzi:

12

Galaretka , 127 bajtów

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

Wypróbuj online!

Przypadki testowe

Jak to działa

Zasadniczo próbuje to przekonwertować porządek znaków wprowadzanych na wartość binarną, na przykład "joel"->[106, 111, 101, 108] -> 2^3*106 + 2^2*111 + 2^1*101 + 2^0*108.

Następnie ta wartość jest pobierana mod 407, następnie mod 270, następnie [kilka dodatkowych modów], a następnie mod 160. Jest to przydatne, ponieważ mapuje wszystkie 66 łańcuchów wejściowych na liczby całkowite od 0 do 158 (na szczęście przy ostatnim modie).

Liczba całkowita jest indeksowana z listy liczb całkowitych w “ọḷḊḲɦ...ƙḅyẉ’b158¤celu znalezienia wartości ntakiej, że wejście ma nnajmniejszą liczbę rozdziałów. Joel ma 7-tą najmniejszą liczbę rozdziałów.

Ta wartość njest dalej indeksowana do listy, “£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘aby znaleźć dokładną liczbę rozdziałów.

Możliwa poprawa: dane wejściowe z taką samą liczbą rozdziałów mogą mieszać do modów tę samą wartość (0% kolizji nie jest konieczne), ale nie uwzględniłem tego w moim programie do określania sekwencji modów.

fireflame241
źródło
126 bajtów
caird coinheringaahing
Zapisz bajt, unikając @( %/i@“...’b158¤ị¢-> %/“...’b158¤iị¢). Zapisz kolejny bajt, używając przesunięcia 160 do pojedynczej listy indeksów stron kodowych na początku ( OḄ;407;270;“ọḷḊḲɦ‘-> OḄ;“ẋn=:!ס‘+160¤).
Jonathan Allan
10

Excel, 373 bajtów

Ponowne użycie podejścia @ Misha z odpowiedzi 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

Wyszukiwanie zwraca rozdziały -1 , a następnie dodaje jeden. Zmienia się to 10w 9dwa razy i ,1,w ,,cztery razy.

Zaktualizowano do starego podejścia. Excel, 460 401 bajtów

Zapisz jako CSV, nazwa książki wprowadzona na końcu pierwszego wiersza (C1 ), wynik wyświetlany w 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

W przypadku tabeli odnośników możemy pominąć et 10i l 24ponieważ pasują one odpowiednio do er 10i js 24.

Wernisch
źródło
Nie widzimy często odpowiedzi na formuły programu Excel, które wymagają tabeli odnośników. Głosuj za nowością i egzekucją. Możesz przeszukać / zamieścić kilka meta pytań dotyczących oceniania w programie Excel. W szczególności uważam, że możesz zawdzięczać kilka dodatkowych bajtów za układ kolumny A. Ponadto prawdopodobnie chcesz przenieść A do C i B: C do A: B, aby nie dostać „naładowania” za wszystkie puste komórki w A. Poza czubkiem mojej głowy, myślę, że rozmiar TSV / Plik tekstowy CSV dla całego arkusza może być właściwym wynikiem?
Sparr
Ogólnie myślę, że liczba bajtów znaków w pliku .csv (w tym przypadku minus liczba bajtów uwzględnionej wartości wejściowej) powinna być wynikiem tego rodzaju odpowiedzi w programie Excel - co według mojego obliczenia pozostawia powyższy wynik na poziomie 401 bajtów
Taylor Scott
@TaylorScott, miałem CR-LF jako znaki nowej linii. Załóżmy, że 401 v. 464 jest z tego powodu?
Wernisch
@Wernisch, w skrócie, tak - można założyć, że kanały są przechowywane jako literał znaku ASCII z kodem znaków 10, co oznacza, że ​​liczą się one jako 1 bajt
Taylor Scott
9

JavaScript (ES6), 251 197 bajtów

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

Test

Sformatowane i skomentowane

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
Arnauld
źródło
2
Oficjalnie jesteś mistrzem znalezienia najbardziej efektywnej metody mieszania w JS ... Czy masz program, który znajduje metody dla Ciebie? ;)
ETHprodukcje
@ETHproductions W pewnym momencie napisałem ogólny program do węzłów, ale nie jest to szczególnie szybkie, więc w większości przypadków piszę niestandardowy kod ... O_o
Arnauld
9

Mathematica: 323 294 bajty

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

Jak to działa

Dla książka począwszy kodów znakowych a, b, c, d, e(owijanie wokół jeśli to konieczne) oblicza6a+b+8c+5d+3e modulo 151, który okazuje się być wyjątkowy, a następnie patrzy liczbę rozdziałów w skompresowanym liście długości 151. (nieużywany wpisów na liście są wypełnione duplikatami poprzedniego wpisu. Może to zachęca do kodowania przez całą długość? W każdym razie pomaga.)

Podziękowania dla @numbermaniac za pomysł na kompresję listy, który trudno jest podać na liczbach, ale stanowi ogromną część ulepszenia.

Stara wersja: Mathematica, 548 435 407 bajtów

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

Jak to działa

Konwertujemy każde imię namena znaki 1, 3 i 6 namename(np. leviticusStaje się lvi, jobstaje się jbb) przed wyszukaniem.

Lista, na której szukamy, jest nieco skompresowana przez połączenie 1-cyfrowego i 2-cyfrowego numeru rozdziału razem w ciągi.

Mathematica: 40 bajtów, niekonkurujące

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

Tak.

Misza Ławrow
źródło
Jeśli użyjesz Compresstej listy, otrzymasz ciąg, który można w programie zamienić z powrotem na listę Uncompress; cała funkcja wychodzi na 430 bajtów, oszczędzając ci 5 :)
numbermaniac
Dzięki! Ta wersja programu miała lepsze sposoby na skrócenie listy, ale zadziałało to bardzo dobrze w przypadku nowego podejścia, które znalazłem :)
Misha Lavrov
4
Naprawdę miałem nadzieję, że druga odpowiedź Mathematica będzie zawierała Biblię
SztupY
Nie ma wbudowanego; jest WolframAlpha["number of chapters of "<>#,"Result"]&, ale jakoś to nie wydaje się całkiem tym samym.
Misha Lavrov
1
Wyszukuje odpowiedź na temat Wolfram Alpha, która jest nazywana oszustwem zarówno w standardowych lukach, jak i wprost w pytaniu. (Chociaż myślę, że jeśli włączyłem kod źródłowy Wolfram Alpha i bazę danych do liczby bajtów, to znów by było w porządku.)
Misha Lavrov
4

Galaretka ,  117 115  114 bajtów

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

Wypróbuj online! lub zobacz zestaw testowy

W jaki sposób?

Zaszyfrowuje iloczyn rzędnych znaków ciągu wejściowego, biorąc trzy dwa trzy pozostałe fragmenty podziału, wyszukuje wynik na liście list i używa znalezionego indeksu do wyszukiwania wyniku na liście długości książek.

Przy znajdowaniu funkcji skrótu wziąłem pod uwagę tylko te, które dały wynik co najwyżej jeden segment z wynikami powyżej 255, aby umożliwić indeksowanie strony kodowej, a następnie wybrałem te, które minimalizują całkowitą liczbę wartości do zakodowania (po usunięciu segmentu „obrażającego” lub jeśli żaden nie istniał najdłużej). Z 66 z trzema modułami znalazłem 59 ( %731%381%258) a 58 ( %731%399%239), a następnie 56 z wpisami ( %1241%865%251) [co daje 117 bajtów] ... Potem znalazłem 58 używając tylko dwóch pozostałych ( %1987%251) [co daje 115 bajtów]
.. . następnie znalazłem 55 używając trzech pozostałych, które po dodaniu dwóch fikcyjnych wpisów pozwalają na dalszą kompresję listy odnośników ...

Kod:

1.

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

to lista pięciu list indeksów stron kodowych ( “...“...“...“...“...“...‘):

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

Jest to transponowane za pomocą atomu, Zaby uzyskać wiadra; nazwij to 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]

( 0i 1są manekinami, pozwalając na[179,5,111] umieszczenie dwóch dalej w prawo - transpozycja wymaga dłuższych wpisów w lewo)

2)

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

Nazwij to C (liczy się rozdział) - jest to lista liczb całkowitych:

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

i jest skonstruowany w następujący sposób (dlatego dwa manekiny powyżej pozwalają 10,12,13 być w porządku rosnącym):

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

Teraz uproszczona wersja kodu to:

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)
Jonathan Allan
źródło
3

Python 2 , 438 429 416 411 409 bajtów

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]

Wypróbuj online!

Działa, zmieniając dane wejściowe na Case Case i znajdując ostatni pasujący podciąg na liście.

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

Na przykład. '1 samuel' -> '1 Samuel'który pasuje ('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24). Ostatni mecz jest ('2 S', 24), więc odpowiedź brzmi24

TFeld
źródło
3

Kod maszynowy 6502 (C64), 204 bajty

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

Wyjaśnienie :

Kluczem tutaj jest użycie specjalnej funkcji mieszającej, która mapuje bez kolizji wartości 0do125 *). Numery rozdziałów są następnie umieszczane w tabeli o wielkości 126 bajtów. Haszowanie odbywa się w pełnych 8 bitach, ostateczną wartość koryguje się, patrząc na wysokie skrypty w jeszcze innej tabeli, w ten sposób łącząc różne wysokie skryty, w których niskie skrypty nie kolidują.

Oto skomentowana lista części do demontażu:

.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

po tym następuje tabela numerów rozdziałów i na końcu tabela wysokich wartości dla wartości skrótu.

Demo online

Zastosowanie: sys49152,"name" na przykład sys49152,"genesis"(wynik 50).

Ważne: Jeśli program został załadowany z dysku (jak w wersji demonstracyjnej online), newnajpierw wydaj polecenie! Jest to konieczne, ponieważ ładowanie programu maszynowego niszczy niektóre wskaźniki C64 BASIC.

Wskazówka dotycząca obudowy: W domyślnym trybie C64 dane wejściowe będą wyświetlane jako duże litery. To jest w rzeczywistości małymi literami, ale C64 ma dwa tryby aw górnej domyślnie / tryb graficzny, małe litery pojawiają się jako wielkie i wielkie litery są wyświetlane jako symbole graficzne.


*) oczywiście, to nie jest tak gęste, jak mogłoby być ... no cóż, może później znajdę jeszcze lepsze rozwiązanie;)

Felix Palmen
źródło
1

Java 8, 623 597 590 bajtów

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 bajtów dzięki @Nevay , zmieniając pętlę for na strumień.

Zdecydowanie można grać w golfa więcej .. Wystarczy wykonać więcej testów.
Być może nie jest to najkrótsza odpowiedź z długiego strzału i można ją pograć w golfa, przesyłając jakąś istniejącą odpowiedź, ale nadal jestem dumny z wymyślenia czegoś samodzielnie .. :)

Wyjaśnienie:

Wypróbuj tutaj.

  1. Pobiera moc 3 każdego znaku (jako wartość ASCII) w ciągu wejściowym
  2. Pobiera ich sumę
  3. Dzieli wynik przez 13595 dzielenie liczb całkowitych (w Javie powoduje to automatyczne obcięcie / wyrównanie wyniku).
  4. Pozostawia to 65 unikalnych wartości (tylko habakkuki matthewobie mają wartość 674)
  5. A potem jeden gigant trójskładnikowy - jeśli ma zwrócić poprawny wynik (z kilkoma wartościami łączącymi się w jednym oświadczeniu trójskładnikowym, o ile to możliwe ( 381i 382oba 1; 425i 436oba 4; 649i 663oba 13; 952i 1018oba 4; 1122i 1229oba 5).
Kevin Cruijssen
źródło
1
Możesz użyć int i=s.chars().map(c->c*c*c).sum()/13595;zamiast int i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;.
Nevay,