Belirli bir frekanstaki sesi çıkar


25

Bu oldukça basit bir meydan okuma, ancak buna çok benzeyen bir soru bulamadım. Buradaki zorluk, STDIN veya eşdeğerini kullanmada bir frekans almak ve daha sonra bu frekansla eşleşen bir tonu Hz cinsinden 5 saniye boyunca çıkarmaktır. Örneğin

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

kurallar

  • Giriş, STDIN veya dilinizin eşdeğeri aracılığıyla alınmalıdır
  • Cevap tam bir program olmalı
  • Yerleşikler kullanılabilir
  • Frekans 50 - 5000 Hz arasında herhangi bir yerde olacaktır.
  • Çıkış 5 saniye boyunca oynatılmalıdır
  • Çıktı sinüs dalgası şeklinde olmalı

Test durumları

Giriş: 440

Çıktı:

Giriş: 200

Çıktı:

Giriş: 4000

Çıktı:


  • Bu, bunun için en kısa çözümü olan dili bulmakla ilgili değildir (boş programın hile yaptığı bazı yerler vardır) - bu, her dilde en kısa çözümü bulmakla ilgilidir . Bu nedenle, hiçbir cevap kabul edilmiş olarak işaretlenmeyecektir.

  • Her zamanki kurallarımızdan farklı olarak, bu zorluktan daha yeni olsa bile, bir dili (veya dil sürümünü) kullanmaktan çekinmeyin. Bu zorluğa 0 baytlık bir cevap göndermek için özel olarak yazılan diller adil oyundur ancak özellikle ilgi çekici değildir.

    Gönderimin test edilebilmesi için bir tercüman olması gerektiğini unutmayın. Daha önce uygulanmamış bir dil için bu tercümanı kendiniz yazmanıza izin verilir (ve hatta teşvik edilir).

    Ayrıca, dillerin programlama dilleri için genel kriterlerimizi yerine getirmesi gerektiğine dikkat edin .


Katalog

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden çok sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğinizden dolayı), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

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


Bir fonksiyon kabul edilebilir mi?
Bir spaghetto

@quartata Tam bir program olmalı.
Chris Loonam,

2
Görüyorum ki birçok insan bir beep()işlev kullanıyor . Bunun bir sinüs dalgası olduğu garantili mi?
geokavel

2
Windows'un System.Console.Beepmeselesi (modern, Windows 10) makinemdeki bir sinüs dalgası, bu yüzden önemli olduğunu düşünüyorum. PPCG'deki çözümlerin genellikle taşınabilir olması gerekmez.
Lynn

Bir ses dosyasını yazdırmak, "bir ton çıkışı" için geçerli bir yol mu?
Ilmari Karonen

Yanıtlar:


13

QBasic, 18 bayt (diskalifiye)

Bahsedilen @pabouk'ta olduğu gibi, bu PC hoparlörünü kullanıyor, bu yüzden sorar gibi bir sinüs dalgası değil, kare bir dalga oynuyor . (Bu gereksinim, bu cevap gönderildikten sonra soruna eklendi , oylar bu yüzden oylar.) Ben yine de gelecek için burada bırakacağım.


INPUT F
SOUND F,91

Girilen frekansta, 5 saniyeye eşit olan 91 tik sesi çalın .


Bu program son gereksinimi karşılamıyor: "Çıktı sinüs dalgası şeklinde olmalı". SOUNDkomutu, tasarlandığı gibi kare dalga üreten bir zamanlayıcı çip 8254 tarafından sürülen PC hoparlörünü kullanır. --- Modern PC'lerde 8254 eksik olmasına rağmen SOUNDkomutun doğru emülasyonu kare bir dalga üretmelidir.
pabouk

3
Cevabımı gönderdikten sonra bu gereksinim eklendi. : / Bir not ekleyeceğim, ancak en üste oy verildiğinde bu cevabı silmekten garip hissediyorum.
Lynn

12

Python2, 40 bayt

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

Sadece Windows üzerinde çalışıyor.


1
Çalışır 5e3mı?
Lynn

