入力を使用したBPMの計算


30

経過した8つのデータポイントを使用して平均BPM(1分あたりのビート数)を計算する最短コードをプログラムします。これは私の最初の投稿であり、これに似た質問を見たことはありません。私はリズムゲームのファンなので、あなた自身のキーボードとあなた自身のリズム感覚を使ってBPMを計算するための小さな便利なツールを持っているといいでしょう...

チャレンジ

  • すべての入力は特異でなければなりません。(つまり、「入力」として「Enter」のみを押す)
  • プログラムには少なくとも9つの入力が必要です。(経過した8つのデータポイントを作成するには。)
  • プログラムは、小数点以下2桁で四捨五入されたキー入力のBPMを出力する必要があります。(つまり178.35)
  • タイミングは最初の入力から始まります。プログラムの開始ではありません

これはなので、最短の答えが勝ちです。

入力と出力の例

少なくとも1つのサンプル入力および出力を提供します。入力がどのように見えるかについての独自の説明と一致することを確認してください。

入力:

> [Enter-Key]
# User waits 1 second
...  7 more inputs
> [Enter-Key] 

出力:

> 60

現在の勝者は、Pythを使用した22バイトのKarlKastorです

勝者はPythを使用していましたが、Matlabの答えは注目に値する答えでした。


5
ハ!興味深い、PPCGへようこそ。将来の参考のため、投稿する前に課題に関するフィードバックを得ることができるサンドボックスもあります。ただし、これは非常によくできています。
魔法のタコUr

BPMの計算方法は?最初のキー入力でタイミングを開始しますか、それともコードの実行が開始されますか?外挿する前に7または8で除算しますか?
-xnor

うーん。だから、タイミングは最初のキープレスで開始する必要があります。除算については、9入力を行うように変更します(したがって、8で除算します)
-xNinjaKittyx

いい質問です!幸運
ノアクリスティーノ

回答:


1

Pyth、22バイト

 wJ.d0 mw8.Rc480-.d0J2

(はい、主要なスペースがあります)

入力は「Enter」を押すことです。

追加の出力が許可されている場合、スペースを削除して20バイトのスコアを取得できます。

実行例

説明

 wJ.d0 mw8.Rc480-.d0J2
 w                      # take the first input
                        # (space) throw the result away
  J.d0                  # store the current system time in J
       mw8              # take 8 inputs and throw the result away
                 -.d0J  # difference of current time and J
             c480       # divide 480 by this
           .R         2 # round to 2 decimal places 

9

MATLAB / Octave、58 56 55バイト

-1バイトありがとう@LuisMendo!

input('');tic;for k=1:7;input('');end;fix(48e3/toc)/100

Enterキーを9回押す必要があります。(オクターブでも動作します。)

ここで、MATLABを左、Octaveを右に表示します。


ど!しかし、round(.,2)機能しませんか、または新しいバージョンでは機能しますか?
flawr

ああ、それはMatlabでのみ動作します
ルイスメンドー

7

JavaScript(ES6)、77 74バイト

(i=8,n=Date.now,t)=>onclick=_=>(t=t||n(),i--||alert((48e6/(n()-t)|0)/100))

onclickグローバルwindowオブジェクトでイベントを作成します。ウィンドウ内の任意の場所をクリックしてビートを送信します。

テストスニペット


632.41!かなり良い計算:) +1
V.クルトワ


5

Bash +一般的なLinuxユーティリティ、58

script -tt -c'sed -n 9q'
sed '1c2k0
s/ 2/+/;$a480r/p' t|dc

5

Javascriptを、10084のおかげPowellesのおかげバイト、82 ジャスティン・マリナーは、

z=>{(a=alert)();i=0;s=(n=Date.now)();while(i++<8)a();a((48e4/(n()-s)).toFixed(2))}


1
Date.now()代わりにnew Date().getTime()との48e4代わりに使用できるはずです480000
17

また、結果を返す代わりにアラートを返し(a=alert)()、最初の使用と同様に後で使用するように変数にアラートを割り当てることができますa()
17

ああ、どうもありがとう、私は考えもしなかったし48e4、インスタンス化し、alert一緒に呼び出します:(a=alert)()
セルジュK。17年

1
sを使用するようDate.now()に切り替えて、.getTime()後でドロップすることもできます。そしてDate.now、短い名前にエイリアスを作成できます。また、z=関数を再帰的に呼び出していないため、イニシャルは必要ありません。ここでは69バイト
ジャスティンマリナー

ああ、あなたのソリューションは、チャレンジが要求するような小数点以下2桁に丸めません。
ジャスティンマリナー

4

ジャワ1.5+、345の 339 361 337バイト

インポートを修正するのを忘れてしまったことを指摘してくれたマイケルに感謝-34バイト

