Wprowadzenie
Kilka dni temu potrzebowałem do czegoś metronomu. Nie miałem żadnych dostępnych, więc pobrałem aplikację ze sklepu App Store. Aplikacja miała rozmiar 71 MB !!!
71 MB na zrobienie Tic-Toc ...?!
Przyszedł mi do głowy kod-golf i zastanawiałem się, czy niektórzy z was mogliby to poprawić.
Wyzwanie
Golf trochę kodu, który generuje dźwięk. Nie ma znaczenia, jaki rodzaj dźwięku. W razie potrzeby stwórz plik dźwiękowy ... ale sygnał dźwiękowy systemu również wykona zadanie. ( Oto dźwięk, który stworzyłem ... nic specjalnego. )
Dane wejściowe : liczba uderzeń na minutę wysyłanych przez metronom.
Przykład
To jest wersja Java bez gry w golfa! To tylko pokazać zadanie.
public class Metronome {
public static void main(String[] args) throws InterruptedException {
int bpm = Integer.valueOf(args[0]);
int interval = 60000 / bpm;
while(true) {
java.awt.Toolkit.getDefaultToolkit().beep();
// or start playing the sound
Thread.sleep(interval);
System.out.println("Beep!");
}
}
}
Zasady
Nie możesz używać zewnętrznych bibliotek, dozwolone są tylko narzędzia samego języka.
Liczą się tylko bajty kodu źródłowego ... nie plik dźwiękowy.
To jest golf golfowy , więc wygrywanie z najmniejszą ilością bajtów wygrywa!
EDYTOWAĆ:
Przykładowe dane wyjściowe: Więc coś takiego to dane wyjściowe dla 120 bps : link
beep()
dane wyjściowe zarówno konsoli , jak i konsoli nie są dokładnie natychmiastowe IIRC. Żadna z nich niesleep()
jest znana z dokładności.Odpowiedzi:
Mathematica, 26 bajtów
Do
jest zwykle używany jako pętla „for” w najwęższym znaczeniu: powtórz ten fragment kodu dla każdegoi
odx
doy
… lub nawet po prostu powtórz ten fragment kodun
razy. Zamiast liczbyn
możemy nadać jej nieskończoność, aby utworzyć nieskończoną pętlę. Ciało pętliPause[Beep[];60/#]
to po prostu golfowy sposób pisania,Beep[];Pause[60/#]
gdzie#
jest argument funkcji.Jeśli rozwiązanie może ostatecznie wysadzić stos wywołań, możemy zapisać jeden bajt za pomocą rozwiązania rekurencyjnego:
źródło
~Do~∞
to możliwe.For
Pętla tylko mnie do 29 bajtów. (Osobiście uważam, że 26-bajtowa wersja jest jedyną prawidłową wersją.)~Do~∞
nie wydaje się działać, gdy∞
pochodzi ze zmiennej. (Próbowałem tego użyć podczas gry w golfa na swojej maszynie prawdy.)Attributes[Do]
obejmujeHoldAll
, więc domyślam się, że_~Do~∞
ma specjalny wzorzec oceny.Do[...,a]
którym wartość holda
nieskończoności pokazuje połączenie jakoDo[...,{a}]
.Pyth,
11109 bajtówDzięki Adnanowi za przypomnienie
#
.Forever (
#
), wydrukujC
kod har7
. Następnie uśpienie (.d
)60
sekund podzielone przez (c
) input (Q
).źródło
7.
zostanie przeanalizowany jako liczba.#pythnoob
JavaScript,
36 45 42 4134 bajtówZapisano 1 bajt dzięki @RikerW
Zaoszczędzono 1 bajt dzięki produktom @ETH
To jest funkcja.
Jeśli
`\7`
użyję, SpiderMonkey skarży się, że ósemkowe literały są przestarzałe.Alternatywnie, 31 bajtów
Problem polega na tym, że nie można drukować, ale to powinno działać.
źródło
Bash,
535541 bajtówPodziękowania dla @Dennis za stratę 14 bajtów 1
Okej, czas prawdy: jestem okropny w golfowym bashu. Każda pomoc byłaby bardzo mile widziana.
1 cholera. Nic dziwnego, że nikt nie może prześcignąć Dennisa.
źródło
while 1
możliwewhile printf \\a
być może?bc
.read
. 3.echo
istnieje z kodem 0, więc możesz użyć tej instrukcji zamiasttrue
.JavaScript ES6 (przeglądarka), 43 bajty
Może to rozciągać zasady:
Nadaj tej funkcji nazwę (np.
F=x=>...
) I wprowadź ją w konsoli przeglądarki na tej stronie . Następnie wywołaj funkcję za pomocą bps, np.F(60)
I poczekaj, aż magia się wydarzy. :-)Dlaczego to działa? Cóż,
b.html
znajduje się w tym samym folderze co plik o nazwie1
, który jest przykładowym plikiem dźwiękowym z OP. Nie jestem pewien, czy jest to zgodne z regułami (wydaje mi się, że jest to wersja powłoki; musi działać w określonym środowisku), ale warto było spróbować.Bezpieczniejsza wersja, 57 bajtów
Jeśli z jakiegoś powodu powyższy kod nie jest dozwolony, spróbuj tego:
Działa na każdej stronie!
źródło
05AB1E , 31 bajtów
Kod:
Gdybym miał wbudowane oczekiwanie N sekund, mogłoby to być 11 bajtów. Niestety tak nie jest. Oto wyjaśnienie:
Wykorzystuje kodowanie ISO 8859-1.
źródło
time.sleep
i.pop()
wewnątrz kodu w ten sposób. ;)osascript, 39 bajtów
Istnieje dosłownie polecenie o nazwie beep? Sweeeet!
Można uruchomić tylko w systemie Mac OS X z powodu ograniczonej licencji, ale aby uruchomić:
źródło
Pyton,
686757 bajtówZapisano 1 bajt dzięki @FlagAsSpam
Zaoszczędź 9 bajtów dzięki @Adnan
Zajęło to również 2 bajty mniej po konwersji zakończeń linii do formatu UNIX.
Starsza wersja, która faktycznie przyjmuje bpm jako argument wiersza poleceń (66 bajtów):
źródło
print"\7";
? Nie jestem pewien, ale jestem pewien, że to działa.a=input()
ia
zastąpienieint(sys.argv[1])
? Zawsze myślałem, że Python 2 automatycznie ocenia dane wejściowe i dlatego nie potrzebuje konwersji int, ale mogę się mylić.input()
faktycznie dokonuje automatycznej oceny. Zapomniałem o tej funkcji. Jest to raczej mało mityczne - prawdopodobnie dziedzictwo z dawnych czasów.time.sleep(60./a)
go zastąpićtime.sleep(60./input())
, całkowicie usuwająca=input()
?AutoIt , 56 bajtów
źródło
Vitsy, 14 bajtów
Tryb gadatliwy (tłumacz wkrótce):
Zasadniczo używam
w
operatora, aby czekać określoną liczbę sekund określoną przezbpm/60
nieskończoną pętlę. Następnie robię szum przy użyciu wyjścia terminala o znaku 7 ASCII (BEL
).źródło
java -jar Vitsy.jar <filename>
.C #, 118 bajtów
Podstawowe rozwiązanie.
źródło
System.Console.Beep();
, a drukowanie znaków używaSystem.Console.Write('<\a character>');
.Java,
10382 bajtyDzięki @Justin za golenie 21 bajtów!
Och Jezu.
Metoda i wersja golfowa przykładowego programu.
źródło
System.out.print('\7');
zamiastjava.awt.Toolkit.getDefaultToolkit().beep();
?'\7'
jest postacią dzwonka, która wydaje dźwięk, gdy jest drukowanaGMC-4Kod maszynowy , 21,5 bajtów
GMC-4 to 4-bitowy komputer firmy Gakken do nauczania zasad asemblera w uproszczonym zestawie instrukcji i komputerze. Ta procedura pobiera dane z adresów pamięci danych
0x5D
poprzez0x5F
, w big-endian przecinku (czyli jedna cyfra za dziobanie).Algorytm w zasadzie dodaje dane wejściowe do pamięci i czeka 0,1 s, aż będzie co najmniej 600, a następnie odejmuje 600 i wydaje sygnał dźwiękowy w nieskończonej pętli. Ponieważ GMC-4 ma kilka funkcji zamiany rejestrów, ale nie ma kopii rejestru funkcji , robi się to na poważnie.
Szesnastkowo (druga linia to pozycja w pamięci):
W montażu:
Zrzeczenie się:
W rzeczywistości nie posiadam GMC-4. Skrupulatnie sprawdziłem ten program z dokumentacją online, ale mogłem się pomylić. Nie znam też endianizmu. Wygląda na to, że GMC-4 jest big-endianem, ale nie jestem pewien. Jeśli ktoś jest właścicielem GMC-4 i może to zweryfikować / powiedzieć mi o endianistyczności GMC-4, bardzo bym to docenił.
źródło
C, 48 bajtów
Rozwiązanie tylko dla systemu Windows (funkcja Sleep (), a konkretnie).
Użyłem również (ab) faktu, że printf () zwraca liczbę wydrukowanych znaków, aby użyć go jako warunku nieskończonej pętli.
Pomiędzy podwójnymi cudzysłowami w wywołaniu printf () występuje znak, ale z jakiegoś powodu nie jest tu wyświetlany. W razie wątpliwości skopiuj i wklej do Sublime Text 2 lub Notepad ++, znak będzie wyświetlany jako
BEL
.To zaczęło się jako rozwiązanie C ++, ale w pewnym sensie wpadło w podzbiór C C ++ (ponieważ, wiesz,
Sleep()
jest nieco krótszy niżstd::this_thread::sleep_for(std::chrono::milliseconds())
) iprintf()
jest krótszy niżstd::cout<<
).źródło
AppleScript 94 bajty
Wiem, że jestem spóźniony i to jest mój pierwszy post tutaj, ale cokolwiek.
Nie golfowany:
źródło
VBScript,
11366 bajtówTen program jest dość prosty; pobiera dane wejściowe, powtarza znak BEL i czeka. Dzięki Niel za wygaszenie prawie połowy programu!
źródło
WScript.Echo CHR(7)
? Czy miałeś na myśli60000
?Rubin,
3733 bajtówCałkiem proste.
To jest funkcja lambda. Jeśli chciał 60 bpm, to zrobić:
m[60]
.źródło
$><<?\a
powinien również działać na sygnał dźwiękowy. I nie ma potrzeby, aby podać nazwę proc (wszystkie rozwiązania z funkcją JavaScript strzałki tłuszczu również pozostawić nieprzypisane), można nazwać to anonimowo za:->b{loop{$><<?\a;sleep 6e1/b}}[60]
.?\a
; czy masz Ruby 1.x? Jeśli tak, czy możesz przetestować, czy to działa?Japt, 30 bajtów
?
Powinny być dosłowne bajt9A
. Przetestuj online! (Przepraszamy za wyskakujące okienko opóźniające kilka pierwszych uderzeń; zostanie ono wkrótce usunięte).Jak to działa
źródło
Świnka, 18 bajtów
Wczytaj BPM do zmiennej I, a następnie F {z dwiema spacjami po} jest nieskończoną pętlą. Zatrzymaj się na 60 sekund / BPM, a następnie zapisz $ CHR (7) {Ascii: BEL} na standardowe wyjście, podając wymagane wyjście audio, a następnie uruchom ponownie w nieskończonej pętli.
źródło
Java, 321 znaków
Brzmi bardzo dobrze. Działa tylko w systemach z obsługą MIDI.
.
źródło
ChucK , 90 bajtów
Biały szum, który jest włączany i wyłączany co dwa tyknięcia.
Wyjaśnienie
Ma to na celu włączenie dźwięku w takcie, a następnie wyłączenie go w późniejszym czasie.
9893 bajtowa wersja (hodowca)Biały szum odtwarzany przez 10 milisekund na tik.
Jest to kliknięcie zamiast ciągłego włączania i wyłączania hałasu.
źródło
Perl 5, 36 bajtów
Podprogram; użyj go jako
źródło
sleep
jest w sekundach, więc nie możesz mieć więcej niż 60 sygnałów na minutę, nie jestem pewien, czy to wymóg. Ponadto prawdopodobnie możesz zachować tę samą liczbę bajtów, ale mieć pełny program, wykonując coś takiego:$|=<>;{print"\a";sleep 60/$|;redo}
(nie można go teraz przetestować).sleep
. Ale to zadziałało dla mnie.Jolf, 7 bajtów, niekonkurujący
Dodałem dźwięki po tym bardzo dobrym wyzwaniu.
Jeśli chcesz wyczyścić ten dźwięk, zwróć uwagę na wynik. Powiedz, że ta liczba to
x
. Wykonaj kolejne polecenie Jolf~CP"x"
, a interwał zostanie wyczyszczony.źródło
Zsh, 32 bytes
Based on the leading bash answer, but
source
s instead ofexec
s. The TIO link sources$0:a
because of how the original file is executed, but it will work without it.Try it online!
źródło
Bash + bc + ><>, 44 bytes
Playing on the fact that the ><> interpreter lets you define a tick time :
The ><> code is
7o
and should output the BEL character, producing a system beep. It will loop until interrupted.The
-t
value is set to (2 / RPM ) / 60 so that the whole code is played RPM * 60 times per second.źródło
bc
installed? It looks like the$(bc -l<<<"2/$1/60")
did not produce any output. I'll add it to the list of languages of the answer. I haven't been able to fully test my answer yet, so there might be some kind of error too.SmileBASIC, 26 bytes
It can play any general midi instrument, though anything above 9 will use more bytes.
źródło
Stax, 17 bytes
or, unpacked:
The program outputs bytes that, when fed through the command line tool aplay with default setting, produce a metronome noise. The input is used as bpm
example:
You should hear a horrible beeping noise at the desired bpm
źródło