Hinweise zur Tabulatur

9

Herausforderung

Bei einer Liste mit Notizen müssen Sie die entsprechende Tabulatur zurückgeben.

Anmerkungen

Die Noten müssen im Bereich von A bis einschließlich G und der Oktavbereich von 2 bis einschließlich 6 liegen. Das Format ist eine Notenoktave mit #einer scharfen und beiner flachen. ZB: A7oder F#3.

Tabs

Tabulatur ist eine Methode zum Schreiben von Musik, indem das Instrument schematisch dargestellt wird. Es wird normalerweise als fünf Zeilen mit Zahlen dargestellt.

Die Zahlen, die auf die Linien geschrieben sind, stellen den Bund dar, der verwendet wird, um die gewünschte Tonhöhe zu erhalten. Zum Beispiel zeigt die Nummer 3 in der obersten Zeile des Stabes an, dass der Spieler am dritten Bund auf dem hohen E (erste Saite) nach unten drücken soll. Nummer 0 bezeichnet die Mutter - das heißt eine offene Saite.

Die Bundnummern dürfen nicht größer als 22 sein und die Gitarre besteht aus sechs Saiten.

Die Tabulatur muss im Standard-ASCII-Format vorliegen . Sie dürfen keine Technikindikatoren (Hammer auf, Schieben usw.) einschließen. Trennen Sie jede Note durch fünf Striche. Reduzieren Sie bei zweistelligen Zahlen die Anzahl der Striche auf vier.

Der Anfang der Registerkarte sollte folgendermaßen aussehen:

e |-----
B |-----
G |-----
D |-----
A |-----
E |-----

Und das Ende sollte aussehen wie:

-----|

für alle Zeilen.


(Quelle: justinguitar.com )

Beispiel

Input: C3 C3 D3 E3 F3

Output:

e |-----------------------------------|
B |-----------------------------------|
G |-----------------------------------|
D |-----------------0-----2-----3-----|
A |-----3-----3-----------------------|
E |-----------------------------------|

Gewinnen

Der kürzeste Code gewinnt

Beta-Zerfall
quelle
Müssen wir in unserer Ausgabe geeignete Zeichenfolgen verwenden? Was hindert uns daran, eine Tabulatur auszugeben, die nur die E-Zeichenfolge verwendet?
Danmcardle
@crazedgremlin Du musst die Oktaven berücksichtigen. Nur die Verwendung der E-Saite bedeutet, dass sich die Note nicht in der entsprechenden Oktave befindet.
Beta Decay
Um eine Note um eine Oktave zu erhöhen, können wir dem Bundwert 12 Bünde hinzufügen. Gibt es eine Regel, um dies zu verhindern, die ich verpasst habe?
Danmcardle
@crazedgremlin Sie können, aber dies liefert nur zwei Oktaven.
Beta-Zerfall
Ich bin nur pedantisch, aber du hast nie gesagt, dass ich keine wirklich lange Gitarre mit 1000 Bünden haben kann.
Danmcardle

Antworten:

8

Python 3 - 329 328 319 300

Dies ist mein erster Beitrag auf codegolf.se und wahrscheinlich bei weitem nicht optimal. Ich habe hier viele Beiträge gelesen, aber vor vielleicht 50 Stunden meinen ersten Code Golf gespielt. Wollte es aber versuchen!

BEARBEITEN: 1 Byte entfernt, dort musste kein zusätzlicher Bindestrich ausgegeben werden

BEARBEITEN 2: 9 Bytes entfernt, einige Leerzeichen aus der Notenzeichenfolge entfernt

EDIT 3: 19 Bytes durch Konvertierung filter()in einen Generator entfernt

a,b='C B#oC#DboD oD#EboE FboF E#oF#GboG oG#AboA oA#BboB Cb',input().split()
for f in range(6):print('eBGDAE'[f]+' |-----'+''.join([((str(d[-1])if f==6-len(d)else'')+'-'*6)[:6]for d in[[c-d+9for d in b"%*/48="if c+9>=d]for c in[12*int(g[-1])+a[:a.index((g[:-1]+' ')[:2])].count('o')for g in b]]])+'|')

Ein bisschen ungolfed:

a='C B#oC#DboD oD#EboE FboF E#oF#GboG oG#AboA oA#BboB Cb' # string of notes
b=input().split()                                         # read user input
for f in range(6):                    # loop through the strings

  print('eBGDAE'[f] + ' |-----' +     # string identifier and start of string
  ''.join([                           # join notes of tablature
  ((str(d[-1])                        # highest string the note can be played on
  if f == 6 - len(d)                  # if this is the correct string print the fret
  else '')                            # if not then only dashes
  + '-' * 6)                          # print the dashes after the fret
  [:6]                                # but only until 6 chars per note

  for d in [                          # loop through strings
  [c - d                              # calculate fret number
  + 9                                 # add back the 9 (explained below)
  for d in b"%*/48="                  # string values increased by 9 as ASCII bytes
  if c + 9 >= d]                      # filter to remove too high-pitched strings

  for c in [                          # loop through note values
  12 * int(g[-1]) +                   # octave value
  a[:a.index(                         # part of note string before this note
  (g[:-1] + ' ')[:2])]                # unique note identifier
  .count('o')                         # o's (frets) between C and this note
  for g in b]]])                      # loop through notes

  + '|')                              # end tablature
PurkkaKoodari
quelle
Das ist brilliant! :)
Beta Decay