Wyjście „Mozart - Alla Turca” na standardowe wyjście (patrz przykład dla „referencyjnego wdrożenia”)
Spróbuj znaleźć, jak spakować zarówno syntezator, jak i muzykę do minimalnego rozmiaru.
Wymagania:
- Format odpowiedni do wprowadzania
aplay -f cd
(podpisany 16-bitowy mały endian, 2 kanały); - Należy odtwarzać całą muzykę (bez pomijanych nut lub partii, przynajmniej nie mniej niż w programie przykładowym), jednak polifonia nie jest wymagana;
- Nie można po prostu zadzwonić
/usr/bin/timidity
,/usr/bin/sox
lub coś w tym rodzaju (np wymagać zainstalowania specjalnego modułu muzycznego); - Nie można uzyskać dostępu do sieci lub założyć, że muzyka jest dostępna lokalnie;
„Implementacja referencyjna” z możliwym do przetworzenia wynikiem: https://gist.github.com/vi/5478693
(Stary przykładowy program Perl: https://gist.github.com/vi/5447962 )
Odpowiedzi:
Polifoniczny, Haskell,
282631774719Wyjście audio: https://www.dropbox.com/s/nba6489tfet740r/hs-golf-turca.ogg
Cechy:
z prawej ręki . Oczywiście mógłbym również dodać lewą rękę(skończone).jak na prawdziwym pianiniewłaściwie bardziej ... hej, ten utwór ma naśladować tureckie zespoły Janissary , prawda?Oto częściowo nieoznaczona i skomentowana wersja: https://gist.github.com/leftaroundabout/5517198 .
źródło
Python, 331 + 286 = 617 (0,548 bajtów na notatkę)
Moje rozwiązanie wykorzystuje plik danych i skrypt Pythona. Plik danych powinien zostać wykorzystany jako dane wejściowe do skryptu. Nie mam aplikacji, ale działa, gdy importuję ją jako surowe dane w Audacity z podpisanym 16-bitowym PCM, little-endian i 2 kanałami.
Plik danych ma 331 bajtów. Oto skrypt Pythona, który go wyprowadza:
Oto skrypt Pythona:
Uwaga: Jeśli używasz systemu Windows, użyj
-u
przełącznika dla obu skryptów, ponieważ stdin i stdout zajmują się danymi binarnymi.źródło
os.read/write
zamiastsys.stdin/stdout
.GolfScript (129 + 369 = 498 bajtów)
Zarówno program, jak i plik danych zawierają znaki niedrukowalne, więc przedstawię reprezentacje Base64 i xxd.
Program (129 bajtów):
Dane (369 bajtów):
Wyjaśnienie
Przekształciłem (zaktualizowaną) partyturę (więcej na ten temat później) w pojedynczy ciąg zawierający bajty o wartościach od 0 do 24. Długości nut są najważniejsze; następnie wartości nut, reprezentowane przez mod 25 i zakodowane różnicowo. Przyczyną kodowania różnicowego jest to, że fragmenty powtarzane w transpozycji zostaną zredukowane do tej samej sekwencji i mogą zostać skompresowane.
Następnie uruchomiłem to przez program do kompresji ciągów znaków do GolfScript, o którym wspomniałem wcześniej (i który poprawiłem, aby być konkurencyjnym w tym golfie), aby uzyskać plik danych, który jest dekompresowany przez pierwszą część programu:
Jest to proste rozszerzenie gramatyczne tego typu, które jest znane każdemu, kto spojrzał na wiele pytań oznaczonych złożonością kolmogorowa .
Następnie podzielę ten ciąg na pary
[length note]
i iteruję po parach. Znaki niedrukowalne pochodzą z magicznego ciągu znaków zawierającego parametry częstotliwości notatek: używam domyślnego skrótu GolfScript mod 256 tablic liczb całkowitych, które są konwertowane na ciągi, aby utworzyć falę trójkąta *, więc częstotliwość podstawowa wynosi 22050/256 Hz Napisałem program do znalezienia współczynników całkowitych, które dają dobre dostrojenie; magiczny ciąg zawiera liczniki, a mianownik 17 jest taki sam dla wszystkich nut. Średni błąd strojenia wynosi około 3,4 centa.Długości nut są przedstawiane w postaci, w jakiej są, i są znacznie bardziej prawdopodobne niż poprzednia wersja partytury. Jak podejrzewałem, zaokrąglanie zwiększyło nadmiarowość ciągu i skróciło skompresowany plik danych o 30 bajtów, nie mówiąc już o zapisaniu tablicy odnośników. Jednak nadal istnieją pewne fragmenty, które uważam za podejrzane:
lub
dać słupki, które są szóstą szydełka dłuższe niż reszta słupków w partyturze, i
lub
są całkowitą liczbą taktów, ale z pewnymi wątpliwymi przesunięciami.
Program może być nieco krótszy. Celowo wybrałem krótką wymianę na czas realizacji. Z pewnymi poprawkami szybkości interpretera GolfScript, które przesłałem Darrenowi Smithowi i które, jak sądzę, planuje opublikować w pewnym momencie, obecna wersja działa na moim komputerze w mniej niż 15 minut. Jeśli nie
puts
wygeneruję każdej nuty po wygenerowaniu, to działa znacznie wolniej.* Wyznaję, że mój komentarz na temat wszystkich osób korzystających z fal prostokątnych był błędny.
źródło
base64 -d <<< 'MjU2Y.....9Lw==' |
golfscript i mówigolfscript:405:in 'scan': invalid byte sequence in UTF-8 (ArgumentError)
(to samo, jeśli zapisuję program do pliku, oczywiście)㔲戶獡㌷慢敳せ为⽝㐨ⰴ屻ㅛ⤤⽝㉜㴤紪尯⤬⭽⸥㈬⼯楺筰乾㈫┵为笧誂鮒꺤쎸��䇿䥅前屗慜浧❴㨽㭦∩ĦĂ༃ጔ؏༆ณؕḧ⸘研��⒖✏㰢⭻⩽㐴Ⱚ〵⨾⩦㜱ⸯ⸮╽✧渺瀫瑵絳/
), dostajęundefined method
class_id 'na zero: NilClass`Kod maszynowy x86 - 513 bajtów
To nie do końca spełnia wyzwanie, ponieważ zamiast wyświetlać w formacie odpowiednim do wprowadzenia do gry, gra midi.
Plik wykonywalny .COM i kod źródłowy asm - uruchomienie muzyki może potrwać do 14 sekund. Będzie również odtwarzać trochę wolniej, ponieważ rozdzielczość timera wynosi 1/18 sekundy.
Muzyka jest kodowana w 375 bajtach przy użyciu kodowania Fibonacciego i słownika złożonego z wcześniej zdekodowanej muzyki.
Algorytm dekodowania pseudokodu:
Po odkodowaniu muzyki, wystarczy wysłać ją do portu Midi.
źródło