Introdução
Alguns dias atrás eu precisava de um metrônomo para alguma coisa. Como não havia nenhum disponível, baixei um aplicativo da App Store. O aplicativo tinha um tamanho de 71 MB !!!
71 MB para criar tic-toc ...?!
Então o código-golfe veio à minha mente e eu estava pensando se alguns de vocês poderiam melhorar isso.
Desafio
Golf algum código que emita algum som. É muito irrelevante que tipo de som. Se necessário, crie algum arquivo de som ... mas um bipe do sistema também fará o trabalho. ( Aqui está um som que eu criei ... nada de especial. )
Entrada : as batidas por minuto que o metrônomo emite.
Exemplo
Esta é uma versão Java sem golfe! É apenas para mostrar a tarefa.
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!");
}
}
}
Regras
Você não pode usar bibliotecas externas, apenas ferramentas da própria linguagem são permitidas.
Apenas os bytes do código fonte contam ... não o arquivo de som.
Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
EDITAR:
Exemplo de saída: Então, algo assim seria a saída para 120 bps : link
beep()
e saída do console não são exatamente IIRC instante. Nenhum dos doissleep()
é conhecido por ser preciso.Respostas:
Mathematica, 26 bytes
Do
é normalmente usado como um loop "for" no sentido mais restrito: repita esse trecho de código para cada umi
dex
paray
... ou mesmo apenas repita esse trecho de códigon
. Em vez de um númeron
, podemos dar-lhe infinito para criar um loop infinito. O corpo do loop éPause[Beep[];60/#]
que é apenas uma maneira de escrever golfe,Beep[];Pause[60/#]
onde#
está o argumento da função.Se for admissível que a solução exploda eventualmente a pilha de chamadas, podemos salvar um byte com uma solução recursiva:
fonte
~Do~∞
era possível. UmFor
loop me atingiu apenas 29 bytes. (Além disso, eu pessoalmente acredito que a versão 26-byte é o único válido.)~Do~∞
parece não funcionar quando se∞
trata de uma variável. (Eu tentei usar que quando golfe sua máquina verdade.)Attributes[Do]
incluiHoldAll
, então meu palpite é que_~Do~∞
tem um padrão de avaliação especial.Do[...,a]
ondea
fica o infinito mostra realmente a chamada comoDo[...,{a}]
.Pitão,
11109 bytesAgradeço a Adnan por me lembrar
#
.Para sempre (
#
), imprima oC
código har7
. Em seguida, durma (.d
)60
segundos dividido por (c
) input (Q
).fonte
7.
seria analisado como um número.#pythnoob
JavaScript,
36 45 42 4134 bytesGuardado 1 byte graças a @RikerW
Guardado 1 byte graças a @ETHproductions
Esta é uma função.
Se eu usar
`\7`
, o SpiderMonkey reclama que os literais octais estão obsoletos.Alternativa, 31 bytes
O problema é que os não imprimíveis são removidos, mas isso deve funcionar.
fonte
Bash,
535541 bytesGraças a @Dennis por raspar 14 bytes 1
Ok, hora da verdade: sou péssimo em jogar basquete. Qualquer ajuda seria muito apreciada.
1 Caramba. Não é de admirar que ninguém possa superar Dennis.
fonte
while 1
possível?while printf \\a
possivelmente?bc
.read
. 3.echo
existe com o código 0, então você pode usar essa instrução em vez detrue
.JavaScript ES6 (navegador), 43 bytes
Isso pode estar estendendo as regras:
Dê um nome a esta função (por exemplo
F=x=>...
) e digite-a no console do navegador nesta página . Em seguida, chame a função com seus bps, por exemploF(60)
, e aguarde a mágica acontecer. :-)Por que isso funciona? Bem,
b.html
está na mesma pasta que um arquivo chamado1
, que é o arquivo de som de amostra do OP. Não tenho certeza se isso está dentro das regras (acho que é como a versão do shell; ele precisa ser executado em um ambiente específico), mas valeu a pena tentar.Versão mais segura, 57 bytes
Se o código acima não for permitido por algum motivo, tente o seguinte:
Funciona em qualquer página!
fonte
05AB1E , 31 bytes
Código:
Se eu tivesse um built-in esperando N segundos, isso poderia ter sido 11 bytes. Infelizmente, esse não é o caso. Aqui está a explicação:
Usa a codificação ISO 8859-1.
fonte
time.sleep
e.pop()
no meio do código dessa maneira. ;)osascript, 39 bytes
Existe literalmente um comando chamado beep? Sweeeet!
Executável apenas no Mac OS X devido a licença restrita, mas para executar, faça:
fonte
Python,
686757 bytesGuardado 1 byte graças a @FlagAsSpam
Guardado 9 bytes graças a @Adnan
Também demorou 2 bytes a menos depois de converter as terminações de linha no formato UNIX.
Versão mais antiga, que na verdade leva bpm como argumento de linha de comando (66 bytes):
fonte
print"\7";
? Não tenho certeza, mas tenho certeza que funciona.a=input()
e ? Eu sempre pensei que o Python 2 avalia automaticamente a entrada e, portanto, não precisa da conversão int, mas posso estar errado.a
int(sys.argv[1])
input()
realmente avalia automaticamente. Eu esqueci esse recurso. É bastante antitônico - provavelmente um legado dos velhos tempos.time.sleep(60./a)
ser substituído portime.sleep(60./input())
, enquanto remove completamentea=input()
?AutoIt , 56 bytes
fonte
Vitsy, 14 bytes
Modo detalhado (intérprete em breve):
Basicamente, eu uso o
w
operador para aguardar um determinado número de segundos, conforme especificado porbpm/60
, envolvido em um loop infinito. Então, faço ruído com a saída do terminal do caractere ASCII 7 (BEL
).fonte
java -jar Vitsy.jar <filename>
.C #, 118 bytes
Solução básica.
fonte
System.Console.Beep();
e a impressão do personagem é usadaSystem.Console.Write('<\a character>');
.Java,
10382 bytesObrigado a Justin por cortar 21 bytes!
Oh puxa.
Método e versão em golf do programa de amostra.
fonte
System.out.print('\7');
vez dojava.awt.Toolkit.getDefaultToolkit().beep();
?'\7'
é o personagem sino, que faz um som quando ele é impressoCódigo de máquina GMC-4 , 21,5 bytes
O GMC-4 é um computador de 4 bits de uma empresa chamada Gakken para ensinar os princípios da linguagem assembly em um conjunto de instruções e computador simplificados. Essa rotina leva a entrada nos endereços da memória de dados
0x5D
por meio0x5F
de decimal big-endian (ou seja, um dígito por mordidela).O algoritmo está basicamente adicionando a entrada à memória e aguardando 0,1s, até que seja pelo menos 600, e subtraindo 600 e emitindo um sinal sonoro, em um loop infinito. Como o GMC-4 possui várias funções de troca de registro, mas nenhuma cópia de registro função de , isso é feito da maneira mais difícil.
Em hexadecimal (a segunda linha está na posição na memória):
Na montagem:
Aviso Legal:
Na verdade, eu não tenho um GMC-4. Verifiquei meticulosamente este programa com documentação on-line, mas posso ter cometido um erro. Eu também não sei o endianness. Parece que o GMC-4 é big endian, mas não tenho certeza. Se alguém é dono de um GMC-4 e pode verificar isso / me dizer o endianness do GMC-4, eu agradeceria muito.
fonte
C, 48 bytes
Uma solução apenas para Windows (função Sleep (), para ser específico).
Eu também (ab) usei o fato de printf () retornar o número de caracteres impressos para usá-lo como condição de loop infinito.
Há um caractere entre aspas duplas na chamada printf (), mas ele não é exibido aqui por algum motivo. Em caso de dúvida, copie e cole no Sublime Text 2 ou Notepad ++, o caractere será exibido como
BEL
.Isso começou como uma solução C ++, mas meio que caiu no subconjunto C do C ++ (porque, você sabe,
Sleep()
é um pouco menor questd::this_thread::sleep_for(std::chrono::milliseconds())
) eprintf()
é menor questd::cout<<
).fonte
AppleScript 94 bytes
Eu sei que estou muito atrasado, e este é o meu primeiro post aqui, mas tanto faz.
Ungolfed:
fonte
VBScript,
11366 bytesEste programa é bastante simples; recebe entrada, ecoa o caractere BEL e aguarda. Agradecemos a Niel por cortar quase metade do programa!
fonte
WScript.Echo CHR(7)
? Além disso, você quis dizer60000
?Ruby,
3733 bytesBem direto.
Esta é uma função lambda. Se você queria 60 bpm, você faria:
m[60]
.fonte
$><<?\a
, também deve funcionar para o sinal sonoro. E não há necessidade de dar um nome para o proc (todas as soluções de JavaScript com função seta gordura também deixá-lo não atribuído), você pode chamá-lo anonimamente também:->b{loop{$><<?\a;sleep 6e1/b}}[60]
.?\a
; você tem o Ruby 1.x? Se sim, você pode testar se isso funciona?Japonês, 30 bytes
O
?
deve ser o byte literal9A
. Teste online! (Desculpe pelo pop-up que adia as primeiras batidas; isso será removido em breve.)Como funciona
fonte
Caxumba, 18 bytes
Leia o BPM na variável I, então F {com dois espaços depois} é um loop infinito. Pare por 60 segundos / BPM, depois escreva $ CHR (7) {Ascii: BEL} na saída padrão, fornecendo a saída de áudio necessária e, em seguida, reinicie no loop infinito.
fonte
Java, 321 caracteres
Parece muito bom. Funciona apenas em sistemas com suporte a MIDI.
.
fonte
ChucK , 90 bytes
Ruído branco que é ligado e desligado a cada dois tiques.
Explicação
Isso é feito para ativar o som em uma batida e depois desligá-lo depois.
98versão de 93 bytes (mais sofisticada)O ruído branco é reproduzido por 10 milissegundos por tick.
Isso é feito para ser um clique, em vez de ativar e desativar o ruído constante.
fonte
Perl 5, 36 bytes
Uma sub-rotina; use-o como
fonte
sleep
está em segundos, então você não pode ter mais de 60 sinais sonoros por minuto, não tenho certeza se isso é um requisito. Além disso, você provavelmente pode manter a mesma contagem de bytes, mas ter um programa completo fazendo algo como:$|=<>;{print"\a";sleep 60/$|;redo}
(não pode testá-lo agora).sleep
. Mas funcionou para mim.Jolf, 7 bytes, não-competitivo
Eu adicionei sons depois que esse excelente desafio foi feito.
Se você deseja limpar este som, anote a saída. Diga que esse número é
x
. Execute outro comando Jolf~CP"x"
, e o intervalo será limpo.fonte
Zsh , 32 bytes
Com base na resposta principal do bash, mas
source
s em vez deexec
s. O TIO vincula as fontes$0:a
devido à forma como o arquivo original é executado, mas funcionará sem ele.Experimente online!
fonte
Bash + bc + > <> , 44 bytes
Brincando com o fato de que o intérprete> <> permite definir um tempo de verificação:
O código> <> é
7o
e deve BELgerar o caractere, produzindo um sinal sonoro do sistema. Ele fará um loop até ser interrompido.O
-t
valor é definido como (2 / RPM) / 60 para que todo o código seja reproduzido em RPM * 60 vezes por segundo.fonte
bc
instalado? Parece que o$(bc -l<<<"2/$1/60")
não produziu nenhuma saída. Vou adicioná-lo à lista de idiomas da resposta. Ainda não consegui testar completamente minha resposta, por isso também pode haver algum tipo de erro.SmileBASIC, 26 bytes
Ele pode tocar qualquer instrumento midi geral, embora qualquer coisa acima de 9 use mais bytes.
fonte
Stax, 17 bytes
ou desembalado:
O programa gera bytes que, quando alimentados pela ferramenta de linha de comando, são exibidos com a configuração padrão, produzem um ruído do metrônomo. A entrada é usada como bpm
exemplo:
Você deve ouvir um bip horrível nas bpm desejadas
fonte