Скільки у мене розділів?


18

Біблія - одна з найвпливовіших книг, яку коли-небудь писали, і її часто називають найбільш продаваною книгою усіх часів . Він був написаний приблизно 40 різними авторами протягом сотень років, перш ніж бути складеним у його сучасній формі. Але що цікаво в Біблії, це те, як вона розділена. Він розділений на 2 різних заповіту, які розділені на 66 менших книг, кожна з яких розділена на менші глави, які розділені на окремі вірші.

Я подумав, що було б цікавим завданням спробувати закодувати кількість глав у кожній книзі в найкоротший можливий код. Отже, для сьогоднішнього виклику ви повинні написати програму або функцію, яка приймає одну із книг як вхідну та виводить кількість розділів у цій книзі відповідно до версії King King .

Ви можете приймати IO у будь-якому розумному форматі, наприклад, читання / запис STDIN / STDOUT або файл, аргументи функцій / повернення значень, що спонукають користувача тощо. Вхід завжди буде однією з 66 книг Біблії, і лише малі регістри. Це означає, що якщо вам надано будь-який інший внесок, дозволено не визначене поведінку. Оскільки існує лише 66 можливих входів та виходів, всі вони надані тут, згідно з даними сторінки Вікіпедії на розділах Біблії у версії «Кінг Джеймс» :

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

Оскільки ця проблема полягає у пошуку оптимального способу кодування кожної назви книги та підрахунку глав, використання будь-яких вбудованих даних, які дають інформацію про Біблію, заборонено. Однак, оскільки було б цікаво подивитися, на яких мовах є такі вбудовані файли, сміливо діліться другою неконкурентною версією разом зі своєю відповіддю. Отримання інформації із зовнішніх джерел також не дозволено (жодна зі стандартних лазівки не дозволена, але я вважав, що було б корисно чітко згадати цю).

Як завжди, це проблема з , тому постарайтеся зробити якомога коротшу програму (вимірюється в байтах), наскільки це можливо. Весело гольфу!


3
Вихід не фіксований, тож чому така колгорогова складність ?
LyricLy

3
@LyricLy Оскільки, незважаючи на те, що вихід не фіксований, все одно йдеться про найефективніший спосіб генерування двох різних наборів даних: 1) назви книг (або частина назви, достатньо довга, щоб її розпізнати) та 2 ) Відповідна кількість глав.
DJMcMayhem

3
ви просто бачите всі з нормальною сумою, а потім лише псалми, що на кшталт
ПОЛОВА

4
Я хочу enklactвийти з цього виклику, але не можу ...
повністюлюдсько

3
@DJMcMayhem Ви забули той факт, що не існує 66 унікальних листів. : P
повністюлюдський

Відповіді:


12

Желе , 127 байт

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

Спробуйте в Інтернеті!

Випробування

Як це працює

По суті, це намагається перетворити порядки введення символів у бінарне значення, наприклад "joel"-> [106, 111, 101, 108]-> 2^3*106 + 2^2*111 + 2^1*101 + 2^0*108.

Потім це значення приймається mod 407, потім mod 270, потім [ще кілька модів], потім mod 160. Це корисно, оскільки воно відображає всі 66 рядкових входів на цілі числа від 0 до 158 (пощастило на остаточному моді).

Ціле число індексується зі списку цілих чисел, “ọḷḊḲɦ...ƙḅyẉ’b158¤щоб знайти таке значення n, що вхід має nнайменшу кількість глав. Джоел, як правило, має 7-ту найменшу кількість глав.

Це значення nдодатково індексується у списку, “£ÐgƁ÷ḅ*Wßßɦ*⁷ċṗṿỵ×Ɓṿ⁷ḢQ’b7+\;“BƝ‘щоб знайти точну кількість глав.

Можливе вдосконалення: вхідні дані з однаковою кількістю глав можуть зрівняти однакове значення з модами (зіткнення 0% не потрібно), але я не враховував цього в своїй програмі для визначення послідовності модів.



Збережіть байт, уникаючи @( %/i@“...’b158¤ị¢-> %/“...’b158¤iị¢). Збережіть інший байт, скориставшись зміщенням 160 в одному списку індексів кодової сторінки на початку ( OḄ;407;270;“ọḷḊḲɦ‘-> OḄ;“ẋn=:!ס‘+160¤).
Джонатан Аллан

10

Excel, 373 байт

