Biorąc pod uwagę partyturę ascii, musisz mieć możliwość wygenerowania nuty i odpowiadającej jej długości. Partytura będzie zawierać od 5 do 15 nut włącznie i jest zapisywana na pięciolinii. Klepka składa się z pięciu poziomych linii składających się z - (minus) znaków oddzielonych liniami spacji. Dolna linia w pięciolinii odpowiada nucie „E”. Linia odstępów bezpośrednio nad dolną linią wskazuje „F” i ma wyższy skok niż „E” poniżej. Trwa to jak poniżej. Zauważ, że nuty idą w górę do „G”, zanim zaczną ponownie od „A”. Patrz poniżej:
F ----------
E
D ----------
C
B ----------
A
G ----------
F
E ----------
Zauważ, że litery nie są zawarte w danych wejściowych. Nuty nakładają się na pięciolinię za pomocą znaku ao (małe litery ooh), aby wskazać „główkę nuty”. Ta główka nuty wskazuje częstotliwość nuty, a zatem jej alfabetyczną reprezentację, jak powyżej. Na przykład nuta umieszczona na partyturze, jak poniżej, oznacza „A”:
----
----
----
o
----
----
Nuta, taka jak „A” powyżej, nazywa się „całą nutą” i byłaby odtwarzana przez cały jeden takt. Inne czasy trwania można wskazać, włączając „trzon” powstający z nuty oraz od zera do trzech „flag”. Trzon składa się z trzech | (rura lub pionowy pasek) znaki ułożone bezpośrednio nad głowicą nuty. Trzon bez flag jest uważany za „ćwierćnuta” i gra przez ćwierć uderzenia. Flagi to znaki \ (odwrotny ukośnik) i ręka po prawej stronie rdzenia. Każdy trzon zmniejsza o połowę czas grania nuty. Długość każdej nuty będzie następująca: cała nuta, ćwierćnuta, ósma nuta, szesnasta nuta lub trzydziestosekundowa nuta. Tak wyglądałby każdy typ notatki A:
--------------------
----|---|\--|\--|\--
| | |\ |\
----|---|---|---|\--
o o o o o
--------------------
--------------------
Połączenie więcej niż jednej nuty daje wynik. Każda nuta może mieć szerokość czterech znaków, przy czym nuta znajduje się w pierwszej kolumnie każdego czteroznakowego bloku. Na przykład :
|\
----|\--|\----------
|\ | |\
----o---|---o---|\--
| o |
|---------------o---
|
o-------------------
--------------------
Powyższy przykład zawiera następujące nuty w kolejności: ćwierćnuta „G”, trzydziestosekundowa nuta „D”, ósma nuta „C”, cała nuta „D” i szesnasta nuta „B”. Każda nuta na wydruku powinna mieć format litera / długość, gdzie litera to AG, a długość to ułamek długości nuty w porównaniu do całej nuty. Jako wyjątek, długość i / / znak nie powinny być drukowane, jeśli notatka jest całą notatką. Każda nuta w twoich wynikach powinna być oddzielona pojedynczym odstępem. Dlatego dla powyższego wyniku kod powinien wypisać następujące dane:
G/4 D/32 C/8 D B/16
- Nuty będą miały następujący zakres: EFGABCDE F. Uwaga: należy wydrukować tylko literę, oktawa jest ignorowana.
- Zauważ, że liczba linii wejściowych waha się od 9 do 12, ponieważ nuty z kwadransami lub mniej w linii D lub wyższej będą wymagały więcej linii do pełnego wyświetlenia.
- W tym przypadku nie ma półnuty.
Najkrótszy kod wygrywa (białe znaki się nie liczą).
Edycja: Naprawiono błąd w odstępach na jednym wejściu.
Niektóre przykładowe dane wejściowe:
|\
----|\--|-------------------
|\ | |
|---|---o---------------o---
| o |\
o---------------|\--|\------
|\ |\ |\
------------|\--|\--o-------
|\ o
------------o---------------
Wyjście: B / 8 C / 8 D / 8 E / 32 F / 32 G / 32 D.
----------------o-------------------
o
------------o-----------------------
o
--------o---------------------------
o
----o-------------------------------
o
o-----------------------------------
Wyjście: EGBDFFACE
|\
|\
|\
------------o-------|-----------
| o | |\
|---|\--------------|---|\------
| | o |\
o---|---|\--------------o---|\--
o |\ |\
--------|\------------------|---
o o
--------------------------------
Wyjście: B / 4 A / 8 F / 32 F / 32 EC / 4 B / 32 F / 16
Odpowiedzi:
JavaScript,
284,279,278,225,221, 220 znaków (w tym niezbędne spacje)One-liner ( skrzypce testowe ):
Czytelne ( skrzypce testowe ):
źródło
;
i wykonując kilka sztuczek, możesz uczynić to jeszcze krótszym.function a(c){b='',d=c.split('\n');for(e=0;d[0][e++];){for(i=f=0;g=d[i++];){h=g[e-1];if(h=='o')b+=(b?' ':'')+String.fromCharCode((d.length+4-i)%7+65);if(h=='|')f=f||4;f*=1+(g[e]=='\\');}if(f)b+='/'+f}return b}
(209 znaków)Perl, 103 znaki
(108 jeśli policzy się niezbędne znaki odstępu)
Z białymi miejscami do prezentacji:
Zauważ, że zakładam, że wszystkie linie mają tę samą długość (jak w poprawionej wersji pytania).
Zmieniona wersja z objaśnieniami:
(stare, dłuższe rozwiązanie, zachowane, ponieważ może być interesujące, nawet jeśli jest trochę dłuższe)
Perl,
147126znaków(
149131, jeśli policzysz niezbędne białe znaki)Z białymi miejscami do prezentacji:
Zmieniono trochę, aby nie nadużywać języka tak bardzo:
Zauważ, że zakładam, że wszystkie linie mają tę samą długość. Jeśli chcesz zezwolić na krótsze wiersze, oczywistą poprawką jest dodanie
$_.=1x$c,
na początku programu, kosztem 9 znaków.Pomyślałem o innym podejściu, aby uniknąć długich słów, takich jak
split
i,map
i pozwolić spacjom wykonać więcej pracy, ale płyta kotłowa i znaki interpunkcyjne zemściły się i mogę sprowadzić ją do okropnej 130 (144 z niezbędną spacją).Tym razem łatka do radzenia sobie z niedokończonymi liniami jest nieco dziwniejsza (co, myślałeś, że nie może być dziwniejsza?). 139 znaków, 155 z niezbędnymi odstępami.
źródło
Scala (2,9),
352313291294290277274273 znakówJeśli potrzebna jest tylko funkcja:
Jeśli wymagany jest pełny program:
źródło
J - 108 znaków
Nie golfowany:
źródło
Python golf, 207 znaków.
Mam zacząć grać w golfa z kodu Pythona przez 2 dni i uważam, że takie rzeczy jak
import sys
,sys.stdin.read
,sys.stdout.write
są wyraziste.źródło