Библия является одной из самых влиятельных книг, когда-либо написанных, и обычно цитируется как самая продаваемая книга всех времен . Он был написан примерно 40 различными авторами за сотни лет до того, как был скомпилирован в его нынешнюю форму. Но в Библии интересно то, как она разделена. Он разделен на 2 разных завета, которые разбиты на 66 небольших книг, каждая из которых разбита на более мелкие главы, каждая из которых разбита на отдельные стихи.
Я подумал, что было бы забавно попытаться закодировать количество глав в каждой книге в кратчайший возможный код. Таким образом, для сегодняшнего испытания вы должны написать программу или функцию, которая принимает одну из книг в качестве входных данных и выводит количество глав в этой книге в соответствии с версией короля Джеймса .
Вы можете использовать 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
Поскольку эта задача заключается в поиске оптимального способа кодирования каждого названия книги и количества глав, использование любых встроенных функций, дающих информацию о Библии, не допускается. Однако, поскольку было бы интересно узнать, на каких языках есть такие встроенные функции, не стесняйтесь поделиться второй неконкурентной версией вместе с вашим ответом. Получение информации из внешних источников также недопустимо (ни одна из стандартных лазеек не допускается, но я подумал, что было бы полезно явно упомянуть об этом).
Как обычно, это задача для игры в гольф , поэтому постарайтесь создать как можно более короткую программу (измеряемую в байтах). Удачи в гольф!
источник
enklact
выйти из этого испытания, но я не могу ...Ответы:
Желе , 127 байт
Попробуйте онлайн!
Тестовые случаи
Как это устроено
По сути, это пытается преобразовать орды ввода символов в двоичное значение, например
"joel"
->[106, 111, 101, 108]
->2^3*106 + 2^2*111 + 2^1*101 + 2^0*108
.Затем это значение берется мод 407, затем мод 270, затем [еще несколько модов], затем мод 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¤
).Excel, 373 байта
Повторное использование подхода @ Миши из ответа Mathematica (
6a+b+8c+5d+3e modulo 151
):Lookup возвращает главы
-1
, а затем добавить одну. Это меняется10
в9
два раза, и,1,
в,,
4 раза.Обновлен до старого подхода. Excel,
460401 байтСохранить как CSV, имя книги вводится в конце первой строки (
C1
), результат отображается вC2
:Для таблицы поиска мы можем опустить
et 10
иl 24
потому, что они совпадаютer 10
иjs 24
соответственно.источник
JavaScript (ES6),
251197 байтТестовое задание
Показать фрагмент кода
Отформатировано и прокомментировано
источник
Mathematica:
323294 байтаКак это устроено
Для книги , начиная с кодами символов
a
,b
,c
,d
,e
(обтекание при необходимости) вычисляет6a+b+8c+5d+3e
по модулю 151, который случается быть уникальным, а затем смотрит на количество глав в сжатом списке длина 151. (Неиспользуемые в списке заполнены дубликатами предыдущей записи. Это поощряет кодирование длин серий, может быть? В любом случае, это помогает.)Спасибо @numbermaniac за идею сжатия списка, которую сложно назвать цифрой, но это огромная часть улучшения.
Старая версия: Mathematica,
548435407 байтКак это устроено
Мы преобразуем каждое имя
name
в символы 1, 3 и 6 изnamename
(например,leviticus
становитсяlvi
,job
становитсяjbb
), прежде чем искать его.Список, в котором мы смотрим, немного сжат, сложив 1-значные и 2-значные номера глав вместе в строки.
Mathematica: 40 байтов, не конкурирует
Да.
источник
Compress
в списке, вы получите строку, которую можно превратить в списокUncompress
в вашей программе; вся функция получается до 430 байт, экономя 5 :)WolframAlpha["number of chapters of "<>#,"Result"]&
, но почему-то это не похоже на одно и то же.Python 2 ,
244183 байтаПопробуйте онлайн!
источник
Желе ,
117 115114 байтовПопробуйте онлайн! или увидеть набор тестов
Как?
Хэширует произведение порядковых чисел символов входной строки, беря
тридватри остатка деления, ищет результат в списке списков и использует найденный индекс, чтобы найти результат в списке длин книг.При поиске хеш-функции я учитывал только те, которые давали не более одного сегмента с любыми результатами более 255, чтобы разрешить индексацию кодовой страницы, а затем выбирал те, которые минимизировали общее количество значений для кодирования (после удаления «ошибочного» сегмента или если ни одного не было самого длинного ведра). Из 66 с тремя модулями я нашел 59 (
%731%381%258
) и 58 (%731%399%239
), а затем один с 56 записями (%1241%865%251
) [делающий для 117 байтов] ... Затем я нашел 58, используя только два остатка (%1987%251
) [делая для 115 байтов].. Затем я нашел 55, используя три остатка, которые при добавлении двух фиктивных записей позволяют дополнительно сжать список поиска ...
Код:
1.
список из пяти списков индексов кодовых страниц (
“...“...“...“...“...“...‘
):Это транспонируется с использованием атома,
Z
чтобы получить ведра; назовите это B:(
0
и1
являются фиктивными ключами, позволяющими[179,5,111]
быть двумя дальше вправо - для транспонирования требуются более длинные записи слева)2.
Назовите это C (количество глав) - это список целых чисел:
и строится следующим образом (поэтому два фиктивных ключа выше позволяют располагаться
10,12,13
в порядке возрастания):Теперь упрощенная версия кода:
источник
Python 2 ,
438429416411409 байтПопробуйте онлайн!
Работает, изменив ввод на Case Case и найдя последнюю подходящую подстроку в списке.
Например.
'1 samuel' -> '1 Samuel'
который соответствует('m', 9), ('2', 36), ('S', 8), ('Sa', 31), ('2 S', 24)
. Последнее совпадение('2 S', 24)
, поэтому ответ24
источник
6502 машинный код (C64), 204 байта
Пояснение :
Ключевым моментом здесь является использование специальной функции хеширования, которая отображает без коллизий значения
0
к125
*). Номера глав затем помещаются в таблицу 126 байтов. Хеширование выполняется в полных 8 битах, окончательное значение корректируется путем поиска больших полубайтов в еще одной таблице, таким образом комбинируя различные верхние полубайты, где нижние полубайты не сталкиваются.Вот закомментированный список разборки части кода:
после этого следует таблица номеров глав и, наконец, таблица высоких полубайтов для значения хеш-функции.
Онлайн демо
Использование:
sys49152,"name"
напримерsys49152,"genesis"
(вывод50
).Важно: если программа была загружена с диска (как в онлайн-демонстрации), введите
new
сначала введите команду! Это необходимо, потому что при загрузке машинной программы перегружаются некоторые основные указатели C64.Подсказка о корпусе: в режиме C64 по умолчанию ввод будет отображаться в верхнем регистре. Эта является на самом деле в нижнем регистре, но C64 имеет два режима работы, а в верхнем по умолчанию / графический режим, строчные символы отображаются в виде заглавных и прописные символы отображаются в виде графических символов.
*) конечно, это не так плотно, как могло бы быть ... ну, может быть, я найду еще лучшее решение позже;)
источник
Java 8
623597590 байт-7 байт благодаря @Nevay , изменив цикл for на поток.
Можно определенно больше играть в гольф. Просто нужно сделать еще несколько испытаний.
Это может быть не самый короткий ответ из длинных, и его можно сыграть в гольф, перенеся какой-то существующий ответ, но я все еще горжусь тем, что смог придумать что-то сам ... :)
Объяснение:
Попробуй это здесь.
13595
как целочисленное деление (в Java это автоматически обрезает / выравнивает результат).habakkuk
иmatthew
оба имеют значение674
)381
и382
оба1
;425
и436
оба4
;649
и663
оба13
;952
и1018
оба4
;1122
и1229
оба5
).источник
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;
.