Apokalipsa zombie nadeszła i świat się kończy. Nagle ktoś odkrywa formułę, która zajmuje aktualną godzinę, minutę i dzień, i wyrzuca idealną nutę do gry na pianinie, która natychmiast zabija każdego zombie, który ją słyszy. Niestety na świecie pozostał tylko jeden pianista, który zapomniał czytać nuty, ale nadal umie czytać nuty. Oczywiście jest to kwestia bardzo czasochłonna, więc wydaje się naturalne, że komputer to robi. 1
Twoim wyzwaniem jest zanotowanie G
i wysłanie notatki umieszczonej na pięciolinii (w kluczu wiolinowym) w następujący sposób:
-----
-----
|
---|-
|
--O--
-----
Specyfikacja:
- Musisz wypisać pięciolinię naprzemiennych linii
-----
(5 myślników) i pustej linii. Łącznie będzie 5-----
s. Notatkę należy nałożyć na ten pięciolinię. - Dane wejściowe określą lokalizację notatki. Dane wejściowe będą:
- opcjonalny
H
lubL
określający „wysoki” lub „niski” - list od
A
doG
, określający wysokość - opcjonalny
#
lubb
, określający ostry lub płaski.
- opcjonalny
- „Uwaga” jest zdefiniowana jako:
- Jedna
O
(duża litera O) wyrównana do środka pięciolinii, która znajduje się w miejscu nuty. (Górna linia toHF
(wysokie F), a dolna linia toE
(normalne E).) - Trzy
|
s (pionowe paski), trzon, który będzie:- jedno pole na lewo od nuty i schodzenie w dół (zaczynając o jedno pole poniżej nuty), jeśli nuta znajduje się w środkowej linii (
B
) lub powyżej, lub - jedno pole po prawej stronie nuty i idące w górę (zaczynając o jedno pole powyżej nuty), jeśli nuta znajduje się poniżej środkowej linii.
- jedno pole na lewo od nuty i schodzenie w dół (zaczynając o jedno pole poniżej nuty), jeśli nuta znajduje się w środkowej linii (
- A
#
lubb
jedna spacja bezpośrednio na lewo od nuty, jeśli podano ją na wejściu.
- Jedna
- Wiersze księgi muszą zostać dodane, jeśli nuta jest zbyt wysoka lub niska. Te linie będą
---
(tylko 3 kreski szerokości, w przeciwieństwie do 5) i pojawią się tylko wtedy, gdy nuta jest na lub powyżej / poniżej (odpowiednio dla górnych / dolnych linii księgi) linii księgi. - Przestrzenie zewnętrzne można umieszczać w dowolnym miejscu; na przykład możesz sprawić, że puste linie będą miały spacje lub spację po liniach księgi, jeśli pomoże to w zapisaniu dowolnych znaków.
Oto wizualizacja umożliwiająca łatwiejsze zrozumienie specyfikacji wraz ze wszystkimi nazwami nut obok wierszy:
HB
--- HA
HG
----- HF
HE
----- HD
HC
----- B
A
----- G
F
----- E
D
--- C
LB
--- LA
LG
--- LF
... (bottom cut off for brevity, you get the idea anyway)
Oto kilka przykładów, które możesz wykorzystać do przetestowania swojego programu:
Wejście: HG#
#O
-|---
|
-|---
-----
-----
-----
Wejście: LAb
-----
-----
-----
-----
-----
|
--|
|
bO-
Wejście: HB
O
|--
|
-|---
-----
-----
-----
-----
Wejście: C
-----
-----
-----
-----
|
---|-
|
-O-
To jest golf golfowy , więc wygra najkrótszy kod w bajtach!
1: najbardziej realistyczny evar ekspozycji! :-P
#
lubb
po prawej stronie nuty niż po lewej; czy to naprawdę jest wymagane?Odpowiedzi:
Golfscript,
211210209197195192 znakówPrzybywając po zwycięstwo (od tego postu), w mojej najnowszej wersji Python w wersji GolfScript :
Przetestuj tutaj (pierwsze 2 wiersze są wprowadzane przez użytkownika, zwykle pochodzi ze standardowego wejścia).
Wersja „czytelna”:
źródło
Rubinowy -
271267252249234229220214 znakówDosłownie nauczyłem się do tego Ruby. Jest więc z pewnością miejsce na ulepszenie gry w golfa. Lub robienie czegokolwiek naprawdę. Ale potrzebowałem języka ze zmiennymi ciągami. :)
Nieco golfisty:
Mogę go przyciąć o kolejne 2 znaki do 212 znaków, jeśli dozwolone są wiodące puste wiersze. To rozwiązanie i tak nie wypełnia wierszy, które nie są drukowane:
Czy lambda jest uczciwą grą? Wtedy mogę uzyskać 210 znaków przy pierwszym podejściu
Lub 207 znaków z dodatkowymi pustymi wierszami:
Oczywiście, teraz musisz zrobić
f.call("HGb")
.źródło
!x.nil?
odpowiada!x
. I dla jednej linii ifsif x;y;end;
jest równoważne zy if x
. Możesz także użyć literału nowego wiersza w tym ciągu.if
do pracy. Jeśli użyję?\n
(jeśli o to ci chodziło), muszę dodać spację, więc nic nie zyskuję. A usunięcie.nil?
s wcale nie działało (zawsze sprawdzanetrue
)..nil?
, ale warto w postaciach.!x.nil?
is!!x
. :)Python,
329309295286280277 znakówGrałem teraz trochę więcej. Nadal można to poprawić, ale nie jestem pewien, czy uda mi się pokonać rozwiązania ruby lub gry w golfa dzięki takiemu podejściu.
Początkowo drukowałem wiersz po wierszu, ale okazało się, że zajmuje to zbyt wiele, więc generuję siatkę ciągów, a następnie wypełniam to, co należy wypełnić. Dane wejściowe pochodzą z wiersza poleceń, np .:
źródło
GolfScript -
243232228227 znakówPrzetłumaczyłem moją odpowiedź CoffeeScript na GolfScript, który jest znacznie bardziej odpowiedni do manipulacji ciągami.
EDYCJA: Oszczędność sześciu znaków dzięki prawidłowemu użyciu operatora inkrementacji, trzech dzięki dobremu wykorzystaniu stosu, sześciu kolejnych przez nieodpowiedzialne przedefiniowanie operatorów, których nie używam, i jeszcze jednego poprzez nie drukowanie spacji po wierszach łaski.
Całkowicie grał w golfa:
Z komentarzami:
źródło
Go
. wyjdzieoo|||
:)Python,
250245242235 znakówZupełnie inne podejście, które zakończyło się pokonaniem mojego drugiego! Kod przetwarzania danych wejściowych jest podobny, ale o to chodzi.
Odwzorowałem wartość każdego znaku na podstawie wiersza i kolumny, a następnie grałem w golfa nad drukiem:
źródło
Java -
921907863 znakówKażdy ciąg buduję osobno, przechowując każdy ciąg w tablicy. Następnie przejdź przez tablicę i wydrukuj każdą linię.
Och, proszę, nie nienawidź mnie, to mój pierwszy raz. Nie mogę znaleźć żadnego pytania / wprowadzenia, więc mam nadzieję, że mój format publikacji jest w porządku. Nie jestem pewien, jak poważni ludzie podeszli do liczby znaków ... normalna wersja kodu - dodatkowa jest łamana linia / spacje (1313 znaków):
źródło
args
).[]
, spacje wokół nawiasów itp.Haskell 377C
Wersja bez golfa:
źródło
Literate CoffeeScript -
497527 znakówJestem pewien, że istnieje lepszy sposób na zbudowanie siatki, ale nie mogę tego rozgryźć.
Jeden pomocnik golfa.
AC na dużą skalę i personel.
Nasza funkcja notacji weźmie ciąg reprezentujący notatkę.
Najpierw określmy oktawę.
Potem notatka i przypadkowa. Uwielbiam dekonstruować zadanie.
Przekształćmy nutę i oktawę w indeks i narysujmy notatkę.
Teraz wyeliminujemy tylko tyle personelu, ile potrzebujemy.
I trzon notatki.
Teraz wypiszmy wyniki.
Na koniec wyeksportujemy funkcję do testowania na konsoli. Te postacie nie liczą się do sumy.
źródło
C
325304Teraz o 21 bajtów krótszy dzięki @ace !
Wynik:
źródło
n
i można usunąći=0
pierwsząfor
pętlę.if
zdaniu((i%12)&11)==0
można go zastąpić!((i%12)&11)
.?:
ma bardzo niższy priorytet niż^
i<
tak można usunąć wsporniki o warunkach przed złożeniem?
. I można wymienićprintf("%s",
zputs(
.JavaScript
390388Trochę wyzwania, muszę przyznać ... Jestem pewien, że istnieją sposoby na zmniejszenie tego ... Jestem otwarty na sugestie ...
Pierwsza iteracja
Druga iteracja (użycie
n.slice(-1)
zamiastn[n.length-1]
), goli 2 bajtyWersja bez golfa:
źródło