Berapa banyak bab yang saya miliki?


18

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 , jadi cobalah membuat program sesingkat mungkin (diukur dalam byte) yang Anda bisa. Bersenang-senang bermain golf!


3
Outputnya tidak tetap, jadi mengapa kompleksitas kolmogorov ini ?
LyricLy

3
@ LyricLy Karena meskipun output tidak diperbaiki, masih tentang melihat cara paling efisien untuk menghasilkan dua set data yang berbeda: 1) Nama-nama buku (atau sebagian dari nama yang cukup lama untuk mengenalinya) dan 2 ) Jumlah bab yang sesuai.
DJMcMayhem

3
Anda hanya melihat semua yang dengan jumlah normal dan kemudian hanya mazmur yang seperti SETENGAH ALKITAB
HyperNeutrino

4
Saya ingin enklactjalan keluar dari tantangan ini tetapi saya tidak bisa ...
manusia

3
@DJMcMayhem Anda lupa fakta bahwa tidak ada 66 huruf unik. : P
totallyhuman

Jawaban:


12

Jelly , 127 byte

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

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 nilai nsedemikian rupa sehingga input memiliki njumlah bab paling sedikit. Joel kebetulan memiliki jumlah bab ke-7.

Nilai dari nini 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.



Simpan byte dengan menghindari @( %/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¤).
Jonathan Allan

10

Excel, 373 byte

Menggunakan kembali pendekatan @ Misha dari jawaban 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

Cari mengembalikan bab -1, dan kemudian menambahkan satu. Ini berubah 10menjadi 9dua kali, dan ,1,menjadi ,,4 kali.

Diperbarui ke pendekatan lama. Excel, 460 401 byte

Simpan sebagai CSV, Nama Buku yang dimasukkan di akhir baris pertama ( C1), hasil ditampilkan dalam 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

Untuk tabel pencarian, kita dapat meninggalkan et 10dan l 24karena ini cocok er 10dan js 24masing - masing.


Kami tidak melihat jawaban rumus excel sangat sering yang memerlukan tabel pencarian. Suara positif untuk kebaruan dan eksekusi. Anda mungkin ingin mencari / memposting beberapa pertanyaan meta tentang mencetak gol di excel. Secara khusus, saya pikir Anda mungkin harus membayar beberapa byte untuk tata letak kolom A. Juga, Anda mungkin ingin memindahkan A ke C dan B: C ke A: B sehingga Anda tidak mendapatkan "biaya" untuk semua sel kosong di A. Dari atas kepala saya, saya pikir ukuran TSV / File teks CSV untuk seluruh lembar mungkin merupakan skor yang tepat?
Sparr

Secara umum, saya berpikir bahwa bytecount karakter dalam file .csv (dalam hal ini dikurangi bytecount dari nilai input yang disertakan) harus menjadi skor dari jenis-jenis jawaban Excel ini - yang menurut hitungan saya meninggalkan di atas pada skor dari 401 byte
Taylor Scott

@TaylorScott, saya memiliki CR-LF sebagai karakter baris baru. Asumsikan 401 v. 464 adalah karena ini?
Wernisch

@Wernisch, singkatnya, ya - Anda dapat mengasumsikan bahwa linefeeds disimpan sebagai karakter ASCII literal dengan charcode 10, yang berarti bahwa mereka dihitung sebagai 1 byte
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

Uji

Diformat dan dikomentari

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

2
Anda secara resmi ahli dalam menemukan metode hashing paling efisien di JS ... Atau Anda punya program yang menemukan metode untuk Anda? ;)
ETHproduksi

@ ETHproductions Saya memang menulis program Node generik di beberapa titik, tapi itu tidak terlalu cepat jadi saya akhirnya menulis kode kustom sebagian besar waktu ... O_o
Arnauld

9

Mathematica: 323 294 byte

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

Bagaimana itu bekerja

Untuk buku yang diawali dengan kode karakter a, b, c, d, e(membungkus sekitar jika perlu) menghitung 6a+b+8c+5d+3emodulo 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, 548 435 407 byte

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