import java.awt.event.*;class B{public static void main(String[]a){new java.awt.Frame(){{addKeyListener(new KeyAdapter(){long x=System.currentTimeMillis();int b=0;public void keyPressed(KeyEvent e){if(e.getKeyChar()==' '&&b++==9){System.out.println(Math.round(6000000.0*b/(System.currentTimeMillis()-x))/100.0);}}});setVisible(1>0);}};}}

ユーザーがスペースバーを押すと、ユーザーの音声が聞こえます。次に、ユーザーが9回押したときに、現在のBPMをユーザーに出力します。

ここに画像の説明を入力してください

画像には、ゴルフコードにはないデバッグメッセージが含まれています。


ゴルフをしていない:

import java.awt.event.*;

class B {
    public static void main(String[] a) {
        new java.awt.Frame() {
            {
                addKeyListener(new KeyAdapter() {
                    long x = System.currentTimeMillis();
                    int b = 0;

                    public void keyPressed(KeyEvent e) {
                        if (e.getKeyChar() == ' ' && b++ == 9) {
                            System.out
                                    .println(Math.round(6000000.0 * b
                                            / (System.currentTimeMillis() - x)) / 100.0);
                        }
                    }
                });
                setVisible(1 > 0);
            }
        };
    }
}

ハイスコ​​アを取得してみてください...

KEY PRESS0 AT 250ms.
KEY PRESS1 AT 343ms.
KEY PRESS2 AT 468ms.
KEY PRESS3 AT 563ms.
KEY PRESS4 AT 672ms.
KEY PRESS5 AT 781ms.
KEY PRESS6 AT 880ms.
KEY PRESS7 AT 989ms.
485

私は、マイナーな変更を行い、あなたの代わりに7の入力のための8つのデータポイントを持つことができるので、私は9つの入力を望んでいたことを(ちょうど小さな変更する必要があります。)
xNinjaKittyx

スペースを逃した:String[]a) {new java
スティーブン

もう1つのことは、「小数点以下2桁で四捨五入されたキー押下のBPMを出力する必要がある」という要件を設定することです。これは小数点以下2桁に丸められますか?
-xNinjaKittyx

1
@xNinjaKittyxが今します。
魔法のタコUr

1
記録は、2027.03BPM xDが若干ベンチマークを改善するためにコードをわずかに変更したものです
-XtremeBaumer

3

C#(.NETコア)、193 206 189 186 155 143 137バイト

-47おかげバイトTheLethalCoder
-4おかげバイトNazar554
-16おかげバイトリュック
-2おかげバイトカミルDrakariを

_=>{var x=new long[9];for(int i=0;i<9;){Console.ReadKey();x[i++]=DateTime.Now.Ticks;}return Math.Round(48e8/(x[8]-x[0]),2);}

バイトカウントにも追加:

using System;

プログラム全体:

namespace System
{
    class A
    {
        static void Main()
        {
            Func<int, double> f = _ =>
            {
                var x = new long[9];
                for (int i = 0; i < 9; )
                {
                    Console.ReadKey();
                    x[i++] = DateTime.Now.Ticks;
                }
                return Math.Round(48e8 / (x[8] - x[0]), 2);
            };
            Console.WriteLine(f(0));
        }
    }
}

1
開始時間の最初のキーを押した後、2つの変数の1つをループの外側に置き、ループ内の別の変数を上書きする方が短いでしょう。出力値をフォーマットする必要がないと思うので+""、doubleを返すだけでも問題ありません。namespace System.Diagnostics{}おそらく短いですがDiagnosticswあまりにも完全な予選でのみ使用します。呼び出しのusing System;バイトカウントに含める必要があることに注意してくださいConsole
TheLethalCoder

2
置き換える540000.05.4e5
Nazar554

1
さてあなたは、ような何かしたい(end-start).MillisecondsとセットendstartするがDateTime.Now
TheLethalCoder

1
計算に誤りがあると思います。ReadKeyをThread.Sleep(100)に置き換えると、600 BPM未満になるはずですが、コードではそれ以上(約670 BPM)になります。式は「60秒* 1000ms /(deltaMs / 8ポイント)」で、「48e8 / deltaMs」に変換されます。また、$ "{48e8 /(d [8] -d [0])。Ticks:n2}" fo -20を返すことができます;-)
Luc

1
私はあなたが8/TimeSpan.TotalMinutes代わりに行うことによっていくつかのバイトを節約できるはずだと思います54e4/TimeSpan.TotalMilliseconds。また、クイックチェックによって「恐らくMath.round(値、2)」の代わりに使用しvalue.ToString("n2")、それは少数の括弧を必要と部分的にので、いくつかの文字を保存するように見えた
カミルDrakari

2

C ++、150バイト

#include<iostream>
#include<ctime>
#define G getchar()
void f(){G;auto s=clock();G;G;G;G;G;G;G;G;std::cout<<round(6000/(double(clock()-s)/8000))/100;}

