입력으로 BPM 계산


30

8 개의 데이터 시점을 사용하여 평균 BPM (분당 비트)을 계산하는 가장 짧은 코드를 프로그래밍하십시오. 이것은 내 첫 번째 게시물이며 이와 비슷한 질문을 보지 못했습니다. 나는 리듬 게임의 팬이기 때문에 자신의 키보드와 자신의 리듬 감각을 사용하여 BPM을 계산할 수있는 작은 편리한 도구를 갖는 것이 좋을 것입니다 ...

도전

  • 모든 입력은 단수 여야합니다. (즉, "입력"을 "입력"으로 눌러야)
  • 프로그램은 9 개 이상의 입력을 가져야합니다. (8 개의 데이터 시점을 생성하기 위해)
  • 프로그램은 소수점 2 자리로 반올림 한 키 누르기의 BPM을 출력해야합니다. (즉, 178.35)
  • 첫 입력에서 타이밍이 시작됩니다. 프로그램을 시작하지 않음

이것은 이므로 가장 짧은 답변이 이깁니다.

입력 및 출력 예

하나 이상의 입력 및 출력 예를 제공하십시오. 입력 내용에 대한 설명과 일치하는지 확인하십시오.

입력:

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

산출:

> 60

현재 우승자는 Pyth 를 사용하여 KarlKastor에서 22 바이트

우승자가 Pyth를 사용했지만 Matlab의 대답은 주목할만한 대답이었습니다.


5
하아! 재미 있고 PPCG에 오신 것을 환영합니다. 나중에 참조 할 수 있도록 문제를 게시하기 전에 피드백을받을 수 있는 샌드 박스 도 있습니다. 그러나 이것은 꽤 잘 이루어졌습니다.
매직 문어 Urn

BPM은 어떻게 계산합니까? 첫 번째 키 누르기 또는 코드 실행이 시작될 때 타이밍을 시작합니까? 외삽하기 전에 7 또는 8로 나눕니 까?
xnor

흠 .. 따라서 첫 번째 키를 누르면 타이밍이 시작됩니다. 나누기에 관해서는, 나는 9 개의 입력을하기 위해 그것을 바꿀 것입니다 (따라서 8로 나눕니다)
xNinjaKittyx

멋진 질문입니다! 행운을 빌어 요
Noah Cristino

답변:


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 / 옥타브, 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에서만 작동합니다
Luis Mendo

7

자바 스크립트 (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

배쉬 + 일반적인 리눅스 유틸리티, 58

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

5

Javascript, Powelles 덕분에 100 , 84 , Justin Mariner 덕분에 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.
파월

또한 결과를 반환하는 대신 다시 경고하고 (a=alert)()첫 번째 사용과 같은 변수에 경고를 할당 한 다음 나중에 사용할 수 있습니다 a().
파월

아 고마워, 나는 결코 생각하지 않았고 48e4, alert함께하고 함께 부르지 않았다 (a=alert)().
Serge K.

1
s을 사용하도록 전환 Date.now()하고 .getTime()나중을 삭제할 수도 있습니다 . 그런 다음 Date.now더 짧은 이름으로 별칭 을 지정할 수 있습니다 . 그리고 z=함수를 재귀 적으로 호출하지 않기 때문에 초기 값 은 필요하지 않습니다. 아래로 69 여기 바이트
저스틴 선원에게

아, 그리고 당신의 해결책은 도전이 요구하는 것처럼 소수점 이하 2 자리로 반올림되지 않습니다.
Justin Mariner

4

자바 1.5, 345 339 361 337 바이트

가져 오기를 수정하는 것을 잊어 버린 지적 Michael 덕분에 -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
Stephen

또 다른 점은 "키 프레스의 BPM을 소수점 2 자리로 반올림해야한다"는 요구 사항을 제시했다. 이 소수점 이하 자릿수로 반올림합니까?
xNinjaKittyx

1
@xNinjaKittyx가 이제 수행합니다.
매직 문어 Urn

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
시작 시간 동안 첫 번째 키를 누른 후 루프 외부에 두 변수가 있고 루프에 다른 변수를 덮어 쓰는 것이 더 짧습니다. 출력 값을 형식화해야한다고 생각하지 않으므로 +""double을 반환하는 것만으로 도 좋습니다. namespace System.Diagnostics{}아마 짧은하지만 당신은 사용 Diagnostics상의 w그래서 완전히 그 자격이 너무 아마도 짧습니다. 통화 using System;의 바이트 수에 포함시켜야 합니다 Console.
TheLethalCoder

2
교체 540000.05.4e5
Nazar554

1
글쎄, 당신은 좋아 (end-start).Milliseconds하고 설정 end하고 start할 것 DateTime.Now입니다.
TheLethalCoder

1
계산에 오류가 있다고 생각합니다. ReadKey를 Thread.Sleep (100)으로 바꾸면 600BPM보다 약간 작아야하지만 코드는 670BPM 이상을 제공합니다. 공식은 "60e * 1000ms / (deltaMs / 8points)"여야하며 "48e8 / deltaMs"로 변환됩니다. 또한 $ "{48e8 / (d [8] -d [0])을 반환 할 수 있습니다. 틱 : 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;}

당신이를 제거 할 경우 5 바이트를 절약 할 수 #define대신 할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ý

@ Zacharý 구문 오류가 발생했습니다
HatsuPointerKun

어떤 이유로 내 컴파일러가에 대해 불평 round합니다.
Zacharý

2

파이썬 + 저주, 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로드 할 모듈을.

Felipe Nardi Batista 덕분에 -9 바이트


저주 모듈은 무엇입니까? 저주 해?
매직 문어 Urn

@MagicOctopusUrn 물론 그것이하는 일입니다.
HyperNeutrino

time ()은 프로그램 실행이 아니라 첫 번째 입력에서 시작해야합니다.
xNinjaKittyx

@xNinjaKittyx 고정; 감사합니다
HyperNeutrino

농담을 제외하고는 터미널 기반 GUI 라이브러리입니다.
Kroltan

2

VBA, 57

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

Enter 키를 누르거나 메시지 상자에서 확인을 클릭하십시오.


2

파이썬 3 , 74 바이트

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

온라인으로 사용해보십시오!

이것은 모든 입력을 한 번에 실행하지만 작동하기 때문에 TIO에서 바보 같은 숫자를 줄 것입니다. setup 매개 변수를 제외한 timeit()명령문의 실행 시간을 'input()'초 단위로 반환합니다 input(). 유효성 검증을 위해 입력 당 1 초 지연된 TIO .


1

자바 (8), (180) 135 바이트

@SocraticPhoenix가 -45 바이트를 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));}

사용되지 않는 인수를 가진 익명의 람다 함수로, 함수 인터페이스 메소드에 할당되어야합니다 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가요?
Socratic Phoenix

@SocraticPhoenix 나는 그것을 실제로 시도한 적이 없지만 작동하는 것 같습니다. System.in.read()입력을받을 때까지 차단하기 위해 사용하십시오 . 감사! 답변을 업데이트합니다.
Justin Mariner

롤 과 25559105.43 bpm
V. Courtois

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를 사용하는 경우에만 작동합니다. 스캔을 즉시 종료하기 때문입니다. 반올림을 처리 print하면서 digits인수에 명시 적으로 사용 합니다 .

> 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으로 반올림도됩니까?
로마 Gräf

@ RomanGräf 으악, 아니. 편집했습니다.
JAD

0

루비, 58 바이트

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.