Einführung
Vor einigen Tagen brauchte ich ein Metronom für etwas. Ich hatte keine verfügbar, also habe ich eine App aus dem App Store heruntergeladen. Die App hatte eine Größe von 71 MB !!!
71 MB für Tic-Toc ...?!
Also kam mir Codegolf in den Sinn und ich fragte mich, ob einige von euch dies verbessern könnten.
Herausforderung
Spielen Sie einen Code ab, der einen Ton ausgibt. Es ist ziemlich irrelevant, welche Art von Sound. Erstellen Sie bei Bedarf eine Audiodatei, aber ein System-Piepton erledigt auch die Aufgabe. ( Hier ist ein Sound, den ich erstellt habe ... nichts Besonderes. )
Eingang : Die Schläge pro Minute, die das Metronom ausgibt.
Beispiel
Dies ist eine nicht golfene Java-Version! Es ist nur um Ihnen die Aufgabe zu zeigen.
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!");
}
}
}
Regeln
Sie dürfen keine externen Bibliotheken verwenden, nur Tools der Sprache selbst sind erlaubt.
Es zählen nur die Bytes des Quellcodes ... nicht die Audiodatei.
Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
BEARBEITEN:
Beispielausgabe: So ähnlich wäre die Ausgabe für 120 bps : link
beep()
Konsolen- als auch die Sofort-IIRC-Ausgabe nicht genau gleich. Wedersleep()
ist dafür bekannt, genau zu sein.Antworten:
Mathematica, 26 Bytes
Do
wird normalerweise im engeren Sinne als "for" -Schleife verwendet: Wiederholen Sie diesen Code für jedesi
vonx
bisy
... oder wiederholen Sie diesen Code einfachn
mal. Anstelle einer Zahl könnenn
wir sie auch unendlich setzen, um eine Endlosschleife zu erstellen. Der Loop-Body istPause[Beep[];60/#]
nur eine Golf-Schreibweise,Beep[];Pause[60/#]
in der#
das Funktionsargument steht.Wenn es für die Lösung zulässig ist, den Aufrufstapel irgendwann in die Luft zu jagen, können wir mit einer rekursiven Lösung ein Byte sparen:
quelle
~Do~∞
das möglich ist. EineFor
Schleife brachte mich nur auf 29 Bytes. (Ich persönlich glaube auch, dass die 26-Byte-Version die einzig gültige ist.)~Do~∞
nicht zu funktionieren, wenn das∞
von einer Variablen kommt. (Ich habe versucht, das beim Golfen Ihrer Wahrheitsmaschine zu verwenden.)Attributes[Do]
enthältHoldAll
, so meine Vermutung, dass_~Do~∞
ein spezielles Bewertungsmuster hat.Do[...,a]
where holda
infinity" den Aufruf tatsächlich als anzeigtDo[...,{a}]
.Pyth,
11109 BytesVielen Dank an Adnan , der mich daran erinnert hat
#
.#
Drucken Sie für immer ( ) denC
Code har7
. Dann Schlaf (.d
)60
Sekunden geteilt durch (c
) Eingabe (Q
).quelle
7.
würde als Zahl analysiert.#pythnoob
JavaScript,
36 45 42 4134 Bytes1 Byte dank @RikerW gespeichert
1 Byte dank @ETHproductions eingespart
Dies ist eine Funktion.
Wenn ich benutze
`\7`
, beschwert sich SpiderMonkey, dass oktale Literale veraltet sind.Alternative, 31 Bytes
Das Problem ist, dass die nicht druckbaren Dateien entfernt werden, dies sollte jedoch funktionieren.
quelle
Bash,
535541 BytesVielen Dank an @Dennis für das Abschneiden von 14 Byte 1
Okay, Zeit für die Wahrheit: Ich bin schrecklich, wenn es um Golf geht. Jede Hilfe wäre so sehr dankbar.
1 Heiliger Mist. Kein Wunder, dass niemand Dennis übertreffen kann.
quelle
while 1
möglichwhile printf \\a
vielleicht?bc
.read
. 3.echo
Existiert mit Code 0, daher können Sie diese Anweisung anstelle von verwendentrue
.JavaScript ES6 (Browser), 43 Byte
Dies könnte die Regeln verletzen:
Geben Sie dieser Funktion einen Namen (zB
F=x=>...
) und geben Sie diesen in der Browserkonsole auf dieser Seite ein . Rufen Sie dann die Funktion mit Ihrem bps aufF(60)
und warten Sie, bis die Magie einsetzt. :-)Warum funktioniert das? Nun,
b.html
befindet sich im selben Ordner wie eine Datei mit dem Namen1
, bei der es sich um die Beispielsounddatei aus dem OP handelt. Ich bin nicht sicher, ob dies innerhalb der Regeln liegt (ich denke, es ist wie die Shell-Version; es muss in einer bestimmten Umgebung ausgeführt werden), aber es war einen Versuch wert.Sicherere Version, 57 Bytes
Wenn der obige Code aus irgendeinem Grund nicht zulässig ist, versuchen Sie Folgendes:
Funktioniert auf jeder Seite!
quelle
05AB1E , 31 Bytes
Code:
Wenn ich eine eingebaute Wartezeit von N Sekunden hätte, hätte dies 11 Bytes sein können. Dies ist leider nicht der Fall. Hier ist die Erklärung:
Verwendet die ISO 8859-1-Codierung.
quelle
time.sleep
und.pop()
in der Mitte des Codes so zu sehen. ;)osascript, 39 bytes
Es gibt buchstäblich einen Befehl namens Beep? Süßer!
Kann aufgrund der eingeschränkten Lizenz nur unter Mac OS X ausgeführt werden.
quelle
Python,
686757 Bytes1 Byte dank @FlagAsSpam gespeichert
9 Bytes dank @Adnan eingespart
Nach der Konvertierung der Zeilenenden in das UNIX-Format wurden 2 Byte weniger benötigt.
Ältere Version, die eigentlich bpm als Kommandozeilenargument benötigt (66 Bytes):
quelle
print"\7";
? Ich bin mir nicht sicher, aber ich bin mir ziemlich sicher, dass das funktioniert.a=input()
unda
ersetzenint(sys.argv[1])
? Ich habe immer gedacht, dass Python 2 Eingaben automatisch auswertet und daher die int-Konvertierung nicht benötigt, aber ich kann mich irren.input()
tatsächlich automatisch ausgewertet. Ich habe diese Funktion vergessen. Es ist allerdings ziemlich unpythonisch - wahrscheinlich ein Erbe aus alten Zeiten.time.sleep(60./a)
ersetzt werdentime.sleep(60./input())
, während vollständig entfernt werdena=input()
?AutoIt , 56 Bytes
quelle
Vitsy, 14 Bytes
Ausführlicher Modus (Dolmetscher in Kürze verfügbar):
Grundsätzlich verwende ich den
w
Operator, um eine bestimmte Anzahl von Sekunden zu wartenbpm/60
, die in einer Endlosschleife eingeschlossen sind. Dann mache ich Geräusche mit der Terminalausgabe des ASCII-Zeichens 7 (BEL
).quelle
java -jar Vitsy.jar <filename>
.C #, 118 Bytes
Grundlösung.
quelle
System.Console.Beep();
die ZeichenSystem.Console.Write('<\a character>');
.Java,
10382 BytesVielen Dank an @Justin für das Abschneiden von 21 Bytes!
Oh mein Gott.
Methode und Golfversion des Beispielprogramms.
quelle
System.out.print('\7');
statt derjava.awt.Toolkit.getDefaultToolkit().beep();
?'\7'
ist die Glockenfigur, die beim Ausdruck einen TonGMC-4- Maschinencode, 21,5 Byte
Der GMC-4 ist ein 4-Bit-Computer der Firma Gakken, der die Prinzipien der Assemblersprache in einem vereinfachten Befehlssatz und Computer lehrt. Diese Routine nimmt die Eingabe in Datenspeicheradressen
0x5D
durch eine0x5F
Big-Endian-Dezimalzahl (dh eine Ziffer pro Halbbyte) vor.Der Algorithmus addiert im Grunde genommen die Eingabe in den Speicher und wartet 0,1 Sekunden, bis sie mindestens 600 beträgt, und subtrahiert dann 600 und piept in einer Endlosschleife. Da der GMC-4 eine Reihe von Register-Swap-Funktionen hat, aber keine Register- Copy- Funktionen, wird dies auf die harte Tour gemacht.
In hex (zweite Zeile ist Position im Speicher):
In Montage:
Haftungsausschluss:
Eigentlich besitze ich kein GMC-4. Ich habe dieses Programm sorgfältig mit Online-Dokumentation überprüft, aber möglicherweise habe ich einen Fehler gemacht. Ich kenne die Endianness auch nicht. Es sieht so aus, als wäre der GMC-4 ein Big-Endian, aber ich bin mir nicht sicher. Wenn jemand ein GMC-4 besitzt und dies bestätigen kann / mir die Endianze des GMC-4 mitteilen kann, würde ich es sehr schätzen.
quelle
C 48 Bytes
Eine reine Windows-Lösung (Sleep () - Funktion, um genau zu sein).
Ich habe auch (ab) die Tatsache verwendet, dass printf () die Anzahl der gedruckten Zeichen zurückgibt, um sie als Endlosschleifenbedingung zu verwenden.
Der Aufruf von printf () enthält ein Zeichen zwischen doppelten Anführungszeichen, das hier jedoch aus irgendeinem Grund nicht angezeigt wird. Im Zweifelsfall kopieren und in Sublime Text 2 oder Notepad ++ einfügen, wird das Zeichen als angezeigt
BEL
.Dies begann als C ++ - Lösung, fiel aber irgendwie in die C-Teilmenge von C ++ (weil, wie Sie wissen,
Sleep()
etwas kürzer ist alsstd::this_thread::sleep_for(std::chrono::milliseconds())
) undprintf()
ist kürzer alsstd::cout<<
).quelle
AppleScript 94 Bytes
Ich weiß, ich bin ziemlich spät dran und dies ist mein erster Beitrag hier, aber was auch immer.
Ungolfed:
quelle
VBScript,
11366 BytesDieses Programm ist einfach genug; Es nimmt Eingaben entgegen, gibt das BEL-Zeichen wieder und wartet. Vielen Dank an Niel, der fast das halbe Programm abgeschnitten hat!
quelle
WScript.Echo CHR(7)
? Meinten Sie auch60000
?Ruby,
3733 BytesZiemlich einfach.
Dies ist eine Lambda-Funktion. Wenn Sie 60 bpm wollte, dann würden Sie tun:
m[60]
.quelle
$><<?\a
sollte das auch für den Piepton funktionieren. Und keine Notwendigkeit , einen Namen für die proc geben (alle JavaScript - Lösungen mit Fett Pfeil Funktion lassen es auch nicht zugeordnet), können Sie es nennen anonym zu:->b{loop{$><<?\a;sleep 6e1/b}}[60]
.?\a
. Hast du Ruby 1.x? Wenn ja, können Sie testen, ob dies funktioniert?Japt, 30 Bytes
Das
?
sollte das wörtliche Byte sein9A
. Online testen! (Entschuldigung, dass das Popup die ersten Beats verzögert. Dies wird bald entfernt.)Wie es funktioniert
quelle
Mumps, 18 Bytes
Lese die BPM in die Variable I, dann ist F {mit zwei Leerzeichen danach} eine Endlosschleife. Halten Sie für 60 Sekunden / BPM an, und schreiben Sie dann $ CHR (7) {Ascii: BEL} in die Standardausgabe. Geben Sie dabei die erforderliche Audioausgabe an. Starten Sie dann die Endlosschleife erneut.
quelle
Java, 321 Zeichen
Klingt sehr gut. Funktioniert nur auf Systemen mit MIDI-Unterstützung.
.
quelle
ChucK , 90 Bytes
Weißes Rauschen, das alle zwei Ticks ein- und ausgeschaltet wird.
Erläuterung
Hiermit schalten Sie den Sound bei einem Beat ein und danach wieder aus.
9893 byte version (schicker)Weißes Rauschen wird 10 Millisekunden pro Tick gespielt.
Dies ist ein Klick, anstatt dass konstantes Rauschen ein- und ausgeschaltet wird.
quelle
Perl 5, 36 Bytes
Ein Unterprogramm; benutze es als
quelle
sleep
ist in Sekunden angegeben, daher können nicht mehr als 60 Signaltöne pro Minute ausgegeben werden. Sie sind sich nicht sicher, ob dies erforderlich ist. Außerdem können Sie wahrscheinlich dieselbe Bytezahl beibehalten, aber ein vollständiges Programm haben, indem Sie Folgendes ausführen:$|=<>;{print"\a";sleep 60/$|;redo}
(Kann es derzeit nicht testen).sleep
. Aber es hat bei mir geklappt.Jolf, 7 Bytes, nicht konkurrierend
Ich habe Sounds hinzugefügt, nachdem diese sehr feine Herausforderung gemacht wurde.
Wenn Sie diesen Ton löschen möchten, notieren Sie sich die Ausgabe. Sagen wir, diese Nummer ist
x
. Führen Sie einen anderen Jolf-Befehl aus~CP"x"
, und das Intervall wird gelöscht.quelle
Zsh , 32 Bytes
Basierend auf der führenden Bash-Antwort, aber
source
s stattexec
s. Der TIO-Link gibt$0:a
an, wie die Originaldatei ausgeführt wird, funktioniert jedoch ohne sie.Probieren Sie es online!
quelle
Bash + bc + > <> , 44 Bytes
Unter Berücksichtigung der Tatsache, dass Sie mit dem Interpreter> <> eine Tick-Zeit definieren können:
Der Code> <> ist
7o
und sollte das BELZeichen ausgeben und einen Systemsignalton erzeugen. Es wird wiederholt, bis es unterbrochen wird.Der
-t
Wert ist auf (2 / U / min) / 60 eingestellt, damit der gesamte Code 60-mal pro Sekunde mit U / min * abgespielt wird.quelle
bc
installiert? Es sieht so aus, als ob der$(bc -l<<<"2/$1/60")
keine Ausgabe produziert hat. Ich werde es der Liste der Sprachen der Antwort hinzufügen. Ich konnte meine Antwort noch nicht vollständig testen, sodass möglicherweise auch ein Fehler vorliegt.SmileBASIC, 26 Bytes
Es kann jedes allgemeine Midi-Instrument spielen, obwohl mehr als 9 Bytes benötigt werden.
quelle
Stax, 17 Bytes
oder ausgepackt:
Das Programm gibt Bytes aus, die, wenn sie mit der Standardeinstellung über das Befehlszeilentool abgespielt werden, ein Metronomrauschen erzeugen. Der Eingang wird als BPM verwendet
Beispiel:
Sie sollten ein schreckliches Piepen bei der gewünschten Drehzahl hören
quelle