Phát ra âm thanh có tần số nhất định


25

Đây là một thử thách khá đơn giản, nhưng tôi không thể tìm thấy bất kỳ câu hỏi nào thực sự giống với nó. Thách thức là lấy tần số bằng cách sử dụng STDIN hoặc tương đương, sau đó phát ra âm phù hợp với tần số đó, tính bằng Hz, trong 5 giây. Ví dụ

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

Quy tắc

  • Đầu vào phải được thực hiện thông qua STDIN hoặc tương đương với ngôn ngữ của bạn
  • Câu trả lời phải là một chương trình đầy đủ
  • Nội dung có thể được sử dụng
  • Tần số sẽ ở bất cứ đâu từ 50 - 5000 Hz
  • Đầu ra phải được phát trong 5 giây
  • Đầu ra phải ở dạng sóng hình sin

Các trường hợp thử nghiệm

Đầu vào: 440

Đầu ra:

Đầu vào: 200

Đầu ra:

Đầu vào: 4000

Đầu ra:


  • Đây không phải là tìm ngôn ngữ với giải pháp ngắn nhất cho việc này (có một số nơi mà chương trình trống thực hiện thủ thuật) - đây là về việc tìm giải pháp ngắn nhất trong mọi ngôn ngữ. Do đó, không có câu trả lời sẽ được đánh dấu là chấp nhận.

  • Không giống như các quy tắc thông thường của chúng tôi, vui lòng sử dụng ngôn ngữ (hoặc phiên bản ngôn ngữ) ngay cả khi nó mới hơn thử thách này. Các ngôn ngữ được viết cụ thể để gửi câu trả lời 0 byte cho thử thách này là trò chơi công bằng nhưng không đặc biệt thú vị.

    Lưu ý rằng phải có một thông dịch viên để trình có thể được kiểm tra. Được phép (và thậm chí được khuyến khích) tự viết trình thông dịch này cho một ngôn ngữ chưa được thực hiện trước đó.

    Cũng lưu ý rằng ngôn ngữ làm phải đảm bảo thực tiêu chuẩn thông thường của chúng tôi cho các ngôn ngữ lập trình .


Mục lục

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


Một chức năng sẽ được chấp nhận?
một spaghetto

@quartata Nó phải là một chương trình đầy đủ.
Chris Loonam

2
Tôi thấy rằng rất nhiều người đang sử dụng một beep()chức năng. Có đảm bảo rằng đó là một sóng hình sin?
geokavel

2
Điều của Windows System.Console.Beeplà một làn sóng hình sin trên máy tính (hiện đại, Windows 10) của tôi, vì vậy tôi nghĩ rằng nó có giá trị. Các giải pháp trên PPCG thường không cần phải di động.
Lynn

Có phải in ra một tệp âm thanh là một cách hợp lệ để "phát ra âm thanh"?
Ilmari Karonen

Câu trả lời:


13

QBasic, 18 byte (không đủ tiêu chuẩn)

Giống như @pabouk đã đề cập, cái này sử dụng loa PC, vì vậy nó phát sóng vuông chứ không phải sóng hình sin như vấn đề yêu cầu. (Yêu cầu này đã được thêm vào vấn đề sau khi câu trả lời này được đăng, do đó phiếu bầu.) Dù sao tôi cũng sẽ để nó cho hậu thế.


INPUT F
SOUND F,91

Phát âm thanh ở tần số đầu vào trong 91 tiếng, tương đương với 5 giây.


Chương trình này không thỏa mãn yêu cầu cuối cùng: "Đầu ra phải ở dạng sóng hình sin". SOUNDlệnh sử dụng loa PC được thiết kế bởi chip hẹn giờ 8254 tạo ra sóng vuông. --- Mặc dù trong PC hiện đại, 8254 có thể thiếu phần mô phỏng chính xác của SOUNDlệnh nên tạo ra sóng vuông.
pabouk

3
Yêu cầu này đã được thêm vào sau khi tôi đăng câu trả lời của mình. : / Tôi sẽ thêm một ghi chú, nhưng tôi cảm thấy kỳ lạ về việc xóa câu trả lời này khi nó được bình chọn lên đầu.
Lynn

12

Python2, 40 byte

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

Chỉ hoạt động trên Windows.


1
Sẽ 5e3làm việc?
Lynn

3
@Mauris Không, tôi đã thử rồi nhưng nó chỉ muốn số nguyên.
orlp

10

Toán học, 42 byte

Chà nếu chúng ta có thể sử dụng tích hợp ...

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