Повторне використання підходу @ Міші з відповіді 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

Пошук повертає глави -1, а потім додає одне. Це змінюється 10в 9два рази і ,1,в,, 4 рази.

Оновлено до старого підходу. Excel, 460 401 байт

Зберегти як CSV, Назва книги, введена наприкінці першого рядка ( C1), результат відображається у 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

Для таблиці пошуку ми можемо залишити їх et 10і l 24тому, що вони відповідають er 10і js 24відповідно.


Ми не бачимо відповідей формули excel дуже часто, які потребують таблиці пошуку. Підвищення новизни та виконання. Можливо, ви захочете пошукати / опублікувати деякі мета-запитання щодо зарахування балів у excel Зокрема, я думаю, що ви можете завдячувати ще декільком байтам для компонування стовпця "А". Крім того, ви, ймовірно, хочете перейти від A до C і B: C до A: B, щоб ви не отримували "зарядку" за всі порожні комірки в A. Зверху голови, я думаю, розмір TSV / Текстовий файл CSV для всього аркуша може бути правильним балом?
Спарр

Як правило, я вважаю, що кількість рахунків символів у .csv-файлі (в цьому випадку мінус кількість введених вхідних значень) має бути оцінкою цих типів відповіді Excel - що, за моїм підрахунком, залишає вищезазначене на базі 401 байт
Тейлор Скотт

@TaylorScott, у мене були CR-LF як нові символи рядка. Припустимо, через це 401 v. 464?
Верніш

@Wernisch, коротше, так - ви можете припустити, що канали ліній зберігаються як буквар символів ASCII з charcode 10, тобто вони вважаються 1 байтом
Тейлор Скотт

9

JavaScript (ES6), 251 197 байт

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

Тест

Відформатовано та прокоментовано

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
Ви офіційно є майстром пошуку найбільш ефективного методу хешування в JS ... Або у вас є програма, яка знаходить для вас методи? ;)
ETHproductions

@ETHproductions Я писав загальну програму Node в якийсь момент, але це не особливо швидко, тому я закінчую писати користувацький код більшість часу ... O_o
Arnauld

9

Mathematica: 323 294 байти

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

Як це працює

Для книги , починаючи з кодами символів a, b, c, d, e(обтікання при необхідності) обчислює6a+b+8c+5d+3e по модулю 151, який трапляється бути унікальним, а потім дивиться на кількість голів в стислому списку довжина 151. (Невикористані в списку заповнені дублікатами попереднього запису. Це може заохочувати кодування довжини пробігу, можливо? У будь-якому випадку це допомагає.)

Завдяки @numbermaniac за ідею стиснення списку, яку важко поставити на номер, але це величезна частина покращення тут.

Стара версія: Mathematica, 548 435 407 байт

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

Як це працює

Перетворюємо кожне ім’я name в символи 1, 3 і 6 namename(наприклад, leviticusстає lvi, jobстає jbb), перш ніж шукати його.

Список, в якому ми розглядаємо речі, злегка стискається, поєднуючи однорядкові та двозначні номери глав разом у рядках.

Математика: 40 байт, неконкурентна

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

Так.


Якщо ви використовуєте Compressу списку, ви отримуєте рядок, який можна повернути до списку Uncompressу вашій програмі; вся функція виходить на 430 байт, заощаджуючи 5 :)
numbermaniac

Спасибі! Ця версія програми мала кращі способи скоротити список, але це дуже добре спрацювало з новим підходом, який я знайшов :)
Міша Лавров

4
Я дуже сподівався, що друга відповідь Mathematica міститиме вбудовану Біблію
SztupY

