Виведіть звук певної частоти


25

Це досить простий виклик, але я не зміг знайти жодного питання, яке було б схоже на нього. Завдання полягає в тому, щоб прийняти частоту за допомогою STDIN або еквівалента, а потім вивести тон, який відповідає цій частоті, в Гц, протягом 5 секунд. Наприклад

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

Правила

  • Введення даних потрібно взяти через STDIN або еквівалент вашої мови
  • Відповідь повинна бути повноцінною програмою
  • Можливо використовувати вбудовані
  • Частота буде коливатися від 50 до 5000 Гц
  • Вихід повинен відтворюватися протягом 5 секунд
  • Вихід повинен бути у вигляді синусоїди

Тестові справи

Вхід: 440

Вихід:

Вхід: 200

Вихід:

Вхід: 4000

Вихід:


  • Йдеться не про пошук мови з найкоротшим рішенням для цього (є деякі, де порожня програма виконує трюк) - це про пошук найкоротшого рішення на кожній мові. Тому жодна відповідь не буде позначена як прийнята.

  • На відміну від наших звичних правил, сміливо користуйтесь мовою (або мовною версією), навіть якщо вона є новішою, ніж ця проблема. Мови, спеціально написані для подання 0-байтової відповіді на це завдання, є чесною грою, але не особливо цікавою.

    Зауважте, що повинен бути перекладач, щоб подати заявку можна перевірити. Дозволяється (і навіть заохочується) писати цього перекладача самостійно для раніше не виконаної мови.

    Також зверніть увагу , що мови дійсно повинні в повній мірі відчути наші звичайні критерії для мов програмування .


Каталог

Фрагмент стека внизу цієї публікації генерує каталог з відповідей а) як список найкоротших варіантів для кожної мови та б) як загальний таблиця лідерів.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон 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 Це повинна бути повна програма.
Кріс Лоунам

2
Я бачу, що багато людей використовують beep()функцію. Чи гарантовано це синусоїда?
geokavel

2
System.Console.BeepРіч Windows - це синусоїда на моїй (сучасній, Windows 10) машині, тому я думаю, що це має значення. Рішення щодо PPCG зазвичай не повинні бути портативними.
Лінн

Чи є друк аудіофайлу правильним способом "вивести тон"?
Ільмарі Каронен

Відповіді:


13

QBasic, 18 байт (дискваліфіковано)

Як і згадував @pabouk, для цього використовується динамік ПК, тому він відтворює квадратну хвилю, а не синусоїду, як задає проблема. (Ця вимога була додана до проблеми після опублікування цієї відповіді, отже, і голосів.) Я все одно залишу її для нащадків.


INPUT F
SOUND F,91

Відтворюйте звук на введеній частоті 91 тиків, що дорівнює 5 секундам.


Ця програма не відповідає останній вимозі: "Вихід повинен бути у вигляді синусоїди". SOUNDКоманда використовує динамік ПК, який, як було розроблено, керувався чіпом таймера 8254, який видає квадратну хвилю. --- Хоча в сучасних ПК 8254 може бути відсутня правильна емуляція SOUNDкоманди повинна створювати квадратну хвилю.
пабук

3
Ця вимога була додана після того, як я опублікував свою відповідь. : / Я додам примітку, але мені здається дивно видаляти цю відповідь, коли вона проголосувала вгорі.
Лінн

12

Python2, 40 байт

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

Працює лише в Windows.


1
Було б 5e3працювати?
Лінн

3
@Mauris Ні, я вже пробував це, але він хоче лише цілі числа.
orlp

10

Математика, 42 байти

Добре, якщо ми можемо використовувати вбудовані ...

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

Завдяки вимозі до повноцінної програми, вперше мені вдалося скористатися моїм нещодавно відкритим наконечником використання гольфу% (результат останньої оцінки), щоб зберегти два байти.

Математика також має вбудований, Soundякий сприймає висоту та тривалість як аргументи, але, на жаль, крок повинен бути наданий як музична нота. Визначення власної звукової хвилі через, Playздається, є єдиним способом роботи з частотою.



7

MATLAB, 36 байт

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

Завдяки недостатності за збереження двох байтів.


