メトロノームの構築


36

前書き

数日前、何かのためにメトロノームが必要でした。利用できるものがなかったため、App Storeからアプリをダウンロードしました。アプリのサイズは71 MBでした!!!
三目並べの作成に71 MB ...?!
それで、コードゴルフが私の頭に浮かびました。

チャレンジ

サウンドを出力するコードをゴルフします。どんな音なのかはまったく無関係です。必要に応じてサウンドファイルを作成します...しかし、システムビープ音も同様に機能します。(ここに私が作成したサウンドがあります...特別なものはありません。

入力:メトロノームが出力する1分あたりの拍数。

これは非ゴルフJavaバージョンです!タスクを表示するだけです。

public class Metronome {
  public static void main(String[] args) throws InterruptedException {
    int bpm = Integer.valueOf(args[0]);
    int interval = 60000 / bpm;

    while(true) {
        java.awt.Toolkit.getDefaultToolkit().beep();
        // or start playing the sound
        Thread.sleep(interval);
        System.out.println("Beep!");

    }
  }
}

ルール

外部ライブラリを使用することはできません。言語自体のツールのみが許可されます。
ソースコードのバイトのみがカウントされます...サウンドファイルはカウントされません。

これはであるため、バイト数が最小の提出が勝ちです!

編集:

出力例:したがって、このようなものは120 bpsの出力になります:link


1
I / Oの例をいくつか追加できますか(サウンドを録音してアップロードし、リンクをここに投稿してください)?
アディソンクランプ

2
質問:「外部ライブラリ」と言うとき、その言語で提案されているライブラリが含まれますか?(これは使用しませんが、例はVitsyにあり、シェルまたはJSにアクセスできます(ただし、JSは組み込みです))
Addison Crump


1
ダウンロードしたアプリの大部分は、かなりのグラフィックスと効果音だと思います。それは...何もしませんが、何とかMBの数十を使用するように管理し、まだすべてが白いが、画面に変わり、それらの懐中電灯アプリのようなものだ
ダレル・ホフマン

1
精度の要件は何ですか?サンプルでは、​​両方のbeep()出力とコンソール出力は、正確なインスタントIIRCではありません。どちらもsleep()正確だとは知られていない。
Num Lock

回答:


19

Mathematica、26バイト

Pause[Beep[];60/#]~Do~∞&

Doそれぞれのコードのこの部分を繰り返します。通常、最も狭い意味での「ため」ループとして使用されているiからxy...あるいは単にコードのこの部分繰り返しn回。数の代わりにn、無限ループを作成するために無限を与えることができます。ループ本体は、関数の引数がどこにあるかPause[Beep[];60/#]を書くための単なるゴルフ法です。Beep[];Pause[60/#]#

ソリューションが最終的にコールスタックを爆破することが許容される場合、再帰的なソリューションで1バイトを節約できます。

#0[Beep[];Pause[60/#];#]&

それ~Do~∞が可能だとは知りませんでした。Forループは、わずか29バイトに私を得ました。(また、26バイトバージョンが唯一の有効なバージョンであると個人的に信じています。)
LegionMammal978

@ LegionMammal978残念ながら、変数から来る~Do~∞場合は機能しないようです。(私はあなたの真実マシンをゴルフするときにそれを使ってみました。)
マーティンエンダー

1
Attributes[Do]が含まれているHoldAllので、私の推測では_~Do~∞特別な評価パターンがあります。
LegionMammal978

@ LegionMammal978 無限大を保持しているDo[...,a]場所のエラーメッセージはa実際に呼び出しを示すため、変数のように見えますDo[...,{a}]
マーティンエンダー

14

Pyth、11 10 9バイト

について私に思い出させてくれたアドナンに感謝し#ます。

#C7.dc60Q

永久(#)、Charコードを出力します7。次に、スリープ(.d60秒を(c)入力(Q)で除算します。


@Adnanはそのことを忘れました。ありがとう。
-PurkkaKoodari

スペースが必要ですか?
リトシアスト

@ThomasKwaはい。IIRC 7.は数値として解析されます。
コナーオブライエン

5
ああ。#pythnoob
コナーオブライエン

2
試したときに、.dをスリープさせることができませんでした。Unix時間を印刷し続けました
-busukxuan

8

JavaScript、36 45 42 41 34バイト

@RikerWのおかげで1バイト節約

@ETHproductionsのおかげで1バイト節約

n=>{for(;;sleep(60/n))print("\7")}

これは機能です。

を使用する場合`\7`、SpiderMonkeyは8進数リテラルが非推奨であると文句を言います。

代替、31バイト

n=>{for(;;sleep(60/n))print``}

問題は、印刷できないものが削除されることですが、これは機能するはずです。


くそー、私はちょうどこのような何かを投稿しようとしていた。別のアプローチを使用しているため、(ノードとすべてを使用するため)まだ投稿します。
アディソンクランプ

私が質問した方法から見ると、再帰的な解決策は不可能です。メトロノームは仕事と仕事のために作られています...しばらくしてからクラッシュするためではありません。
PEAR

@PEAR変数はインクリメントされないため、クラッシュすることはありません。クラッシュを引き起こす可能性がある唯一のものは、50
です-Downgoat

これはどの環境で実行されますか?chromeとNode.jsを試しましたが、動作させることができません。
starbeamrainbowlabs

@starbeamrainbowlabsこれはJavaScriptシェル(SpiderMonkey)を使用しています
-Downgoat

8

Bash、53 55 41バイト

14バイトを削る@Dennisに感謝します1

わかりました、真実の時間:私はゴルフbashでひどいです。どんな助けもとても感謝しています。

echo " ";sleep `bc -l<<<60/$1`;exec $0 $1
      ^ That's ASCII char 7

1聖なるがらくた。誰もデニスをアウトゴルフできないのも不思議ではない


であるwhile 1可能性?
PEAR

@PEAR Nupe-すでに試しました。
アディソンクランプ

while printf \\aたぶん?
ニール

bashは整数除算を使用するため、これは機能しません。を使用する必要がありますbc
spaghetto

1. BEL文字はBashにとって特別なものではないため、引用符は必要ありません。2.入力をCLAとして読み取る場合、必要はありませんread。3. echoコード0で存在するため、の代わりにそのステートメントを使用できますtrue
デニス

7

JavaScript ES6(ブラウザー)、43バイト

これはルールを拡張している可能性があります。

x=>setInterval('new Audio(1).play()',6e4/x)

この関数に名前(例F=x=>...)を付けて、このページのブラウザコンソールに入力します。次に、bpsなどで関数を呼び出し、F(60)魔法が発生するまで待ちます。:-)

なぜこれが機能するのですか?まあ、b.htmlという名前のファイルと同じフォルダーにあります1。これは、OPからのサンプルサウンドファイルです。これがルール内にあるかどうかはわかりませんが(シェルバージョンに似ていると思います。特定の環境で実行する必要があります)、一見の価値がありました。

より安全なバージョン、57バイト

上記のコードが何らかの理由で許可されない場合、代わりにこれを試してください:

x=>setInterval('new Audio("//ow.ly/Xrnl1").play()',6e4/x)

どのページでも機能します!


これは興味深いソリューションです。ファイルをダウンロードして名前を変更すると、さらに短くなりますよね?
PEAR

@PEARこれは短くなりますが、実行するには同じフォルダー内のサウンドファイルを含む独自のWebページが必要になります。
ETHproductions

ああ、それはJavaScriptのxDさんだ...あなたしている右
PEAR

@PEARそこに行った。この新しいソリューションはルール内ですか?
ETHproductions

ほら 特定のWebページでJSであることを指定できます。これは既存のインタープリターなので、有効な言語です。
アディソンクランプ

6

05AB1E、31バイト

コード:

I60s/[7ç?D.etime.sleep(#.pop())

N秒待機するビルトインがある場合、これは11バイトでした。残念ながら、そうではありません。説明は次のとおりです。

I                               # Push input
 60                             # Push 60
   s                            # Swap the top 2 items
    /                           # Divide the top 2 items
     [                          # Infinite loop
      7ç                        # Push the character \x07
        ?                       # Output it, which give a sound
         .e                     # Evaluate the following as Python code
           time.sleep(       )  # Wait for N seconds
                      #         # Short for stack
                       .pop()   # Pop the last item

ISO 8859-1エンコードを使用します。


これは最初の05AB1Eの答えの一つは、それが見て非常に奇妙に見えるo.Ôでなければなりませんtime.sleepし、.pop()そのようなコードの真ん中に。;)
Kevin Cruijssen

6

osascript、39バイト

on run a
repeat
beep
delay 60/a
end
end

文字通りビープというコマンドがありますか?スウィーエット!

ライセンスが制限されているためMac OS Xでのみ実行可能ですが、実行するには次のようにします。

osascript -e "on run a
repeat
beep
delay 60/a
end
end" bpm

6

Python、68 67 57バイト

@FlagAsSpamのおかげで1バイト節約

@Adnanのおかげで9バイト節約

import time
a=input()
while 1:print"\7";time.sleep(60./a)

また、行末をUNIX形式に変換した後、2バイト少なくなりました。

古いバージョン、実際にはコマンドライン引数としてbpmを使用します(66バイト):

import sys,time
while 1:print"\7";time.sleep(60./int(sys.argv[1]))

4
できませんかprint"\7";?よくわかりませんが、うまくいくと確信しています。
アディソンクランプ

@Andanいいえ、input()はユーザーからの入力を要求します。それが有効な入力と見なされるかどうかはわかりません。とにかく数値への変換も必要です。
-webwarrior

1
どの程度a=input()a交換しますかint(sys.argv[1])?Python 2は入力を自動的に評価するので、int変換は必要ないと思っていましたが、間違っているかもしれません。
アドナン

@Andanはinput()実際に自動評価を行います。私はその機能を忘れていました。しかし、それはかなり素朴です-おそらく昔からの遺産です。
webwarrior

完全に削除しながら、time.sleep(60./a)に置き換えることができますか?time.sleep(60./input())a=input()
クラップ


4

Vitsy、14バイト

a6*r/V1m
<wVO7

詳細モード(インタープリターは近日公開予定):

0:                              // a6*r/V1m
push a; // 10
push 6;
multiply top two; // 60
reverse stack; // bpm on top
divide top two; // bpm/60
save/push permanent variable; 
push 1;
goto top method; // goes to 1
1:                              // <wVO7
go backward; // infinite loop, from the bottom of 1
wait top seconds;
save/push permanent variable; // pushes the bpm in terms of seconds of delay
output top as character;
push 7;

基本的に、w演算子を使用して、で指定された一定の秒数だけ待機bpm/60し、無限ループにラップします。次に、ASCII文字7(BEL)の端末出力でノイズを発生させます。


良さそうに見えますが、これをどのようにテストできますか?:)
PEAR

@PEAR 通訳をダウンロードする必要があります(タイトルにリンクするのを忘れました)。ファイルに保存し、で実行しjava -jar Vitsy.jar <filename>ます。
アディソンクランプ

4

C#、118バイト

class A{static int Main(string[]a){for(;;System.Threading.Thread.Sleep(60000/int.Parse(a[0])))System.Console.Beep();}}

基本的なソリューション。


ASCII char 7を印刷しないのはなぜですか?
アディソンクランプ

@FlagAsSpamより長い:システムのビープ音はを使用しSystem.Console.Beep();、キャラクターの印刷はを使用しSystem.Console.Write('<\a character>');ます。
LegionMammal978

わあ キャラクターを書くのはたくさんあります。
アディソンクランプ

4

Java、103 82バイト

21バイトを削る@Justinに感謝します!

ああ、そうだ。

void x(int b)throws Exception{for(;;Thread.sleep(60000/b))System.out.print('\7');}

サンプルプログラムのメソッドとゴルフバージョン。


なぜではSystem.out.print('\7');なくjava.awt.Toolkit.getDefaultToolkit().beep();
ジャスティン

@Justin \は、正規表現文字のエスケープ専用です。
アディソンクランプ

1
バックスラッシュはエスケープシーケンスではありません。'\7'はベル文字です。印刷すると音がします
ジャスティン

@ジャスティン・フー。私は常にそれについてエラーを投げました(二重引用符を使用している場合)。私の間違い。ありがとう!:D
アディソンクランプ

3

GMC-4マシンコード、21.5バイト

GMC-4は、簡素化された命令セットとコンピューターでアセンブリ言語の原理を教えるために、学研と呼ばれる会社が開発した4ビットコンピューターです。このルーチンは、データ・メモリ・アドレスに入力を受け取り0x5Dを通じて0x5Fビッグエンディアン小数で、(ニブルごとに、1桁です)。

アルゴリズムは基本的に、入力をメモリに追加し、少なくとも600になるまで0.1秒待ってから、無限ループで600を減算してビープ音を鳴らします。GMC-4には多数のレジスタスワップ機能がありますが、レジスタコピー機能はないため、これは難しい方法です。

16進数(2行目はメモリ内の位置):

A24A14A04 80EC AF5A2EF AE5A1EF AD5A0EF 8A6 F2AF09 86ADEEE9F09
012345678 9ABC DEF0123 4567890 ABCDEF0 123 456789 ABCDEF01234

組み立て中:

    tiy 2     ;ld y, 0x2
    AM        ;ld a, [0x50 + y]
    tiy 1
    AM
    tiy 0
    AM
start:
    tia 0     ;ld a, 0x0
    cal timr  ;pause for (a+1)*0.1 seconds
    tiy F
    MA        ;ld [0x50 + y], a
    tiy 2
    cal DEM+  ;add a to [0x50 + y]; convert to decimal and carry.
    tiy E     ;do the same for the second digit
    MA
    tiy 1
    cal DEM+
    tiy D     ;and the third.
    MA
    tiy 0
    cal DEM+
    tia A
    M+
    jump beep
    jump start
beep:
    tia 6
    tiy D
    cal DEM-
    cal SHTS  ;'play short sound'
    jump start

免責事項:

私は実際にGMC-4を所有していません。私はこのプログラムをオンラインのドキュメントで細心の注意を払ってチェックしましたが、間違いを犯した可能性があります。私もエンディアンを知りません。GMC-4はビッグエンディアンのように見えますが、よくわかりません。誰かがGMC-4を所有していて、これを確認したり、GMC-4のエンディアンを教えてくれたりすることができれば、とても感謝しています。


3

C、48バイト

void f(int b){while(printf(""))Sleep(60000/b);}
                            ^ literal 0x07 here

Windows専用のソリューション(具体的には、Sleep()関数)。

また、(f)printf()が無限ループ条件として使用するために印刷された文字数を返すという事実を使用しました。

printf()呼び出しの二重引用符の間には文字がありますが、何らかの理由でここには表示されません。疑わしい場合は、Sublime Text 2またはNotepad ++にコピーして貼り付けてくださいBEL。文字はとして表示されます。

これはC ++ソリューションとして始まりましたが、C ++のCサブセットに少し落ちました(ご存知のようにSleep()、少し短いためstd::this_thread::sleep_for(std::chrono::milliseconds()))、printf()短いstd::cout<<)。


3

AppleScript 94バイト

私はかなり遅れていることを知っています、そして、これはここでの私の最初の投稿ですが、何でも。

表示ダイアログ ""デフォルトの回答 ""
xを60000 /返される結果のテキストに設定します
繰り返す
ビープ
遅延x
終わり

ゴルフをしていない:

表示ダイアログ ""デフォルトの回答 ""
xを60000に設定する/(結果のテキストが返される)
繰り返す
    ビープ
    遅延x
終わりの繰り返し

) -しかし、おかげでたくさん;ねえ、新しい答え:)残念ながら私は、私はマックを持っていない場合を除き、あなたのポストを試すことができないんだ
PEAR

@PEARどういたしまして。:)
あなた