Вбудованого немає; є WolframAlpha["number of chapters of "<>#,"Result"]&, але якось це не схоже на зовсім те саме.
Міша Лавров

1
Він шукає відповідь на Вольфрам Альфа, який називається обманом як у стандартних лазівках, так і явно в питанні. (Хоча я думаю, що якби я включив вихідний код і базу даних Вольфрама Альфи до числа байтів, це зробило б це знову нормально.)
Міша Лавров


4

Желе ,  117 115  114 байт

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

Спробуйте в Інтернеті! або побачити набір тестів

Як?

Містить добуток порядкових знаків символів вхідного рядка, взявши три два залишки три поділу, шукає результат у списку списків та використовує знайдений індекс для пошуку результату у списку довжин книг.

При знаходженні хеш-функції я розглядав лише ті, які призвели до щонайменше одного відра з будь-якими результатами понад 255, щоб дозволити індексацію кодової сторінки, а потім вибрав ті, які мінімізували загальну кількість значень для кодування (після видалення відрізка "ображаючого" або якщо жодне не існувало найдовшого відра). З 66 з трьома модулями я знайшов 59 ( %731%381%258) a 58 ( %731%399%239), потім один з 56 записами ( %1241%865%251) [що робить 117 байт] ... Потім я знайшов 58, використовуючи лише два залишки ( %1987%251) [для 115 байт]
.. після цього я знайшов 55 із використанням трьох залишків, що після додавання двох фіктивних записів дозволяє подальше стиснення списку пошуку ...

Кодекс:

1.

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

- це список з п'яти списків індексів кодової сторінки ( “...“...“...“...“...“...‘):

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

Це транспонується за допомогою атома, Zщоб отримати відра; зателефонуйте цьому 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]

( 0і 1манекенні ключі, що дозволяють[179,5,111] бути двома далі праворуч - для переміщення потрібні довші записи ліворуч)

2.

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

Назвіть цей C (підраховує розділ) - це список цілих чисел:

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

і побудований наступним чином (тому два ключі манекена, наведені вище, дозволяють 10,12,13знаходитись у порядку зростання):

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

Тепер спрощена версія коду:

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

Пітон 2 , 438 429 416 411 409 байт

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]

Спробуйте в Інтернеті!

Працює, змінюючи вхід у Title Case і знаходячи в списку останню відповідну підрядку.

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

Напр. '1 samuel' -> '1 Samuel'яка відповідає ('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24). Остання відповідність є ('2 S', 24), тому відповідь така24


3

Машинний код 6502 (C64), 204 байти

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

Пояснення :

Ключовим моментом тут є використання спеціальної функції хешування , яка відображає без collissions до значень 0в125 *). Номери глав потім поміщаються в таблицю з 126 байтами. Хеширование проводиться повністю 8 біт, остаточне значення коригується шляхом пошуку високих ніблів в іншій таблиці, таким чином, комбінуючи різні високі гриби там, де низькі грибки не стикаються.

Ось коментований список розбирання кодової частини:

.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

після цього слідує таблиця номерів глав і, нарешті, таблиця високих нібелів для хеш-значення.

Демонстрація в Інтернеті

Використання: sys49152,"name" наприклад sys49152,"genesis"(вихід 50).

Важливо: Якщо програма завантажувалася з диска (як, наприклад, в демонстрації в Інтернеті), newспочатку видайте команду! Це необхідно, оскільки завантаження машинної програми знищує деякі вказівники C64 BASIC.

Підказка щодо корпусу: у режимі C64 за замовчуванням вхід відображатиметься у верхньому регістрі. Це є насправді в нижньому регістрі, але C64 має два режими роботи, а в верхньому за замовчуванням / графічний режим, рядкові символи відображаються в вигляді великих і прописні символи відображаються в вигляді графічних символів.


*) Звичайно, це не так щільно, як могло б бути ... о, ну, можливо, я знайду ще краще рішення згодом;)


1

Java 8, 623 597 590 байт

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 байт завдяки @Nevay , змінивши цикл for-циклу на потік.

Однозначно можна пограти в гольф більше .. Просто потрібно зробити ще кілька тестувань.
Це може бути не найкоротшою відповіддю з дальнього пострілу, і можна було б пограти в гольф, перенісши якусь існуючу відповідь, але я все ще пишаюся тим, що щось придумав сам .. :)

Пояснення:

Спробуйте тут.

  1. Приймає потужність 3 символів кожного (як значення ASCII) у вхідній рядку
  2. Бере сума цих
  3. Ділить результат на 13595ціле ділення (на Java це автоматично обрізає / підбиває результат).
  4. Це залишає 65 унікальних значень (тільки habakkukі matthewобидва мають значення 674)
  5. А потім один гігантський потрійний - якщо повернути правильний результат (з кількома значеннями, що поєднуються в одному потрійному виписці, де це можливо ( 381і 382обидва 1; 425і 436обидва 4; 649і 663обидва 13; 952і 1018обидва 4; 1122і 1229обидва 5).

1
Ви можете використовувати int i=s.chars().map(c->c*c*c).sum()/13595;замість int i=0;for(int c:s.getBytes())i+=c*c*c;i/=13595;.
Невай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.