Покопавшись в глубине своей временной папки, вы найдете несколько композиций для фортепиано. К сожалению, эти композиции были написаны только с именами заметок и продолжительностью, и у вас есть доступ только к текстовому терминалу. Поэтому ваша задача - написать программу для отображения композиций как ASCII-произведений.
вход
Ваша программа должна принимать две строки в качестве входных данных. Первая строка будет представлять ноты верхнего посоха (со скрипичным ключом), а вторая строка будет представлять ноты нижнего посоха.
Примечания будут переданы в научной нотации . Заметки высшего персонала всегда будут между C4
и C6
включительно. Заметки нижнего персонала всегда будут между C2
и C4
включительно.
Каждая нота будет поставляться с длительностью, которая будет один из: 1
, 2
, 4
, 8
. Они представляют собой целую ноту (полубрив), половинную ноту (минимум), четвертную ноту (вязание крючком) и восьмую ноту (квавер) соответственно.
Примечания любой другой продолжительности никогда не появятся на входе.
Как заметка и длительность разделены, и как каждая заметка отделена от других заметок на входе, остается на ваше усмотрение. Ниже приведен пример ввода для высшего персонала:
E4/4 A4/8 C#5/8 E5/2
Здесь заметки отделяются пробелом, а длительность отделяется от заметки косой чертой. Эти разделители не являются фиксированными, и вы можете изменить их или вообще пропустить.
Вы можете предположить, что в каждом штате есть хотя бы одна заметка. На входе нет упоров.
Выход
Ваша программа предназначена для вывода партитуры в формате ASCII, в соответствии со следующими описаниями.
Ключи должны быть в первую очередь слева от вашего вывода (расстояние между двумя посохами не должно быть изменено):
^
| |
------|/----
/
-----/|-----
/ |
---/--__----
| / \
---\-\|-|---
\ | /
------|-----
|
\_/
----___-----
/ \ |
---\---|----
| |
-------/----
/
-----/------
------------
Стебель банкноты (вертикальная линия рядом с кружком) должен указывать вверх, если банкнота находится ниже средней линии посоха. Он должен указывать вниз, если нота находится выше средней линии посоха. Если нота находится на средней линии, то стебель может указывать в любом направлении. (Единственное исключение из этого - бонус, который возникает при подключении восьмых нот, описанных ниже). Стебель должен начинаться на линии выше / ниже круга и быть 6
высокими.
У всех типов примечаний кроме целых примечаний есть основы. Флаг восьмой ноты представлен двумя косыми чертами в разных строках (см. Пример заметки ниже).
Заполненный заголовок (для четвертой и восьмой нот) представлен как (@)
. Пустой заголовок заметки (для половины и всей заметки) представлен как ( )
.
Случайности (острые предметы, квартиры, натуральные элементы) должны быть размещены, как показано в примечаниях к примеру, с ровно одним символом между правой стороной случайной и левой стороной заголовка заметки.
При необходимости следует использовать строки книги и иметь 7
длину символов, центрированных вокруг заголовка заметки.
Каждая заметка должна быть 12
шириной символов.
Пример примечания:
|_
|_| ( )
| |------
|
------------ ---------|-- ------------ ------------ ------------
|
------------ ---------|-- ---|-------- ------------ ------------
(@) _|_|_ | |_
-----|------ _|_|_-( )--- ---|/-(@)--- ------------ ---------|\-
| | | | | \
-----|------ ------------ -----|------ ------------ ---------|--
| | |
-----|------ ------------ -----|------ ------------ ---------|--
| | / |
|/ --(@)--
quarter note half note eighth note whole note eighth note
sharped flatted natural
После 12-символьной заметки оставьте 2 * 12 - 12 = 12
символы пустыми ( или в
-
зависимости от строки), если заметка является четвертной. Если примечание является наполовину примечанием, оставьте 4 * 12 - 12 = 36
символы пустыми. Если заметка представляет собой целую заметку, оставьте 8 * 12 - 12 = 84
символы пустыми. Не добавляйте дополнительные символы для восьмых нот.
В конце каждого такта (96 символов после ключа или строки гистограммы) выведите строку гистограммы. Это делается путем перехода каждого символа между самой верхней и самой нижней строками (включительно) и замены на
|
и -
с +
. (См. Пример выходных данных внизу вопроса).
В конце пьесы выведите конец музыки, выведя 3 строки подряд, но с пробелом между первой и второй. То есть:
+-++
| ||
+-++
| ||
. ..
. ..
Обратите внимание, что острые, плоские и натуральные элементы сохраняются до конца меры. Натуральный знак следует использовать только для того, чтобы отменить резкое или плоское, использованное ранее в той же мере.
Для выполнения этой задачи острые, плоские и натуральные элементы влияют только на ноту в одной октаве и в одном ключе (резкое на A5 не приводит к резкости A4, а плоское на C4 в верхнем штабе не вызывает С4 в нижнем штабе должен быть выровнен).
Информация только для бонуса
Бонус предполагает правильное соединение восьмых нот.
Когда есть две последовательные восьмые ноты, выровненные по такту четвертной ноты (другими словами, число символов перед первой восьмой нотой кратно 24), две восьмые ноты должны быть соединены.
Пусть заметят А будет примечанием, самым дальним от середины посоха. Если обе ноты на том же расстоянии от середины, либо нота может быть примечание . Пусть другой ноту примечание B .
Направление и стебли должна быть направлением ствола ноты A .
Стебель одной из нот должен быть 6
высотой линий (как в случае со стеблями в целом), а стебель другой ноты должен быть расширен до конца стебля другой ноты.
Стебли должны быть связаны с _
.
Пример восьмой ноты:
___________
| |
| |
| |
| | --(@)--
| | | |
------------------------ ---|_----|-----------|-- -----|------------------
|/ (@) | | |_
------------------------ ---------------------|-- -----|--------|_|-(@)---
(@) _|_|_ | | ||
-----|------_|_|_-(@)--- ---------------------|-- -----|-----------|------
| | | | | | |
-----|-----------|------ ---------------------|-- -----|-----------|------
| | | | |
-----|-----------|------ ------------------(@)--- -----|___________|------
| |
|___________|
Пример ввода и вывода
Вход :
A#4/4 G#4/4 F#4/2 A#4/4 G#4/4 F#4/2 F#4/8 F#4/8 F#4/8 F#4/8 G#4/8 G#4/8 G#4/8 G#4/8 A#4/4 G#4/4 F#4/2
A#3/4 G#3/4 F#3/2 A#3/4 G#3/4 F#3/2 F#3/2 G#3/2 F#3/4 E#3/4 F#3/2
Выход :
^
| | | | |
------|/-------------|-----------------------|--------------------------------------------------------------+---------|-----------------------|--------------------------------------------------------------+----------___________-------------___________------------|\----------|\----------|\----------|\-+---------|-----------------------|--------------------------------------------------------------+-++
/ | | | | | | | | | | | | | \ | \ | \ | \| | | | | ||
-----/|--------------|-----------------------|-----------------------|--------------------------------------+---------|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+---------|-----------------------|-----------------------|--------------------------------------+-++
/ | | | | | | | | | | | | | | | | | | | | | | ||
---/--__----_|_|_----|-----------------------|-----------------------|--------------------------------------+_|_|_----|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+_|_|_----|-----------------------|-----------------------|--------------------------------------+-++
| / \ _|_|_ (@) _|_|_ | | |_|_|_ (@) _|_|_ | | | | | | | _|_|_ | | | | |_|_|_ (@) _|_|_ | | | ||
---\-\|-|----|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+_|_|_----|-----------|-----------|-----------|--_|_|_-(@)---------(@)---------(@)---------(@)---+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-++
\ | / | | _|_|_ ( ) | | | _|_|_ ( ) |_|_|_ (@) (@) (@) (@) | | | | | _|_|_ ( ) | ||
------|------------------------------------------------------|-|--------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-|-|--------------------------------------------------------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-++
| | | | | ||
\_/ | | | | ||
| | | | ||
| | | | ||
| | | | ||
| | | | ||
_|_|_ |_|_|_ | | | ||
----___-----_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+------------------------------------------------_|_|_-------------------------------------------+------------------------------------------------------------------------------------------------+-++
/ \ | | | | _|_|_ (@) _|_|_ | | | | _|_|_ (@) _|_|_ |_|_|_ _|_|_ ( ) |_|_|_ | ||
---\---|---------|-------------------|-|-|------------------_|_|_-( )---------------------------------------+-----|-------------------|-|-|------------------_|_|_-( )---------------------------------------+_|_|_-( )----------------------------------------|-|-|------------------------------------------+_|_|_ (@)---------------_|_|_-------------------------( )---------------------------------------+-++
| | | | | | | | | | | | | | | | | | | | | | _|_|_ (@) | | ||
-------/---------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-------------------|-|-|-----------------------|------------------------------------------+-++
/ | | | | | | | | | | | | | | | ||
-----/-----------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
| | | | | | | | | | | | | ||
-----------------------------------------------------------------|------------------------------------------+-----------------------------------------------------|------------------------------------------+-----|------------------------------------------------------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
|
Для демонстрации, в третьей мере, F#
восьмые ноты связаны, а G#
восьмые ноты - нет. Ваша программа должна либо соединить восьмые ноты, когда это применимо (для бонуса), либо оставить их все отключенными.
Дополнительная информация
- Любое количество конечных пробелов / строк является приемлемым.
- Не должно быть лишних пробелов перед ключами или пробелов между нотами. Любое количество пустых строк может быть передано до / после вывода.
- Бонус за подключение восьмых нот составляет 0,75 * количество байтов исходного кода .
- Это код-гольф , поэтому выигрывает самый короткий код.
Ответы:
Python - 8,85 ... КБ (
93699066 B)Хаха! Самый быстрый пистолет на ... Западе?
Это далеко от правильной игры в гольф, но это, по крайней мере, функционирует. На момент публикации это самая короткая запись, так что ... а?
Позвольте мне начать с того, что я никогда не играл в такие большие игры и даже не знаю, с чего начать.
Эта запись не содержит бонусных баллов, но я все же хотел бы добавить это перед игрой в гольф.
Я в основном написал своего рода класс рендеринга ASCII, в котором хранятся символы, составляющие каждый «блок», в 2D-формате, так что любое количество различных «символов» может быть нарисовано над 2D-сеткой. Для блоков заметок сначала был нарисован посох, затем любой персонал, при необходимости удлиняющий планки, затем заголовок заметки, затем стебель и хвост (где это применимо) и последний случайный.
Когда даны следующие два входа для скрипичных и басовых ключей:
Следующие выходные результаты:
Вот рабочая версия кода с некоторым ложным входным кодом, так как эта конкретная веб-среда разработки Python не позволяла имитировать ввод или отдельные файлы.
grandstaff.py
Содержит как скрипичные, так и басовые посохи, а также ручки для рисования линий между ними.
staff.py
Единый посох. Содержит массив объектов «Блок», представляющих ноты, штрихи, ключи и т. Д. Этот класс обрабатывает интервалы между нотами и вставку штрихов в соответствующих местах.
block.py
Этот класс обрабатывает «рендеринг» (или, возможно, композицию) текста ASCII. Внутри находятся жестко закодированные символы, такие как скрипичный и басовый ключи, пустой посох, штрихи, случайные звуки и необходимые фрагменты для создания нот разной длительности. Они «нарисованы» на двумерной сетке символьных «пикселей» в последовательном порядке, чтобы получить окончательный блок ASCII.
main.py
Этот класс просто «запускает» программу, создавая экземпляр GrandStaff, передавая ему заданные строковые значения и печатая его строковое значение.
источник