用输入计算BPM


30

编写最短的代码,将使用经过的8个数据时间点来计算平均BPM(每分钟节拍数)。这是我的第一篇文章,而且我还没有看到类似的问题。因为我是节奏游戏迷,所以拥有一个便捷的小工具可以使用自己的键盘和节奏感来计算BPM(如果您有...)。

挑战

  • 所有输入必须为单数。(即仅按“输入”作为“输入”)
  • 您的程序必须至少接受9个输入。(要创建经过8个数据点的时间。)
  • 您的程序应输出按键的BPM(四舍五入到小数点后两位)。(即178.35)
  • 时序从第一个输入开始。无法启动程序

这是,因此最短的答案将获胜。

输入和输出示例

提供至少一个示例输入和输出。确保它们与您对输入外观的描述相符。

输入:

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

输出:

> 60

目前的胜利者是KarlKastor在使用Pyth 22个字节

即使获胜者使用的是Pyth,Matlab的答案也是一个值得注意的答案。


5
哈!有趣,欢迎来到PPCG;供以后参考,我们还有一个沙盒,您可以在其中发布挑战之前获得反馈。不过,这做得很好。
魔术章鱼缸

我们如何计算BPM?我们是在第一次按键时开始计时还是在代码开始运行时开始计时?在推断之前,我们要除以7还是8?
xnor

嗯。所以计时应该从第一次按键开始。至于除法,我将其更改为做9个输入(所以您除以8)
xNinjaKittyx

很酷的问题!祝你好运
诺亚·克里斯蒂诺

Answers:


1

Pyth,22个字节

 wJ.d0 mw8.Rc480-.d0J2

(是的,有一个领导空间)

输入是“输入”印刷机。

如果允许其他输出,我可以删除空格并获得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字节

感谢@LuisMendo -1个字节!

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

您必须按Enter 9次。(也在八度中工作。)

在这里,您可以看到它的运行情况,左侧为MATLAB,右侧为Octave:


天哪!但round(.,2)不起作用,还是在新版本中起作用?
瑕疵的

哦,它仅在Matlab中有效
Luis Mendo

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


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
powelles

同样,您也可以向结果发送警报,而不是返回结果,并将警报分配给变量,例如(a=alert)()您的首次使用然后再使用a()
powelles

阿感谢了很多,我从来没有想过的48e4,以及实例化和呼叫alert起来:(a=alert)()
Serge K.

1
您还可以切换s到use Date.now(),然后删除.getTime()后者。然后,您可以别名Date.now为一个较短的名称。而且由于z=不需要递归调用函数,因此不需要缩写。在此处减少
贾斯汀·马里纳

哦,您的解决方案不能像挑战所要求的那样四舍五入到小数点后两位。
贾斯汀·马里纳

4

Java的1.5+,345个 339 361 337字节

-34字节,感谢Michael指出我忘了修复进口件

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

我做了一个小小的更改,我希望有9个输入,因此您可以有8个数据点而不是7个输入。(应该是一个小小的更改。)
xNinjaKittyx

错过空间:String[]a) {new java
斯蒂芬

另一件事是,我提出了一个要求,即“它应输出按2小数点舍入的按键的BPM”。这会舍入到小数点后两位吗?
xNinjaKittyx

1
@xNinjaKittyx现在开始。
魔术章鱼缸

1
记录是2027.03BPM xD稍微修改了代码以进行更好的基准测试
XtremeBaumer

3

C#(.NET核心),193 206 189 186 155 143 137字节

-47字节感谢TheLethalCoder
-4字节感谢Nazar554
-16字节感谢Luc
-2字节感谢Kamil 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
在第一次按下按键开始时间之后,让两个变量在循环外具有一个变量,然后在循环中覆盖另一个变量,会更短一些。我不认为您需要格式化输出值,因此只需+""甚至返回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)。公式应为“ 60sec * 1000ms /(deltaMs / 8points)”,即“ 48e8 / deltaMs”。另外,您还可以返回$“ {48e8 /(d [8] -d [0])。Ticks:n2}” fo -20 ;-)
Luc

1
我认为您应该可以8/TimeSpan.TotalMinutes代替来节省一些字节54e4/TimeSpan.TotalMilliseconds。另外,通过使用'Math.Round(value,2)'进行快速检查,value.ToString("n2")似乎节省了一些字符,部分原因是它需要较少的括号
Kamil 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;}

如果删除,您可以节省5个字节#define,而是这样做void f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem

不,因为如果我这样做,则计时将在第一个输入之前开始,而据说计时从第一个输入开始。
无法

是否可以将第3行#define G;getchar()更改clock();G为然后再更改为clock()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字节归功于Felipe Nardi Batista


curses模块有什么作用?骂你吗
魔术章鱼缸

@MagicOctopusUrn当然,这就是它的作用。
HyperNeutrino

time()需要在第一次输入时开始,而不是在程序执行时开始。
xNinjaKittyx

@xNinjaKittyx已修复;谢谢
HyperNeutrino '17

撇开@MagicOctopusUrn讲,这是一个基于终端的GUI库。
Kroltan '17

2

vba,57岁

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

按Enter,或在消息框中单击“确定”。


2

Python 3,74个字节

from timeit import*;print('%.2f'%(480/timeit('input()',input(),number=8)))

在线尝试!

这将为您提供TIO中的愚蠢数字,因为它可以一次运行所有输入,但确实可以工作。 timeit()返回'input()'以秒为单位的语句执行时间,不包括setup参数input()TIO每个输入的延迟1s,以进行验证。


1

Java 8,180 135字节

-45字节,感谢@SocraticPhoenix建议System.in直接使用。

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));}

具有未使用参数的匿名lambda函数,必须将其分配给引发的功能接口方法Exception(下面的示例)。从控制台读取;通过按发送节拍enter

带周围测试代码的无高尔夫球

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()用来阻止直到收到输入。谢谢!将更新答案。
贾斯汀·马里纳

25559105.43 BPM与洛尔
五库尔图瓦

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,这是否也可以纠正?
罗曼·格拉夫(RomanGräf)

@RomanGräf哇,不。编辑。
JAD

0

Ruby,58个字节

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.