Jak wszyscy wiemy, seria Zelda jest jedną z najlepszych serii gier, jakie kiedykolwiek stworzono. Na cześć tego, zagrajmy kilka piosenek na ocarinie.
Wyzwanie:
Napisz program, który, biorąc pod uwagę piosenkę, wyprowadza wynik na standardowe wyjście dla tego konkretnego utworu.
Wejście:
Piosenka, z której będziesz musiał wydać wynik, otrzyma unikalna kombinacja trzech znaków, jak pokazano poniżej:
zel - Zelda's Lullaby
sas - Saria's Song
eps - Epona's Song
sos - Sun's Song
sot - Song of Time
sst - Song of Storms
Pieśni dodatkowe, po -7%:
mof - Minuet of Forest
bof - Bolero of Fire
sow - Serenade of Water
nos - Nocturne of Shadow
ros - Requiem of Spirit
pol - Prelude of Light
Pieśń dodatkowa 2, -8%:
scs - Scarecrow's song
Jak wszyscy wiemy, piosenka Scarecrow to piosenka, którą sam komponujesz. Ta piosenka musi mieć osiem nut. Wykonaj wynik, który sam skomponujesz, który różni się od wszystkich innych wyników.
Jeśli zdecydujesz się dołączyć wszystkie utwory, będzie to łącznie -50% premii do twojego wyniku w bajtach.
Wynik:
Notatki na wydruku są symbolizowane przez następujące znaki:
^
<
>
V
A
Wynik w następującym formacie:
-^-^-^-^-^-^-^-^-
-<-<-<-<-<-<-<-<-
->->->->->->->->-
-V-V-V-V-V-V-V-V-
-A-A-A-A-A-A-A-A-
Dozwolona jest tylko jedna nuta na kolumnę. Dla uproszczenia dodałem kolejny wiersz do oryginalnych czterech wierszy.
Każda nuta odpowiada innemu rzędowi:
^: ----------------
<: ----------------
>: ----------------
V: ----------------
A: ----------------
Dane wyjściowe należy zapisać na standardowe wyjście. Końcowe znaki nowej linii są dozwolone.
Przykłady:
Wejście (Kołysanka Zelda):
zel
Wynik:
---^-----^-------
-<-----<---------
----->----->-----
-----------------
-----------------
Wejście (Bolero ognia):
bof
Wynik:
-----------------
-----------------
--------->--->---
-V---V-----V---V-
---A---A---------
Uwaga ściągawka:
zel
<^><^>
sas
V><V><
eps
^<>^<>
sos
>V^>V^
sot
>AV>AV
sst
AV^AV^
mof
A^<><>
bof
VAVA>V>V
sow
AV>><
nos
<>>A<>V
ros
AVA>VA
pol
^>^><^
Ponieważ gramy w golfa ocarina code, wygrywa najkrótszy program w bajtach!
Piosenki o referencjach:
http://www.thonky.com/ocarina-of-time/ocarina-songs
http://www.zeldadungeon.net/Zelda05-ocarina-of-time-ocarina-songs.php
v
wyglądałyby lepiej.Odpowiedzi:
Pyth, 56,5 (113 bajtów - 6 × 7% - 8%)
Zawiera znaki niedrukowalne, więc oto odwracalny
xxd
zrzut heksowy:Możesz także spróbować online .
Wyjaśnienie
Przechowuję utwory w liczbach base-6, ponownie zakodowanych w bazie 1391423, a następnie w bazie 256, aby zaoszczędzić miejsce. Musiałem wybrać bazę 6, ponieważ niektóre utwory zaczynają się od
^
, a liczby nie mogą zaczynać się od 0 po dekodowaniu.źródło
Funciton , 4322 - 50% = 2161
Naprawdę nie próbuję tutaj grać w golfa. Więcej pod kątem piękna. Myślę, że główny program wygląda naprawdę schludnie, idealne prostokątne pudełko schowane po prawej stronie.
Jak zawsze, możesz uzyskać lepsze renderowanie, wykonując
$('pre').css('line-height',1)
w konsoli przeglądarki.Kontynuując tradycję nadawania nazw funkcjom Funciton składającym się z jednego, dziwnego, rzadko używanego znaku Unicode, pomyślałem o tym, co może najlepiej reprezentować to wyzwanie, i przyszło mi do głowy, że Link i Zelda (lub, jeśli chcesz, Legenda o Zelda ) daje LZ , więc małe litery ʫ (U + 02AB, ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟᴢ ᴅɪɢʀᴀᴘʜ) wydają się odpowiednie.
Wyjaśnienie
Jak wyjaśniono w artykule esolangs, program Funciton odbiera dane wejściowe zakodowane jako coś, co nazwałbym „UTF-21”, ale jako pojedynczą ogromną liczbę całkowitą. Gdybym chciał użyć tego numeru jako klucza do mapy skrótów (słownik, tablica asocjacyjna), potrzebowałbym funkcji skrótu, która spełnia dwa kryteria: jedno, jest wystarczająco proste do zaimplementowania w Funciton i dwa, wszystkie 13 z oczekiwanych ciągi wejściowe dają inną wartość skrótu. Najprostsza funkcja skrótu, o której mogłem myśleć, dotyczyła
input % m
pewnej wartościm
. Dlatego próbowałemm
= 13, 14, 15 itd., Aż dotarłem do najmniejszej liczby całkowitej, dla której wszystkie wartości skrótu są unikalne. Okazuje się, że ta liczba to 25.Wartości skrótu to:
Kodujemy każdą piosenkę, tak aby jeden bit reprezentował obecność lub brak nuty. Na przykład Kołysanka Zelda byłaby kodowana w następujący sposób:
z wyjątkiem tego, że bity są w odwrotnej kolejności; lewa górna komórka jest najmniej znacząca. Oznacza to, że każda piosenka ma 40 bitów.
W ten sposób tworzymy (umiarkowanie rzadką) tabelę skrótów, biorąc 40 × 25 = 1000-bitów i umieszczając wzór bitowy dla każdego utworu we właściwym miejscu zgodnie z jego wartością skrótu. Monstrualną liczbą w programie jest właśnie ta tabela skrótów.
Oto, co oznacza każda z pozostałych liczb:
45
=0x2D
Jest Unicode-
.1257283645609482190214660190
: To jest ciąg znaków^<>VA
w UTF-21. Z perspektywy czasu mogłem użyć tutaj 7 bitów na znak, dzięki czemu liczba ta jest krótsza, ale UTF-21 jest tak głęboko tradycyjny w Funciton, że po prostu nie przyszło mi to do głowy.2097151
=0x1FFFFF
= (1 << 21) - 1. Służy do uzyskania pierwszego znaku z powyższego ciągu.20971565
: To jest ciąg-\n
, który jest dołączany na końcu każdej linii.\n
ma wartość 10. Ta ostatnia liczba to (10 << 21) + 45.Program działa teraz w następujący sposób:
ʫ
3 następujące parametry:^<>VA
.ʫ
,-
-
-\n
, a następnie odetnij pierwszy znak od c i rozpocznij kolejną pętlę z a = 8.źródło
Python 2, 143,5 (287 bajtów - 50%)
Siatka jest generowana z myślnikami; następnie zindeksowano i zastąpiono notatkami.
źródło
j
zastępując każdy przecinek z miejsca i wywołaniesplit
bez argumentówrange
. Niestety nie można po prostu pomnożyć wewnętrznej listy przez 5, ponieważ wszystkie są tym samym obiektem, a zmiana jednego zmienia inne: / Jednak pokonaliśmy perla (na razie)!"<^><^>"
=>"<^>"*2
?scs="<"*8
Nie podoba mi się twoja piosenka Scarecrow.Perl 5, 125 (
320260250 bajtów -6x7% piosenki bonusowe -8% piosenka strach na wróble)Tak, wreszcie okazja do eksperymentowania z tą składnią skrótu Perlish.
Test
źródło
qw()
składni zamiast grubych przecinków (%h=qw(zel <^><^> sas >'V><' ...)
aby zaoszczędzić trochę bajtów@L
można napisać bardziej zwięźle jako@L=('-')x17
. Ponadto główny hash może pozostać anonimowy jako@B={qw(zel <^><^> ... scs <^V>>V^<)}->{$_}=~/./g
.Perl, 75 (150 bajtów - 50%)
Licząc shebang jako 2, dane wejściowe są pobierane ze standardowego wejścia.
Przykładowe użycie
źródło
Haskell, 344 - 50% = 172 bajty
o
wykonuje pracę.Myślałem, że mogę pokonać Pythona za pomocą tych kodowań (zajęło mi to dużo czasu ._.), Ale nie. Tak naprawdę nie oszczędzają dużo bajtów. Jakieś sugestie?
Tak, to minus przed kodowaniem dla
"ros"
. Dzieje się tak, ponieważ jego „arkusz” kończy się znakiem, który oznacza0
w mojej bazie 5, ponieważ ta negatywna sztuczka nie zadziałałaby dla „łatwych piosenek” zakodowanych przez podwojenie tego, co jest zakodowanes
. Chyba że użyjeszquot
może, ale wtedy nie poradzisz sobiep (-1)
specjalnie, ponieważquot (-5) = 0
negatywność zniknie. Cokolwiek.źródło
PHP: 130 bajtów (260
270279bajtów - 6 × 7% - 8%)Dzięki Ismael Miguel i Blackhole za kilka świetnych pomysłów, aby zaoszczędzić więcej bajtów!
Po
print"-
tym następuje dosłowne wstawienie znaku powrotu karetki. Może to oznaczać dwa bajty w systemie Windows.Wszystkie utwory bonusowe, w tym utwór Stracha na Wróble, są włączone.
Każda piosenka jest reprezentowana przez siedem bajtów kodu. Podoba mi się nowa punktacja, ponieważ przy starej punktacji zdobyłbym tylko jeden skromny punkt bonusowy!
Ostatnie zmiany powodują, że PHP generuje wiele ostrzeżeń, więc aby zachować ład i porządek, są one przekazywane
/dev/null
.Zapisz jako
zelda.php
i uruchom w wierszu poleceń:źródło
main.php
”?()
wokół($i-$c)
oecho($i-$c)?'--':'-'.$z[$c-0];
. Również twój sznurek wewnątrzsplit
może być używany bez'
. I'/^'.$argv[1].'/'
można zapisać jako"/^$argv[1]/"
Python 3 - 138,5 (
292280277 bajtów - 50%)Ogoliłem kilka bajtów z bieżącego lidera Pythona, wykonując metodę drukowania zgodnie z rzeczywistym użyciem zamiast metody zastępowania.
Wypróbuj online
Biegać:
Wynik:
źródło
['--',c+'-'][s[x]==c]
zamiast warunkowegoRuby, rev. 1, 192–50% = 96
Gra w golfa obejmuje:
usunięcie spacji między grupami liter w magicznym ciągu (i zmiana mianownika na końcu linii do
/4
.) Usunięcie niektórych innych niepotrzebnych białych znaków.konwersja sekwencji ucieczki na pojedyncze znaki (wymiana stosów ich nie wyświetli, więc umieściłem
?
jako symbol zastępczy)redefinicja
g
jako pojedynczego ciągu zawierającego pięć ciągów-
po 17, po których następują znaki nowej linii, zamiast tablicy pięciu ciągów po 17-
Ruby, rev 0, 223 - 50% = 111,5 (nie golf)
Kod wejściowy jest zredukowany do 2 liter. Jeśli zaczyna się od
s
, tos
jest usuwane, jeśli zaczyna się na literę późniejs
(dotyczy tylkozel
ostatniej litery, a jeśli zaczyna się na literę przeds
usunięciem środkowej litery).Magiczny ciąg znaków (który w wersji bez golfa zawiera spacje dla przejrzystości) zawiera dwuliterowe kody, po których następują dane muzyczne. Jest przeszukiwany za pomocą operatora dopasowania,
=~
który zwraca pozycję w ciągu.Jest dokładnie jedna piosenka, każda z 5, 7 i 8 nutami (plus scs, która ma również 8 nut.) Te, wraz z jedną dowolną 6-nutową piosenką,
ros
są pakowane na początku magicznego ciągu, dzięki czemu wartośćn
podana przez Pozycja struny może być wykorzystana do obliczenia liczby nut do zagrania.cs
jest wciśnięty wcześniejbf
, a po obcięciu, gdy liczban
jest zaokrąglana w dół, po prostu uzyskujemy prawidłowe obliczenia dla obu. Po czwartym klastrze wszystkie utwory mają 6 nut, więc jeślin
jest duża, liczba nut jest zmniejszana do domyślnej wartości 6.Tablica
-
jest ustawiony na wyjściu i uwagi są podstawione w jednej po drugiej. Wymagane dane muzyczne są pobierane ze zmiennej,$'
która zawiera część oryginalnego magicznego ciągu po prawej stronie dopasowania. W ten sposób nieistotne dane są ignorowane.Nuty są zakodowane po 3 w magicznym ciągu, zaraz po odpowiednim 2-literowym kodzie piosenki. Są one wyodrębniane z podziałem przez,
5**(i%3)
a postać wg
jest odpowiednio aktualizowana. Na końcu programug
jest drukowany.źródło
Python 2, 141,5 bajtów -50% (283 bajtów)
Przechowuje każdą nutę jako bajt, ponieważ każda linia ma 8 nut. Przywołuje reprezentację binarną, a następnie zastępuje odpowiednimi znakami.
źródło
Lua, 249 bajtów - 50% = 124,5
Całkiem proste, po prostu odczytuje utwory zakodowane jako liczby podstawowe 6.
źródło