Grzebiąc w głębi folderu tymczasowego, znajdziesz kompozycje na fortepian. Niestety, te kompozycje zostały napisane tylko z nazwami nut i czasem trwania, a ty masz dostęp tylko do terminalu tekstowego. Dlatego Twoim zadaniem jest napisanie programu wyświetlającego kompozycje jako grafikę ASCII.
Wkład
Twój program powinien przyjmować dwa ciągi jako dane wejściowe. Pierwszy ciąg będzie reprezentował nuty górnej pięciolinii (z kluczem tonalnym), podczas gdy drugi ciąg będzie reprezentował nuty dolnej pięciolinii.
Notatki zostaną przekazane w naukowym zapisie wysokości tonu . Nuty górnej personelu zawsze będzie między C4
i C6
włącznie. Notatki dnie personelu zawsze będzie między C2
i C4
włącznie.
Każda nuta przyjdzie z czasem trwania, który będzie jednym z: 1
, 2
, 4
, 8
. Reprezentują one odpowiednio całą nutę (półprzewodnik), pół nutę (minim), ćwierćnuta (ćwierćnuta) i ósemkę (ósemka).
Notatki o innym czasie trwania nigdy nie pojawią się na wejściu.
Sposób rozdzielenia nuty i czasu trwania oraz sposób oddzielenia każdej nuty od innych nut na wejściu zależy od uznania użytkownika. Oto przykładowe dane wejściowe dla najlepszych pracowników:
E4/4 A4/8 C#5/8 E5/2
Tutaj nuty są oddzielone spacją, a czas trwania jest oddzielony od nuty ukośnikiem. Te ograniczniki nie są stałe i możesz je zmienić lub całkowicie pominąć.
Możesz założyć, że w każdej pięciolinii jest co najmniej jedna nuta. Brak danych wejściowych.
Wydajność
Twój program ma wypisać wynik jako grafikę ASCII, zgodnie z następującymi opisami.
Klucze powinny być pierwszą rzeczą po lewej stronie wyjścia (nie należy zmieniać odległości między dwoma pięcioliniami):
^
| |
------|/----
/
-----/|-----
/ |
---/--__----
| / \
---\-\|-|---
\ | /
------|-----
|
\_/
----___-----
/ \ |
---\---|----
| |
-------/----
/
-----/------
------------
Trzon nuty (pionowa linia obok koła) powinien być skierowany w górę, jeśli nuta znajduje się poniżej środkowej linii pięciolinii. Powinien wskazywać w dół, jeśli nuta znajduje się powyżej środkowej linii pięciolinii. Jeśli nuta znajduje się w środkowej linii, trzon może wskazywać w dowolnym kierunku. (Jedyny wyjątek od tej zasady dotyczy premii i występuje podczas łączenia ósmych nut, opisanych później). Trzon powinien zaczynać się na linii powyżej / poniżej koła i powinien być 6
wysoki.
Wszystkie typy nut, z wyjątkiem całych nut, mają trzony. Flaga ósmej nuty jest reprezentowana przez dwa ukośniki w różnych liniach (patrz przykładowe uwagi poniżej).
Wypełniona główka nuty (dla ćwierć i ósmej nuty) jest reprezentowana przez (@)
. Pusta główka nuty (na pół i całe nuty) jest reprezentowana przez ( )
.
Przypadkowe (ostre, płaskie, naturalne) należy umieścić tak, jak pokazano w przykładowych notatkach, z dokładnie jedną postacią między prawą stroną przypadkowego a lewą stroną głowy notatki.
W razie potrzeby należy stosować wiersze księgi i powinny mieć one 7
długość znaków, wyśrodkowane wokół główki nuty.
Każda nuta powinna mieć 12
szerokość znaków.
Przykładowe uwagi:
|_
|_| ( )
| |------
|
------------ ---------|-- ------------ ------------ ------------
|
------------ ---------|-- ---|-------- ------------ ------------
(@) _|_|_ | |_
-----|------ _|_|_-( )--- ---|/-(@)--- ------------ ---------|\-
| | | | | \
-----|------ ------------ -----|------ ------------ ---------|--
| | |
-----|------ ------------ -----|------ ------------ ---------|--
| | / |
|/ --(@)--
quarter note half note eighth note whole note eighth note
sharped flatted natural
Po nocie 12 znaków, należy pozostawić 2 * 12 - 12 = 12
znaków pusta (albo czy
-
w zależności od linii), jeśli uwaga jest ćwierćnuta. Jeśli nuta jest półnuty, pozostaw 4 * 12 - 12 = 36
znaki puste. Jeśli notatka jest całą notatką, pozostaw 8 * 12 - 12 = 84
znaki puste. Nie dodawaj dodatkowych znaków do ósmych nut.
Na końcu każdego taktu (96 znaków po wierszu klucza lub kreski), wypisz linię słupka. Odbywa się to poprzez zejście każdy znak między najwyższym i dolnej skrajnej linii (włącznie), i zastępując z
|
i -
z +
. (Zobacz przykładowy wynik na dole pytania).
Na końcu utworu wyślij koniec muzyki, wypuszczając 3 linie kreskowe z rzędu, ale z odstępem między pierwszym a drugim. To jest:
+-++
| ||
+-++
| ||
. ..
. ..
Należy pamiętać, że ostre, płaskie i naturalne przedmioty trwają do końca taktu. Znak naturalny powinien być używany tylko do anulowania ostrza lub płaskiego użytego wcześniej w tym samym takcie.
Do celów tego zadania, narzędzia, mieszkania i zwierzęta naturalne wpływają tylko na nutę w jednej oktawie i jednym kluczu (ostry na A5 nie powoduje ostrzenia A4, a płaski na C4 w górnym pięciolinii nie powoduje C4 w dolnej pięciolinii do spłaszczenia).
Informacje tylko dla bonusu
Bonus obejmuje prawidłowe połączenie ósmych nut.
Jeśli są dwa kolejne ósme nuty, wyrównane do taktu ćwierćnutowego (innymi słowy, liczba znaków przed pierwszą ósmą nutą jest wielokrotnością 24), dwie ósme nuty należy połączyć.
Niech nuta A będzie nutą najdalej od środka pięciolinii. Jeżeli obie notatki są w takiej samej odległości od środka, albo może być uwaga uwaga . Niech Inne Napisz UWAGA UWAGA B .
Kierunek zarówno łodygi powinny być kierunek łodygi nocie A .
Trzon jednej nuty powinien mieć 6
linie wysokie (tak jak w przypadku pni w ogóle), a trzon drugiej nuty powinien być przedłużony do końca rdzenia drugiej nuty.
Pędy należy połączyć _
.
Przykład połączonych ósmych nut:
___________
| |
| |
| |
| | --(@)--
| | | |
------------------------ ---|_----|-----------|-- -----|------------------
|/ (@) | | |_
------------------------ ---------------------|-- -----|--------|_|-(@)---
(@) _|_|_ | | ||
-----|------_|_|_-(@)--- ---------------------|-- -----|-----------|------
| | | | | | |
-----|-----------|------ ---------------------|-- -----|-----------|------
| | | | |
-----|-----------|------ ------------------(@)--- -----|___________|------
| |
|___________|
Przykładowe wejście i wyjście
Wejście :
A#4/4 G#4/4 F#4/2 A#4/4 G#4/4 F#4/2 F#4/8 F#4/8 F#4/8 F#4/8 G#4/8 G#4/8 G#4/8 G#4/8 A#4/4 G#4/4 F#4/2
A#3/4 G#3/4 F#3/2 A#3/4 G#3/4 F#3/2 F#3/2 G#3/2 F#3/4 E#3/4 F#3/2
Wyjście :
^
| | | | |
------|/-------------|-----------------------|--------------------------------------------------------------+---------|-----------------------|--------------------------------------------------------------+----------___________-------------___________------------|\----------|\----------|\----------|\-+---------|-----------------------|--------------------------------------------------------------+-++
/ | | | | | | | | | | | | | \ | \ | \ | \| | | | | ||
-----/|--------------|-----------------------|-----------------------|--------------------------------------+---------|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+---------|-----------------------|-----------------------|--------------------------------------+-++
/ | | | | | | | | | | | | | | | | | | | | | | ||
---/--__----_|_|_----|-----------------------|-----------------------|--------------------------------------+_|_|_----|-----------------------|-----------------------|--------------------------------------+---------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|--+_|_|_----|-----------------------|-----------------------|--------------------------------------+-++
| / \ _|_|_ (@) _|_|_ | | |_|_|_ (@) _|_|_ | | | | | | | _|_|_ | | | | |_|_|_ (@) _|_|_ | | | ||
---\-\|-|----|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+_|_|_----|-----------|-----------|-----------|--_|_|_-(@)---------(@)---------(@)---------(@)---+-|-|--------------------_|_|_-(@)---------------_|_|_----|--------------------------------------+-++
\ | / | | _|_|_ ( ) | | | _|_|_ ( ) |_|_|_ (@) (@) (@) (@) | | | | | _|_|_ ( ) | ||
------|------------------------------------------------------|-|--------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-|-|--------------------------------------------------------------------------------------------+-------------------------------------------------|-|--------------------------------------------+-++
| | | | | ||
\_/ | | | | ||
| | | | ||
| | | | ||
| | | | ||
| | | | ||
_|_|_ |_|_|_ | | | ||
----___-----_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+_|_|_-(@)---------------_|_|_-------------------------------------------------------------------+------------------------------------------------_|_|_-------------------------------------------+------------------------------------------------------------------------------------------------+-++
/ \ | | | | _|_|_ (@) _|_|_ | | | | _|_|_ (@) _|_|_ |_|_|_ _|_|_ ( ) |_|_|_ | ||
---\---|---------|-------------------|-|-|------------------_|_|_-( )---------------------------------------+-----|-------------------|-|-|------------------_|_|_-( )---------------------------------------+_|_|_-( )----------------------------------------|-|-|------------------------------------------+_|_|_ (@)---------------_|_|_-------------------------( )---------------------------------------+-++
| | | | | | | | | | | | | | | | | | | | | | _|_|_ (@) | | ||
-------/---------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-------------------|-|-|-----------------------|------------------------------------------+-++
/ | | | | | | | | | | | | | | | ||
-----/-----------|-----------------------|-----------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-----|-----------------------------------------------|------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
| | | | | | | | | | | | | ||
-----------------------------------------------------------------|------------------------------------------+-----------------------------------------------------|------------------------------------------+-----|------------------------------------------------------------------------------------------+-----|-----------------------|-----------------------|------------------------------------------+-++
|
Dla celów demonstracyjnych w trzecim takcie F#
ósemka jest połączona, a G#
ósma nie. Twój program powinien albo łączyć ósme nuty, o ile ma to zastosowanie (dla premii), lub pozostawić je wszystkie rozłączone.
Inne informacje
- Dopuszczalna jest dowolna ilość końcowych białych znaków / linii.
- Przed kluczami nie powinno być żadnych białych znaków ani białych znaków między nutami. Dowolna liczba pustych linii może być emitowana przed / po wyjściu.
- Premia za połączenie ósmych nut to 0,75 * liczba bajtów kodu źródłowego .
- To jest golf golfowy , więc wygrywa najkrótszy kod.
Odpowiedzi:
Python - 8,85 ... KB (
93699066 B)Ha ha! Najszybsza broń na ... Zachodzie?
Jest to DALEKO od prawidłowej gry w golfa, ale przynajmniej działa. W tej chwili jest to najkrótszy wpis, więc ... tak?
Zacznę od stwierdzenia, że nigdy tak naprawdę nie grałem w golfa i nawet nie wiem od czego zacząć.
Ten wpis nie zawiera jeszcze punktów bonusowych, ale nadal chciałbym je dodać przed rozpoczęciem gry w golfa.
Zasadniczo napisałem rodzaj klasy renderowania ASCII, która przechowuje znaki tworzące każdy „blok” w formacie 2D, dzięki czemu można narysować dowolną liczbę różnych „symboli” na siatce 2D. W przypadku bloków nutowych najpierw narysowano pięciolinię, następnie dowolne przedłużenia prętów, jeśli to konieczne, następnie główkę nuty, a następnie trzon i ogon (w stosownych przypadkach), a na końcu przypadek.
Gdy podane są następujące dwa dane wejściowe dla tonów wysokich i niskich:
Następujące wyniki wyjściowe:
Oto działająca wersja kodu z pewnym fałszywym kodem wejściowym, ponieważ ten konkretny IDE sieci web w Pythonie nie pozwalał na symulację danych wejściowych ani oddzielnych plików.
grandstaff.py
Zawiera treble treble i treble bas, oraz uchwyty do rysowania linii między nimi.
staff.py
Jeden personel. Zawiera tablicę obiektów „Block”, które reprezentują nuty, kreski, klucze, itp. Ta klasa obsługuje odstępy między nutami i wstawianie linii słupków w odpowiednich miejscach.
block.py
Ta klasa obsługuje „renderowanie” (lub być może kompozycję) tekstu ASCII. Wewnątrz znajdują się zakodowane symbole, takie jak klucz tonalny i klucz basowy, pusta pięciolinia, linie kreskowe, przypadkowe elementy i elementy niezbędne do stworzenia dźwięków o różnym czasie trwania. Są one „rysowane” na siatce 2D „pikselów” znaków w kolejności sekwencyjnej, aby utworzyć końcowy blok ASCII.
main.py
Ta klasa po prostu „uruchamia” program, tworząc wystąpienie GrandStaff, przekazując mu dane wejściowe ciągu i wypisując jego wartość ciągu.
źródło