เอาต์พุตเสียงของความถี่ที่แน่นอน


25

นี่เป็นความท้าทายที่ค่อนข้างง่าย แต่ฉันไม่พบคำถามใด ๆ ที่คล้ายกับมันจริงๆ ความท้าทายคือการใช้ความถี่ในการใช้ STDIN หรือเทียบเท่าแล้วส่งเสียงที่ตรงกับความถี่นั้นใน Hz เป็นเวลา 5 วินาที ตัวอย่างเช่น

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

กฎระเบียบ

  • ต้องป้อนข้อมูลผ่าน STDIN หรือภาษาที่เทียบเท่าของคุณ
  • คำตอบต้องเป็นโปรแกรมเต็มรูปแบบ
  • อาจใช้ Builtins
  • ความถี่จะอยู่ที่ใดก็ได้ตั้งแต่ 50 - 5,000 Hz
  • เอาต์พุตจะต้องเล่นเป็นเวลา 5 วินาที
  • ผลผลิตจะต้องอยู่ในรูปของคลื่นไซน์

กรณีทดสอบ

การป้อนข้อมูล: 440

เอาท์พุท:

การป้อนข้อมูล: 200

เอาท์พุท:

การป้อนข้อมูล: 4000

เอาท์พุท:


  • นี่ไม่ได้เกี่ยวกับการค้นหาภาษาด้วยวิธีแก้ปัญหาที่สั้นที่สุดสำหรับเรื่องนี้ (มีบางโปรแกรมที่โปรแกรมเปล่าทำเคล็ดลับ) - สิ่งนี้เกี่ยวกับการค้นหาวิธีแก้ปัญหาที่สั้นที่สุดในทุกภาษา ดังนั้นจะไม่มีการทำเครื่องหมายคำตอบว่าเป็นที่ยอมรับ

  • แตกต่างจากกฎทั่วไปของเราอย่าลังเลที่จะใช้ภาษา (หรือรุ่นภาษา) แม้ว่าจะใหม่กว่าความท้าทายนี้ ภาษาที่เขียนขึ้นเพื่อส่งคำตอบแบบ 0 ไบต์ต่อความท้าทายนี้เป็นเกมที่ยุติธรรม แต่ไม่น่าสนใจเป็นพิเศษ

    โปรดทราบว่าจะต้องมีล่ามเพื่อให้สามารถส่งการทดสอบได้ ได้รับอนุญาต (และสนับสนุนให้) เขียนล่ามนี้ด้วยตัวคุณเองสำหรับภาษาที่ยังไม่ได้ใช้งานมาก่อน

    นอกจากนี้ยังทราบว่าภาษาไม่ต้อง fullfil เกณฑ์ปกติของเราสำหรับการเขียนโปรแกรมภาษา


แค็ตตาล็อก

ส่วนย่อยของสแต็กที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการของวิธีแก้ปัญหาที่สั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของสองไฟล์หรือคุณต้องการแสดงรายการการลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

คุณสามารถทำให้ชื่อภาษาเป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

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


ฟังก์ชั่นจะเป็นที่ยอมรับหรือไม่?
สปาเก็ตตี้

@quartata มันควรเป็นโปรแกรมแบบเต็ม
Chris Loonam

2
ฉันเห็นว่าผู้คนจำนวนมากกำลังใช้beep()ฟังก์ชั่น รับประกันได้หรือไม่ว่าเป็นคลื่นไซน์
geokavel

2
System.Console.Beepสิ่งที่Windows เป็นคลื่นไซน์บนเครื่อง (ทันสมัย ​​Windows 10) ของฉันดังนั้นฉันคิดว่านับ โซลูชันบน PPCG โดยทั่วไปไม่จำเป็นต้องพกพา
ลินน์

การพิมพ์ไฟล์เสียงเป็นวิธีที่ถูกต้องหรือไม่ในการ "ส่งเสียง"
Ilmari Karonen

คำตอบ:


13

QBasic, 18 ไบต์ (ตัดสิทธิ์)

เช่นเดียวกับ @pabouk ที่กล่าวถึงนี่ใช้ลำโพง PC ดังนั้นจึงเล่นเป็นรูปคลื่นได้ไม่ใช่คลื่นไซน์ตามที่ปัญหาถาม (ความต้องการนี้ถูกเพิ่มเข้าไปในปัญหาหลังจากโพสต์คำตอบนี้ดังนั้นการลงคะแนน) ฉันจะทิ้งไว้ที่นี่เพื่อลูกหลานต่อไป


