Wie viele Kapitel habe ich?

18

Die Bibel ist eines der einflussreichsten Bücher, die jemals geschrieben wurden, und wird allgemein als das meistverkaufte Buch aller Zeiten bezeichnet . Es wurde von ungefähr 40 verschiedenen Autoren über Hunderte von Jahren geschrieben, bevor es in seiner aktuellen Form kompiliert wurde. Das Interessante an der Bibel ist jedoch, wie sie aufgeteilt ist. Es ist in 2 verschiedene Testamente unterteilt, die in 66 kleinere Bücher unterteilt sind, die jeweils in kleinere Kapitel unterteilt sind, die jeweils in einzelne Verse unterteilt sind.

Ich dachte, es wäre eine lustige Herausforderung, die Anzahl der Kapitel in jedem Buch mit dem kürzestmöglichen Code zu codieren. Für die heutige Herausforderung müssen Sie also ein Programm oder eine Funktion schreiben, die eines der Bücher als Eingabe verwendet und die Anzahl der Kapitel in diesem Buch gemäß der King James-Version ausgibt .

Sie können E / A in jedem vernünftigen Format verwenden, zum Beispiel das Lesen / Schreiben von STDIN / STDOUT oder einer Datei, Funktionsargumente / Rückgabewerte, Aufforderung an den Benutzer usw. sind zulässig. Die Eingabe wird immer eines der 66 Bücher der Bibel sein und nur Kleinbuchstaben. Dies bedeutet, dass undefiniertes Verhalten zulässig ist, wenn Sie eine andere Eingabe erhalten. Da es nur 66 mögliche Ein- und Ausgänge gibt, werden sie alle hier zur Verfügung gestellt, laut Wikipedia-Seite zu Bibelkapiteln in der 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

Da es bei dieser Herausforderung darum geht, den optimalen Weg zu finden, um jeden Buchnamen und jede Kapitelanzahl zu codieren, ist die Verwendung von integrierten Funktionen, die Informationen über die Bibel enthalten, nicht zulässig. Da es jedoch interessant wäre zu sehen, welche Sprachen über solche Funktionen verfügen, können Sie auch eine zweite, nicht konkurrierende Version zusammen mit Ihrer Antwort freigeben. Das Abrufen von Informationen aus externen Quellen ist ebenfalls nicht gestattet (keine der Standardlücken ist zulässig, aber ich hielt es für nützlich, diese ausdrücklich zu erwähnen).

Wie üblich handelt es sich hierbei um eine Herausforderung. Versuchen Sie daher, das kürzestmögliche Programm (gemessen in Byte) zu . Viel Spaß beim Golfen!

DJMcMayhem
quelle
3
Die Ausgabe ist nicht festgelegt. Warum ist diese Kolmogorov-Komplexität ?
Text
3
@LyricLy Auch wenn die Ausgabe nicht fixiert ist, geht es immer noch darum, die effizienteste Methode zum Generieren von zwei verschiedenen Datensätzen zu finden: 1) Die Namen der Bücher (oder ein Teil des Namens, der lang genug ist, um ihn zu erkennen) und 2 ) Die entsprechende Anzahl von Kapiteln.
DJMcMayhem
3
Sie sehen nur die mit einer normalen Menge und dann nur Psalmen, die wie die HÄLFTE DER BIBEL
HyperNeutrino
4
Ich möchte enklactaus dieser Herausforderung herauskommen, aber ich kann nicht ...
totalhuman
3
@DJMcMayhem Sie haben vergessen, dass es nicht 66 eindeutige Buchstaben gibt. : P
totalhuman

Antworten:

12

Jelly , 127 Bytes

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

Probieren Sie es online!

Testfälle

Wie es funktioniert

Im Wesentlichen wird versucht, die Ordnungen der eingegebenen Zeichen in einen Binärwert umzuwandeln, z. B. "joel"-> [106, 111, 101, 108]-> 2^3*106 + 2^2*111 + 2^1*101 + 2^0*108.