3
@ Mauris Hayır, bunu çoktan denemiştim ama sadece tamsayıları istiyor.
orlp

10

Mathematica, 42 bayt

Peki, eğer yerleşikleri kullanabilirsek ...

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

Tam bir program gereksinimi sayesinde ilk kez kullanmam gerekti benim yakın zamanda keşfedilen golf ucu kullanmanın% iki bayt kaydetmek için (son değerlendirmenin sonucunu).

Mathematica'da ayrıca Soundbir perdesi ve argüman olarak süren bir yerleşik özelliği vardır , ancak ne yazık ki perdenin bir nota olarak verilmesi gerekir. Kendi ses dalganızı belirtmek, Playfrekansla çalışmanın tek yolu gibi görünüyor.


7

C #, 80 bayt

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

BeepJava'da ing için alternatif nedir biliyor musunuz ?
Kritixi Lithos

7

MATLAB, 36 bayt

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

İki bayt kaydetme kusuruna teşekkürler .


2
Kullanarak 2^-12yerine bir karakter kaydedebilirsiniz 1/4096.
kusur

Ah aptal ben, 8^-4daha kısa!
kusur


4

FakeASM , 12 bayt

RDA
BEEP 5e3

Windows referans uygulaması (indirme) ile çalışır . BeepModern platformlarda sinüs dalgası olan Windows fonksiyonunu çağırıyor .


STDIN nerede?
kedi

1
RDASTDIN'den bir sayı okur ve kayıt ettirir A.
Lynn

Spesifikasyonu okudum ve fark ettim ama yorumumu silmeyi unuttum. teşekkürler, yine de
kedi

4

Bash + X11, 27 20 bayt

xset b 9 $1 5;echo 

Bu, yazdırılamaz, bu yüzden bir hexdump içerir:

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

Bu, frekansı bir komut satırı argümanı olarak alır ve% 9'luk bir ses seviyesinde uygun bip sesi çalar (ses seviyesi belirtilmediğinden).

(Not: Bilgisayarımdaki bazı sorunlar nedeniyle bunu test edemedim, ancak çalıştığından% 99 eminim.)


İçeride \ x07 var mı?
Doktor

Hayır, xset tüm bip işlerini yapar.
Bir spaghetto

@Doktor Ah, ne demek istediğinizi anlıyorum ... gerçek sesi çıkarmak için bir \ x07'ye ihtiyacı var. Tamir ediyorum.
Bir spaghetto

echo <BEL><BEL>Gerçek karakter nerede , 6 bayt kaydeder.
Dennis,

@Dennis D'oh. Teşekkürler!
bir

4

JavaScript, 114 bayt

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

Biraz gelişmiş bir tarayıcı gerektirir, istemde sıklığı girin. JSFiddle


Bu, 5 saniye çalmayacaktır çünkü prompt()sesli zamanlayıcı başlatıldıktan sonra çağrılır new AudioContext(). Bunu alabileceğin en kısa sürenin 115 bayt olduğuna inanıyorum c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655

Başınız için teşekkürler, 'birlikte' kullanma fikrini de takdir ediyorum.
Nickson,

Daha önce <script>JavaScript programının tam bir program olarak değerlendirilebilmesi için gerekli etiketleri görmedim . Ben kaldırarak, size de 114. yönelik olman iyi düşünmek patama ve sadece ayar frequency.value=prompt()110'a aşağı almalısınız
Mwr247

@ Mwr247 Ne yazık ki, user81655'in işaret ettiği gibi, AudioContext oluşturulduğunda sesin ne zaman başlayacağını belirleyen zamanlayıcı. İstemin ondan önce görünmesi gerekir, aksi takdirde yavaş bir giriş daha kısa ses çıkarır veya hiç ses çıkarmaz.
Nickson,

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)Bu 3 bayt kaydeder
Patrick Roberts

4

Bash + Linux programları, 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

Bu gerçek bir sinüs dalgası. Bip sesi yok. Komut satırı üzerinden girilen giriş frekansı:

./hz.sh 440

3

İşlem, 148 114 106 bayt

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