プログラミングパズルとコードゴルフへようこそ。これは良い答えです、+ 1。答え続けてください!
wizzwizz4

2

VBScript、113 66バイト

a=InputBox("")
Do
WScript.Echo(Chr(7))
WScript.Sleep(60000/a)
Loop

このプログラムは非常に簡単です。入力を受け取り、BEL文字をエコーし​​て待機します。プログラムのほぼ半分を削減したNielに感謝します!


何が問題なのWScript.Echo CHR(7)ですか?また、意味60000ですか?
ニール

@ニールああ、はい。それらを忘れました。
コナーオブライエン

2

ルビー、37 33バイト

m=->b{loop{puts"\7"
sleep 6e1/b}}

とても簡単です。

これはラムダ関数です。60 bpmが必要な場合は、次のようにしますm[60]


理論的に$><<?\aは、ビープ音でも動作するはずです。また、プロシージャの名前を指定する必要はありません(ファットアロー関数を使用するすべてのJavaScriptソリューションも未割り当てのままにします)->b{loop{$><<?\a;sleep 6e1/b}}[60]。匿名で呼び出すこともできます。
マナトワーク

@manatwork Ruby 2.xしか持っていないので、テストできませんでした?\a。Ruby 1.xをお持ちですか?その場合、これが機能することをテストできますか?
ジャスティン