Dann wird dieser Wert für Mod 407, dann für Mod 270, dann für [ein paar weitere Mods] und dann für Mod 160 verwendet. Dies ist nützlich, da alle 66 Zeichenfolgeneingaben Ganzzahlen zwischen 0 und 158 zugeordnet werden (Glück im letzten Mod).

Die Ganzzahl wird aus der Ganzzahlliste indiziert “ọḷḊḲɦ...ƙḅyẉ’b158¤, um den Wert von zu ermittelnn so zu ermitteln, dass die Eingabe die nniedrigste Anzahl von Kapiteln aufweist. Joel hat zufällig die 7. geringste Anzahl von Kapiteln.

Dieser Wert von n wird weiter in die Liste aufgenommen “£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘, um die genaue Anzahl der Kapitel zu ermitteln.

Mögliche Verbesserung: Eingaben mit der gleichen Anzahl von Kapiteln können von den Mods auf den gleichen Wert gehasht werden (0% Kollision ist nicht erforderlich), aber das habe ich in meinem Programm nicht berücksichtigt, um die Reihenfolge der Mods zu bestimmen.

fireflame241
quelle
126 Bytes
Caird Coinheringaahing
Speichern Sie ein Byte, indem Sie @( %/i@“...’b158¤ị¢-> %/“...’b158¤iị¢) vermeiden . Speichern Sie ein weiteres Byte mit einem Offset von 160 in einer einzelnen Codepage-Indexliste am Anfang ( OḄ;407;270;“ọḷḊḲɦ‘-> OḄ;“ẋn=:!ס‘+160¤).
Jonathan Allan
10

Excel, 373 Bytes

Wiederverwenden von @ Mischas Ansatz aus der Mathematica-Antwort ( 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

Lookup gibt Kapitel zurück -1und fügt dieses hinzu. Dies ändert sich 10in 9zweimal und ,1,in ,,viermal.

Auf alten Ansatz aktualisiert. Excel, 460 401 Bytes

Als CSV speichern, Buchname am Ende der ersten Zeile eingeben ( C1), Ergebnis angezeigt in 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

Für die Lookup - Tabelle können wir auslassen et 10und l 24weil dieses Übereinstimmen auf er 10und js 24ist.

Wernisch
quelle
Sehr oft werden keine Excel-Formeln angezeigt, für die eine Nachschlagetabelle erforderlich ist. Upvote für die Neuheit und die Ausführung. Vielleicht möchten Sie einige Meta-Fragen zum Scoring in Excel suchen / veröffentlichen. Insbesondere denke ich, dass Sie ein paar mehr Bytes für das Layout der A-Spalte schulden könnten. Außerdem möchten Sie wahrscheinlich A nach C und B: C nach A: B verschieben, damit Sie nicht für alle leeren Zellen in A "aufgeladen" werden. CSV-Textdatei für das gesamte Blatt könnte die richtige Partitur sein?
Sparr
Im Allgemeinen denke ich, dass die Bytecount der Zeichen in der CSV-Datei (in diesem Fall abzüglich der Bytecount des enthaltenen Eingabewerts) die Punktzahl dieser Excel-Antworttypen sein sollte 401 Bytes
Taylor Scott
@ TaylorScott, ich hatte CR-LF als neue Zeilenzeichen. Angenommen, die 401 v. 464 liegt daran?
Wernisch
@Wernisch, kurz gesagt, ja - Sie können davon ausgehen, dass die Zeilenvorschübe als ASCII-Zeichenliteral mit dem Zeichencode 10 gespeichert werden, was bedeutet, dass sie als 1 Byte zählen
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

Prüfung

Formatiert und kommentiert

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
quelle
2
Sie sind offiziell der Meister darin, die effizienteste Hash-Methode in JS zu finden ... Oder haben Sie ein Programm, das Methoden für Sie findet? ;)
ETHproductions
@ETHproductions Ich habe irgendwann ein generisches Node-Programm geschrieben, aber es ist nicht besonders schnell, so dass ich am Ende die meiste Zeit benutzerdefinierten Code schreibe ... O_o
Arnauld
9

Mathematica: 323 294 Bytes

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

Wie es funktioniert

