Выведите «Моцарт - Алла Турка» на стандартный вывод (см. Образец для «эталонной реализации»)
Попробуйте найти способ упаковать как синтезатор, так и музыку в минимальный размер.
Требования:
- Формат подходит для ввода
aplay -f cd
(подписанный 16-битный байтовый код, 2 канала); - Должна быть воспроизведена вся музыка (без пропущенных нот или частей, по крайней мере, не меньше, чем в примере программы), хотя полифония не требуется;
- Не могу просто позвонить
/usr/bin/timidity
,/usr/bin/sox
или что - то подобное (например , требуется установить специальный музыкальный модуль); - Не могу получить доступ к сети или предположить, что музыка доступна локально;
«Реализация эталона» с доступным счетом: https://gist.github.com/vi/5478693
(Старый пример программы Perl: https://gist.github.com/vi/5447962 )
Ответы:
Полифонический, Хаскелл,
282631774719Аудио выход: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg
Функции:
с правой стороны . Я мог бы, конечно, добавить и левую руку(сделал это).как будто ты играешь на настоящем пианинона самом деле, гораздо больше ... эй, эта часть должна подражать турецким янычарским группам , верно?Вот частично разглаженная и прокомментированная версия: https://gist.github.com/leftaroundabout/5517198 .
источник
Python, 331 + 286 = 617 (0,548 байт на ноту)
Мое решение использует файл данных и скрипт Python. Файл данных должен использоваться в качестве входных данных для сценария. У меня нет aplay, но он работает, когда я импортирую их как необработанные данные в Audacity с подписанным 16-битным PCM, little-endian и 2 каналами.
Файл данных составляет 331 байт. Вот скрипт Python, который выводит его:
Вот скрипт Python:
Примечание. Если вы работаете в Windows, используйте
-u
переключатель для обоих сценариев, поскольку stdin и stdout имеют дело с двоичными данными.источник
os.read/write
вместоsys.stdin/stdout
.GolfScript (129 + 369 = 498 байт)
И программа, и файл данных содержат непечатаемые символы, поэтому я собираюсь дать представления Base64 и xxd.
Программа (129 байт):
Данные (369 байт):
объяснение
Я исказил (обновленный) предоставленный счет (подробнее об этом позже) в одну строку, содержащую байты со значениями от 0 до 24. Длина примечания идет первой; затем значения ноты, представленные мод 25 и разностно закодированы. Причина разностного кодирования заключается в том, что отрывки, которые повторяются в транспозиции, будут сокращены до той же последовательности и могут быть сжаты.
Затем я запустил это через программу сжатия string-to-GolfScript, которую я упоминал ранее (и которую я улучшил, чтобы быть конкурентоспособной в этом гольфе), чтобы получить файл данных, который распаковывается первой частью программы:
Это простое грамматическое расширение типа, знакомое любому, кто смотрел на многие вопросы, помеченные как сложность колмогоров .
Затем я разделяю эту строку на пары
[length note]
и перебираю пары. Непечатаемые символы происходят из магической строки, которая содержит параметры частоты для примечаний: я использую неявное усечение GolfScript 256 целочисленных массивов GolfScript, которые преобразуются в строки для создания треугольной волны *, поэтому базовая частота составляет 22050/256. Гц. Я написал программу, чтобы найти целочисленные соотношения, которые дают хорошую настройку; Волшебная строка содержит числители, а знаменатель 17 одинаков для всех заметок. Средняя ошибка настройки составляет около 3,4 цента.Длины нот представлены как есть, и они гораздо более правдоподобны, чем предыдущая версия партитуры. Как я и подозревал, округление увеличило избыточность строки и сократило сжатый файл данных на 30 байтов, не говоря уже о сохранении поискового массива. Тем не менее, есть некоторые отрывки, которые я нахожу подозрительными:
или
дать бары, которые на одну шестую часть крючка длиннее, чем остальные бары в партитуре, и
или
являются целым числом баров, но с некоторыми сомнительными смещениями.
Программа может быть немного короче. Я сознательно решил торговать в короткие сроки за время исполнения. С некоторыми улучшениями в скорости интерпретатора GolfScript, который я представил Даррену Смиту и который, я полагаю, он планирует опубликовать в какой-то момент, текущая версия запускается на моем компьютере менее чем за 15 минут. Если я не делаю
puts
каждую ноту после ее генерации, она работает намного медленнее.* Настоящим признаюсь, что мой комментарий о том, что все используют прямоугольные волны, был неверным.
источник
base64 -d <<< 'MjU2Y.....9Lw==' |
golfscript, и он говоритgolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
(то же самое, если я сохраняю программу в файл, конечно)㔲戶獡㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/
), я получаюundefined method
class_id 'для nil: NilClass`Машинный код x86 - 513 байт
Это не полностью решает проблему, так как вместо вывода в формате, подходящем для подачи в aplay, он воспроизводит midi.
Исполняемый файл .COM и исходный код asm - запуск музыки может занять до 14 секунд. Он также будет играть немного медленно, поскольку разрешение таймера составляет 1/18 секунды.
Музыка кодируется в 375 байтах с использованием кодирования Фибоначчи и словаря, составленного из ранее декодированной музыки.
Алгоритм декодирования псевдокода:
Как только музыка декодируется, просто вывести ее на порт Midi.
источник