Nhờ vào yêu cầu cho một chương trình đầy đủ, đây là lần đầu tiên tôi sử dụng mẹo chơi gôn được phát hiện gần đây của tôi về việc sử dụng %(kết quả đánh giá cuối cùng) để tiết kiệm hai byte.

Mathematica cũng có một tích hợp trong Soundđó có một cao độ và thời lượng làm đối số, nhưng thật không may, cao độ phải được đưa ra như một nốt nhạc. Chỉ định sóng âm thanh của riêng bạn thông qua Playdường như là cách duy nhất để làm việc với tần số.


7

C #, 80 byte

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

Bạn có biết cái gì thay thế cho Beeping trong Java không?
Kritixi Lithos

7

MATLAB, 36 byte

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

Cảm ơn flawr đã lưu hai byte.


2
Bạn có thể lưu một ký tự bằng cách sử dụng 2^-12thay vì 1/4096.
flawr

Ôi tôi thật ngốc, 8^-4thậm chí còn ngắn hơn!
flawr


4

FakeASM , 12 byte

RDA
BEEP 5e3

Hoạt động với triển khai tham chiếu Windows (tải xuống) . Nó gọi Beepchức năng của Windows , là một làn sóng hình sin trên các nền tảng hiện đại.


STDIN ở đâu?
mèo

1
RDAđọc một số từ STDIN và đăng ký nó A.
Lynn

Tôi đã kết thúc việc đọc thông số kỹ thuật và nhận thấy điều đó nhưng tôi quên xóa bình luận của tôi. cảm ơn, mặc dù
con mèo

4

Bash + X11, 27 20 byte

xset b 9 $1 5;echo 

Điều này chứa một không thể in được, vì vậy đây là một hexdump:

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

Điều này lấy tần số làm đối số dòng lệnh và phát tiếng bíp thích hợp ở mức âm lượng 9% (vì không có âm lượng nào được chỉ định).

(Lưu ý: Tôi không thể kiểm tra điều này do một số vấn đề với máy tính của tôi, nhưng tôi chắc chắn 99% nó hoạt động.)


Có \ x07 trong đó không?
TheDoctor

Không, xset làm tất cả những thứ bíp.
một spaghetto

@TheDoctor Ồ tôi hiểu ý của bạn ... nó cần một \ x07 để tạo ra tiếng ồn thực sự. Sửa chữa.
một spaghetto

echo <BEL>nơi <BEL>là nhân vật thực tế, tiết kiệm 6 byte.
Dennis

@Dennis D'oh. Cảm ơn!
một spaghetto

4

JavaScript, 114 byte

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

Yêu cầu một trình duyệt tiên tiến, nhập tần số trong lời nhắc. Câu đố


Điều này sẽ không phát trong 5 giây vì prompt()được gọi sau khi bộ hẹn giờ âm thanh được bắt đầu new AudioContext(). Tôi tin rằng ngắn nhất bạn có thể nhận được này là 115 byte với c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
dùng81655

Cảm ơn những người đứng đầu, tôi cũng đánh giá cao ý tưởng sử dụng 'với'.
Nickson

Tôi chưa thấy <script>các thẻ được yêu cầu cho JavaScript để xem xét một chương trình đầy đủ trước đó. Tôi nghĩ rằng bạn tốt cho 114. Ngoài ra, việc xóa pbài tập và chỉ cần cài đặt frequency.value=prompt()sẽ giúp bạn giảm xuống 110.
Mwr247

@ Mwr247 Thật không may, như user81655 đã chỉ ra, bộ hẹn giờ xác định khi âm thanh dừng bắt đầu khi AudioContext được tạo. Lời nhắc phải xuất hiện trước đó hoặc đầu vào chậm có thể dẫn đến âm thanh ngắn hơn hoặc không có âm thanh nào cả.
Nickson

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)điều này tiết kiệm 3 byte
Patrick Roberts

4

Đồ dùng 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

Đây là một sóng hình sin thực sự. Không có tiếng bíp. Tần số đầu vào được nhập thông qua dòng lệnh:

./hz.sh 440

3

Đang xử lý, 148 114 106 byte

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

(Vì một số lý do, Xử lý yêu cầu cả sử dụng câu lệnh nhập và dòng mới, nếu không, nó không nhận ra thư viện.)

Tôi vẫn chưa tìm ra cách chuyển đối số vào Xử lý, mặc dù tôi biết điều đó là có thể, vì vậy mã này yêu cầu phải có một tệp có tên "s" trong thư mục phác thảo có giá trị tần số. Nếu tôi có thể tìm ra cách vượt qua trong các đối số, tôi có thể thay thế tải tệp bằng 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