Für ein Buch mit Zeichencodes beginnen a, b, c, d, e(Umwickeln falls erforderlich) berechnet 6a+b+8c+5d+3eModulo 151, die eindeutig sein geschieht, und sucht dann die Anzahl der Kapitel in einer komprimierten Liste der Länge 151. (Nicht verwendete Einträge in der Liste ausgefüllt mit Duplikaten des vorherigen Eintrags. Dies fördert möglicherweise die Lauflängencodierung. Wie auch immer, es hilft.)

Vielen Dank an @numbermaniac für die Idee der Listenkomprimierung, die schwer zu beziffern ist, aber einen großen Teil zur Verbesserung beiträgt.

Alte Version: Mathematica, 548 435 407 Bytes

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

Wie es funktioniert

Wir konvertieren jeden Namen namein die Zeichen 1, 3 und 6 von namename(zB leviticuswird lvi, jobwird jbb), bevor wir ihn nachschlagen.

Die Liste, in der wir nachschlagen, wird leicht komprimiert, indem die ein- und zweistelligen Kapitelnummern in Zeichenfolgen zusammengefasst werden.

Mathematica: 40 Bytes, nicht konkurrierend

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

Ja.

Mischa Lawrow
quelle
Wenn Sie Compressin der Liste verwenden, erhalten Sie eine Zeichenfolge, die Uncompressin Ihrem Programm wieder in die Liste umgewandelt werden kann. Die gesamte Funktion ergibt 430 Bytes und spart Ihnen 5 :)
numbermaniac
Vielen Dank! Diese Version des Programms hatte bessere Möglichkeiten, die Liste zu verkürzen, aber dies funktionierte sehr gut für den neuen Ansatz, den ich gefunden habe :)
Misha Lawrow
4
Ich hoffte wirklich, dass eine zweite Mathematica-Antwort eine eingebaute Bibel enthalten würde
SztupY
Es gibt keine eingebauten; es gibt WolframAlpha["number of chapters of "<>#,"Result"]&, aber irgendwie fühlt sich das nicht ganz gleich an.
Mischa Lawrow
1
Es schlägt die Antwort auf Wolfram Alpha nach, die als Betrug sowohl in den Standardlücken als auch explizit in der Frage bezeichnet wird. (Obwohl ich denke, dass, wenn ich den Quellcode und die Datenbank von Wolfram Alpha in die
Mischa Lawrow
4

Jelly ,  117 115  114 Bytes

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

Probieren Sie es online! oder sehen Sie sich die Testsuite an

Wie?

Durchsucht das Produkt der Ordinalzahlen der Zeichen der Eingabezeichenfolge mit drei zwei Restdivisionen , sucht das Ergebnis in einer Liste mit Listen und verwendet den gefundenen Index, um das Ergebnis in einer Liste mit Buchlängen nachzuschlagen .

Bei der Suche nach einer Hash-Funktion habe ich nur diejenigen berücksichtigt, die zu höchstens einem Bucket mit Ergebnissen über 255 führten, um die Codepage-Indizierung zu ermöglichen, und dann diejenigen ausgewählt, die die Gesamtzahl der zu codierenden Werte minimierten (nach Entfernen des "beleidigenden" Bucket oder wenn keine existierte der längste Eimer). Aus 66 mit drei Modulos fand ich eine 59 ( %731%381%258) eine 58 ( %731%399%239), dann eine mit 56 Einträgen ( %1241%865%251) [117 Bytes] ... Ich fand dann eine 58 mit nur zwei Resten ( %1987%251) [115 Bytes]
. .dann habe ich eine 55 mit drei Resten gefunden, die, wenn zwei Dummy-Einträge hinzugefügt werden, eine weitere Komprimierung der Lookup-Liste ermöglicht ...

Der Code:

1.

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

ist eine Liste von fünf Listen mit Codeseitenindizes ( “...“...“...“...“...“...‘):

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

Dies wird mithilfe des Atoms umgesetzt Z, um die Eimer zu erhalten. nenne das 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]

(die 0und 1sind die Dummy-Tasten, so dass die [179,5,111]zwei weiter rechts sein können - die Transponierung erfordert längere Eingaben links)

2.

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

Nennen Sie dieses C (das Kapitel zählt) - es ist eine Liste von ganzen Zahlen:

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

und ist wie folgt aufgebaut (die beiden obigen Dummy-Tasten erlauben daher eine 10,12,13aufsteigende Reihenfolge):

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

Die vereinfachte Version des Codes lautet nun:

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
quelle
3

Python 2 , 438 429 416 411 409 Bytes

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]

