Emette un suono di una certa frequenza


25

Questa è una sfida piuttosto semplice, ma non sono riuscito a trovare alcuna domanda che fosse davvero simile ad essa. La sfida è prendere una frequenza usando STDIN o un equivalente, quindi emettere un tono che corrisponda a quella frequenza, in Hz, per 5 secondi. Per esempio

Input: 400
Output: (a tone of 400 Hz with a duration of 5 seconds)

Regole

  • L'input deve essere accettato tramite STDIN o l'equivalente della tua lingua
  • La risposta deve essere un programma completo
  • I builtin possono essere usati
  • La frequenza sarà ovunque da 50 a 5000 Hz
  • L'output deve essere riprodotto per 5 secondi
  • L'output deve essere sotto forma di un'onda sinusoidale

Casi test

Ingresso: 440

Produzione:

Ingresso: 200

Produzione:

Ingresso: 4000

Produzione:


  • Non si tratta di trovare la lingua con la soluzione più breve per questo (ci sono alcuni in cui il programma vuoto fa il trucco) - si tratta di trovare la soluzione più breve in ogni lingua. Pertanto, nessuna risposta verrà contrassegnata come accettata.

  • A differenza delle nostre solite regole, sentiti libero di usare una lingua (o versione linguistica) anche se è più recente di questa sfida. Le lingue specificamente scritte per inviare una risposta di 0 byte a questa sfida sono un gioco leale ma non particolarmente interessante.

    Si noti che deve essere presente un interprete per poter testare l'invio. È permesso (e persino incoraggiato) di scrivere questo interprete per una lingua precedentemente non implementata.

    Si noti inoltre che le lingue non devono esaudire i nostri criteri usuali per linguaggi di programmazione .


Catalogare

Lo snippet di stack nella parte inferiore di questo post genera il catalogo dalle risposte a) come elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

## Perl, 43 + 2 (-p flag) = 45 bytes

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


Una funzione sarebbe accettabile?
uno spaghetto il

@quartata Dovrebbe essere un programma completo.
Chris Loonam,

2
Vedo che molte persone usano una beep()funzione. È garantito che si tratti di un'onda sinusoidale?
geokavel,

2
La System.Console.Beepcosa di Windows è un'onda sinusoidale sulla mia macchina (moderna, Windows 10), quindi penso che conta. Le soluzioni su PPCG generalmente non devono essere portatili.
Lynn,

La stampa di un file audio è un modo valido per "emettere un tono"?
Ilmari Karonen,

Risposte:


13

QBasic, 18 byte (squalificato)

Come accennato da @pabouk, questo utilizza l'altoparlante del PC, quindi riproduce un'onda quadra , non un'onda sinusoidale come il problema richiede. (Questo requisito è stato aggiunto al problema dopo che questa risposta è stata pubblicata, quindi i voti). Lascerò comunque qui per i posteri.


INPUT F
SOUND F,91

Riproduci un suono alla frequenza immessa per 91 tick, che è pari a 5 secondi.


Questo programma non soddisfa l'ultimo requisito: "L'output deve essere sotto forma di un'onda sinusoidale". SOUNDIl comando utilizza l'altoparlante PC che, come progettato, era guidato da un chip timer 8254 che produce un'onda quadra. --- Anche se nei moderni PC 8254 potrebbe mancare la corretta emulazione del SOUNDcomando dovrebbe produrre un'onda quadra.
pabouk,

3
Questo requisito è stato aggiunto dopo che ho pubblicato la mia risposta. : / Aggiungerò una nota, ma mi sento strano a cancellare questa risposta quando è quella votata all'inizio.
Lynn,

12

Python2, 40 byte

from winsound import*
Beep(input(),5000)

Funziona solo su Windows.


1
Funzionerebbe 5e3?
Lynn,

3
@Mauris No, l'avevo già provato ma vuole solo numeri interi.
orlp,

10

Mathematica, 42 byte

Bene, se possiamo usare i built-in ...

Input[]
EmitSound@Play[Sin[2t%Pi],{t,0,5}]

Grazie alla necessità di un programma completo, questa è stata la prima volta che ho usato il mio consiglio di golf recentemente scoperto sull'uso %(risultato dell'ultima valutazione) per risparmiare due byte.

Mathematica ha anche un built-in Soundche prende un tono e una durata come argomenti, ma sfortunatamente il tono deve essere dato come una nota musicale. Specificare la propria onda sonora tramite Playsembra essere l'unico modo per lavorare con una frequenza.


7

C #, 80 byte

class P{static void Main(string[]a){System.Console.Beep(int.Parse(a[0]),5000);}}

