Uwagi do tabulatury

9

Wyzwanie

Biorąc pod uwagę listę notatek, musisz zwrócić odpowiednią tabulaturę.

Notatki

Nuty muszą zawierać się w przedziale od A do G włącznie, a zakres oktawy od 2 do 6 włącznie. Format jest nutowo-oktawowy, #reprezentujący ostry i bpłaski. Np .: A7lub F#3.

Zakładki

Tabulatura to metoda pisania muzyki polegająca na schematycznym przedstawieniu instrumentu. Zwykle jest reprezentowany jako pięć linii z cyframi.

Liczby zapisane na liniach reprezentują próg użyty do uzyskania pożądanego skoku. Na przykład cyfra 3 zapisana w górnym wierszu kostki oznacza, że ​​gracz powinien nacisnąć trzeci próg na wysokim E (pierwszy ciąg). Liczba 0 oznacza nakrętkę - to znaczy ciąg otwarty.

Liczby progów nie mogą być większe niż 22, a gitara ma sześć strun.

Tabulatura musi być w standardowym formacie ASCII . Nie wolno dołączać żadnych wskaźników techniki (młotek, ślizganie itp.). Oddziel każdą nutę pięcioma myślnikami. W przypadku podwójnych cyfr zmniejsz liczbę myślników do czterech.

Początek karty powinien wyglądać następująco:

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

A koniec powinien wyglądać następująco:

-----|

dla wszystkich linii.


(źródło: justinguitar.com )

Przykład

Input: C3 C3 D3 E3 F3

Output:

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

Zwycięski

Najkrótszy kod wygrywa

Rozpad beta
źródło
Czy musimy używać odpowiednich ciągów znaków w naszej produkcji? Co powstrzyma nas przed wydaniem tabulatury, która korzysta tylko z łańcucha E.
danmcardle
@crazedgremlin Musisz wziąć pod uwagę oktawy. Tylko użycie ciągu E oznacza, że ​​nuta nie będzie w odpowiedniej oktawie.
Beta Decay
Aby podnieść nutę o jedną oktawę, możemy dodać 12 progów do wartości progu. Czy istnieje reguła, aby temu zapobiec, za którą tęskniłem?
danmcardle
@crazedgremlin Możesz, ale to zapewnia tylko dwie oktawy.
Beta Decay
Jestem pedantyczny, ale nigdy nie powiedziałeś, że nie mogę mieć naprawdę długiej gitary z 1000 progów.
danmcardle

Odpowiedzi:

8

Python 3 - 329 328 319 300

To jest mój pierwszy post na codegolf.se i prawdopodobnie nie jest prawie optymalny; Przeczytałem tutaj wiele postów, ale mój pierwszy golf w golfa napisałem jakieś 50 godzin temu. Chciałem jednak spróbować!

EDYCJA: Usunięto 1 bajt, nie trzeba było tam generować dodatkowego myślnika

EDYCJA 2: Usunięto 9 bajtów, usunięto niektóre spacje z ciągu nut

EDYCJA 3: Usunięto 19 bajtów poprzez konwersję filter()do generatora

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]]])+'|')

Nieco golfista:

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
źródło
To jest genialne! :)
Beta Decay