Probieren Sie es online!

Ändert die Eingabe in "Groß- / Kleinschreibung" und sucht die letzte übereinstimmende Teilzeichenfolge in der Liste.

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

Z.B. '1 samuel' -> '1 Samuel'welche passt ('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24). Das letzte Spiel ist ('2 S', 24), also ist die Antwort24

TFeld
quelle
3

6502 Maschinencode (C64), 204 Bytes

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

Erklärung :

Der Schlüssel hierbei ist die Verwendung einer speziellen Hash-Funktion, die Werte ohne Kollisionen 0auf 125*) abbildet . Die Kapitelnummern werden dann in einer 126-Byte-Tabelle abgelegt. Das Hashing wird in vollen 8 Bits durchgeführt, der Endwert wird angepasst, indem die High-Nibbles in einer weiteren Tabelle nachgeschlagen werden. Auf diese Weise werden verschiedene High-Nibbles kombiniert, bei denen die Low-Nibbles nicht kollidieren.

Hier ist eine kommentierte Demontageliste des Codeteils:

.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

Danach folgt eine Tabelle mit den Kapitelnummern und schließlich eine Tabelle mit den High-Nibbles für den Hash-Wert.

Online-Demo

Verwendung: sys49152,"name" zum Beispiel sys49152,"genesis"(Ausgabe 50).

Wichtig: Wenn das Programm von der Festplatte geladen wurde (wie in der Online-Demo), geben Sie zuerst einen newBefehl aus! Dies ist notwendig, weil das Laden eines Maschinenprogramms einige C64 BASIC-Zeiger in den Papierkorb wirft.

Hinweis zum Gehäuse: Im Standardmodus des C64 wird die Eingabe in Großbuchstaben angezeigt. Dies ist in der Tat Kleinbuchstaben, aber der C64 verfügt über zwei Modi. Im Standardmodus für Groß- / Grafik werden Kleinbuchstaben als Großbuchstaben und Großbuchstaben als Grafiksymbole angezeigt.


*) natürlich ist das nicht so dicht wie es sein könnte ... na ja, vielleicht finde ich später eine noch bessere lösung;)

Felix Palmen
quelle
1

Java 8, 623 597 590 Bytes

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 Bytes dank @Nevay durch Ändern der for-Schleife in einen Stream.

Kann auf jeden Fall mehr golfen werden. Müssen nur noch ein paar Tests machen.
Es ist vielleicht bei weitem nicht die kürzeste Antwort und könnte durch Portierung einer vorhandenen Antwort erreicht werden, aber ich bin trotzdem stolz darauf, mir selbst etwas einfallen zu lassen .. :)

Erläuterung:

Probieren Sie es hier aus.

  1. Nimmt die Potenz von 3 jedes Zeichens (als ASCII-Wert) in die Eingabezeichenfolge
  2. Nimmt die Summe davon
  3. Dividiert das Ergebnis durch 13595 eine Ganzzahldivision (in Java wird das Ergebnis automatisch abgeschnitten / geebnet).
  4. Es verbleiben 65 eindeutige Werte (nur habakkukund matthewbeide haben einen Wert von 674)
  5. Und dann ein riesiger Ternär, um das richtige Ergebnis zu erhalten (mit ein paar Werten, die, wo möglich, in einer einzigen Ternär-Anweisung kombiniert werden ( 381und 382beides 1; 425und 436beides 4; 649und 663beides 13; 952und 1018beides 4; 1122und 1229beides ; und beides 5).
Kevin Cruijssen
quelle
1
Sie können int i=s.chars().map(c->c*c*c).sum()/13595;anstelle von verwenden int i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;.
Nevay