(Bir nedenden dolayı İşleme hem import deyimini hem de yeni satırı kullanmayı gerektirir, aksi takdirde kütüphaneyi tanımıyordur.)

Argümanları İşlemeye nasıl aktaracağımı henüz bulamadım, bunun mümkün olduğunu bilmeme rağmen, bu kodun çizim değeri klasöründe frekans değeri olan "s" adlı bir dosyaya sahip olmasını gerektiriyor. Bağımsız değişkenlerin nasıl iletileceğini bulabilirsem, dosya yükleme ile değiştirebilirim args[0].


3

VB.net, 90 bayt , 74 bayt

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

Sehnsucht'a teşekkürler

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

Bu benim ilk gönderim, bu yüzden yanlış bir şey yaparsam lütfen bana bildirin


1
Komut satırı argümanını ana argümanlara almak Main(a()As Stringve Beep(a(0),5000)toplamı bayt sayacına
Sehnsucht

2

Turbo / Borland / Ücretsiz / GNU Pascal, 95 bayt

Turbo / Borland pascal'ı çalıştırmaya çalışan modern bilgisayarlarda (iyi, 200MHz'den daha hızlı olan herhangi bir şey) gecikme işleviyle ilgili sorunlar nedeniyle, yamalı bir CRT kitaplığında bile 5 saniye beklemeyebilir

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

Dize - Tamsayı dönüşümü, FreePascal ve modern türevlerde daha kısa (77 byte) yapılabilir ve şu StrToIntfonksiyona sahiptir:

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

1
Bildiğim kadarıyla, bir Pascal programı, tüm derleyicilerle birlikte bile olsa iyi çalışacaktır Program a;, bu nedenle atlayarak 10 bayt kazanabilirsiniz.
vsz

@vsz FPC iyi olabilir (bu yüzden bunu ikinci snippet'ten kaldırabilirim), hala ihtiyaç duyduğumu hatırladığım kadarıyla bazı eskileri (TP5.5 gibi) kontrol etmem gerekiyor.
SztupY

“Girdi STDIN aracılığıyla girilmelidir” diyor, bu nedenle bu kadar uzun ParamStr()ve tam Read()olarak gerektiği gibi atlayın : pastebin.com/1Tw2d0D6
manatwork

2

Perl, 27 bayt

Modüllere izin veriyorsak, temel olarak Python cevabının Perl versiyonu (sadece Windows üzerinde de çalışır).

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 bayt

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

Bash cevabımın çevirisi. Çevrimiçi tercümanda çalışmaz (açıkçası).

Girdiyi, sayısal olmayan herhangi bir karakter olarak takip eder, ardından frekansı takip eder (bu yüzden 440 Hz'lik bir giriş için "a440" yapabilirsiniz).

açıklama

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

Güzel cevap. İyi iş.
Rɪᴋᴇʀ

Vitsy'yi kullandın. <3 Çocuğum kurtarıldı.
Addison Crump

1

C with WinAPI, 82 bytes

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

Uses the WinAPI Beep() function.


Don't you need to pass &x to scanf? Also you can declare x as a parameter to main and let the compiler default its type.
Neil

@Neil, I don't know how I mistyped it without passing &x to scanf(). Fixed now; thanks.
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" is given via #define. Outputs a sinewave with approximate frequency of FHz. Rounded 2*Pi to 6.3, instead of "default" 6.2831, but sounds pretty much the same.

Sadly there isn't much to golf here.


Input should be taken via STDIN, not hardcoded.
flawr

@flawr I don`t know any methods of precise input on Shadertoy. Please enlighten me.
Kroltan

This is should be your task, not mine. But I do not know Shadertoy anyway so I cannot help you.
flawr

@flawr the only method of reasonable precision would be the cursor position, but that is only available to image shaders, not sound shaders. So I'm pretty much stuck with defines.
Kroltan

Can you load files? That's what I did.
geokavel

0

Jolf, 4 bytes, noncompeting

This language addition came after the challenge.

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

The default wave is a sine wave.


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)

Converts from Hz to half steps, and plays the a certain note with the a detune value to produce the frequency.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.