2
Ви можете зберегти один символ, використовуючи 2^-12замість 1/4096.
flawr

Ой дурний мене, 8^-4ще коротший!
flawr


4

FakeASM , 12 байт

RDA
BEEP 5e3

Працює з реалізацією посилання Windows (завантаження) . Він називає Beepфункцію Windows , яка є синусоїдою на сучасних платформах.


Де STDIN?
кіт

1
RDAзчитує число з STDIN і вносить його в регістр A.
Лінн

Я закінчив прочитати специфікацію і помітив це, але забув видалити свій коментар. спасибі, хоча
кіт

4

Bash + X11, 27 20 байт

xset b 9 $1 5;echo 

Тут міститься недрукований файл, тож ось шістнадцятковий набір:

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

JavaScript, 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)}.
користувач81655

Дякую за голову вгору, я ціную ідею використання "з" також.
Ніксон

Я раніше не бачив <script>теги як необхідні для того, щоб JavaScript вважався повноцінною програмою. Я думаю, що ти хороший для 114. Крім того, видалення pзавдання та просто налаштування frequency.value=prompt()повинні
звести

@ Mwr247 На жаль, як вказував user81655, таймер, який визначає, коли звук зупиняється, починається при створенні AudioContext. Підказка повинна з'являтися до цього часу, або повільний введення може спричинити коротший звук або взагалі відсутній звук.
Ніксон

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)це економить 3 байти
Патрік Робертс

4

Утиліти 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

Це справжня синусова хвиля. Без звукових сигналів. Частота введення, введена через командний рядок:

./hz.sh 440

3

Обробка, 148 114 106 байт

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

(З якоїсь причини обробка вимагає використання оператора імпорту та нового рядка, інакше бібліотека не розпізнає.)

Я ще не зрозумів, як передавати аргументи в Processing, хоча я знаю, що це можливо, тому для цього коду потрібен файл з назвою "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
Це можна зменшити, замість цього аргумент командного рядка в основних аргументах Main(a()As Stringта Beep(a(0),5000)зменшення загальної кількості до 74 байт відповідно до лічильника байтів
Sehnsucht

2

Turbo / Borland / Безкоштовно / GNU Pascal, 95 байт

Через проблеми з функцією затримки на сучасних комп’ютерах (ну що-небудь швидше, ніж 200 МГц), які намагаються запустити 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 to Integer можна зробити коротше (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()
довге

2

Perl, 27 байт

В основному, Perl-версія відповіді Python (також працює лише в Windows), якщо ми дозволяємо модулі.

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 байт

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

Переклад моєї відповіді на баш. Не працює в онлайн-перекладачі (очевидно).

Приймає введення як будь-який нечисловий символ з наступною частотою (тому для входу 440 Гц ви можете зробити "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ɪᴋᴇʀ

Ви використовували Віци. <3 Моя дитина викуплена.
Аддісон Кримп

1

C з WinAPI, 82 байти

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

Використовує функцію WinAPI Beep ().


Вам не потрібно пройти , &xщоб scanf? Також ви можете оголосити xяк параметр main та дозволити компілятору за замовчуванням його тип.
Ніл

@Neil, я не знаю, як я неправильно ввів його, не переходячи &xдо scanf(). Виправлено зараз; Спасибі.
користувач2064000


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, замість "за замовчуванням" 6,2831, але звучить приблизно так само.

На жаль, тут для гольфу не так вже й багато.


Введення даних слід проводити через STDIN, а не жорстко.
flawr

@flawr Я не знаю жодних методів точного введення інформації про Shadertoy. Будь ласка, просвіти мене.
Кролтан

Це має бути вашим завданням, а не моїм. Але я все одно не знаю Шадертоя, тому не можу вам допомогти.
flawr

@flawr єдиним методом розумної точності буде положення курсору, але це доступно лише для шейдерів зображень, а не для звукових шейдерів. Так що я в значній мірі застряг з визначеннями.
Кролтан

Чи можете ви завантажувати файли? Це я і зробив.
geokavel

0

Джольф, 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)

Перетворює з Гц на півкроки і відтворює певну ноту зі значенням дету, щоб створити частоту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.