Cảm ơn Sehnsucht

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

Đây là bài viết đầu tiên của tôi vì vậy nếu tôi làm bất cứ điều gì sai xin vui lòng cho tôi biết


1
Điều đó có thể được giảm bớt khi lấy đối số dòng lệnh trong các đối số chính thay vào đó Main(a()As StringBeep(a(0),5000)giảm tổng số xuống còn 74 byte theo bộ đếm byte
Sehnsucht

2

Turbo / Borland / Free / GNU Pascal, 95 byte

Do sự cố với chức năng trì hoãn trên các máy tính hiện đại (tốt, mọi thứ nhanh hơn 200Mhz) khi cố chạy Turbo / Borland pascal, điều này có thể không đợi 5 giây, ngay cả với thư viện CRT đã vá

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

Việc chuyển đổi String thành Integer có thể được thực hiện ngắn hơn (77 byte) trên FreePascal và các dẫn xuất hiện đại, vì chúng có StrToIntchức năng:

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

1
Theo tôi biết, một chương trình Pascal sẽ hoạt động tốt với tất cả các trình biên dịch ngay cả khi không có Program a;phần, vì vậy bạn có thể giành được 10 byte mà không cần bỏ qua nó.
vsz

@vsz FPC có thể ổn (vì vậy tôi có thể xóa nó khỏi đoạn mã thứ hai), tôi vẫn phải kiểm tra một số cái cổ, như TP5.5, theo như tôi nhớ họ yêu cầu.
SztupY

Các yêu cầu nói Đầu vào phải được thực hiện thông qua STDIN, vì vậy hãy bỏ qua phần dài ParamStr()và chỉ cần Read()theo yêu cầu: pastebin.com/1Tw2d0D6
thao tác

2

Perl, 27 byte

Về cơ bản là phiên bản Perl của câu trả lời Python (cũng chỉ hoạt động trên Windows), nếu chúng tôi cho phép các mô-đun.

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 byte

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

Một bản dịch của câu trả lời bash của tôi. Không hoạt động trong trình thông dịch trực tuyến (rõ ràng).

Lấy đầu vào là bất kỳ ký tự không phải là số nào theo sau tần số (vì vậy, với đầu vào 440 Hz, bạn có thể thực hiện "a440").

Giải trình

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

Câu trả lời tuyệt vời. Công việc tốt đẹp.
Rɪᴋᴇʀ

Bạn đã sử dụng Vitsy. <3 Con tôi được chuộc.
Addison Crump

1

C với WinAPI, 82 byte

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

Sử dụng hàm WinAPI Beep ().


Bạn không cần phải vượt qua &xđể scanf? Ngoài ra, bạn có thể khai báo xnhư là một tham số cho chính và để trình biên dịch mặc định loại của nó.
Neil

@Neil, tôi không biết làm thế nào tôi nhầm nó mà không chuyển &xđến scanf(). Đã sửa bây giờ; cảm ơn.
dùng2064000


0

Máy tạo âm thanh Shadertoy GLSL, 86

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

"Đầu vào" được đưa ra thông qua #define. Xuất ra một hình sin với tần số xấp xỉ FHz. Làm tròn 2 * Pi thành 6.3, thay vì "mặc định" 6.2831, nhưng âm thanh khá giống nhau.

Đáng buồn là không có nhiều để chơi golf ở đây.


Đầu vào phải được thực hiện thông qua STDIN, không được mã hóa cứng.
flawr

@flawr Tôi không biết bất kỳ phương pháp nhập liệu chính xác nào trên Shadertoy. Vui lòng làm sáng tỏ cho tôi.
Kroltan

Đây là nhiệm vụ của bạn , không phải của tôi. Nhưng dù sao tôi cũng không biết Shadertoy nên tôi không thể giúp bạn.
flawr

@flawr phương pháp duy nhất có độ chính xác hợp lý sẽ là vị trí con trỏ, nhưng chỉ có sẵn cho các trình đổ bóng hình ảnh, không phải các trình tạo bóng âm thanh. Vì vậy, tôi khá bế tắc với định nghĩa.
Kroltan

Bạn có thể tải tập tin? Đó là những gì tôi đã làm.
geokavel

0

Jolf, 4 byte, không biên dịch

Bổ sung ngôn ngữ này đến sau khi thách thức.

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

Sóng mặc định là sóng hình sin.


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)

Chuyển đổi từ Hz sang nửa bước và phát một nốt nhất định với giá trị giảm dần để tạo ra tần số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.