を削除し#defineて代わりに行うと5バイト節約できますvoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem

いいえ、私がそれを行うと、タイミングは最初の入力の前に開始されるので、タイミングは最初の入力で開始すると言われています。プログラムの開始ではありません
-HatsuPointerKun

それは、変更ライン3にすることが可能であろう#define G;getchar()し、その後変更clock();Gclock()G
ザカリー

@Zacharý構文エラーが表示されます
-HatsuPointerKun

何らかの理由で、私のコンパイラはについて不満を言っていroundます。
ザカリー

2

Python + curses、122バイト

import curses as C,time as T
s=C.initscr()
C.cbreak()
t=0
exec's.getch();t=t or T.time()'*9
print'%.2f'%(540/(T.time()-t))

cursesモジュールをロードする必要があります。

フェリペ・ナルディ・バティスタのおかげで-9バイト


cursesモジュールは何をしますか?あなたを呪います?
魔法のタコUr

@MagicOctopusUrnもちろん、それは確かにそれがすることです。
ハイパーニュートリノ

time()は、プログラムの実行時ではなく、最初の入力時に開始する必要があります。
-xNinjaKittyx

@xNinjaKittyx修正; 感謝
HyperNeutrino

@MagicOctopusUrnジョークはともかく、ターミナルベースのGUIライブラリです。
Kroltan

2

vba、57

msgbox"":x=timer:for i=1to 8:msgbox"":next:?480/(timer-x)

Enterキーを押すか、メッセージボックスで[OK]をクリックします。



1

Java 8、180 135バイト

@SocraticPhoenixがSystem.in直接使用することを提案してくれたおかげで-45バイト。

x->{System.in.read();long t=System.nanoTime(),i=0;for(;i++<8;System.in.read());System.out.printf("%.2f",4.8e11/(System.nanoTime()-t));}

スローする関数インターフェイスメソッドに割り当てる必要がある未使用の引数を持つ匿名ラムダ関数Exception(以下の例を参照)。コンソールから読み取ります。を押すとビートが送信されenterます。

Ungolfed w / Surrounding Test Code

public class A {
    interface F{void f(Object x) throws Exception;}

    public static void main(String[]a) throws Exception {
        F f =

        x->{
            System.in.read();
            long t=System.nanoTime(),i=0;
            for(;i++<8;System.in.read());
            System.out.printf("%.2f",4.8e11/(System.nanoTime()-t));
        }

        ;
        f.f(null);
    }
}

1
から直接読むのは短くなりSystem.inますか?
ソクラティックフェニックス

@SocraticPhoenix実際に試したことはありませんが、うまくいくようです。System.in.read()入力が受信されるまでブロックするためだけに使用します。ありがとう!回答を更新します。
ジャスティンマリナー

この lol と25559105.43 bpm
V.クルトワ

1

C#、117バイト

これが構築するC#(.NET Core)の回答が既にあります。出力用の補間文字列(.NET Coreに欠けているようです)を追加し、DateTimeの代わりに長い配列を使用していくつかのバイトを削りました。

_=>{var d=new long[9];for(var i=0;i<9;){Console.ReadKey();d[i++]=DateTime.Now.Ticks;}return$"{48e8/(d[8]-d[0]):n2}";}

人道的なバージョン

class Program
{
    static void Main()
    {
        Func<int, string> f = _ =>
        {
            var d = new long[9];
            for (var i = 0; i < 9;)
            {
                Console.ReadKey();   // Switch these two to "automate" key presses.
                //Thread.Sleep(100); 

                d[i++] = DateTime.Now.Ticks;
            }
            return $"{48e8 / (d[8] - d[0]):n2}";
        };

        var result = f(1);
        Console.WriteLine();
        Console.WriteLine(result);
        Console.ReadKey(true);
    }
}

1

R、79 84バイト

scan();s=Sys.time;x=s();replicate(8,scan());cat(round(60/as.numeric((s()-x)/8),d=2))

Enterを使用する場合にのみ機能します。これはスキャンをすぐに終了するためです。引数に明示的に使用printdigits、丸めを処理します。

> scan();s=Sys.time;x=s();replicate(8,scan());cat(round(60/as.numeric((s()-x)/8),d=2))
1: 
Read 0 items
numeric(0)
1: 
Read 0 items
1: 
Read 0 items
1: 
Read 0 items
1: 
Read 0 items
1: 
Read 0 items
1: 
Read 0 items
1: 
Read 0 items
1: 
Read 0 items
[[1]]
numeric(0)

[[2]]
numeric(0)

[[3]]
numeric(0)

[[4]]
numeric(0)

[[5]]
numeric(0)

[[6]]
numeric(0)

[[7]]
numeric(0)

[[8]]
numeric(0)

[1] 439.47

これは、1000を超えるCPMでも正しく丸められますか?
ローマングラフ

@RomanGräfおっと、いや。編集済み。
-JAD

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