Disegna una firma chiave ASCII


22

Dato un input di una nota, emette un disegno ASCII del tasto maggiore corrispondente sulla chiave di violino.

Ecco tutte le chiavi principali (che non includono double-sharps o double-flat) e le rispettive firme chiave:


Cerchia di quinti deluxe 4 da parte dell'utente di Wikipedia Just plain Bill, copyright CC BY-SA 3.0

Se l'input è una chiave con oggetti taglienti, disegna la seguente arte ASCII con il numero appropriato di oggetti taglienti:

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

---------

E se l'input è una chiave con flat:

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

Ecco un breve riassunto dei possibili input e di quanti taglienti o flat usano:

   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

Tutte e cinque le linee di trattini devono sempre essere disegnate, ma può esserci un numero qualsiasi di trattini per linea in modo tale che gli oggetti taglienti o piatti abbiano almeno una colonna di riempimento su ciascun lato, purché ogni linea di trattini abbia la stessa lunghezza. Ad esempio, questi sono anche tutti output accettabili per l'input Ab:

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

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

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

Nel caso di Do maggiore, che non ha né taglienti né piatti, è accettabile qualsiasi numero positivo di trattini per linea (anche uno).

Qualsiasi quantità di spazi bianchi iniziali o finali va bene, così come gli spazi finali su ogni riga. Gli spazi iniziali in più vanno bene purché ci sia lo stesso numero su ogni riga.

Puoi prendere input in minuscolo o richiedere che input senza uno sharp o flat contengano uno spazio finale, se lo desideri.

Dato che si tratta di , vincerà la soluzione più breve in byte.



3
@Neil Ah, scusami per aver rubato la tua sfida> _ <Ho cercato nel sito principale prima di pubblicare, ma non ho pensato di controllare la sandbox.
Maniglia della porta

Risposte:


3

Python 2 , 206 197 178 175 168 161 byte

Grazie a Mr. Xcoder per -12 byte!

Questa è una funzione che restituisce il risultato come un elenco di caratteri 2D. Se l'input non contiene uno sharp / flat, deve essere riempito con uno spazio.

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]

Provalo online!


Penso alle "FCGDAEB".find(k[0])-1mappe e agli altri al loro indice - 1, quindi penso che funzionerebbe invece. ( 175 byte? )F-1n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)
Mr. Xcoder il

@ Mr.Xcoder È intelligente ... grazie.
FlipTack

3

Carbone , 60 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Calcola il numero di oggetti taglienti nella firma chiave.

←UO⁹¦⁹-¶

Stampa il pentagramma, ma un quadrato a sinistra dell'origine in modo che il primo sharp / flat sia nella colonna zero.

Fθ«

Passa sopra qualsiasi oggetto tagliente.

Jι⊖﹪⊕׳ι⁷#»

Calcola la riga del sharp e stampala.

F±θ«

Passa sopra tutti gli appartamenti.

Jι⊕﹪⁺³×⁴ι⁷b

Calcola la riga dell'appartamento e stampala.


2

Befunge, 139 byte

~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

Provalo online!

Si noti che l'input dovrebbe essere terminato con un avanzamento riga, come in genere si verifica quando si esegue il programma in modo interattivo.

Spiegazione

Iniziamo leggendo due caratteri di stdin: la nota principale, n , e un accidentale, a (che può essere un avanzamento di riga se non vi è alcun accidentale). Usando questi valori, calcoliamo il numero della firma chiave, signum , come segue:

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

Ciò restituisce un valore nell'intervallo da -7 a 7, dove il segno ci dice se abbiamo bisogno di oggetti taglienti o piani (positivi o negativi) e il valore assoluto ci fornisce il numero di oggetti taglienti o piani richiesti. Quindi per un uso successivo, estraiamo il segno, i s , e il conteggio accidentale, cnt , con:

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

Quindi abbiamo due loop nidificati, che ripetono un numero di riga, r , da 9 in giù a 0, e un numero di colonna, c , da 0 a 8. Per una riga e colonna particolare, calcoliamo se un accidentale dovrebbe essere visibile in quel indicare con:

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

Se non è un caso, dobbiamo generare una riga o uno spazio a seconda che la riga, r , sia pari o dispari. E se si tratta di un accidentale, abbiamo bisogno di un'uscita calante o crescente a seconda del segno, s . Quindi valutiamo la seguente formula:

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

Il che ci dà un indice nell'intervallo da 0 a 3, che rappresenta una linea, uno spazio, un piano o uno spigolo. Usiamo semplicemente quell'indice per cercare il carattere di output richiesto da una tabella, che puoi vedere incorporato all'inizio della seconda riga di codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.