Нарисуйте ключ ASCII

22

При вводе ноты выведите ASCII-чертеж соответствующей мажорной клавиши на скрипичном ключе.

Вот все основные ключи (которые не включают двойные острые или двойные квартиры) и соответствующие им подписи ключей:


Круг пятых делюкс 4 от пользователя из Википедии Просто Билл, авторское право CC BY-SA 3.0

Если в качестве ввода используется клавиша с острыми краями, нарисуйте следующую иллюстрацию ASCII с соответствующим количеством острых предметов:

   #
-#-------
      #
----#----
  #
-------#-
     #
---------

---------

И если на входе есть ключ с квартирами:

---------
  b
----b----
      b
-b-------
   b
-----b---
       b
---------

Вот краткое резюме возможных входных данных, а также сколько острых предметов или квартир они используют:

   0   1   2   3   4   5   6   7
#  C   G   D   A   E   B   F#  C#
b  C   F   Bb  Eb  Ab  Db  Gb  Cb

Все пять линий штрихов всегда должны быть нарисованы, но в каждой строке может быть любое количество штрихов, так что у диезов или плоскостей должен быть хотя бы один столбец заполнения с каждой стороны, при условии, что каждая линия штрихов имеет одинаковую длину. Например, все это также приемлемые выходы для ввода Ab:

---------   ------   ---------   ----------------
  b           b           b          b
----b----   ----b-   -------b-   ------b---------

-b-------   -b----   ----b----   ---b------------
   b           b           b          b
---------   ------   ---------   ----------------

---------   ------   ---------   ----------------

В случае до мажор, в котором нет ни острых предметов, ни плоских линий, допустимо любое положительное число штрихов в строке (даже одного).

Любое количество начальных или конечных пробелов хорошо, как и пробелы в каждой строке. С дополнительными ведущими пробелами все в порядке, если в каждой строке одинаковое число.

Вы можете взять ввод в нижнем регистре или требовать, чтобы входы без резкого или плоского концевого пробела, если вы того пожелаете.

Поскольку это , победит самое короткое решение в байтах.

Дверная ручка
источник
3
@Neil Ах, извините за кражу вашего вызова> _ <Я искал основной сайт перед публикацией, но не думал проверять песочницу.
Ручка двери

Ответы:

3

Python 2 , 206 197 178 175 168 161 байт

Спасибо мистеру Xcoder за -12 байтов!

Это функция, которая возвращает результат в виде двухмерного списка символов. Если на входе нет резкого / плоского, он должен быть дополнен пробелом.

def f(k,r=range(10)):n="CGDAEB".find(k[0])+7*' #'.find(k[1]);return[[(' -'[i%2],'b#'[n>0])[0<j<=abs(n)and`i`==(n*"1403625"+"5263748")[j-1]]for j in r]for i in r]

Попробуйте онлайн!

FlipTack
источник
Я думаю , что "FCGDAEB".find(k[0])-1карты Fв -1и других их индекс - 1, так что я думаю , что n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)будет работать вместо этого. ( 175 байт? )
г-н Xcoder
@ Mr.Xcoder Это умно ... спасибо.
FlipTack
3

Древесный уголь , 60 байт

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ←UO⁹¦⁹-¶Fθ«Jι⊖﹪⊕׳ι⁷#»F±θ«Jι⊕﹪⁺³×⁴ι⁷b

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ

Подсчитайте количество острых предметов в ключе подписи.

←UO⁹¦⁹-¶

Напечатайте штырь, но на один квадрат слева от начала координат, чтобы первый резкий / плоский был в нулевом столбце

Fθ«

Переверните все острые предметы.

Jι⊖﹪⊕׳ι⁷#»

Рассчитайте ряд острых и распечатайте его.

F±θ«

Обведите все квартиры.

Jι⊕﹪⁺³×⁴ι⁷b

Рассчитайте ряд квартиры и распечатайте его.

Нил
источник
2

Befunge, 139 байтов

~9%:4%7*+4/7%~6%1-2/7*+vv\`0:\!-g02+*2g00+1%7+g00*+3g00::<<0+55p02:_@
- b#09p01*-1*2p00:`0:-8<>10g`!**:00g2+*\!20g2%*+1g,1+:8`!#^_>$,:1-\^1

Попробуйте онлайн!

Обратите внимание, что ввод должен завершаться переводом строки, как это обычно происходит при интерактивном запуске программы.

объяснение

Мы начинаем с чтения двух символов из stdin - основной ноты, n и случайного a (который может быть переводом строки, если нет случайного). Используя эти значения, мы вычисляем номер ключевой подписи signum следующим образом:

signum = (n%9 + n%9%4*7)/4%7 + (a%6 - 1)/2*7 - 8

Это возвращает значение в диапазоне от -7 до 7, где знак говорит нам, нужны ли нам острые или плоские (положительные или отрицательные), а абсолютное значение дает нам необходимое количество острых или плоских. Поэтому для дальнейшего использования мы извлекаем знак s и случайный счет cnt :

s   = (signum > 0)
cnt = abs(signum) 

Затем у нас есть два вложенных цикла, итерируя номер строки, r от 9 до 0 и номер столбца c от 0 до 8. Для конкретной строки и столбца мы вычисляем, должен ли случайный объект быть видимым при этом. указать с:

accidental = (r == (c*(s+3) + s)%7 + 1 + s*2) and (c > 0) and (c <= cnt)

Если это не случайно, нам нужно вывести строку или пробел в зависимости от того, строка или r нечетной или четной. И если это случайно, нам нужно вывести резкое или плоское в зависимости от знака s . Поэтому мы оцениваем следующую формулу:

index = (!accidental * (r%2)) + (accidental * (s+2))

Что дает нам индекс в диапазоне от 0 до 3, представляющий либо линию, либо пробел, либо плоскую, либо резкую. Мы просто используем этот индекс для поиска необходимого выходного символа в таблице, которую вы можете видеть встроенной в начале второй строки кода.

Джеймс Холдернесс
источник