Bagaimana itu bekerja

Kami mengonversi setiap nama namemenjadi karakter 1, 3, dan 6 dari namename(misalnya leviticusmenjadi lvi, jobmenjadi jbb) 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

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

Ya.


Jika Anda gunakan Compresspada daftar, Anda mendapatkan string yang dapat diubah kembali menjadi daftar Uncompressdi dalam program Anda; seluruh fungsi keluar menjadi 430 byte, menghemat 5 :)
numbermaniac

Terima kasih! Versi program itu memiliki cara yang lebih baik untuk mempersingkat daftar, tetapi ini bekerja dengan sangat baik untuk pendekatan baru yang saya temukan :)
Misha Lavrov

4
Saya benar-benar berharap jawaban Mathematica kedua akan memuat Alkitab yang
Sudah Ada

Tidak ada built-in; ada WolframAlpha["number of chapters of "<>#,"Result"]&, tetapi entah bagaimana itu tidak terasa seperti hal yang sama.
Misha Lavrov

1
Itu mencari jawaban pada Wolfram Alpha, yang disebut selingkuh di celah standar dan secara eksplisit dalam pertanyaan. (Walaupun saya berpikir bahwa jika saya memasukkan kode sumber dan basis data Wolfram Alpha dalam jumlah byte, itu akan membuatnya baik lagi.)
Misha Lavrov


4

Jelly ,  117 115  114 byte

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

Cobalah online! atau lihat test-suite

Bagaimana?

Hash produk dari ordinals karakter string input dengan mengambil tiga dua tiga 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.

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

adalah daftar lima daftar indeks kode halaman ( “...“...“...“...“...“...‘):

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

Ini dialihkan menggunakan atom Zuntuk mendapatkan ember; sebut B ini:

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

( 0dan 1adalah kunci boneka, yang memungkinkan [179,5,111]dua berada lebih jauh ke kanan - transpos membutuhkan entri yang lebih panjang berada di sebelah kiri)

2.

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

Sebut C ini (jumlah bab) - ini adalah daftar bilangan bulat:

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

dan dikonstruksi sebagai berikut (dua kunci boneka di atas karenanya memungkinkan 10,12,13dalam urutan menaik):

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

Versi kode yang disederhanakan adalah:

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)

3

Python 2 , 438 429 416 411 409 byte

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]

Cobalah online!

Bekerja dengan mengubah input ke Judul Kasus, dan menemukan substring yang cocok terakhir dalam daftar.

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

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


3

6502 kode mesin (C64), 204 byte

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

Penjelasan :

Kuncinya di sini adalah menggunakan fungsi hashing khusus yang memetakan tanpa nilai collitions 0ke 125*). 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:

.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

setelah itu mengikuti tabel nomor bab dan akhirnya tabel camilan tinggi untuk nilai hash.

Demo online

Penggunaan:, sys49152,"name" misalnya sys49152,"genesis"(output 50).

Penting: Jika program dimuat dari disk (seperti dalam demo online), keluarkan newperintah 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;)


1

Java 8, 623 597 590 byte

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 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.

  1. Mengambil kekuatan 3 karakter masing-masing (sebagai nilai ASCII) di String input
  2. Mengambil jumlah itu
  3. Membagi hasil dengan 13595sebagai pembagian bilangan bulat (di Jawa ini secara otomatis memotong / menurunkan hasilnya).
  4. Ini menyisakan 65 nilai unik (hanya habakkukdan matthewkeduanya memiliki nilai 674)
  5. Dan kemudian satu terner raksasa - jika mengembalikan hasil yang benar (dengan beberapa nilai yang digabungkan dalam pernyataan terner tunggal jika memungkinkan ( 381dan 382keduanya 1; 425dan 436keduanya 4; 649dan 663keduanya 13; 952dan 1018keduanya 4; 1122dan 1229keduanya 5).

1
Anda bisa menggunakan int i=s.chars().map(c->c*c*c).sum()/13595;bukan int i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;.
Nevay
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.