Функсітон , 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 іменам, що складаються з одного, дивного, рідко використовуваного символу Unicode, я подумав про те, що найкраще може представляти цю проблему, і мені спало на думку, що Посилання та Зельда (або, якщо ви хочете, Легенда про Zelda ) дають вам LZ , тому нижній регістр graph (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 -
\n
10. Останнє число - (10 << 21) + 45.
Зараз програма триває так:
- Основна програма дзвінки
ʫ
з такими 3 параметрами:
- B : Хеш-таблиця, зміщена праворуч на 40 біт у кращу величину хеша введення. Пісня, яку ми хочемо випустити, зараз має 40 найменш значущих біт.
- c : Рядок
^<>VA
.
- а : Число 8.
- У кожній ітерації
ʫ
,
- якщо c не порожній,
- якщо не дорівнює нулю, дивитися на нижній біт B . Виведіть , а потім інший, якщо він дорівнює нулю або перший символ c в іншому випадку. Зсуньте праворуч B на один, щоб видалити один біт і декремент a .
-
-
- якщо a дорівнює нулю, виведіть
-\n
, а потім відріжте перший символ з c та запустіть інший цикл з a = 8.
- якщо c порожній, ми закінчили.