Gibt einen Ton mit einer bestimmten Frequenz aus


25

Dies ist eine ziemlich einfache Herausforderung, aber ich konnte keine Frage finden, die der wirklich ähnlich war. Die Herausforderung besteht darin, mit STDIN oder einem Äquivalent eine Frequenz einzugeben und dann 5 Sekunden lang einen Ton auszugeben, der mit dieser Frequenz in Hz übereinstimmt. Beispielsweise

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

Regeln

  • Die Eingabe muss über STDIN oder die entsprechende Sprache erfolgen
  • Die Antwort muss ein vollständiges Programm sein
  • Builtins können verwendet werden
  • Die Frequenz liegt zwischen 50 und 5000 Hz
  • Die Ausgabe muss 5 Sekunden lang abgespielt werden
  • Die Ausgabe muss in Form einer Sinuswelle erfolgen

Testfälle

Eingang: 440

Ausgabe:

Eingang: 200

Ausgabe:

Eingang: 4000

Ausgabe:


  • Hier geht es nicht darum, die Sprache mit der kürzesten Lösung dafür zu finden (es gibt einige, bei denen das leere Programm den Trick macht) - hier geht es darum, die kürzeste Lösung in jeder Sprache zu finden. Daher wird keine Antwort als angenommen markiert.

  • Im Gegensatz zu unseren üblichen Regeln können Sie auch dann eine Sprache (oder Sprachversion) verwenden, wenn diese neuer als diese Herausforderung ist. Sprachen, die speziell geschrieben wurden, um eine 0-Byte-Antwort auf diese Herausforderung zu senden, sind fair, aber nicht besonders interessant.

    Beachten Sie, dass ein Dolmetscher vorhanden sein muss, damit die Einreichung getestet werden kann. Es ist erlaubt (und sogar empfohlen), diesen Dolmetscher für eine zuvor nicht implementierte Sprache selbst zu schreiben.

    Beachten Sie auch , dass die Sprachen Sie müssen erfüllen unsere üblichen Kriterien für Programmiersprachen .


Katalog

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Snippet angezeigt wird:

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


Wäre eine Funktion akzeptabel?
ein Spaghetto

@quartata Es sollte ein volles Programm sein.
Chris Loonam

2
Ich sehe, dass viele Leute eine beep()Funktion benutzen . Ist es garantiert, dass das eine Sinuswelle ist?
Geokavel

2
Windows ' System.Console.BeepDing ist eine Sinuswelle auf meinem (modernen, Windows 10) Computer, also denke ich, dass das zählt. Lösungen für PPCG müssen im Allgemeinen nicht portabel sein.
Lynn

Ist das Ausdrucken einer Audiodatei eine gültige Methode, um "einen Ton auszugeben"?
Ilmari Karonen

Antworten:


13

QBasic, 18 Bytes (disqualifiziert)

Wie @pabouk erwähnt, das die PC - Lautsprecher verwendet, so dass es eine spielt quadratische Welle, keine Sinuswelle wie das Problem fragt. (Diese Anforderung wurde zu dem Problem hinzugefügt, nachdem diese Antwort veröffentlicht wurde, daher die Abstimmungen.) Ich werde sie hier sowieso für die Nachwelt belassen.


INPUT F
SOUND F,91

Spielen Sie einen Sound mit der eingegebenen Frequenz für 91 Ticks, was 5 Sekunden entspricht.


Dieses Programm erfüllt nicht die letzte Anforderung: "Die Ausgabe muss in Form einer Sinuswelle erfolgen". SOUNDDer Befehl verwendet den PC-Lautsprecher, der wie vorgesehen von einem Zeitgeberchip 8254 angesteuert wurde, der eine Rechteckwelle erzeugt. --- Obwohl in modernen PCs 8254 fehlen könnte, sollte eine korrekte Emulation des SOUNDBefehls eine Rechteckwelle erzeugen.
Pabouk

3
Diese Anforderung wurde hinzugefügt, nachdem ich meine Antwort gepostet habe. : / Ich werde eine Notiz hinzufügen, aber ich finde es komisch, diese Antwort zu löschen, wenn es die ist, die oben gewählt wurde.
Lynn

12

Python2, 40 Bytes

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

Funktioniert nur unter Windows.


1
Würde 5e3funktionieren
Lynn,

3
@ Mauris Nein, das hatte ich schon probiert, aber es will nur ganze Zahlen.
Orlp

10

Mathematica, 42 Bytes

Nun, wenn wir integrierte Funktionen verwenden können ...

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