INPUT F
SOUND F,91

เล่นเสียงที่ความถี่อินพุทเป็นเวลา 91 เห็บซึ่งเท่ากับ 5 วินาที


โปรแกรมนี้ไม่เป็นไปตามข้อกำหนดล่าสุด: "ผลลัพธ์จะต้องอยู่ในรูปของคลื่นไซน์" SOUNDคำสั่งใช้ลำโพง PC ซึ่งออกแบบโดยใช้ชิปจับเวลา 8254 ซึ่งสร้างคลื่นสี่เหลี่ยม --- แม้ว่าในพีซีที่ทันสมัย ​​8254 อาจหายไปการจำลองที่ถูกต้องของSOUNDคำสั่งควรสร้างคลื่นสี่เหลี่ยม
pabouk

3
ข้อกำหนดนี้เพิ่มเข้ามาหลังจากที่ฉันโพสต์คำตอบของฉัน : / ฉันจะเพิ่มบันทึกย่อ แต่ฉันรู้สึกแปลกเกี่ยวกับการลบคำตอบนี้เมื่อมีการลงคะแนนด้านบน
ลินน์

12

Python2, 40 ไบต์

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

ใช้ได้กับ Windows เท่านั้น


1
จะ5e3ทำงานอย่างไร
Lynn

3
@Mauris ไม่ฉันได้ลองแล้ว แต่มันต้องการจำนวนเต็มเท่านั้น
orlp

10

Mathematica ขนาด 42 ไบต์

ถ้าเราใช้บิวด์อิน ...

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

ขอขอบคุณที่ต้องการสำหรับโปรแกรมเต็มรูปแบบครั้งนี้เป็นครั้งแรกที่ผมได้ใช้เคล็ดลับการเล่นกอล์ฟของฉันเพิ่งค้นพบของการใช้%(ผลการประเมินที่ผ่านมา) เพื่อบันทึกไบต์ที่สอง

Mathematica ยังมี built-in Soundซึ่งใช้ระยะห่างและระยะเวลาเป็นข้อโต้แย้ง แต่น่าเสียดายที่ pitch จะต้องได้รับเป็นโน้ตดนตรี การระบุคลื่นเสียงของคุณเองผ่านPlayดูเหมือนจะเป็นวิธีเดียวที่จะทำงานกับความถี่



7

MATLAB, 36 ไบต์

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

ขอบคุณข้อบกพร่องสำหรับการบันทึกสองไบต์


2
คุณสามารถบันทึกตัวละครตัวหนึ่งโดยใช้แทน2^-12 1/4096
ข้อบกพร่อง

โอ้ความโง่เขลาของฉัน8^-4ก็ยิ่งสั้นลง!
ข้อบกพร่อง


4

FakeASMขนาด 12 ไบต์

RDA
BEEP 5e3

ทำงานร่วมกับการดำเนินการอ้างอิงของ Windows (ดาวน์โหลด) มันเรียกBeepฟังก์ชั่นของ Windows ซึ่งเป็นคลื่นไซน์บนแพลตฟอร์มที่ทันสมัย


STDIN อยู่ที่ไหน
แมว

1
RDAอ่านตัวเลขจาก STDIN Aและทำให้มันในการลงทะเบียน
ลินน์

ฉันอ่านข้อมูลจำเพาะและพบว่าฉันลืมลบความคิดเห็นของฉัน ขอบคุณแม้ว่า
cat

4

Bash + X11, 27 20 ไบต์

xset b 9 $1 5;echo 

สิ่งนี้มี unprintable ดังนั้นนี่คือ hexdump:

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

สิ่งนี้ใช้ความถี่เป็นอาร์กิวเมนต์บรรทัดคำสั่งและเล่นเสียงบี๊บที่เหมาะสมที่ระดับเสียง 9% (เนื่องจากไม่มีการระบุปริมาณ)

(หมายเหตุ: ฉันไม่สามารถทดสอบได้เนื่องจากปัญหาบางอย่างกับคอมพิวเตอร์ของฉัน แต่ฉันแน่ใจว่าใช้งานได้ 99%)


มี \ x07 อยู่ที่นั่นไหม?
TheDoctor

ไม่ xset ทำทุกสิ่งที่ส่งเสียงบี๊บ
ปาเก็ตตี้

