Как мы все знаем, серия Zelda - одна из лучших игр, когда-либо созданных. В честь этого давайте сыграем несколько песен на окарине.
Вызов:
Напишите программу, которая, учитывая песню, выводит счет на стандартный вывод для этой конкретной песни.
Входные данные:
Песня, для которой вам нужно будет вывести партитуру, будет представлена уникальной комбинацией из трех символов, как показано ниже:
zel - Zelda's Lullaby
sas - Saria's Song
eps - Epona's Song
sos - Sun's Song
sot - Song of Time
sst - Song of Storms
Бонусные песни, -7% каждая:
mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light
Бонусная песня 2, -8%:
scs - Scarecrow's song
Как мы все знаем, песня Чучела - это песня, которую вы сочиняете сами. Эта песня должна иметь восемь нот. Выведите счет, который вы составляете сами, который отличается от всех остальных.
Если вы решите включить все песни, вы получите бонус -50% к вашему счету байтов.
Выход:
Примечания в выводе обозначены следующими символами:
^
<
>
V
A
Выведите оценку в следующем формате:
-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-
Разрешается только одна заметка на столбец. Для простоты я добавил еще одну строку к исходным четырем строкам.
Каждая нота соответствует отдельной строке:
^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------
Выходные данные должны быть записаны на стандартный вывод. Конечные переводы строки разрешены.
Примеры:
Вход (Колыбельная Зельды):
zel
Выход:
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------
Вход (Болеро Огня):
bof
Выход:
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Примечание шпаргалка:
zel
<^><^>
sas
V><V><
eps
^<>^<>
sos
>V^>V^
sot
>AV>AV
sst
AV^AV^
mof
A^<><>
bof
VAVA>V>V
sow
AV>><
nos
<>>A<>V
ros
AVA>VA
pol
^>^><^
Поскольку мы играем в гольф с кодом окарины , выигрывает самая короткая программа в байтах!
Ссылки на песни:
http://www.thonky.com/ocarina-of-time/ocarina-songs
http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php
v
будут выглядеть лучше.Ответы:
Pyth, 56,5 (113 байт - 6 × 7% - 8%)
Он содержит непечатаемые символы, так что вот обратимый
xxd
hexdump:Вы также можете попробовать это онлайн .
объяснение
Я сохраняю песни в числах base-6, перекодированных в базу 1391423, а затем в базу 256 для экономии места. Мне пришлось выбирать базу 6, так как некоторые песни начинаются с
^
, а цифры не могут начинаться с 0 после декодирования.источник
Funciton , 4322 - 50% = 2161
На самом деле не пытаюсь играть в гольф здесь. Собираюсь больше за угол красоты. Я думаю, что основная программа выглядит действительно аккуратно, идеальная прямоугольная коробка спрятана справа.
Как всегда, вы можете получить лучший рендеринг, выполнив
$('pre').css('line-height',1)
в консоли браузера.Продолжая традицию давать имена функций Funciton, состоящие из одного странного, редко используемого символа Юникод, я подумал о том, что может лучше всего представлять эту проблему, и мне пришло в голову, что Линк и Зельда (или, если хотите, Легенда о Зельда ) даст тебе LZ , поэтому орграф строчных букв ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) кажется подходящим.
объяснение
Как объясняется в статье esolangs, программа Funciton получает вход, закодированный как то, что я бы назвал «UTF-21», но как одно целое число. Если бы я хотел использовать это число в качестве ключа к хэш-карте (словарь, ассоциативный массив), мне нужна хеш-функция, которая удовлетворяет двум критериям: один - достаточно простой для реализации в Funciton, и два - все 13 ожидаемых входные строки дают другое значение хеша. Самая простая хеш-функция, о которой я мог подумать, была
input % m
для некоторого значенияm
. Поэтому я пробовалm
= 13, 14, 15 и т. Д., Пока не получил наименьшее целое число, для которого все значения хеш-функции являются уникальными. Оказывается, это число 25.Значения хэша:
Мы кодируем каждую песню, имея один бит, представляющий наличие или отсутствие ноты. Например, Колыбельная Зельды будет закодирована следующим образом:
за исключением того, что биты находятся в обратном порядке; верхняя левая ячейка находится в младшем значащем бите. Это означает, что каждая песня имеет длину 40 бит.
Таким образом, мы создаем (умеренно разреженную) хеш-таблицу, беря 40 × 25 = 1000-битное число и размещая битовый шаблон для каждой песни в нужном месте в соответствии с ее хэш-значением. Чудовищное число в программе - именно эта хеш-таблица.
Вот что означает каждое из оставшихся чисел:
45
=0x2D
Unicode для-
.1257283645609482190214660190
: Это строка^<>VA
в UTF-21. Оглядываясь назад, я мог бы использовать здесь 7 бит на символ, делая число короче, но UTF-21 настолько глубоко традиционен в Funciton, что мне просто не пришло в голову.2097151
=0x1FFFFF
= (1 << 21) - 1. Используется для получения первого символа из приведенной выше строки.20971565
: Это строка-\n
, которая добавляется в конец каждой строки.\n
равен 10. Это последнее число (10 << 21) + 45.Программа теперь работает следующим образом:
ʫ
следующие 3 параметра:^<>VA
.ʫ
,-
-
-\n
, затем отрежьте первый символ от c и начните другой цикл с a = 8.источник
Python 2, 143,5 (287 байт - 50%)
Сетка создается штрихами; затем индексируется и заменяется заметками.
источник
j
, заменяя каждую запятую пробелом и вызываяsplit
без аргументовrange
. К сожалению, вы не можете просто умножить внутренний список на 5, потому что все они являются одним и тем же объектом, и изменение одного из них приводит к изменению других: / Хотя мы пока победили perl (пока)!"<^><^>"
=>"<^>"*2
?scs="<"*8
Мне не нравится твоя песня Пугало.Perl 5, 125 (
320260250 байтов -6x7% бонусных песен -8% песни чучела)Да, наконец-то появилась возможность поэкспериментировать с синтаксисом Perlish hash.
Тест
источник
qw()
синтаксис вместо жирных запятых (%h=qw(zel <^><^> sas >'V><' ...)
чтобы сохранить несколько байтов@L
может быть написано более кратко, как@L=('-')x17
. Также основной хеш можно оставить как анонимный@B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g
.Perl 75 (150 байт - 50%)
Считая Шебанг как 2, ввод берется из стандартного ввода.
Пример использования
источник
Haskell, 344 - 50% = 172 байта
o
делает работуЯ думал, что смогу победить Python, используя эти кодировки (это заняло у меня много времени ._.), Но нет. Они еще не экономят много байтов. Какие-либо предложения?
Да, это минус перед кодировкой для
"ros"
. Это потому, что его «лист» заканчивается символом, который означает0
в моей базе 5, потому что этот отрицательный трюк не сработает для «простых песен», закодированных путем удвоения того, что закодировано вs
. Если вы не используете,quot
может быть, но тогда вы не можете обращатьсяp (-1)
с этимquot (-5) = 0
, так как отрицательность исчезнет. Без разницы.источник
PHP: 130 байтов (260
270279байтов - 6 × 7% - 8%)Спасибо Измаилу Мигелю и Блэкхолу за отличные идеи по экономии байтов!
После
print"-
этого это буквальная вставка возврата каретки. Может переводиться в два байта в Windows.Все бонусные песни, включая песню Пугало, включены.
Каждая песня представлена семью байтами кода. Мне нравится новая оценка, потому что со старой оценкой я бы получил всего один скудный бонусный балл в целом!
Недавние изменения заставляют PHP генерировать много предупреждений, поэтому, чтобы они были аккуратными и аккуратными, к ним обращались
/dev/null
.Сохранить как
zelda.php
и запустить в командной строке:источник
main.php
»?()
вокруг($i-$c)
наecho($i-$c)?'--':'-'.$z[$c-0];
. Кроме того, ваша строка внутриsplit
может быть использована без'
. И'/^'.$argv[1].'/'
может быть записано как"/^$argv[1]/"
Python 3 - 138,5 (
292280277 байт - 50%)Урезал несколько байтов от текущего лидера Python, выполняя метод print-as-you-go, а не метод replace.
Попробуйте онлайн
Бег:
Выход:
источник
['--',c+'-'][s[x]==c]
вместо условныхRuby, rev 1, 192 - 50% = 96
Гольф включает в себя:
удаление пробелов между группами букв в магической строке (и ревизия знаменателя в конце строки к
/4
.) удаление некоторых других ненужных пробелов.преобразование escape-последовательностей в отдельные символы (обмен стека не будет отображать их, поэтому я поместил их
?
в качестве заполнителя)переопределение
g
в виде одной строки, содержащей пять строк по 17,-
за которыми следуют символы новой строки вместо массива из пяти строк по 17-
Рубин, рев 0, 223 - 50% = 111,5 (без золота)
Код ввода сокращается до 2 букв. Если он начинается с
s
, тоs
удаляется, если начинается с буквы послеs
(zel
удаляется только последняя буква, и если он начинается с буквы доs
удаления средней буквы).Волшебная строка (которая в версии без гольфа содержит пробелы для ясности) содержит двухбуквенные коды, за которыми следуют музыкальные данные. Поиск осуществляется с помощью оператора соответствия,
=~
который возвращает позицию в строке.Существует ровно одна песня, каждая из 5, 7 и 8 нот (плюс scs, которая также имеет 8 нот). Они вместе с одной произвольной песней из 6 нот
ros
объединяются в начале магической строки, так что значение,n
заданное Положение в строке может быть использовано для расчета количества играемых нот.cs
сжимается в ранееbf
, и с усечением, когда число вn
округляется в меньшую сторону, мы просто уходим с правильным расчетом для обоих. После четвертого кластера все песни имеют 6 нот, поэтому, еслиn
оно велико, количество нот уменьшается до 6 по умолчанию.Массив
-
настроен для вывода, и примечания заменяются один за другим. Необходимые музыкальные данные извлекаются из переменной,$'
которая содержит часть оригинальной магической строки справа от совпадения. Таким образом, нерелевантные данные игнорируются.Ноты кодируются по 3 за раз в волшебную строку, сразу после соответствующего двухбуквенного кода песни. Они извлекаются с делением на,
5**(i%3)
и символ вg
обновляется соответственно. В конце программыg
печатается.источник
Python 2, 141,5 байт -50% (283 байт)
Сохраняет каждую ноту как байт, поскольку каждая строка имеет длину 8 нот. Вызывает двоичное представление и затем заменяет правильные символы.
источник
Lua, 249 байт - 50% = 124,5
Довольно просто, просто читает песни, закодированные в виде цифр base-6.
источник