Намалюйте підпис ключа ASCII


22

З огляду на введення ноти, виведіть ASCII малюнок відповідного основного ключа на високий ключ.

Ось усі основні клавіші (які не включають подвійні різкі або подвійні плоскі) та їх відповідні підписи ключів:


Коло п'ятих deluxe 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]

Спробуйте в Інтернеті!


Я думаю, що "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, що представляє собою лінію, пробіл, площину або різку. Ми просто використовуємо цей індекс для пошуку потрібного символу виводу з таблиці, який ви можете побачити вбудованим на початку другого рядка коду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.