Narysuj podpis klucza ASCII

22

Biorąc pod uwagę nutę, wypisz rysunek ASCII odpowiedniego klucza głównego na kluczu wiolinowym.

Oto wszystkie główne klucze (które nie obejmują podwójnych ostrzy lub podwójnych mieszkań) i odpowiadające im sygnatury klawiszy:


Circle of fifths deluxe 4 użytkownika Wikipedii Po prostu rachunek, prawa autorskie CC BY-SA 3.0

Jeśli dane wejściowe to klucz z ostrymi narzędziami, narysuj następującą grafikę ASCII z odpowiednią liczbą ostrych narzędzi:

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

---------

A jeśli dane wejściowe to klucz do mieszkań:

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

Oto zwięzłe podsumowanie możliwych danych wejściowych, a także liczby używanych narzędzi o ostrych krawędziach:

   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

Wszystkie pięć linii kresek musi być zawsze narysowanych, ale może istnieć dowolna liczba kresek na linię, tak że ostre narzędzia lub mieszkania mają co najmniej jedną kolumnę wypełnienia po każdej stronie, o ile każda linia kresek ma tę samą długość. Na przykład wszystkie te są również akceptowalnymi wyjściami dla wejściaAb :

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

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

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

W przypadku C-dur, który nie ma ostrych ani płaskich, dopuszczalna jest dowolna dodatnia liczba kresek na linię (nawet jedną).

Każda ilość początkowych lub końcowych białych znaków jest w porządku, podobnie jak końcowe spacje w każdej linii. Dodatkowe spacje wiodące są w porządku, o ile w każdym wierszu znajduje się ten sam numer.

Możesz wprowadzić dane małymi literami lub wymagać, aby dane wejściowe bez ostrego lub płaskiego zawierały spację końcową, jeśli chcesz.

Ponieważ jest to , wygra najkrótsze rozwiązanie w bajtach.

Klamka
źródło
Powiązane
Neil
3
@Neil Ah, przepraszam za kradzież twojego wyzwania> _ <Przed wysłaniem przeszukałem główną stronę, ale nie pomyślałem o sprawdzeniu piaskownicy.
Klamka

Odpowiedzi:

3

Python 2 , 206 197 178 175 168 161 bajtów

Dzięki Mr. Xcoder za -12 bajtów!

Ta funkcja zwraca wynik jako listę znaków 2D. Jeśli wejście nie zawiera ostrego / płaskiego, powinno być wypełnione spacją.

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]

Wypróbuj online!

FlipTack
źródło
Myślę, że "FCGDAEB".find(k[0])-1mapy Fdo, -1a pozostałe do ich indeksu - 1, więc myślę, n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)że zadziałałoby. ( 175 bajtów? )
Pan Xcoder,
@ Mr.Xcoder To sprytne ... dziękuję.
FlipTack,
3

Węgiel , 60 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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

Oblicz liczbę ostrzy w sygnaturze klucza.

←UO⁹¦⁹-¶

Wydrukuj pięciolinię, ale jeden kwadrat po lewej stronie początku, tak aby pierwszy ostry / płaski był w kolumnie zero.

Fθ«

Pętla nad ostrymi narzędziami.

Jι⊖﹪⊕׳ι⁷#»

Oblicz rząd ostry i wydrukuj go.

F±θ«

Pętla nad dowolnymi mieszkaniami.

Jι⊕﹪⁺³×⁴ι⁷b

Oblicz rząd mieszkania i wydrukuj go.

Neil
źródło
2

Befunge, 139 bajtów

~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

Wypróbuj online!

Należy pamiętać, że oczekuje się, że dane wejściowe zostaną zakończone przez wejście liniowe, jak to zwykle bywa podczas interaktywnego uruchamiania programu.

Wyjaśnienie

Zaczynamy od odczytania dwóch znaków ze standardowego wejścia - nuty głównej, n i przypadkowego, a (który może być wierszem, jeśli nie ma przypadkowego). Korzystając z tych wartości, obliczamy numer podpisu klucza, signum , w następujący sposób:

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

Zwraca to wartość z zakresu od -7 do 7, gdzie znak mówi nam, czy potrzebujemy ostrych lub płaskich (dodatnich czy ujemnych), a wartość bezwzględna podaje nam liczbę wymaganych ostrych lub płaskich. W celu późniejszego wykorzystania wyodrębniamy znak s oraz liczbę przypadkową cnt za pomocą:

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

Następnie mamy dwie zagnieżdżone pętle, iterujące numer wiersza r od 9 do 0 oraz numer kolumny c od 0 do 8. Dla konkretnego wiersza i kolumny obliczamy, czy przypadek powinien być widoczny punkt z:

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

Jeśli nie jest to przypadkowe, musimy wyprowadzić linię lub spację w zależności od tego, czy wiersz r jest nieparzysty, czy parzysty. A jeśli jest to przypadkowe, musimy wyprowadzić ostry lub płaski w zależności od znaku, s . Oceniamy więc następującą formułę:

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

Co daje nam indeks z zakresu od 0 do 3, reprezentujący albo linię, spację, mieszkanie lub ostry. Po prostu używamy tego indeksu do wyszukiwania wymaganego znaku wyjściowego z tabeli, który można zobaczyć osadzony na początku drugiego wiersza kodu.

James Holderness
źródło