Покопавшись в глубине своей временной папки, вы найдете несколько композиций для фортепиано. К сожалению, эти композиции были написаны только с именами заметок и продолжительностью, и у вас есть доступ только к текстовому терминалу. Поэтому ваша задача - написать программу для отображения композиций как 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 * количество байтов исходного кода .
- Это код-гольф , поэтому выигрывает самый короткий код.