Sai qual è l'alternativa per Beeping in Java?
Kritixi Lithos,

7

MATLAB, 36 byte

sound(sin(pi*input('')*(0:8^-4:10)))

Grazie a flawr per il salvataggio di due byte.


2
Puoi salvare un personaggio usando 2^-12invece di 1/4096.
flawr

Oh sciocco, 8^-4è ancora più breve!
flawr


4

FakeASM , 12 byte

RDA
BEEP 5e3

Funziona con l'implementazione di riferimento di Windows (download) . Chiama la Beepfunzione di Windows , che è un'onda sinusoidale su piattaforme moderne.


Dov'è lo STDIN?
cat

1
RDAlegge un numero da STDIN e lo inserisce nel registro A.
Lynn,

Ho finito per leggere le specifiche e notarlo, ma ho dimenticato di eliminare il mio commento. grazie, però
cat

4

Bash + X11, 27 20 byte

xset b 9 $1 5;echo 

Questo contiene un non stampabile, quindi ecco un hexdump:

0000000: 7873 6574 2062 2039 2024 3120 353b 6563  xset b 9 $1 5;ec
0000010: 686f 2007                                ho .

Ciò accetta la frequenza come argomento della riga di comando e riproduce il segnale acustico appropriato a un volume del 9% (poiché non è stato specificato alcun volume).

(Nota: non sono stato in grado di testarlo a causa di alcuni problemi con il mio computer, ma sono sicuro al 99% che funzioni.)


C'è un \ x07 lì dentro?
TheDoctor

No, xset fa tutto il segnale acustico.
uno spaghetto il

@TheDoctor Oh capisco cosa intendi ... ha bisogno di un \ x07 per fare il rumore vero e proprio. Fissaggio.
uno spaghetto il

echo <BEL>dove si <BEL>trova il carattere effettivo, salva 6 byte.
Dennis,

@Dennis D'oh. Grazie!
uno spaghetto il

4

JavaScript, 114 byte

p=prompt();c=new AudioContext;with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}

Richiede un browser un po 'all'avanguardia, inserisci la frequenza nel prompt. JSFiddle


Questo non verrà riprodotto per 5 secondi perché prompt()viene chiamato dopo l'avvio del timer audio alle new AudioContext(). Credo che il più breve che puoi ottenere sia di 115 byte con c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655

Grazie per l'heads-up, apprezzo anche l'idea di usare 'with'.
Nickson,

Non ho mai visto i <script>tag come richiesti prima che JavaScript fosse considerato un programma completo. Penso che tu sia bravo per il 114. Inoltre, rimuovere il pcompito e solo l'impostazione frequency.value=prompt()dovrebbe
portarti

@ Mwr247 Sfortunatamente, come sottolineato da user81655, il timer che determina quando l'audio si ferma inizia quando viene creato AudioContext. Il prompt deve apparire prima di allora, oppure un input lento potrebbe comportare un audio più breve o nessun audio.
Nickson,

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)questo fa risparmiare 3 byte
Patrick Roberts

4

Utilità Bash + Linux, 95

bc -l<<<"obase=16;for(;t<5;t+=1/8000){a=s($1*t*6.3);scale=0;a*30/1+99;scale=9}"|xxd -p -r|aplay

Questa è una vera onda sinusoidale. Nessun segnale acustico. Frequenza di ingresso immessa dalla riga di comando:

./hz.sh 440

3

Elaborazione, 148 114 106 byte

import processing.sound.*;
Engine.start().sinePlay(int(loadStrings("s")[0]),1,0,0,0);delay(5000);exit();

