Funciton , 4322 - 50% = 2161
На самом деле не пытаюсь играть в гольф здесь. Собираюсь больше за угол красоты. Я думаю, что основная программа выглядит действительно аккуратно, идеальная прямоугольная коробка спрятана справа.
Как всегда, вы можете получить лучший рендеринг, выполнив $('pre').css('line-height',1)
в консоли браузера.
┌─────────────────────────┐
┌─┴─╖ ┌─┴─╖
┌────────┤ · ╟─────────────────────┤ · ╟─────────────┐ ╔═════════╗ ╔════╗ ╔════╗
│ ╘═╤═╝ ╔═════════╗ ╘═╤═╝ ╓───╖ │ ║ 1257283 ║ ┌─╢ 40 ║ ║ 25 ║
│ │ ║ 2097151 ║ ├───╢ ʫ ╟───┐ │ ║ 6456094 ║ │ ╚════╝ ╚══╤═╝
┌─┴─╖ │ ╚════╤════╝ ┌─┴─╖ ╙─┬─╜ ┌─┴─╖ │ ║ 8219021 ║ │ ┌───╖ ┌─┴─╖
┌───┤ · ╟────────┴────┐ └─────┬────┤ · ╟───┴───┤ · ╟─┤ ║ 4660190 ║ └──┤ × ╟───┤ % ║
│ ╘═╤═╝ │ ┌┴┐ ╘═╤═╝ ╘═╤═╝ │ ╚════════╤╝ ╘═╤═╝ ╘═╤═╝
│ │ │ └┬┘ │ │ │ ╔═══╗ ┌─┴─╖ ┌──┴─╖ ╔═╧═╗
│ │ ╔═══╗ ┌────╖ │ ┌─┴─╖ ┌┐ │ │ │ ║ 8 ╟──┤ ʫ ╟──┤ >> ║ ║ ║
│ │ ║ 1 ╟─┤ >> ╟─┘ ┌───┤ ? ╟─┤├─┤ │ │ ╚═══╝ ╘═╤═╝ ╘══╤═╝ ╚═══╝
│ │ ╚═══╝ ╘══╤═╝ │ ╘═╤═╝ └┘ │ │ │ ╔════════════════╧═════════╗
│ │ ┌─┴─╖ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╔═╧═╗ │ │ ║ 609678112368778425678534 ║
│ ┌─┴─────────┤ ʫ ╟─┤ ‼ ╟─┤ · ╟─┤ ‼ ║ ║ 1 ║ │ │ ║ 616189712722605554111376 ║
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╚═══╝ │ │ ║ 461573643915077926310571 ║
│ │ │ │ │ ╔═╧══╗ │ │ ║ 355541007599150245813976 ║
│ │ ╔══════╗ │ │ └───╢ 45 ║ │ │ ║ 426564826002362964111793 ║
│ │ ║ 2097 ║ │ ┌─┴─╖ ┌───╖ ╚════╝ │ │ ║ 714054902293682079346275 ║
│ │ ║ 1565 ║ └───┤ · ╟─┤ ♭ ╟─┐ │ │ ║ 663973372550500581508544 ║
│ │ ╚═╤════╝ ╘═╤═╝ ╘═══╝ ├────────────────────┘ │ ║ 874263187322344354338195 ║
│ │ ┌─┴─╖ ┌─┴─╖ │ │ ║ 642609790172899326178321 ║
│ │ │ ‼ ╟─────────┤ ? ╟───────┘ │ ║ 071643306454414932126243 ║
│ │ ╘═╤═╝ ╘═╤═╝ │ ║ 308860823981077902637848 ║
│ ┌─┴─╖ ┌─┴─╖ ╔═══╗ ┌─┴─╖ │ ║ 322657399386789617074176 ║
└─┤ · ╟─┤ ʫ ╟─╢ 8 ║ ┌─┤ ? ╟────────────────────────────────┘ ╚══════════════════════════╝
╘═╤═╝ ╘═╤═╝ ╚═══╝ │ ╘═╤═╝
│ ┌───┴╖ ╔════╗ │ ╔═══╗
└─┤ >> ╟─╢ 21 ║ └─╢ 0 ║
╘════╝ ╚════╝ ╚═══╝
Продолжая традицию давать имена функций Funciton, состоящие из одного странного, редко используемого символа Юникод, я подумал о том, что может лучше всего представлять эту проблему, и мне пришло в голову, что Линк и Зельда (или, если хотите, Легенда о Зельда ) даст тебе LZ , поэтому орграф строчных букв ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) кажется подходящим.
объяснение
Как объясняется в статье esolangs, программа Funciton получает вход, закодированный как то, что я бы назвал «UTF-21», но как одно целое число. Если бы я хотел использовать это число в качестве ключа к хэш-карте (словарь, ассоциативный массив), мне нужна хеш-функция, которая удовлетворяет двум критериям: один - достаточно простой для реализации в Funciton, и два - все 13 ожидаемых входные строки дают другое значение хеша. Самая простая хеш-функция, о которой я мог подумать, была input % m
для некоторого значения m
. Поэтому я пробовал m
= 13, 14, 15 и т. Д., Пока не получил наименьшее целое число, для которого все значения хеш-функции являются уникальными. Оказывается, это число 25.
Значения хэша:
zel = 6
sas = 19
eps = 10
sos = 22
sot = 1
sst = 9
mof = 14
bof = 3
sow = 13
nos = 17
ros = 21
pol = 16
scs = 23
Мы кодируем каждую песню, имея один бит, представляющий наличие или отсутствие ноты. Например, Колыбельная Зельды будет закодирована следующим образом:
---^-----^------- = 01001000
-<-----<--------- = 10010000
----->----->----- = 00100100
----------------- = 00000000
----------------- = 00000000
за исключением того, что биты находятся в обратном порядке; верхняя левая ячейка находится в младшем значащем бите. Это означает, что каждая песня имеет длину 40 бит.
Таким образом, мы создаем (умеренно разреженную) хеш-таблицу, беря 40 × 25 = 1000-битное число и размещая битовый шаблон для каждой песни в нужном месте в соответствии с ее хэш-значением. Чудовищное число в программе - именно эта хеш-таблица.
Вот что означает каждое из оставшихся чисел:
45
= 0x2D
Unicode для -
.
1257283645609482190214660190
: Это строка ^<>VA
в UTF-21. Оглядываясь назад, я мог бы использовать здесь 7 бит на символ, делая число короче, но UTF-21 настолько глубоко традиционен в Funciton, что мне просто не пришло в голову.
2097151
= 0x1FFFFF
= (1 << 21) - 1. Используется для получения первого символа из приведенной выше строки.
20971565
: Это строка -\n
, которая добавляется в конец каждой строки.
- Может показаться любопытным, что это число и предыдущий выглядят очень похожими, но если подумать, то это потому, что мы используем десятичное число, а Unicode for
\n
равен 10. Это последнее число (10 << 21) + 45.
Программа теперь работает следующим образом:
- Основная программа вызывает
ʫ
следующие 3 параметра:
- B : Хеш-таблица, сдвинутая вправо на 40 бит, умноженная на хеш-значение ввода. Песня, которую мы хотим вывести, теперь состоит из 40 наименее значимых битов.
- с : строка
^<>VA
.
- а : число 8.
- В каждой итерации
ʫ
,
- если с не пусто,
- если не равен нулю, смотреть на нижней бит B . Выведите , а затем другой, если он равен нулю, или первый символ c в противном случае. Сдвиньте вправо B на единицу, чтобы убрать один бит и уменьшить a .
-
-
- если a равно нулю, выведите
-\n
, затем отрежьте первый символ от c и начните другой цикл с a = 8.
- если с пусто, мы сделали.