@TheDoctor โอ้ฉันเห็นสิ่งที่คุณหมายถึง ... มันจำเป็นต้องมี \ x07 เพื่อทำให้เกิดเสียงจริง แก้ไข
สปาเก็ตตี้

echo <BEL>โดยที่<BEL>เป็นอักขระจริงบันทึก 6 ไบต์
เดนนิส

@Dennis D'oh ขอบคุณ!
ปาเก็ตตี้

4

จาวาสคริปต์, 114 ไบต์

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

ต้องใช้เบราว์เซอร์ที่ทันสมัยใช้ความถี่ในการแจ้ง JSFiddle


นี้จะได้เล่นเป็นเวลา 5 วินาทีเพราะเรียกว่าหลังจากการตั้งเวลาเสียงจะเริ่มต้นที่prompt() new AudioContext()ผมเชื่อว่าที่สั้นที่สุดที่คุณจะได้รับนี้เป็น 115 c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}ไบต์ด้วย
user81655

ขอบคุณสำหรับหัวขึ้นฉันขอบคุณความคิดของการใช้ 'กับ' เช่นกัน
Nickson

ฉันไม่เคยเห็น<script>แท็กที่ต้องการให้ JavaScript พิจารณาว่าเป็นโปรแกรมแบบเต็มก่อนหน้านี้ ฉันคิดว่าคุณดีสำหรับ 114 นอกจากนี้การลบการpมอบหมายและเพียงแค่การตั้งค่าfrequency.value=prompt()ควรจะนำคุณลงที่ 110
Mwr247

@ Mwr247 แต่น่าเสียดายที่ user81655 ชี้ให้เห็นตัวจับเวลาที่กำหนดว่าเมื่อเสียงหยุดเริ่มเมื่อ AudioContext ถูกสร้างขึ้น ต้องแจ้งให้ปรากฏก่อนหน้านั้นหรืออินพุตช้าอาจทำให้เสียงสั้นลงหรือไม่มีเสียงเลย
Nickson

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)สิ่งนี้ช่วยประหยัด 3 ไบต์
Patrick Roberts

4

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

นี่เป็นคลื่นไซน์ที่แท้จริง ไม่มีเสียงบี๊บ ความถี่อินพุตที่ป้อนผ่านบรรทัดคำสั่ง:

./hz.sh 440

3

กำลังดำเนินการ, 148 114 106 106 ไบต์

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

(ด้วยเหตุผลบางอย่างการประมวลผลจำเป็นต้องใช้ทั้งคำสั่งนำเข้าและบรรทัดใหม่มิฉะนั้นจะไม่รู้จักห้องสมุด)

ฉันยังไม่ได้หาวิธีการส่งผ่านข้อโต้แย้งในการประมวลผล แต่ฉันรู้ว่ามันเป็นไปได้ดังนั้นรหัสนี้ต้องมีไฟล์ที่เรียกว่า "s" ในโฟลเดอร์ร่างที่มีค่าความถี่ args[0]ถ้าฉันสามารถคิดออกว่าจะผ่านในการขัดแย้งฉันสามารถใช้ทดแทนการโหลดไฟล์ที่มี


3

VB.net, 90 ไบต์ , 74 ไบต์

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

ขอบคุณ Sehnsucht

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

นี่คือโพสต์แรกของฉันดังนั้นหากฉันทำสิ่งผิดปกติโปรดแจ้งให้เราทราบ


