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 golfem , więc postaraj się stworzyć możliwie najkrótszy program (mierzony w bajtach). Miłej zabawy w golfa!
źródło
enklact
wyjść z tego wyzwania, ale nie mogę ...Odpowiedzi:
Galaretka , 127 bajtów
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ścin
takiej, że wejście man
najmniejszą liczbę rozdziałów. Joel ma 7-tą najmniejszą liczbę rozdziałów.Ta wartość
n
jest 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.
źródło
@
(%/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¤
).Excel, 373 bajtów
Ponowne użycie podejścia @ Misha z odpowiedzi Mathematica (
6a+b+8c+5d+3e modulo 151
):Wyszukiwanie zwraca rozdziały
-1
, a następnie dodaje jeden. Zmienia się to10
w9
dwa razy i,1,
w,,
cztery razy.Zaktualizowano do starego podejścia. Excel,
460401 bajtówZapisz jako CSV, nazwa książki wprowadzona na końcu pierwszego wiersza (
C1
), wynik wyświetlany wC2
:W przypadku tabeli odnośników możemy pominąć
et 10
il 24
ponieważ pasują one odpowiednio doer 10
ijs 24
.źródło
JavaScript (ES6),
251197 bajtówTest
Pokaż fragment kodu
Sformatowane i skomentowane
źródło
Mathematica:
323294 bajtyJak 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,
548435407 bajtówJak to działa
Konwertujemy każde imię
name
na znaki 1, 3 i 6namename
(np.leviticus
Staje sięlvi
,job
staje 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
Tak.
źródło
Compress
tej 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 :)WolframAlpha["number of chapters of "<>#,"Result"]&
, ale jakoś to nie wydaje się całkiem tym samym.Python 2 ,
244183 bajtówWypróbuj online!
źródło
Galaretka ,
117 115114 bajtówWypróbuj online! lub zobacz zestaw testowy
W jaki sposób?
Zaszyfrowuje iloczyn rzędnych znaków ciągu wejściowego, biorąc
trzydwatrzy 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.
to lista pięciu list indeksów stron kodowych (
“...“...“...“...“...“...‘
):Jest to transponowane za pomocą atomu,
Z
aby uzyskać wiadra; nazwij to B:(
0
i1
są manekinami, pozwalając na[179,5,111]
umieszczenie dwóch dalej w prawo - transpozycja wymaga dłuższych wpisów w lewo)2)
Nazwij to C (liczy się rozdział) - jest to lista liczb całkowitych:
i jest skonstruowany w następujący sposób (dlatego dwa manekiny powyżej pozwalają
10,12,13
być w porządku rosnącym):Teraz uproszczona wersja kodu to:
źródło
Python 2 ,
438429416411409 bajtówWypróbuj online!
Działa, zmieniając dane wejściowe na Case Case i znajdując ostatni pasujący podciąg na liście.
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
źródło
Kod maszynowy 6502 (C64), 204 bajty
Wyjaśnienie :
Kluczem tutaj jest użycie specjalnej funkcji mieszającej, która mapuje bez kolizji wartości
0
do125
*). 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:
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ładsys49152,"genesis"
(wynik50
).Ważne: Jeśli program został załadowany z dysku (jak w wersji demonstracyjnej online),
new
najpierw 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;)
źródło
Java 8,
623597590 bajtów-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.
13595
dzielenie liczb całkowitych (w Javie powoduje to automatyczne obcięcie / wyrównanie wyniku).habakkuk
imatthew
obie mają wartość674
)381
i382
oba1
;425
i436
oba4
;649
i663
oba13
;952
i1018
oba4
;1122
i1229
oba5
).źródło
int i=s.chars().map(c->c*c*c).sum()/13595;
zamiastint i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;
.