Durch die Forderung nach einem vollständigen Programm, war dies das erste Mal , ich hätte zu verwenden , meine vor kurzem entdeckt Golf Spitze des Verwendens% (Ergebnis der letzten Auswertung) zwei Bytes zu speichern.

Mathematica hat auch eine eingebaute Funktion, Sounddie eine Tonhöhe und eine Dauer als Argumente verwendet, aber leider muss die Tonhöhe als musikalische Note angegeben werden. Die Angabe einer eigenen Schallwelle über Playscheint die einzige Möglichkeit zu sein, mit einer Frequenz zu arbeiten.


7

C #, 80 Bytes

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

Wissen Sie, was die Alternative zu BeepJava ist?
Kritixi Lithos

7

MATLAB, 36 Bytes

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

Danke an flawr für das Speichern von zwei Bytes.


2
Sie können ein Zeichen speichern, indem Sie 2^-12anstelle von verwenden 1/4096.
Fehler

Oh dumm ich, 8^-4ist noch kürzer!
Fehler


4

FakeASM , 12 Bytes

RDA
BEEP 5e3

Funktioniert mit der Windows-Referenzimplementierung (Download) . Es ruft die Windows- BeepFunktion auf, die auf modernen Plattformen eine Sinuswelle ist.


Wo ist der STDIN?
Katze

1
RDALiest eine Nummer aus STDIN und legt sie im Register ab A.
Lynn

Am Ende habe ich die Spezifikation gelesen und bemerkt, aber ich habe vergessen, meinen Kommentar zu löschen.
Katze

4

Bash + X11, 27 20 Bytes

xset b 9 $1 5;echo 

Dies enthält einen nicht druckbaren, also hier ist ein Hexdump:

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

Hierbei wird die Frequenz als Befehlszeilenargument verwendet und der entsprechende Piepton mit einer Lautstärke von 9% abgespielt (da keine Lautstärke angegeben wurde).

(Hinweis: Ich konnte dies aufgrund von Problemen mit meinem Computer nicht testen, bin mir jedoch zu 99% sicher, dass es funktioniert.)


Ist da ein \ x07 drin?
TheDoctor

Nein, xset macht all die Pieptöne.
ein Spaghetto

@TheDoctor Oh, ich verstehe, was du meinst ... es braucht ein \ x07, um das tatsächliche Rauschen zu erzeugen. Festsetzung.
ein Spaghetto

echo <BEL>Wo <BEL>das eigentliche Zeichen ist, spart 6 Bytes.
Dennis

@ Tennis D'oh. Vielen Dank!
ein Spaghetto

4

JavaScript, 114 Bytes

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

Benötigt ein etwas topaktuelles Browser, geben Sie die Frequenz in der Eingabeaufforderung ein. JSFiddle


Dies wird 5 Sekunden lang nicht abgespielt, da prompt()es aufgerufen wird, nachdem der Audio-Timer um gestartet wurde new AudioContext(). Ich glaube, das kürzeste, was Sie bekommen können, sind 115 Bytes c=new AudioContext(p=prompt());with(c.createOscillator()){frequency.value=p;connect(c.destination);start();stop(5)}.
user81655

Vielen Dank für das Heads-up. Ich schätze die Idee, auch mit zu arbeiten.
Nickson

Ich habe bisher nicht gesehen <script>, dass JavaScript-Tags erforderlich sind, um als vollständiges Programm zu gelten. Ich denke, Sie sind gut für die 114. pfrequency.value=prompt()
Wenn

@ Mwr247 Wie user81655 leider bemerkte, startet der Timer, der festlegt, wann der Ton stoppt, wenn der AudioContext erstellt wird. Die Eingabeaufforderung muss vorher erscheinen, sonst kann eine langsame Eingabe zu kürzerem oder gar keinem Audio führen.
Nickson

p=prompt();with(new AudioContext)with(createOscillator())frequency.value=p,connect(destination),start(),stop(5)das spart 3 Bytes
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

Dies ist eine wahre Sinuswelle. Keine Pieptöne. Eingabefrequenz über die Kommandozeile eingegeben:

./hz.sh 440

3

Processing, 148 114 106 Bytes

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

(Aus irgendeinem Grund erfordert die Verarbeitung sowohl die Verwendung der import-Anweisung als auch der neuen Zeile, andernfalls wird die Bibliothek nicht erkannt.)