まあ、私はRuby 1.9.3を持っていると、コードはそれでエラーを発生させません。しかし、テストには別の問題があります。マシンでビープ音が鳴りません。Rubyも何もありません。一度設定すると、何がわからない。
マナトワーク

2

Japt、30バイト

6e4/U i`?w Au¹o('../1').play()

?リテラルバイトでなければなりません9Aオンラインでテストしてください!(ポップアップが最初の数ビートを遅らせるのでごめんなさい。これはすぐに削除されます。)

使い方

6e4/U i"new Audio('../1').play()  // Implicit: U = input bps
6e4/U                             // Calculate 60000 / U.
      i                           // Set a timed event every that many milliseconds,
       "new Audio('../1').play()  // running this code every time.
                                  // ../1 is the path to the file used in my JS entry.

2

おたふく風邪、18バイト

R I F  H 60/I W *7

BPMを変数Iに読み込むと、F {後に2つのスペースが続く}は無限ループになります。60秒/ BPM停止してから、$ CHR(7){Ascii:BEL}を標準出力に書き込み、必要なオーディオ出力を与えてから、無限ループで再起動します。


2

Java、321文字

とてもいいですね。MIDIがサポートされているシステムでのみ機能します。

import javax.sound.midi.*;import java.util.*;class A{public static void main(String[] a) throws Exception{int d=new Scanner(System.in).nextInt();Synthesizer b=MidiSystem.getSynthesizer();b.open();MidiChannel c=b.getChannels()[0];c.programChange(116);while(true){c.noteOn(0,100);Thread.sleep((int)(d/.06));c.noteOff(0);}}}


ルックスの素敵は、これは私のために動作しません:pastebin.com/0CbGYkU0
PEAR

@PEARが修正されました。キャストを忘れました。
username.ak

@PEARとインポート
username.ak

@PEAR、私は理由がない音の一部OPS入れ替えていた
username.ak

2

ChucK、90バイト

2ティックごとにオン/オフされるホワイトノイズ。

60./Std.atoi(me.arg(0))*1000=>float s;while(1){Noise b=>dac;s::ms=>now;b=<dac;s::ms=>now;}

説明

60./Std.atoi(me.arg(0)) //Convert the input to an int and divide 60 by it
*1000                   //Multiply by 1000 (in order to avoid s::second)
=>float s;              //Store it as a float in variable s
while(1)                //Forever,
{Noise b=>dac;          //Connect a noise generator b to the audio output
s::ms=>now;             //Wait for s milliseconds
b=<dac;                 //Disconnect b from the audio output
s::ms=>now;}            //Wait for s milliseconds

これは、ビートでサウンドをオンにし、その後ビートでサウンドをオフにするために行われます。

98 93バイトバージョン(ファンシー)

ホワイトノイズはティックごとに10ミリ秒間再生されました。

60./Std.atoi(me.arg(0))*1000-9=>float s;while(1){Noise b=>dac;10::ms=>now;b=<dac;s::ms=>now;}

これは、一定のノイズをオンまたはオフにするのではなく、クリックになるようにします。


2

Perl 5、36バイト

{{$|=print"\a";sleep 60/$_[0];redo}}

サブルーチン; として使用する

sub{{$|=print"\a";sleep 60/$_[0];redo}}->(21)

sleep秒単位であるため、毎分60回を超えるビープ音を鳴らすことはできません。それが要件かどうかはわかりません。また、おそらく同じバイトカウントを維持できますが、次のようなことを行うことで完全なプログラムを使用$|=<>;{print"\a";sleep 60/$|;redo}できます(今はテストできません)。
ChatterOne

@ChatterOne、そのドキュメントによると、あなたは正しいですsleep。しかし、それは私のために働いた。
msh210

1

Jolf、7バイト、非競合

この非常にすばらしい挑戦がなされた後、音を追加しました。

TΑa/Αaj
T       set an interval
 Αa      that plays a short beep (Α is Alpha)
   /Αaj  every 60000 / j (the input) seconds. (Αa returns 60000)

この音をクリアしたい場合は、出力に注意してください。その数はであると言いxます。別のJolfコマンドを実行する~CP"x"と、間隔がクリアされます。


1

Zsh、32バイト

<<<$'\a'
sleep $[60./$1]
. $0 $1

主要なbashの回答に基づいていますが、sourcesではなくexecsです。TIO $0:aは、元のファイルの実行方法によりソースをリンクしますが、それがなくても機能します。

オンラインでお試しください!


あなたはパーティーに遅れていますが、これは本当に素晴らしい解決策のように見えます!
PEAR

私は遅れていることは知っていますが、今日はゴルフをしたい気分でした。楽しさのために音楽タグをチェックすることにし、この課題を見つけました。良いもの、ところで!
GammaFunction

0

Bash + bc + > <>、44バイト

> <>インタープリターを使用すると、ティック時間を定義できるという事実で遊ぶ:

python fish.py -t $(bc -l<<<"2/$1/60") -c 7o

> <>コードは7oBEL文字を出力し、システムビープ音を鳴らします。中断されるまでループします。値は(2 / RPM)毎秒/ 60それほどコード全体が再生されることRPM * 60倍に設定されています。
-t


公開後しばらくしてから新しい回答をありがとう。私のために動作しません:(私のシステムまたは他の何かの問題かどうかわからない。私はGitHubからfish.pyをダウンロードし、コンマ(openSUSE)を実行した。このエラーが出た:(standard_in)1:構文エラーの使用:fish .py [-h](<script file> | -c <code>)[<options>] fish.py:エラー:引数-t /-tick:引数が1つ必要
PEAR

あなたが持っているbcインストールされていますか?$(bc -l<<<"2/$1/60")は何も出力しなかったようです。回答の言語のリストに追加します。回答をまだ完全にテストすることができていないため、何らかのエラーが発生する可能性があります。
アーロン

0

SmileBASIC、26バイト

INPUT B$BGMPLAY@8T+B$+"[C]

9を超えるものはより多くのバイトを使用しますが、一般的なMIDI楽器を再生できます。


0

スタックス、17バイト

ü7»♥O╚⌂╥☻≈OyM╜Δ∩`

または、開梱:

4|A48*x/W2|A]pc{| }*

プログラムは、デフォルト設定でコマンドラインツールを使用して再生すると、メトロノームノイズを生成するバイトを出力します。入力はbpmとして使用されます

例:

example-stax-interpreter metronome.stax -i "60" | aplay

希望のbpmで恐ろしいビープ音が聞こえます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.