Emite um som com uma certa frequência


25

Esse é um desafio bastante simples, mas não consegui encontrar nenhuma pergunta realmente parecida. O desafio é obter uma frequência no uso de STDIN ou equivalente e emitir um tom que corresponda a essa frequência, em Hz, por 5 segundos. Por exemplo

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

Regras

  • A entrada deve ser recebida através do STDIN, ou equivalente do seu idioma
  • A resposta deve ser um programa completo
  • Builtins podem ser usados
  • A frequência estará em qualquer lugar entre 50 - 5000 Hz
  • A saída deve ser reproduzida por 5 segundos
  • A saída deve estar na forma de uma onda senoidal

Casos de teste

Entrada: 440

Saída:

Entrada: 200

Saída:

Entrada: 4000

Saída:


  • Não se trata de encontrar o idioma com a solução mais curta para isso (existem algumas onde o programa vazio faz o truque) - trata-se de encontrar a solução mais curta em todos os idiomas. Portanto, nenhuma resposta será marcada como aceita.

  • Diferentemente de nossas regras usuais, fique à vontade para usar um idioma (ou versão do idioma), mesmo que seja mais novo que esse desafio. Os idiomas escritos especificamente para enviar uma resposta de 0 byte a esse desafio são um jogo justo, mas não particularmente interessante.

    Observe que deve haver um intérprete para que o envio possa ser testado. É permitido (e até encorajado) escrever esse intérprete para um idioma anteriormente não implementado.

    Observe também que as línguas que têm a cumprir os nossos critérios usuais para linguagens de programação .


Catálogo

O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

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

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

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

Você também pode transformar o nome do idioma em um link que será exibido no snippet:

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


Uma função seria aceitável?
um spaghetto

@quartata Deve ser um programa completo.
Chris Loonam

2
Vejo que muitas pessoas estão usando uma beep()função. É garantido que isso é uma onda senoidal?
geokavel

2
A System.Console.Beepcoisa do Windows é uma onda senoidal na minha máquina (moderna, Windows 10), então acho que isso conta. Soluções em PPCG geralmente não precisam ser portáteis.
Lynn

Imprimir um arquivo de áudio é uma maneira válida de "emitir um tom"?
Ilmari Karonen

Respostas:


13

QBasic, 18 bytes (desqualificado)

Como o @pabouk mencionado, ele usa o alto-falante do PC, então ele toca uma onda quadrada , não uma onda senoidal como o problema pede. (Esse requisito foi adicionado ao problema após a publicação desta resposta, daí os votos.) De qualquer forma, deixarei aqui para posteridade.


INPUT F
SOUND F,91

Tocar um som na frequência de entrada por 91 tiques, o que é igual a 5 segundos.


Este programa não atende ao último requisito: "A saída deve estar na forma de uma onda senoidal". SOUNDO comando usa o alto-falante do PC que, conforme projetado, foi acionado por um chip de timer 8254 que produz uma onda quadrada. --- Embora nos PCs modernos 8254 possam estar faltando, a emulação correta do SOUNDcomando deve produzir uma onda quadrada.
Pabouk

3
Este requisito foi adicionado depois que eu postei minha resposta. : / Adicionarei uma nota, mas me sinto estranho ao excluir esta resposta quando ela é votada no topo.
Lynn

12

Python2, 40 bytes

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

Só funciona no Windows.


1
Funcionaria 5e3?
Lynn

3
@ Mauris Não, eu já tinha tentado isso, mas ele quer apenas números inteiros.
orlp

10

Mathematica, 42 bytes

Bem, se podemos usar built-ins ...

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

Graças ao requisito de um programa completo, foi a primeira vez que usei minha dica de golfe recentemente descoberta% (resultado da última avaliação) para salvar dois bytes.

O Mathematica também possui um built-in Soundque toma um tom e uma duração como argumentos, mas infelizmente o tom deve ser dado como uma nota musical. Especificar sua própria onda sonora via Playparece ser a única maneira de trabalhar com uma frequência.


7

C #, 80 bytes

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

Você sabe qual é a alternativa para Beeping em Java?
Kritixi Lithos

7

MATLAB, 36 bytes

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

Obrigado ao flawr por salvar dois bytes.


2
Você pode salvar um caractere usando em 2^-12vez de 1/4096.
flawr

Oh bobo eu, 8^-4é ainda mais curto!
flawr


4

FakeASM , 12 bytes

RDA
BEEP 5e3

Funciona com a implementação de referência do Windows (download) . Ele chama a Beepfunção do Windows , que é uma onda senoidal nas plataformas modernas.


Onde está o STDIN?
gato

1
RDAlê um número de STDIN e o registra A.
Lynn

Acabei lendo as especificações e percebendo isso, mas esqueci de excluir meu comentário. graças, embora
gato

4

Bash + X11, 27 20 bytes

xset b 9 $1 5;echo 

Isso contém um imprimível, então aqui está um hexdump:

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

Isso toma a frequência como argumento da linha de comando e emite o bipe apropriado em um volume de 9% (já que nenhum volume foi especificado).

(Nota: não foi possível testar isso devido a alguns problemas no meu computador, mas tenho 99% de certeza de que funciona.)


Existe um \ x07 lá?
TheDoctor

Não, o xset faz todo o material sonoro.
a spaghetto

@ TheDoctor Oh, eu entendo o que você quer dizer ... ele precisa de um \ x07 para fazer o barulho real. Fixação.
a spaghetto

