Tính toán BPM với đầu vào


30

Lập trình mã ngắn nhất sẽ tính toán BPM trung bình (Nhịp đập mỗi phút) bằng cách sử dụng 8 điểm dữ liệu thời gian trôi qua. Đây là bài viết đầu tiên của tôi và tôi chưa thấy một câu hỏi tương tự như thế này. Vì tôi là một fan hâm mộ của trò chơi nhịp điệu, thật tuyệt khi có một công cụ nhỏ tiện dụng để tính toán BPM bằng bàn phím của riêng bạn và cảm giác nhịp điệu của riêng bạn (nếu bạn có ...)

Thử thách

  • Tất cả các đầu vào phải là số ít. (tức là chỉ nhấn "enter" là "đầu vào")
  • Chương trình của bạn phải mất ít nhất 9 đầu vào. (Để tạo 8 điểm dữ liệu thời gian trôi qua.)
  • Chương trình của bạn sẽ xuất ra BPM của các phím được làm tròn ở 2 điểm thập phân. (tức là 178,35)
  • Thời gian bắt đầu ở đầu vào đầu tiên. Không bắt đầu chương trình

Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng.

Ví dụ đầu vào và đầu ra

Cung cấp ít nhất một ví dụ đầu vào và đầu ra. Hãy chắc chắn rằng chúng khớp với mô tả của riêng bạn về những gì đầu vào sẽ trông như thế nào.

Đầu vào:

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

Đầu ra:

> 60

Người chiến thắng hiện tại là KarlKastor ở mức 22 Byte bằng Pyth

Mặc dù người chiến thắng đã sử dụng Pyth, câu trả lời Matlab là một câu trả lời đáng chú ý.


5
Hà! Thú vị, chào mừng bạn đến với PPCG; để tham khảo trong tương lai, chúng tôi cũng có một hộp cát nơi bạn có thể nhận phản hồi về các thách thức của mình trước khi đăng chúng. Điều này được thực hiện khá tốt mặc dù.
Bạch tuộc ma thuật Urn

Làm thế nào để chúng tôi tính toán BPM? Chúng ta có bắt đầu tính thời gian trên lần nhấn phím đầu tiên hoặc khi mã bắt đầu chạy không? Chúng ta chia cho 7 hay 8 trước khi ngoại suy?
xnor

Hmm .. Vì vậy, thời gian nên bắt đầu trên lần nhấn phím đầu tiên. Đối với phân chia, tôi sẽ thay đổi nó để thực hiện 9 đầu vào (vì vậy bạn chia cho 8)
xNinjaKittyx

Câu hỏi hay! Chúc may mắn
Noah Cristino

Câu trả lời:


1

Bình thường , 22 byte

 wJ.d0 mw8.Rc480-.d0J2

(vâng, có một không gian hàng đầu)

Đầu vào là 'nhấn' nhấn.

Nếu đầu ra bổ sung được cho phép, tôi có thể xóa khoảng trắng và nhận được số điểm là 20 byte.

thực hiện ví dụ

giải trình

 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 byte

Cảm ơn @LuisMendo cho -1 byte!

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

Bạn phải nhấn enter 9 lần. (Cũng hoạt động trong Octave.)

Ở đây bạn thấy nó hoạt động, bên trái MATLAB, bên phải Octave:


Ôi! Nhưng round(.,2)nó không hoạt động, hoặc nó trong các phiên bản mới hơn?
flawr

Ồ, nó chỉ hoạt động trong Matlab
Luis Mendo

7

JavaScript (ES6), 77 74 byte

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

Tạo một onclicksự kiện trên windowđối tượng toàn cầu . Gửi nhịp đập bằng cách nhấp vào bất cứ nơi nào trong cửa sổ.

Kiểm tra đoạn trích


632,41! khá là tốt :) +1
V. Courtois



5

Javascript, 100 , 84 nhờ Powelles , 82 byte nhờ Justin Mariner

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


1
Bạn sẽ có thể sử dụng Date.now()thay vì new Date().getTime()48e4thay vì 480000.
powelles

