กำลังคำนวณ BPM ด้วยอินพุต


30

โปรแกรมรหัสที่สั้นที่สุดที่จะคำนวณค่าเฉลี่ยของ BPM (Beats ต่อนาที) โดยใช้จุดข้อมูล 8 จุดที่ผ่านไป นี่คือโพสต์แรกของฉันและฉันไม่ได้เห็นคำถามคล้ายกับนี้ เนื่องจากฉันเป็นแฟนเกมจังหวะมันคงจะดีถ้ามีเครื่องมือขนาดเล็กที่ใช้ในการคำนวณ BPM โดยใช้แป้นพิมพ์ของคุณเองและจังหวะของคุณเอง (ถ้าคุณมี ... )

ท้าทาย

  • อินพุตทั้งหมดต้องเป็นเอกพจน์ (เช่นกดปุ่ม "Enter" เป็น "อินพุต" เท่านั้น)
  • โปรแกรมของคุณจะต้องมีอย่างน้อย 9 อินพุต (เพื่อสร้างจุดข้อมูล 8 เวลาที่ผ่านไป)
  • โปรแกรมของคุณควรส่งออก BPM ของการกดปุ่มที่ปัดเศษเป็นทศนิยม 2 ตำแหน่ง (เช่น 178.35)
  • เวลาเริ่มต้นที่อินพุตแรก ไม่เริ่มต้นโปรแกรม

นี่คือดังนั้นคำตอบที่สั้นที่สุดชนะ

ตัวอย่างอินพุตและเอาต์พุต

จัดเตรียมอินพุตและเอาต์พุตตัวอย่างอย่างน้อยหนึ่งรายการ ตรวจสอบให้แน่ใจว่าตรงกับคำอธิบายของคุณในสิ่งที่ป้อนควรมีลักษณะ

การป้อนข้อมูล:

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

เอาท์พุท:

> 60

ผู้ชนะปัจจุบันคือKarlKastorที่ 22 Bytes โดยใช้ Pyth

แม้ว่าผู้ชนะจะใช้ Pyth คำตอบของ Matlab ก็เป็นคำตอบที่น่าทึ่ง


5
ฮา! น่าสนใจยินดีต้อนรับสู่ PPCG; สำหรับการอ้างอิงในอนาคตเรามีกล่องทรายที่คุณสามารถรับข้อเสนอแนะเกี่ยวกับความท้าทายของคุณก่อนโพสต์ นี้ทำได้ค่อนข้างดีแม้ว่า
Magic Octopus Urn

เราจะคำนวณ BPM ได้อย่างไร เราเริ่มจับเวลาในการกดปุ่มครั้งแรกหรือเมื่อรหัสเริ่มทำงานหรือไม่? เราหารด้วย 7 หรือ 8 ก่อนที่จะอนุมานหรือไม่
xnor

อืม .. ดังนั้นการจับเวลาควรเริ่มจากการกดปุ่มแรก สำหรับการแบ่งฉันจะเปลี่ยนเป็น 9 อินพุท (คุณหารด้วย 8)
xNinjaKittyx

คำถามเจ๋ง! ขอให้โชคดี
Noah Cristino

คำตอบ:


1

Pyth , 22 ไบต์

 wJ.d0 mw8.Rc480-.d0J2

(ใช่มีพื้นที่ชั้นนำ)

อินพุตคือกด 'Enter'

หากอนุญาตให้ส่งออกเพิ่มเติมฉันสามารถลบช่องว่างและรับคะแนน 20 ไบต์

example execution

คำอธิบาย

 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 ครั้ง (ใช้ได้กับ Octave ด้วย)

ที่นี่คุณเห็นมันในการดำเนินการซ้าย MATLAB ขวาคู่:


D'โอ้! แต่มัน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

6

Python 3, 93 92 81 ไบต์

ที่บันทึกไว้ 11 ไบต์ขอบคุณไปยังเฟลิ

import time
a,*l,b=[input()or time.time()for i in' '*9]
print(round(480/(b-a),2))


ฉันพยายามprint('%.2f'%(480/(b-a)))และprint(f'{480/(b-a):.2f}')(python3.6 +) แต่ทั้งคู่มีจำนวนเดียวกัน
Felipe Nardi Batista


5

Javascript, 100 , 84ขอบคุณPowelles , 82 ไบต์ขอบคุณJustin Mariner

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

1
คุณยังสามารถสลับsไปใช้Date.now()และวางใน.getTime()ภายหลัง จากนั้นคุณสามารถใช้นามแฝงDate.nowเป็นชื่อที่สั้นกว่า และz=ไม่จำเป็นต้องเริ่มต้นเนื่องจากคุณไม่ได้เรียกใช้ฟังก์ชันซ้ำ ๆ ลดลงเหลือ69 ไบต์ที่นี่
Justin Mariner

อ้อและวิธีแก้ปัญหาของคุณไม่ได้เป็นทศนิยม 2 ตำแหน่งเหมือนความท้าทายที่ขอ
Justin Mariner

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 ปัจจุบัน:

