Alkitab adalah salah satu buku paling berpengaruh yang pernah ditulis, dan umumnya disebut sebagai buku terlaris sepanjang masa . Itu ditulis oleh sekitar 40 penulis berbeda selama ratusan tahun sebelum dikompilasi ke dalam bentuk saat ini. Tetapi yang menarik tentang Alkitab adalah cara membaginya. Ini dibagi menjadi 2 perjanjian yang berbeda, yang dibagi menjadi 66 buku yang lebih kecil, yang masing-masing dibagi menjadi beberapa bab yang lebih kecil, yang masing-masing dibagi menjadi beberapa ayat.
Saya pikir ini akan menjadi tantangan yang menyenangkan untuk mencoba menyandikan jumlah bab dalam setiap buku dengan kode sesingkat mungkin. Jadi untuk tantangan hari ini, Anda harus menulis sebuah program atau fungsi yang mengambil salah satu buku sebagai input, dan menampilkan jumlah bab dalam buku itu menurut The King James Version .
Anda dapat mengambil IO dalam format apa pun yang masuk akal, misalnya membaca / menulis STDIN / STDOUT atau file, argumen fungsi / nilai pengembalian, mendorong pengguna, dll. Semuanya diizinkan. Masukan akan selalu menjadi salah satu dari 66 buku Alkitab, dan hanya huruf kecil. Ini berarti bahwa jika Anda diberi input lain, perilaku yang tidak terdefinisi diizinkan. Karena hanya ada 66 kemungkinan input dan output, semuanya disediakan di sini, menurut halaman Wikipedia tentang bab-bab Alkitab dalam 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
Karena tantangan ini adalah tentang menemukan cara optimal untuk menyandikan setiap nama buku dan jumlah bab, menggunakan setiap bawaan yang memberikan informasi tentang Alkitab tidak diizinkan. Namun, karena akan menarik untuk melihat bahasa mana yang memiliki bawaan seperti itu, jangan ragu untuk membagikan versi kedua yang tidak bersaing bersama dengan jawaban Anda. Mengambil informasi dari sumber eksternal juga tidak diizinkan (tidak ada celah standar yang diizinkan, tetapi saya pikir akan bermanfaat untuk menyebutkannya secara eksplisit).
Seperti biasa, ini adalah tantangan kode-golf , jadi cobalah membuat program sesingkat mungkin (diukur dalam byte) yang Anda bisa. Bersenang-senang bermain golf!
sumber
enklact
jalan keluar dari tantangan ini tetapi saya tidak bisa ...Jawaban:
Jelly , 127 byte
Cobalah online!
Uji Kasus
Bagaimana itu bekerja
Pada dasarnya, ini mencoba untuk mengubah ords dari input karakter menjadi nilai biner, misalnya
"joel"
->[106, 111, 101, 108]
->2^3*106 + 2^2*111 + 2^1*101 + 2^0*108
.Kemudian, nilai ini diambil mod 407, lalu mod 270, lalu [beberapa mod lagi], lalu mod 160. Ini berguna karena memetakan semua 66 string input ke bilangan bulat antara 0 dan 158 (beruntung pada mod akhir).
Bilangan bulat diindeks dari daftar bilangan bulat
“ọḷḊḲɦ...ƙḅyẉ’b158¤
untuk menemukan nilain
sedemikian rupa sehingga input memilikin
jumlah bab paling sedikit. Joel kebetulan memiliki jumlah bab ke-7.Nilai dari
n
ini selanjutnya diindeks ke dalam daftar“£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘
untuk menemukan jumlah bab yang tepat.Kemungkinan peningkatan: input dengan jumlah bab yang sama dapat di-hash dengan nilai yang sama dari mod (0% collision tidak diperlukan), tetapi saya tidak menjelaskannya dalam program saya untuk menentukan urutan mod.
sumber
@
(%/i@“...’b158¤ị¢
->%/“...’b158¤iị¢
). Simpan byte lain dengan menggunakan offset 160 ke daftar indeks halaman kode tunggal di awal (OḄ;407;270;“ọḷḊḲɦ‘
->OḄ;“ẋn=:!ס‘+160¤
).Excel, 373 byte
Menggunakan kembali pendekatan @ Misha dari jawaban Mathematica (
6a+b+8c+5d+3e modulo 151
):Cari mengembalikan bab
-1
, dan kemudian menambahkan satu. Ini berubah10
menjadi9
dua kali, dan,1,
menjadi,,
4 kali.Diperbarui ke pendekatan lama. Excel,
460401 byteSimpan sebagai CSV, Nama Buku yang dimasukkan di akhir baris pertama (
C1
), hasil ditampilkan dalamC2
:Untuk tabel pencarian, kita dapat meninggalkan
et 10
danl 24
karena ini cocoker 10
danjs 24
masing - masing.sumber
JavaScript (ES6),
251197 byteUji
Tampilkan cuplikan kode
Diformat dan dikomentari
sumber
Mathematica:
323294 byteBagaimana itu bekerja
Untuk buku yang diawali dengan kode karakter
a
,b
,c
,d
,e
(membungkus sekitar jika perlu) menghitung6a+b+8c+5d+3e
modulo 151, yang kebetulan menjadi unik, dan kemudian mendongak jumlah bab dalam daftar terkompresi panjang 151. (entri yang tidak digunakan dalam daftar yang diisi dengan duplikat dari entri sebelumnya. Ini mendorong pengodean run-length, mungkin? Bagaimanapun, ini membantu.)Terima kasih kepada @numbermaniac untuk ide kompresi daftar, yang sulit untuk dimasukkan nomornya tetapi merupakan bagian besar dari peningkatan di sini.
Versi lama: Mathematica,
548435407 byteBagaimana itu bekerja
Kami mengonversi setiap nama
name
menjadi karakter 1, 3, dan 6 darinamename
(misalnyaleviticus
menjadilvi
,job
menjadijbb
) sebelum mencarinya.Daftar tempat kita mencari sedikit dikompresi dengan menempatkan nomor bab 1-digit dan 2-digit bersama-sama dalam string.
Mathematica: 40 byte, tidak bersaing
Ya.
sumber
Compress
pada daftar, Anda mendapatkan string yang dapat diubah kembali menjadi daftarUncompress
di dalam program Anda; seluruh fungsi keluar menjadi 430 byte, menghemat 5 :)WolframAlpha["number of chapters of "<>#,"Result"]&
, tetapi entah bagaimana itu tidak terasa seperti hal yang sama.Python 2 ,
244183 byteCobalah online!
sumber
Jelly ,
117 115114 byteCobalah online! atau lihat test-suite
Bagaimana?
Hash produk dari ordinals karakter string input dengan mengambil
tigaduatiga pembagian sisa, mencari hasilnya dalam daftar daftar dan menggunakan indeks yang ditemukan untuk mencari hasilnya dalam daftar panjang buku.Ketika menemukan fungsi hash, saya hanya mempertimbangkan yang menghasilkan paling banyak satu ember dengan hasil lebih dari 255 untuk memungkinkan pengindeksan kode-halaman dan kemudian memilih yang meminimalkan jumlah total nilai untuk dikodekan (setelah menghapus ember "menyinggung" atau jika tidak ada ember terlama). Dari 66 dengan tiga modulos saya menemukan 59 (
%731%381%258
) a 58 (%731%399%239
) kemudian satu dengan 56 entri (%1241%865%251
) [membuat 117 byte] ... Saya kemudian menemukan 58 menggunakan hanya dua sisa (%1987%251
) [membuat 115 byte].. .kemudian saya menemukan 55 menggunakan tiga sisa, yang ketika dua entri dummy ditambahkan memungkinkan untuk kompresi lebih lanjut dari daftar pencarian ...
Kode:
1.
adalah daftar lima daftar indeks kode halaman (
“...“...“...“...“...“...‘
):Ini dialihkan menggunakan atom
Z
untuk mendapatkan ember; sebut B ini:(
0
dan1
adalah kunci boneka, yang memungkinkan[179,5,111]
dua berada lebih jauh ke kanan - transpos membutuhkan entri yang lebih panjang berada di sebelah kiri)2.
Sebut C ini (jumlah bab) - ini adalah daftar bilangan bulat:
dan dikonstruksi sebagai berikut (dua kunci boneka di atas karenanya memungkinkan
10,12,13
dalam urutan menaik):Versi kode yang disederhanakan adalah:
sumber
Python 2 ,
438429416411409 byteCobalah online!
Bekerja dengan mengubah input ke Judul Kasus, dan menemukan substring yang cocok terakhir dalam daftar.
Misalnya.
'1 samuel' -> '1 Samuel'
yang cocok('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24)
. Pertandingan terakhir adalah('2 S', 24)
, jadi jawabannya adalah24
sumber
6502 kode mesin (C64), 204 byte
Penjelasan :
Kuncinya di sini adalah menggunakan fungsi hashing khusus yang memetakan tanpa nilai collitions
0
ke125
*). Nomor bab kemudian ditempatkan dalam tabel 126 byte. Hashing dilakukan dalam 8 bit penuh, nilai akhir disesuaikan dengan mencari nibble tinggi dalam tabel lain, dengan cara ini menggabungkan nibble tinggi yang berbeda di mana nibble rendah tidak bertabrakan.Berikut daftar pembongkaran kode yang dikomentari:
setelah itu mengikuti tabel nomor bab dan akhirnya tabel camilan tinggi untuk nilai hash.
Demo online
Penggunaan:,
sys49152,"name"
misalnyasys49152,"genesis"
(output50
).Penting: Jika program dimuat dari disk (seperti dalam demo online), keluarkan
new
perintah terlebih dahulu! Ini diperlukan karena memuat program mesin menghancurkan beberapa pointer BASIC C64.Petunjuk tentang casing: Dalam mode default C64, input akan muncul sebagai huruf besar. Ini adalah sebenarnya huruf kecil, tetapi C64 memiliki dua mode dan di default atas / mode grafis, karakter huruf kecil muncul sebagai huruf besar dan karakter huruf besar muncul sebagai simbol grafis.
*) tentu saja, ini tidak sepadat mungkin ... oh well, mungkin saya menemukan solusi yang lebih baik nanti;)
sumber
Java 8,
623597590 byte-7 byte terima kasih kepada @Nevay dengan mengubah for-loop ke stream.
Pasti bisa bermain golf lagi .. Hanya perlu melakukan beberapa tes lagi.
Ini mungkin bukan jawaban terpendek dengan tembakan panjang, dan bisa bermain golf dengan porting beberapa jawaban yang ada, tapi saya masih bangga untuk datang dengan sesuatu sendiri .. :)
Penjelasan:
Coba di sini.
13595
sebagai pembagian bilangan bulat (di Jawa ini secara otomatis memotong / menurunkan hasilnya).habakkuk
danmatthew
keduanya memiliki nilai674
)381
dan382
keduanya1
;425
dan436
keduanya4
;649
dan663
keduanya13
;952
dan1018
keduanya4
;1122
dan1229
keduanya5
).sumber
int i=s.chars().map(c->c*c*c).sum()/13595;
bukanint i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;
.