Ngoài ra, bạn có thể cảnh báo kết quả trở lại thay vì trả lại và gán cảnh báo cho một biến như (a=alert)()cho lần sử dụng đầu tiên của bạn và sau đó sử dụng a().
powelles

À cảm ơn rất nhiều, tôi chưa bao giờ nghĩ đến 48e4, và xúi giục VÀ gọi alertnhau : (a=alert)().
Serge K.

1
Bạn cũng có thể chuyển ssang sử dụng Date.now(), và thả .getTime()sau. Và sau đó bạn có thể bí danh Date.nowcho một tên ngắn hơn. Và ban đầu z=không cần thiết vì bạn không gọi hàm một cách đệ quy. Xuống tới 69 byte tại đây
Justin Mariner

Ồ, và giải pháp của bạn không làm tròn đến 2 chữ số thập phân như thử thách yêu cầu.
Justin Mariner

4

Java 1.5+, 345 339 361 337 byte

-34 byte nhờ Michael chỉ ra rằng tôi đã quên sửa lỗi nhập của mình

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

Lắng nghe người dùng khi họ nhấn phím cách. Sau đó, khi người dùng đã nhấn nó 9 lần, hãy in lại cho người dùng BPM hiện tại:

nhập mô tả hình ảnh ở đây

Hình ảnh có thông báo gỡ lỗi không có trong mã golf.


Ung dung:

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

Vui vẻ thử và nhận điểm cao ...

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

Tôi đã thực hiện một thay đổi nhỏ và tôi muốn có 9 đầu vào để bạn có thể có 8 điểm dữ liệu cho đầu vào thay vì 7. (chỉ nên là một thay đổi nhỏ.)
xNinjaKittyx 24/07/17

Bỏ lỡ một không gian:String[]a) {new java
Stephen

Một điều nữa là, tôi đặt một yêu cầu có nội dung "Nó sẽ xuất ra BPM của các phím bấm được làm tròn ở 2 điểm thập phân." Liệu vòng này đến 2 chữ số thập phân?
xNinjaKittyx

1
@xNinjaKittyx hiện có.
Bạch tuộc ma thuật Urn

1
bản ghi là 2027.03BPM xD đã sửa đổi một chút mã cho một số điểm chuẩn tốt hơn
XtremeBaumer

3

C # (.NET Core), 193 206 189 186 155 143 137 byte

-47 byte nhờ TheLethalCoder
-4 byte nhờ Nazar554
-16 byte nhờ Luc
-2 byte nhờ 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);}

Cũng được thêm vào số byte:

using System;

Toàn bộ chương trình:

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
Sẽ ngắn hơn khi có hai biến có một bên ngoài vòng lặp sau khi nhấn phím đầu tiên cho thời gian bắt đầu và sau đó ghi đè lên một biến khác trong vòng lặp. Tôi không nghĩ rằng bạn cần định dạng giá trị đầu ra để chỉ cần +""hoặc thậm chí trả lại gấp đôi sẽ ổn. namespace System.Diagnostics{}có thể ngắn hơn nhưng bạn chỉ sử dụng Diagnosticstrên wđủ điều kiện mà có lẽ cũng ngắn hơn. Lưu ý rằng bạn nên bao gồm using System;trong số byte của bạn cho Consolecuộc gọi.
TheLethalCoder

2
thay thế 540000.0bằng5.4e5
Nazar554

1
Vâng, bạn sẽ làm một cái gì đó như (end-start).Millisecondsvà thiết lập endstartđể DateTime.Now.
TheLethalCoder

1
Tôi nghĩ rằng bạn đã có một lỗi trong tính toán của bạn. Nếu bạn thay thế ReadKey bằng Thread.S ngủ (100), bạn sẽ nhận được ít hơn 600 BPM, nhưng mã của bạn cung cấp nhiều hơn thế (khoảng 670 BPM). Công thức nên là "60 giây * 1000ms / (deltaMs / 8 points)" có nghĩa là "48e8 / deltaMs". Ngoài ra, bạn có thể trả lại $ "{48e8 / (d [8] -d [0]). Ticks: n2}" fo -20 ;-)
Luc