1
ที่สามารถลดลงได้รับอาร์กิวเมนต์บรรทัดคำสั่งใน args หลักแทนMain(a()As StringและBeep(a(0),5000)ลดรวมถึง 74 ไบต์ตามเคาน์เตอร์ไบต์
Sehnsucht

2

Turbo / Borland / Free / GNU Pascal ขนาด 95 ไบต์

เนื่องจากปัญหาเกี่ยวกับฟังก์ชั่นการหน่วงเวลาบนคอมพิวเตอร์ที่ทันสมัย ​​(ดีอะไรเร็วกว่า 200Mhz) พยายามเรียกใช้ Turbo / Borland pascal สิ่งนี้อาจไม่รอ 5 วินาทีแม้จะมีไลบรารี CRT ที่แพตช์แล้ว

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

การแปลง String เป็นจำนวนเต็มสามารถทำได้สั้นลง (77 ไบต์) บน FreePascal และรุ่นที่ใหม่กว่าเนื่องจากมีStrToIntฟังก์ชัน:

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

1
เท่าที่ฉันรู้โปรแกรม Pascal จะทำงานได้ดีกับคอมไพเลอร์ทั้งหมดโดยไม่ต้องมีชิ้นProgram a;ส่วนดังนั้นคุณสามารถชนะได้ 10 ไบต์ด้วยการละเว้น
vsz

@vsz FPC อาจใช้ได้ (ดังนั้นฉันสามารถลบมันออกจากตัวอย่างที่สอง) ฉันยังต้องตรวจสอบโบราณบางอย่างเช่น TP5.5 เท่าที่ฉันจำได้ว่าพวกเขาต้องการมัน
SztupY

ข้อกำหนดระบุว่า“ ต้องป้อนข้อมูลผ่าน STDIN” ดังนั้นให้ข้ามความยาวนั้นParamStr()และRead()ตามที่ต้องการ: pastebin.com/1Tw2d0D6
จัดการ

2

Perl, 27 ไบต์

โดยทั่วไปแล้วคำตอบ Python ในเวอร์ชัน Perl (ใช้ได้กับ Windows ด้วย) หากเราอนุญาตให้ใช้โมดูล

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 ไบต์

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

คำแปลของคำตอบ bash ของฉัน ไม่ทำงานในล่ามออนไลน์ (ชัด)

ใช้อินพุตเป็นอักขระที่ไม่ใช่ตัวเลขตามด้วยความถี่ (ดังนั้นสำหรับอินพุต 440 Hz คุณสามารถทำ "a440")

คำอธิบาย

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

คำตอบที่ยอดเยี่ยม ทำได้ดีมาก
Rɪᴋᴇʀ

คุณใช้ Vitsy <3 ลูกของฉันได้รับการไถ่
Addison Crump

1

C กับ WinAPI 82 ไบต์

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

ใช้ฟังก์ชัน WinAPI Beep ()


คุณไม่จำเป็นต้องผ่าน&xไปscanfหรือ นอกจากนี้คุณสามารถประกาศxเป็นพารามิเตอร์หลักและปล่อยให้เริ่มต้นคอมไพเลอร์ชนิดของมัน
Neil

@Neil ผมไม่ทราบว่าผมพิมพ์ผิดได้โดยไม่ต้องผ่านการ&x scanf()แก้ไขทันที ขอบคุณ
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));}

"ป้อนข้อมูล" #defineจะได้รับผ่านทาง เอาต์พุตสัญญาณคลื่นวิทยุที่มีความถี่โดยประมาณของFเฮิร์ตซ์ ปัดเศษ 2 * Pi เป็น 6.3 แทนที่จะเป็น "default" 6.2831 แต่ฟังดูคล้ายกันมาก

น่าเสียดายที่นี่ไม่ค่อยมีสนามกอล์ฟเท่าไหร่


ควรป้อนข้อมูลผ่าน STDIN ไม่ใช่ฮาร์ดโค้ด
ข้อบกพร่อง

@ flawr ฉันไม่ทราบวิธีการป้อนข้อมูลที่แม่นยำบน Shadertoy โปรดให้ความกระจ่างแก่ฉัน
Kroltan

นี่เป็นภารกิจของคุณไม่ใช่ของฉัน แต่ฉันไม่รู้ Shadertoy อยู่แล้วดังนั้นฉันไม่สามารถช่วยคุณได้
ข้อบกพร่อง

@ flawr วิธีการที่มีความแม่นยำอย่างสมเหตุสมผลเพียงอย่างเดียวคือตำแหน่งเคอร์เซอร์ ดังนั้นฉันค่อนข้างติดอยู่กับคำจำกัดความ
Kroltan

คุณสามารถโหลดไฟล์ได้หรือไม่ นั่นคือสิ่งที่ฉันทำ
geokavel

0

Jolf, 4 ไบต์, ไม่ใช่การแข่งขัน

การเพิ่มภาษานี้เกิดขึ้นหลังจากการท้าทาย

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

คลื่นเริ่มต้นคือคลื่นไซน์


0

SmileBASIC ขนาด 84 ไบต์

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

แปลงจากเฮิร์ตซ์เป็นครึ่งก้าวและเล่นโน้ตที่แน่นอนด้วยค่า detune เพื่อสร้างความถี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.