(Per qualche motivo, l'elaborazione richiede sia l'utilizzo dell'istruzione import sia la nuova riga, altrimenti non riconosce la libreria.)

Non ho ancora capito come passare gli argomenti in Processing, anche se so che è possibile, quindi questo codice richiede di avere un file chiamato "s" nella cartella dello schizzo che ha il valore di frequenza. Se riesco a capire come passare gli argomenti, posso sostituire il caricamento del file args[0].


3

VB.net, 90 byte , 74 byte

Module m
Sub Main(a() as String)
Console.Beep(a(0),5000)
End Sub
End Module

Grazie a Sehnsucht

Module m
Sub Main()
Console.Beep(My.Application.CommandLineArgs.First,5000)
End Sub
End Module

Questo è il mio primo post, quindi se ho fatto qualcosa di sbagliato per favore fatemelo sapere


1
Ciò potrebbe essere ridotto ottenendo invece l'argomento della riga di comando negli argomenti principali Main(a()As Stringe Beep(a(0),5000)riducendo il totale a 74 byte in base al contatore di byte
Sehnsucht

2

Turbo / Borland / Free / GNU Pascal, 95 byte

A causa di problemi con la funzione di ritardo sui computer moderni (beh, qualsiasi cosa più veloce di 200Mhz) che tenta di eseguire Turbo / Borland pascal, questo potrebbe non attendere 5 secondi, anche con una libreria CRT patchata

Program a;Uses crt;Var i,k:Integer;BEGIN Val(ParamStr(1),i,k);Sound(i);Delay(5000);NoSound;END.

La conversione da stringa a intero può essere eseguita più breve (77 byte) su FreePascal e derivati ​​moderni, poiché hanno la StrToIntfunzione:

Program a;Uses crt;BEGIN Sound(StrToInt(ParamStr(1)));Delay(5000);NoSound;END.

1
Per quanto ne so, un programma Pascal funzionerà bene con tutti i compilatori anche senza la Program a;parte, quindi puoi vincere 10 byte omettendolo.
vsz

L'FPC @vsz potrebbe andare bene (quindi posso rimuoverlo dal secondo frammento), devo ancora controllare alcuni antichi, come TP5.5, per quanto ricordo che lo richiedessero.
SztupY,

I requisiti dicono "L'ingresso deve essere accettato tramite STDIN", quindi salta così a lungo ParamStr()e basta Read()come richiesto: pastebin.com/1Tw2d0D6
manatwork

2

Perl, 27 byte

Fondamentalmente una versione Perl della risposta Python (funziona anche solo su Windows), se stiamo permettendo i moduli.

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 byte

"5 "WX" 9 b tesx",7O

Una traduzione della mia risposta bash. Non funziona nell'interprete online (ovviamente).

Accetta input come qualsiasi carattere non numerico seguito dalla frequenza (quindi per un input di 440 Hz potresti fare "a440").

Spiegazione

"5 "WX" 9 b tesx",7O
"5 "                   Push " 5"
    WX                 Reads input and removes the first character (which is used to force string context)
      " 9 b tesx"      Push "xset b 9 "
                 ,     Pop everything and execute as a shell command.
                  7O   Output bell char.

Bella risposta. Bel lavoro.
Rɪᴋᴇʀ

Hai usato Vitsy. <3 Mio figlio è riscattato.
Addison Crump,

1

C con WinAPI, 82 byte

#include<windows.h>
#include<stdio.h>
main(){int x;scanf("%i",&x);Beep(x,5000);}

Utilizza la funzione WinAPI Beep ().


Non hai bisogno di passare &xa scanf? Inoltre, puoi dichiarare xcome parametro principale e lasciare che il compilatore ne imposti il ​​tipo.
Neil,

@Neil, non so come ho sbagliato a scrivere senza passare &xa scanf(). Riparato ora; Grazie.
user2064000


0

Shadertoy GLSL Sound Shader, 86

#define F 440.0
vec2 mainSound(float t){return vec2(sin(6.3*F*t)*(t<5.0?1.0:0.0));}

"Input" viene fornito tramite #define. Emette un'onda sinusoidale con frequenza approssimativa diF Hz. Arrotondato 2 * Pi a 6.3, anziché "predefinito" 6.2831, ma suona praticamente allo stesso modo.

Purtroppo non c'è molto da golf qui.


L'input deve essere eseguito tramite STDIN, non codificato.
flawr

@flawr Non conosco alcun metodo di input preciso su Shadertoy. Per favore, illuminami.
Kroltan,

Questo dovrebbe essere il tuo compito, non il mio. Ma non conosco Shadertoy comunque, quindi non posso aiutarti.
Flawr

@flawr l'unico metodo di ragionevole precisione sarebbe la posizione del cursore, ma è disponibile solo per gli shader di immagine, non per gli shader di suono. Quindi sono praticamente bloccato con definisce.
Kroltan,

Puoi caricare file? Questo è quello che ho fatto.
geokavel,

0

Jolf, 4 byte, non competitivo

Questa aggiunta linguistica è arrivata dopo la sfida.

Αc5j
Αc     create a beep
  5     five seconds long
   j    with the input as a frequency

L'onda predefinita è un'onda sinusoidale.


0

SmileBASIC, 84 byte

INPUT F
N=LOG(F/440,POW(2,1/12))+57BGMPLAY FORMAT$("@D%D@255T12N%D",(N-(N<<0))*63,N)

Converte da Hz a mezzo passo e suona una certa nota con un valore di detune per produrre la frequenza.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.