1
Tôi nghĩ rằng bạn sẽ có thể lưu một số byte bằng cách làm 8/TimeSpan.TotalMinutesthay vì 54e4/TimeSpan.TotalMilliseconds. Ngoài ra, bằng cách kiểm tra nhanh bằng cách sử dụng 'Math.Round (value, 2)' thay vì value.ToString("n2")dường như lưu một vài ký tự, một phần vì nó cần ít dấu ngoặc đơn hơn
Kamil Drakari

2

C ++, 150 byte

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

Bạn có thể tiết kiệm 5 byte nếu bạn loại bỏ #definevà thay vào đóvoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem

Không, bởi vì nếu tôi làm điều đó, thời gian sẽ bắt đầu trước đầu vào đầu tiên, trong khi đó là thời gian bắt đầu ở đầu vào đầu tiên. Không bắt đầu chương trình
HatsuPulumKun

Có thể thay đổi dòng 3 thành #define G;getchar()và sau đó thay đổi clock();Gthành clock()G?
Zacharý

@ Zacharý Tôi gặp lỗi cú pháp
HatsuPulumKun

Vì một số lý do, trình biên dịch của tôi phàn nàn về round.
Zacharý

2

Python + lời nguyền, 122 byte

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

Yêu cầu cursesmô-đun được tải.

-9 byte nhờ Felipe Nardi Batista


Mô-đun nguyền rủa làm gì? Nguyền rủa bạn?
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Tất nhiên đó là những gì nó làm.
HyperNeutrino

time () cần bắt đầu ở đầu vào đầu tiên chứ không phải lúc thực hiện chương trình.
xNinjaKittyx

@xNinjaKittyx cố định; cảm ơn
HyperNeutrino

@MagicOctopusUrn Đùa sang một bên, đó là một thư viện GUI dựa trên thiết bị đầu cuối.
Kroltan

2

vba, 57

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

nhấn enter hoặc nhấp vào OK trong hộp thông báo.


2

Python 3 , 74 byte

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

Hãy thử trực tuyến!

Điều này sẽ cung cấp cho bạn những con số ngớ ngẩn trong TIO vì nó chạy tất cả các đầu vào cùng một lúc nhưng nó hoạt động. timeit()trả về thời gian thực hiện của câu lệnh tính 'input()'bằng giây trừ tham số thiết lập input(). TIO với độ trễ 1s cho mỗi đầu vào để xác thực.


1

Java 8, 180 135 byte

-45 byte nhờ @SocPhoenix đề xuất sử dụng System.intrực tiếp.

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

Hàm lambda ẩn danh với một đối số không được sử dụng phải được gán cho phương thức giao diện chức năng ném một Exception(ví dụ bên dưới). Đọc từ bảng điều khiển; nhịp đập được gửi bằng cách nhấn enter.

Ungolfed w / Mã kiểm tra bao quanh

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
Nó sẽ ngắn hơn để chỉ đọc trực tiếp từ System.in?
Phượng hoàng Socratic

@SocPhoenix Tôi chưa bao giờ thực sự thử điều đó, nhưng nó dường như hoạt động; chỉ sử dụng System.in.read()để chặn cho đến khi nhận được đầu vào. Cảm ơn! Sẽ cập nhật câu trả lời.
Justin Mariner

25559105,43 bpm với lol này
V. Courtois

1

C #, 117 byte

Đã có câu trả lời C # (.NET Core)câu trả lời này được xây dựng. Đã thêm chuỗi nội suy (mà .NET Core dường như thiếu) cho đầu ra và cạo một số byte bằng cách sử dụng mảng dài thay vì 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}";}

Phiên bản nhân đạo

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 byte

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

Chỉ hoạt động khi sử dụng enter, vì điều đó sẽ kết thúc quét ngay lập tức. Rõ ràng sử dụng printcho digitsđối số của nó , xử lý làm tròn.

> 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

Điều này cũng làm tròn đúng với CPM lớn hơn 1000?
Roman Gräf

@ RomanGräf woops, không. Đã chỉnh sửa.
JAD

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.