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 Code-Golf- Herausforderung. Versuchen Sie daher, das kürzestmögliche Programm (gemessen in Byte) zu erstellen . Viel Spaß beim Golfen!
quelle
enklact
aus dieser Herausforderung herauskommen, aber ich kann nicht ...Antworten:
Jelly , 127 Bytes
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 dien
niedrigste 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.
quelle
@
(%/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¤
).Excel, 373 Bytes
Wiederverwenden von @ Mischas Ansatz aus der Mathematica-Antwort (
6a+b+8c+5d+3e modulo 151
):Lookup gibt Kapitel zurück
-1
und fügt dieses hinzu. Dies ändert sich10
in9
zweimal und,1,
in,,
viermal.Auf alten Ansatz aktualisiert. Excel,
460401 BytesAls CSV speichern, Buchname am Ende der ersten Zeile eingeben (
C1
), Ergebnis angezeigt inC2
:Für die Lookup - Tabelle können wir auslassen
et 10
undl 24
weil dieses Übereinstimmen aufer 10
undjs 24
ist.quelle
JavaScript (ES6),
251197 BytePrüfung
Code-Snippet anzeigen
Formatiert und kommentiert
quelle
Mathematica:
323294 BytesWie es funktioniert
Für ein Buch mit Zeichencodes beginnen
a
,b
,c
,d
,e
(Umwickeln falls erforderlich) berechnet6a+b+8c+5d+3e
Modulo 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,
548435407 BytesWie es funktioniert
Wir konvertieren jeden Namen
name
in die Zeichen 1, 3 und 6 vonnamename
(zBleviticus
wirdlvi
,job
wirdjbb
), 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
Ja.
quelle
Compress
in der Liste verwenden, erhalten Sie eine Zeichenfolge, dieUncompress
in Ihrem Programm wieder in die Liste umgewandelt werden kann. Die gesamte Funktion ergibt 430 Bytes und spart Ihnen 5 :)WolframAlpha["number of chapters of "<>#,"Result"]&
, aber irgendwie fühlt sich das nicht ganz gleich an.Python 2 ,
244183 BytesProbieren Sie es online!
quelle
Jelly ,
117 115114 BytesProbieren Sie es online! oder sehen Sie sich die Testsuite an
Wie?
Durchsucht das Produkt der Ordinalzahlen der Zeichen der Eingabezeichenfolge mit
dreizweiRestdivisionen , 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.
ist eine Liste von fünf Listen mit Codeseitenindizes (
“...“...“...“...“...“...‘
):Dies wird mithilfe des Atoms umgesetzt
Z
, um die Eimer zu erhalten. nenne das B:(die
0
und1
sind die Dummy-Tasten, so dass die[179,5,111]
zwei weiter rechts sein können - die Transponierung erfordert längere Eingaben links)2.
Nennen Sie dieses C (das Kapitel zählt) - es ist eine Liste von ganzen Zahlen:
und ist wie folgt aufgebaut (die beiden obigen Dummy-Tasten erlauben daher eine
10,12,13
aufsteigende Reihenfolge):Die vereinfachte Version des Codes lautet nun:
quelle
Python 2 ,
438429416411409 BytesProbieren Sie es online!
Ändert die Eingabe in "Groß- / Kleinschreibung" und sucht die letzte übereinstimmende Teilzeichenfolge in der Liste.
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
quelle
6502 Maschinencode (C64), 204 Bytes
Erklärung :
Der Schlüssel hierbei ist die Verwendung einer speziellen Hash-Funktion, die Werte ohne Kollisionen
0
auf125
*) 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:
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 Beispielsys49152,"genesis"
(Ausgabe50
).Wichtig: Wenn das Programm von der Festplatte geladen wurde (wie in der Online-Demo), geben Sie zuerst einen
new
Befehl 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;)
quelle
Java 8,
623597590 Bytes-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.
13595
eine Ganzzahldivision (in Java wird das Ergebnis automatisch abgeschnitten / geebnet).habakkuk
undmatthew
beide haben einen Wert von674
)381
und382
beides1
;425
und436
beides4
;649
und663
beides13
;952
und1018
beides4
;1122
und1229
beides ; und beides5
).quelle
int i=s.chars().map(c->c*c*c).sum()/13595;
anstelle von verwendenint i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;
.