Introducción
Hace unos días necesitaba un metrónomo para algo. No tenía ninguno disponible, así que descargué una aplicación de la App Store. ¡La aplicación tenía un tamaño de 71 MB!
71 MB para hacer tic-toc ...?!
Así que el código de golf vino a mi mente y me preguntaba si algunos de ustedes podrían mejorar esto.
Reto
Golf un código que emite algo de sonido. Es bastante irrelevante qué tipo de sonido. Si es necesario, cree un archivo de sonido ... pero un pitido del sistema también hará el trabajo. ( Aquí hay un sonido que creé ... nada especial ) .
Entrada : los latidos por minuto que sale el metrónomo.
Ejemplo
¡Esta es una versión Java sin golf! Es solo para mostrarte la tarea.
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!");
}
}
}
Reglas
No puede usar bibliotecas externas, solo se permiten herramientas del lenguaje en sí.
Solo los bytes del código fuente cuentan ... no el archivo de sonido.
Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
EDITAR:
Ejemplo de salida: Entonces, algo como esto sería la salida para 120 bps : enlace
beep()
y la salida de la consola no son exactamente IIRC instantáneos. Ninguno de los dossleep()
es conocido por ser exacto.Respuestas:
Mathematica, 26 bytes
Do
normalmente se usa como un bucle "for" en el sentido más estricto: repita este fragmento de código para cada unoi
dex
ay
... o incluso simplemente repita este fragmento de códigon
veces. Sinn
embargo, en lugar de un número , podemos darle infinito para crear un bucle infinito. El cuerpo del buclePause[Beep[];60/#]
es, simplemente, una forma de escribir de golfBeep[];Pause[60/#]
donde#
está el argumento de la función.Si es admisible que la solución explote la pila de llamadas eventualmente, podemos guardar un byte con una solución recursiva:
fuente
~Do~∞
fuera posible. UnFor
bucle solo me llevó a 29 bytes. (Además, personalmente creo que la versión de 26 bytes es la única válida).~Do~∞
no parece funcionar cuando∞
proviene de una variable. (Intenté usar eso cuando jugaba golf con su máquina de la verdad.)Attributes[Do]
incluyeHoldAll
, así que supongo que_~Do~∞
tiene un patrón de evaluación especial.Do[...,a]
dondea
se encuentra el infinito en realidad muestra la llamada comoDo[...,{a}]
.Pyth,
11109 bytesGracias a Adnan por recordármelo
#
.Forever (
#
), imprime elC
código har7
. Luego duerme (.d
)60
segundos dividido por (c
) input (Q
).fuente
7.
se analizaría como un número.#pythnoob
JavaScript,
36 45 42 4134 bytesGuardado 1 byte gracias a @RikerW
Guardado 1 byte gracias a @ETHproductions
Esta es una función.
Si lo uso
`\7`
, SpiderMonkey se queja de que los literales octales están en desuso.Alternativa, 31 bytes
El problema es que los no imprimibles se eliminan pero esto debería funcionar.
fuente
Bash,
535541 bytesGracias a @Dennis por reducir 14 bytes 1
De acuerdo, la verdad: soy terrible jugando al golf. Cualquier ayuda sería muy apreciada.
1 Santa mierda. No es de extrañar que nadie pueda superar a Dennis.
fuente
while 1
posible?while printf \\a
¿quizás?bc
.read
. 3.echo
existe con el código 0, por lo que puede usar esa declaración en lugar detrue
.JavaScript ES6 (navegador), 43 bytes
Esto puede estar estirando las reglas:
Asigne un nombre a esta función (p
F=x=>...
. Ej. ) E ingrésela en la consola del navegador en esta página . Luego llame a la función con su bps, por ejemploF(60)
, y espere a que ocurra la magia. :-)¿Por qué funciona esto? Bien,
b.html
está en la misma carpeta que un archivo llamado1
, que es el archivo de sonido de muestra del OP. No estoy seguro de si esto está dentro de las reglas (supongo que es como la versión de shell; necesita ejecutarse en un entorno específico), pero valió la pena intentarlo.Versión más segura, 57 bytes.
Si el código anterior no está permitido por alguna razón, intente esto en su lugar:
Funciona en cualquier página!
fuente
05AB1E , 31 bytes
Código:
Si tuviera un incorporado para esperar N segundos, esto podría haber sido de 11 bytes. Por desgracia, este no es el caso. Aquí está la explicación:
Utiliza la codificación ISO 8859-1.
fuente
time.sleep
y.pop()
en medio de un código de esa manera. ;)osascript, 39 bytes
¿Hay literalmente un comando llamado pitido? Sweeeet!
Ejecutable solo en Mac OS X debido a una licencia restringida, pero para ejecutar, haga:
fuente
Python,
686757 bytesGuardado 1 byte gracias a @FlagAsSpam
Guardado 9 bytes gracias a @Adnan
También tomó 2 bytes menos después de convertir las terminaciones de línea al formato UNIX.
Versión anterior, que realmente toma bpm como argumento de línea de comando (66 bytes):
fuente
print"\7";
? No estoy seguro, pero estoy bastante seguro de que funciona.a=input()
ya
reemplazarint(sys.argv[1])
? Siempre he pensado que Python 2 evalúa automáticamente la entrada y, por lo tanto, no necesita la conversión int, pero puedo estar equivocado.input()
realmente evalúa automáticamente. Olvidé esa característica. Sin embargo, es bastante poco propicio, probablemente un legado de los viejos tiempos.time.sleep(60./a)
puede reemplazar contime.sleep(60./input())
, mientras se elimina por completoa=input()
?AutoIt , 56 bytes
fuente
Vitsy, 14 bytes
Modo detallado (intérprete próximamente):
Básicamente, uso el
w
operador para esperar una cierta cantidad de segundos según lo especificado porbpm/60
, envuelto en un bucle infinito. Luego, hago ruido con la salida del terminal del carácter ASCII 7 (BEL
).fuente
java -jar Vitsy.jar <filename>
.C #, 118 bytes
Solución básica
fuente
System.Console.Beep();
impresión del personajeSystem.Console.Write('<\a character>');
.Java,
10382 bytes¡Gracias a @Justin por reducir 21 bytes!
Oh cielos.
Método y versión de golf del programa de muestra.
fuente
System.out.print('\7');
instead of thejava.awt.Toolkit.getDefaultToolkit().beep();
?'\7'
is the bell character, which makes a sound when it is printed outGMC-4 Machine Code, 21.5 bytes
El GMC-4 es una computadora de 4 bits de una compañía llamada Gakken para enseñar los principios del lenguaje ensamblador en un conjunto de instrucciones simplificado y una computadora. Esta rutina toma entrada en direcciones de memoria de datos a
0x5D
través de0x5F
, en decimal big-endian (es decir, un dígito por mordisco).El algoritmo consiste básicamente en agregar la entrada a la memoria y esperar 0.1s, hasta que sea al menos 600, y luego restar 600 y emitir un pitido, en un bucle infinito. Dado que el GMC-4 tiene un montón de funciones de intercambio de registros pero ninguna copia de registro funciones de , esto se hace de la manera difícil.
En hexadecimal (la segunda línea es la posición en la memoria):
En asamblea:
Renuncia:
En realidad no tengo un GMC-4. He revisado meticulosamente este programa con documentación en línea, pero es posible que haya cometido un error. Tampoco sé el endianness. Parece que el GMC-4 es big endian, pero no estoy seguro. Si alguien posee un GMC-4 y puede verificar esto / dime la resistencia del GMC-4, lo agradecería mucho.
fuente
C, 48 bytes
Una solución solo para Windows (función Sleep (), para ser específicos).
También (ab) usé el hecho de que printf () devuelve el número de caracteres impresos para usarlo como condición de bucle infinito.
Hay un carácter entre comillas dobles en la llamada printf (), pero no se muestra aquí por alguna razón. En caso de duda, copie y pegue en Sublime Text 2 o Notepad ++, el carácter se mostrará como
BEL
.Esto comenzó como una solución de C ++, pero cayó en el subconjunto C de C ++ (porque, ya sabes,
Sleep()
es un poco más corto questd::this_thread::sleep_for(std::chrono::milliseconds())
) yprintf()
es más corto questd::cout<<
).fuente
AppleScript 94 bytes
Sé que llego bastante tarde, y esta es mi primera publicación aquí, pero lo que sea.
Sin golf:
fuente
VBScript,
11366 bytesEste programa es lo suficientemente simple; toma entrada, hace eco del carácter BEL y espera. ¡Gracias a Niel por reducir casi la mitad del programa!
fuente
WScript.Echo CHR(7)
? Además, ¿quisiste decir60000
?Ruby,
3733 bytesPretty straightforward.
This is a lambda function. If you wanted 60 bpm, you'd do:
m[60]
.fuente
$><<?\a
should also work for the beep. And no need to give a name for your proc (all JavaScript solutions with fat arrow function also leave it unassigned), you can call it anonymously too:->b{loop{$><<?\a;sleep 6e1/b}}[60]
.?\a
; do you have Ruby 1.x? If so, can you test that this works?Japt, 30 bytes
The
?
should be the literal byte9A
. Test it online! (Sorry about the pop-up delaying the first few beats; this will be removed soon.)How it works
fuente
Mumps, 18 bytes
Read the BPM into variable I, then F {with two spaces after} is an infinate loop. Halt for 60 seconds / BPM, then write $CHR(7) {Ascii: BEL} to standard output, giving the audio output required, then restart at the infinite loop.
fuente
Java, 321 chars
Sounds very good. Works only on systems with MIDI support.
.
fuente
ChucK, 90 bytes
White noise that is turned on and off every two ticks.
Explanation
This is made to turn on the sound on a beat, then turn it off on the beat after.
9893 byte version (fancier)White noise played for 10 milliseconds per tick.
This is made to be a click instead of constant noise being turned on and off.
fuente
Perl 5, 36 bytes
A subroutine; use it as
fuente
sleep
is in seconds, so you can't have more than 60 beeps per minute, not sure if that's a requirement. Also, you can probably keep the same byte count but have a full program by doing something like:$|=<>;{print"\a";sleep 60/$|;redo}
(can't test it right now).sleep
. But it worked for me.Jolf, 7 bytes, noncompeting
I added sounds after this very fine challenge was made.
If you so desire to clear this sound, take note of the output. Say that number is
x
. Execute another Jolf command~CP"x"
, and the interval will be cleared.fuente
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!
fuente
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.fuente
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.
fuente
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
fuente