Ich habe immer noch nicht herausgefunden, wie Argumente an Processing übergeben werden können, obwohl ich weiß, dass dies möglich ist. Daher ist für diesen Code eine Datei mit dem Namen "s" im Skizzenordner erforderlich, die den Häufigkeitswert enthält. Wenn ich herausfinden kann, wie Argumente übergeben werden, kann ich das Laden von Dateien durch ersetzen args[0].


3

VB.net, 90 Bytes , 74 Bytes

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

Danke an Sehnsucht

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

Dies ist mein erster Beitrag. Wenn ich etwas falsch gemacht habe, lass es mich bitte wissen


1
Das könnte das Befehlszeilenargument in Haupt args reduziert wird immer statt , Main(a()As Stringund die Beep(a(0),5000)Verringerung die Gesamtzahl auf 74 - Bytes entsprechend Bytezähler
Sehnsucht

2

Turbo / Borland / Free / GNU Pascal, 95 Bytes

Aufgrund von Problemen mit der Verzögerungsfunktion auf modernen Computern (also mit einer Geschwindigkeit von weniger als 200 MHz), die versuchen, Turbo / Borland Pascal auszuführen, dauert dies möglicherweise keine 5 Sekunden, selbst bei einer gepatchten CRT-Bibliothek

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

Die Konvertierung von String in Integer kann bei FreePascal und modernen Derivaten kürzer (77 Byte) durchgeführt werden, da sie die folgende StrToIntFunktion haben:

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

1
Soweit ich weiß, funktioniert ein Pascal-Programm auch ohne diesen Program a;Teil mit allen Compilern einwandfrei. Sie können also 10 Bytes gewinnen, wenn Sie es weglassen.
vsz

@vsz FPC könnte in Ordnung sein (damit ich das aus dem zweiten Snippet entfernen kann), ich muss noch einige alte prüfen, wie TP5.5, soweit ich mich erinnere, dass sie es benötigten.
SztupY

Die Anforderungen sagen „Input muss durch STDIN genommen werden“, überspringen , so dass lange ParamStr()und gerade Read()sie bei Bedarf: pastebin.com/1Tw2d0D6
Manatwork

2

Perl, 27 Bytes

Grundsätzlich eine Perl-Version der Python-Antwort (funktioniert auch nur unter Windows), wenn wir Module zulassen.

use Audio::Beep;beep<>,5000

2

Vitsy + X11, 20 Bytes

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

Eine Übersetzung meiner Bash-Antwort. Funktioniert nicht im Online-Dolmetscher (offensichtlich).

Nimmt die Eingabe als ein beliebiges nicht numerisches Zeichen gefolgt von der Frequenz an (bei einer Eingabe von 440 Hz können Sie also "a440" eingeben).

Erläuterung

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

Coole Antwort. Gute Arbeit.
24.

Du hast Vitsy benutzt. <3 Mein Kind ist erlöst.
Addison Crump

1

C mit WinAPI, 82 Bytes

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

Verwendet die WinAPI-Funktion Beep ().


Sie nicht brauchen , um passieren &xzu scanf? Sie können xmain auch als Parameter deklarieren und den Compiler als Standardtyp festlegen.
Neil

@Neil, ich weiß nicht, wie ich es falsch geschrieben habe, ohne &xzu übergehen scanf(). Jetzt behoben; Vielen Dank.
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));}

"Eingabe" erfolgt über #define. Gibt eine Sinuswelle mit einer ungefähren Frequenz von FHz aus. 2 * Pi auf 6.3 gerundet, statt "default" 6.2831, hört sich aber ziemlich gleich an.

Leider gibt es hier nicht viel zu golfen.


Die Eingabe sollte über STDIN erfolgen, nicht fest codiert.
Fehler

@flawr Ich kenne keine Methoden zur präzisen Eingabe von Shadertoy. Bitte erleuchte mich.
Kroltan

Dies sollte deine Aufgabe sein, nicht meine. Aber ich kenne Shadertoy sowieso nicht, also kann ich dir nicht helfen.
Fehler

@flawr Die einzige Methode mit angemessener Genauigkeit ist die Cursorposition, die jedoch nur für Bild-Shader und nicht für Sound-Shader verfügbar ist. Also habe ich ziemlich viel mit Definitionen zu tun.
Kroltan

Können Sie Dateien laden? Das ist, was ich tat.
Geokavel

0

Jolf, 4 Bytes, nicht konkurrierend

Dieser Sprachzusatz kam nach der Herausforderung.

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

Die Standardwelle ist eine Sinuswelle.


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)

Wandelt von Hz in halbe Schritte um und spielt eine bestimmte Note mit einem Verstimmungswert, um die Frequenz zu erzeugen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.