enter image description here

รูปภาพมีข้อความดีบั๊กที่ไม่ปรากฏในรหัส golfed


Ungolfed:

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
Stephen

อีกสิ่งหนึ่งคือฉันใส่ข้อกำหนดที่ระบุว่า "ควรส่งออก BPM ของการกดปุ่มที่ปัดเศษเป็นทศนิยม 2 ตำแหน่ง" ทศนิยมเป็นทศนิยม 2 ตำแหน่งหรือไม่
xNinjaKittyx

1
@xNinjaKittyx ทำสิ่งนี้แล้ว
Magic Octopus Urn

1
บันทึกคือ2027.03BPM xD แก้ไขรหัสเล็กน้อยเพื่อการเปรียบเทียบที่ดีขึ้น
XtremeBaumer

3

C # (.NET Core), 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{}อาจจะสั้น แต่คุณใช้Diagnosticsบนwเพื่อให้มีคุณสมบัติอย่างเต็มที่ที่อาจจะสั้นเกินไป โปรดทราบว่าคุณควรรวมusing System;จำนวนไบต์สำหรับการConsoleโทร
TheLethalCoder

2
แทนที่540000.0ด้วย5.4e5
Nazar554

1
ดีที่คุณต้องการทำสิ่งที่ชอบ(end-start).Millisecondsและการตั้งค่าendและการstartDateTime.Now
TheLethalCoder

1
ฉันคิดว่าคุณมีข้อผิดพลาดในการคำนวณของคุณ หากคุณแทนที่ ReadKey ด้วย Thread.Sleep (100) คุณควรได้รับน้อยกว่า 600 BPM แต่รหัสของคุณให้มากกว่านั้น (ประมาณ 670 BPM) สูตรควรเป็น "60sec * 1000ms / (deltaMs / 8points)" ซึ่งแปลเป็น "48e8 / deltaMs" นอกจากนี้คุณสามารถส่งคืน $ "{48e8 / (d [8] -d [0]). ติ๊ก: n2}" สำหรับ -20 ;-)
Luc

1
ฉันคิดว่าคุณควรจะสามารถที่จะบันทึกไบต์บางส่วนโดยการทำแทน8/TimeSpan.TotalMinutes 54e4/TimeSpan.TotalMillisecondsนอกจากนี้ด้วยการตรวจสอบอย่างรวดเร็วโดยใช้ 'Math.Round (ค่า 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

ไม่เพราะถ้าฉันทำอย่างนั้นเวลาจะเริ่มต้นก่อนที่จะป้อนข้อมูลครั้งแรกในขณะที่มันบอกว่าเวลาเริ่มต้นที่การป้อนข้อมูลครั้งแรก ไม่เริ่มต้นโปรแกรม
HatsuPointerKun

เป็นไปได้ไหมที่จะเปลี่ยนบรรทัด 3 เป็น#define G;getchar()และเปลี่ยนclock();Gเป็นclock()G?
Zacharý

@ Zacharýฉันได้รับข้อผิดพลาดทางไวยากรณ์
HatsuPointerKun

roundด้วยเหตุผลบางคอมไพเลอร์ของฉันบ่นเกี่ยวกับ
Zacharý

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 ทำอะไร สาปแช่งคุณ
Magic Octopus Urn

@ MagicOctopusUrn แน่นอนว่ามันเป็นอย่างนั้น
HyperNeutrino

time () ต้องเริ่มต้นที่อินพุตแรกและไม่ทำงานเมื่อโปรแกรมทำงาน
xNinjaKittyx

แก้ไข @xNinjaKittyx แล้ว ขอบคุณ
HyperNeutrino

@MagicOctopusUrn Jokes กันมันเป็นห้องสมุด GUI ที่ใช้ terminal
Kroltan

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()' TIO ที่มีการหน่วงเวลา 1 วินาทีต่ออินพุตสำหรับการตรวจสอบความถูกต้องinput()


1

Java 8, 180 135 ไบต์

-45 ไบต์ขอบคุณ @SocialPhoenix แนะนำให้ใช้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เต้นจะถูกส่งโดยการกด

Ungolfed w / รหัสทดสอบโดยรอบ

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

@SocialPhoenix ฉันไม่เคยลองจริง ๆ แต่ดูเหมือนว่าจะทำงาน เพียงแค่ใช้System.in.read()เพื่อบล็อกจนกว่าจะได้รับการป้อนข้อมูล ขอบคุณ! จะอัปเดตคำตอบ
Justin Mariner

25559105.43 bpm กับlol นี้
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))

ใช้งานได้เมื่อใช้การป้อนเท่านั้นเนื่องจากจะสิ้นสุดการสแกนทันที ใช้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

สิ่งนี้จะปัดเศษให้ถูกต้องด้วย CPM มากกว่า 1,000 หรือไม่
Roman Gräf

@ RomanGräf woops ไม่ แก้ไข
JAD

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.