Zeichnen Sie eine ASCII-Schlüsselsignatur

22

Geben Sie bei Eingabe einer Note eine ASCII-Zeichnung der entsprechenden Dur-Tonart im Violinschlüssel aus.

Hier sind alle Hauptschlüssel (die keine Double-Sharps oder Double-Flats enthalten) und die entsprechenden Schlüsselsignaturen:


Kreis der Quinten deluxe 4 von Wikipedia-Benutzer Just plain Bill, Copyright CC BY-SA 3.0

Wenn es sich bei der Eingabe um einen Schlüssel mit scharfen Stellen handelt, zeichnen Sie die folgende ASCII-Grafik mit der entsprechenden Anzahl von scharfen Stellen:

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

---------

Und wenn die Eingabe ein Schlüssel mit Wohnungen ist:

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

Hier ist eine kurze Zusammenfassung der möglichen Eingaben sowie der Anzahl der verwendeten Scharfzeichner oder Abflachungen:

   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

Es müssen immer alle fünf Strichlinien gezeichnet werden, es kann jedoch eine beliebige Anzahl von Strichen pro Linie geben, sodass die Scharfen oder Abflachungen auf jeder Seite mindestens eine Polstersäule aufweisen, solange jede Strichlinie dieselbe Länge hat. Dies sind beispielsweise alle akzeptablen Ausgaben für die Eingabe Ab:

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

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

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

Im Fall von C-Dur, das keine Schärfen oder Abflachungen aufweist, ist jede positive Anzahl von Strichen pro Zeile (sogar einer) akzeptabel.

Beliebig viele führende oder nachfolgende Leerzeichen sind in Ordnung, ebenso wie nachfolgende Leerzeichen in jeder Zeile. Zusätzliche führende Leerzeichen sind in Ordnung, solange in jeder Zeile dieselbe Nummer steht.

Sie können Eingaben in Kleinbuchstaben vornehmen oder verlangen, dass Eingaben ohne Scharf- oder Flachzeichen ein Leerzeichen enthalten, wenn Sie dies wünschen.

Da es sich um , wird die kürzeste Lösung in Bytes gewinnen.

Türknauf
quelle
Related
Neil
3
@Neil Ah, tut mir leid, dass du deine Herausforderung gestohlen hast.
Türklinke

Antworten:

3

Python 2 , 206 197 178 175 168 161 Bytes

Danke an Mr. Xcoder für -12 Bytes!

Dies ist eine Funktion, die das Ergebnis als 2D-Liste von Zeichen zurückgibt. Wenn die Eingabe keine Scharf / Flach enthält, muss ein Leerzeichen eingefügt werden.

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]

Probieren Sie es online!

FlipTack
quelle
Ich denke, "FCGDAEB".find(k[0])-1Karten Fzu -1und die anderen zu ihrem Index - 1, also würde ich denken n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k), stattdessen zu arbeiten. ( 175 Bytes? )
Mr. Xcoder
@ Mr.Xcoder Das ist schlau ... danke.
FlipTack
3

Kohle , 60 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Berechnen Sie die Anzahl der Schärfen in der Schlüsselsignatur.

←UO⁹¦⁹-¶

Drucken Sie die Daube, aber ein Quadrat links vom Ursprung, so dass sich die erste Spitze / Ebene in Spalte Null befindet.

Fθ«

Schlaufe über scharfe Stellen.

Jι⊖﹪⊕׳ι⁷#»

Berechnen Sie die Reihe der Schärfe und drucken Sie sie aus.

F±θ«

Überfliegen Sie alle Wohnungen.

Jι⊕﹪⁺³×⁴ι⁷b

Berechnen Sie die Reihe der Wohnung und drucken Sie sie aus.

Neil
quelle
2

Befunge, 139 Bytes

~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

Probieren Sie es online!

Beachten Sie, dass erwartet wird, dass die Eingabe mit einem Zeilenvorschub beendet wird, wie dies normalerweise bei der interaktiven Ausführung des Programms der Fall ist.

Erläuterung

Wir beginnen mit dem Lesen von zwei Zeichen aus stdin - der Hauptnote n und einem zufälligen a (das kann ein Zeilenvorschub sein, wenn es keinen zufälligen gibt). Unter Verwendung dieser Werte berechnen wir die Schlüsselsignaturnummer signum wie folgt:

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

Dies gibt einen Wert im Bereich von -7 bis 7 zurück, bei dem das Vorzeichen angibt, ob wir scharfe oder flache Stellen (positiv oder negativ) benötigen, und der absolute Wert gibt die Anzahl der erforderlichen scharfen oder flachen Stellen an. Für die spätere Verwendung extrahieren wir also das Zeichen s und die Zufallszahl cnt mit:

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

Dann haben wir zwei verschachtelte Schleifen, die eine Zeilennummer r von 9 bis 0 und eine Spaltennummer c von 0 bis 8 durchlaufen. Für eine bestimmte Zeile und Spalte berechnen wir, ob dabei ein Zufall sichtbar sein soll Punkt mit:

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

Wenn es kein Zufall ist, müssen wir eine Zeile oder ein Leerzeichen ausgeben, je nachdem, ob die Zeile r gerade oder ungerade ist. Und wenn es ein Zufall ist, müssen wir je nach Vorzeichen eine scharfe oder flache Ausgabe machen, s . Also bewerten wir die folgende Formel:

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

Dies gibt uns einen Index im Bereich von 0 bis 3, der entweder eine Linie, ein Leerzeichen, eine Ebene oder eine Spitze darstellt. Wir verwenden diesen Index einfach, um das erforderliche Ausgabezeichen aus einer Tabelle zu ermitteln, die am Anfang der zweiten Codezeile eingebettet ist.

James Holderness
quelle