echo <BEL>onde <BEL>é o caractere real, salva 6 bytes.
Dennis

@Dennis D'oh. Obrigado!
a spaghetto

4

JavaScript, 114 bytes

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

Requer um navegador de ponta, digite a frequência no prompt. JSFiddle


Isso não será reproduzido por 5 segundos porque prompt()é chamado depois que o timer de áudio é iniciado new AudioContext(). Eu acredito que o mais curto que você pode obter é de 115 bytes c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655

Obrigado pelo aviso, também aprecio a idéia de usar 'with'.
Nickson

Eu nunca vi as <script>tags necessárias para o JavaScript ser considerado um programa completo antes. Eu acho que você é bom para o 114. Além disso, a remoção da patribuição, e apenas a criação frequency.value=prompt()deverá fazê-lo para baixo para 110.
Mwr247

@ Mwr247 Infelizmente, como o usuário81655 apontou, o timer que determina quando o áudio para é iniciado quando o AudioContext é criado. O prompt deve aparecer antes disso ou uma entrada lenta pode resultar em áudio mais curto ou nenhum áudio.
Nickson

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)isso economiza 3 bytes
Patrick Roberts

4

Utilitários 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

Esta é uma verdadeira onda senoidal. Nenhum sinal sonoro. Frequência de entrada inserida via linha de comando:

./hz.sh 440

3

Processando, 148 114 106 bytes

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

(Por algum motivo, o processamento requer o uso da instrução de importação e da nova linha, caso contrário, ela não reconhece a biblioteca.)

Ainda não descobri como passar argumentos para o Processing, apesar de saber que é possível, portanto esse código requer um arquivo chamado "s" na pasta de sketch que possui o valor de frequência. Se eu descobrir como passar argumentos, poderia substituir o carregamento de arquivos args[0].


3

VB.net, 90 bytes , 74 bytes

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

Graças a Sehnsucht

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

Este é o meu primeiro post, então se eu fiz alguma coisa errada, por favor me avise


1
Que poderia ser reduzido ficando a linha de comando argumento em args principais vez Main(a()As Stringe Beep(a(0),5000)reduzindo o total para 74 bytes de acordo com o contador de bytes
Sehnsucht

2

Turbo / Borland / Livre / GNU Pascal, 95 bytes

Devido a problemas com a função de atraso em computadores modernos (bem, qualquer coisa acima de 200 MHz) tentando executar o Turbo / Borland Pascal, isso pode não demorar 5 segundos, mesmo com uma biblioteca CRT corrigida

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

A conversão String para Inteiro pode ser feita mais curta (77 bytes) no FreePascal e derivadas modernas, pois elas têm a StrToIntfunção:

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

1
Até onde eu sei, um programa Pascal funcionará bem com todos os compiladores, mesmo sem a Program a;parte, para que você possa ganhar 10 bytes com a omissão.
vsz 17/11/2015

O @vsz FPC pode estar bem (para que eu possa removê-lo do segundo trecho), ainda tenho que verificar alguns antigos, como o TP5.5, tanto quanto me lembro que eles exigiam.
SztupY

Os requisitos dizem “A entrada deve ser recebida através do STDIN”, portanto, pule essa longa ParamStr()e apenas Read()conforme necessário: pastebin.com/1Tw2d0D6
manatwork

2

Perl, 27 bytes

Basicamente, uma versão Perl da resposta Python (também funciona apenas no Windows), se estivermos permitindo módulos.

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 bytes

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

Uma tradução da minha resposta bash. Não funciona no intérprete online (obviamente).

Recebe a entrada como qualquer caractere não numérico seguido pela frequência (portanto, para uma entrada de 440 Hz, você pode fazer "a440").

Explicação

"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.

Resposta legal. Bom trabalho.
Rɪᴋᴇʀ

Você usou Vitsy. <3 Meu filho é resgatado.
Addison Crump

1

C com WinAPI, 82 bytes

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

Usa a função WinAPI Beep ().


Você não precisa passar &xpara scanf? Além disso, você pode declarar xcomo parâmetro como main e deixar o compilador padronizar seu tipo.
Neil

@ Neil, eu não sei como eu digitei errado, sem passar &xpara scanf(). Corrigido agora; obrigado.
user2064000


0

Shadertoy GLSL Som Shader, 86

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

"Entrada" é fornecida via #define. Emite uma onda senoidal com frequência aproximada de FHz. Arredondado 2 * Pi para 6,3, em vez de "padrão" 6,2831, mas parece praticamente o mesmo.

Infelizmente não há muito para jogar aqui.


A entrada deve ser obtida via STDIN, não codificada.
flawr

@ flawr Eu não conheço nenhum método de contribuição precisa sobre Shadertoy. Por favor me esclareça.
Kroltan 17/11/2015

Esta deve ser sua tarefa, não minha. Mas eu não conheço Shadertoy, então não posso ajudá-lo.
flawr

@flawr, o único método de precisão razoável seria a posição do cursor, mas isso está disponível apenas para sombreadores de imagem, não para som. Então, eu estou muito preso com define.
Kroltan

Você pode carregar arquivos? Isso é o que eu fiz.
geokavel

0

Jolf, 4 bytes, não-competitivo

Essa adição de idioma veio após o desafio.

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

A onda padrão é uma onda senoidal.


0

SmileBASIC, 84 bytes

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

Converte de Hz para meio passo e toca uma certa nota com o valor a desafinar para produzir a frequência.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.