Menghitung BPM dengan input

30

Program kode terpendek yang akan menghitung rata-rata BPM (Detak per Menit) menggunakan 8 titik data waktu berlalu. Ini adalah posting pertama saya, dan saya belum melihat pertanyaan yang mirip dengan ini. Karena saya penggemar permainan rhythm, alangkah baiknya memiliki alat praktis kecil untuk menghitung BPM menggunakan keyboard Anda sendiri dan rasa ritme Anda sendiri (jika Anda punya ...)

Tantangan

  • Semua input harus tunggal. (Yaitu Hanya menekan "enter" sebagai "input")
  • Program Anda harus mengambil setidaknya 9 input. (Untuk membuat 8 titik data waktu berlalu.)
  • Program Anda harus menampilkan BPM dari penekanan tombol yang dibulatkan pada 2 titik desimal. (yaitu 178,35)
  • Pengaturan waktu dimulai pada input pertama. Tidak memulai program

Ini , jadi jawaban terpendek menang.

Contoh Input dan Output

Berikan setidaknya satu contoh input dan output. Pastikan mereka cocok dengan deskripsi Anda sendiri tentang bagaimana seharusnya input itu.

Memasukkan:

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

Keluaran:

> 60

Pemenang saat ini adalah KarlKastor dengan 22 Bytes menggunakan Pyth

Meskipun pemenang menggunakan Pyth, jawaban Matlab adalah jawaban penting.

xNinjaKittyx
sumber
5
Ha! Menarik, selamat datang di PPCG; untuk referensi di masa mendatang kami juga memiliki kotak pasir di mana Anda bisa mendapatkan umpan balik tentang tantangan Anda sebelum mempostingnya. Ini dilakukan dengan cukup baik.
Magic Gurita Guci
Bagaimana kita menghitung BPM? Apakah kita mulai menghitung waktu pada penekanan tombol pertama atau ketika kode mulai berjalan? Apakah kita membaginya dengan 7 atau 8 sebelum melakukan ekstrapolasi?
xnor
Hmm .. Jadi waktunya harus dimulai pada penekanan tombol pertama. Adapun divisi, saya akan mengubahnya untuk melakukan 9 input (sehingga Anda membaginya dengan 8)
xNinjaKittyx
Pertanyaan keren! Semoga berhasil
Noah Cristino

Jawaban:

1

Pyth , 22 byte

 wJ.d0 mw8.Rc480-.d0J2

(ya ada ruang terkemuka)

Input adalah tekan 'enter'.

Jika output tambahan diizinkan, saya dapat menghapus spasi dan mendapatkan skor 20 byte.

contoh eksekusi

penjelasan

 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 
KarlKastor
sumber
9

MATLAB / Oktaf, 58 56 55 byte

Terima kasih @LuisMendo untuk -1 byte!

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

Anda harus menekan enter 9 kali. (Juga berfungsi di Oktaf.)

Di sini Anda melihatnya beraksi, kiri MATLAB, oktaf kanan:

cacat
sumber
Doh! tetapi round(.,2)apakah tidak berhasil, atau apakah itu dalam versi yang lebih baru?
flawr
Oh, itu hanya berfungsi di 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))

Membuat onclickacara pada windowobjek global . Kirim ketukan dengan mengklik di mana saja di jendela.

Cuplikan Tes

Justin Mariner
sumber
632.41! perhitungan yang cukup bagus :) +1
V. Courtois
6

Python 3, 93 92 81 byte

Disimpan 11 byte berkat Felipe .

import time
a,*l,b=[input()or time.time()for i in' '*9]
print(round(480/(b-a),2))
Justin
sumber
1
81 byte
Felipe Nardi Batista
saya mencoba print('%.2f'%(480/(b-a)))dan print(f'{480/(b-a):.2f}')(python3.6 +), tetapi keduanya memiliki bytecount yang sama
Felipe Nardi Batista
5

Bash + utilitas Linux umum, 58

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

Javascript, 100 , 84 terima kasih kepada Powelles , 82 byte terima kasih kepada Justin Mariner

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

Serge K.
sumber
1
Anda harus bisa menggunakannya Date.now()sebagai ganti new Date().getTime()dan 48e4bukan 480000.
powelles
Anda juga dapat mengingatkan hasilnya kembali daripada mengembalikannya dan memberikan peringatan ke variabel seperti (a=alert)()untuk penggunaan pertama Anda dan kemudian digunakan a().
powelles
Ah terima kasih banyak, aku tidak pernah memikirkan 48e4, dan instanciate DAN panggilan alertbersama-sama: (a=alert)().
Serge K.
1
Anda juga dapat beralih suntuk menggunakan Date.now(), dan menjatuhkannya .getTime()nanti. Dan kemudian Anda bisa alias Date.nowke nama yang lebih pendek. Dan inisial z=tidak diperlukan karena Anda tidak memanggil fungsi secara rekursif. Turun ke 69 byte di sini
Justin Mariner
Oh, dan solusi Anda tidak membulatkan ke 2 tempat desimal seperti tantangan yang diminta.
Justin Mariner
4

Java 1.5+, 345 339 361 337 byte

-34 byte terima kasih kepada Michael karena telah menunjukkan bahwa saya lupa memperbaiki impor saya

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

Mendengarkan pengguna saat mereka menekan tombol spasi. Kemudian, ketika pengguna telah menekannya 9 kali, mencetak kembali kepada pengguna BPM saat ini:

masukkan deskripsi gambar di sini

Gambar memiliki pesan debug yang tidak ada dalam kode golf.


Tidak Disatukan:

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

Agak menyenangkan untuk mencoba dan mendapatkan skor tinggi ...

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
Guci Gurita Ajaib
sumber
Saya membuat perubahan kecil dan saya ingin 9 input sehingga Anda bisa memiliki 8 poin data untuk input daripada 7. (seharusnya hanya perubahan kecil.)
xNinjaKittyx
Kehilangan ruang:String[]a) {new java
Stephen
Hal lain adalah, saya meletakkan persyaratan yang mengatakan "Ini harus mengeluarkan BPM dari penekanan tombol yang dibulatkan pada 2 titik desimal." Apakah putaran ini menjadi 2 tempat desimal?
xNinjaKittyx
1
@xNinjaKittyx sekarang.
Magic Gurita Guci
1
catatan adalah 2027.03BPM xD sedikit mengubah kode untuk beberapa pembandingan yang lebih baik
XtremeBaumer
3

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

-47 bytes berkat TheLethalCoder
-4 bytes berkat Nazar554
-16 bytes berkat Luc
-2 bytes berkat 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);}

Juga ditambahkan ke jumlah byte:

using System;

Seluruh program:

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));
        }
    }
}
Grzegorz Puławski
sumber
1
Akan lebih pendek untuk memiliki dua variabel memiliki satu di luar loop setelah penekanan tombol pertama untuk waktu mulai dan kemudian menimpa yang lain dalam loop. Saya tidak berpikir Anda perlu memformat nilai output jadi hanya +""atau bahkan mengembalikan double akan baik-baik saja. namespace System.Diagnostics{}mungkin lebih pendek tetapi Anda hanya menggunakan Diagnosticspada wkualifikasi yang sepenuhnya penuh yang mungkin lebih pendek juga. Perhatikan bahwa Anda harus memasukkan using System;dalam hitungan byte Anda untuk Consolepanggilan tersebut.
TheLethalCoder
2
ganti 540000.0dengan5.4e5
Nazar554
1
Baik Anda akan melakukan sesuatu seperti (end-start).Millisecondsdan set enddan startuntuk DateTime.Now.
TheLethalCoder
1
Saya pikir Anda memiliki kesalahan dalam perhitungan Anda. Jika Anda mengganti ReadKey dengan Thread.Sleep (100), Anda harus mendapatkan sedikit kurang dari 600 BPM, tetapi kode Anda memberikan lebih dari itu (sekitar 670 BPM). Rumusnya harus "60sec * 1000ms / (deltaMs / 8points)" yang diterjemahkan menjadi "48e8 / deltaMs". Anda juga dapat mengembalikan $ "{48e8 / (d [8] -d [0]). Kutu: n2}" untuk -20 ;-)
Luc
1
Saya pikir Anda harus dapat menghemat beberapa byte dengan melakukan 8/TimeSpan.TotalMinutesalih - alih 54e4/TimeSpan.TotalMilliseconds. Selain itu, dengan pemeriksaan cepat menggunakan 'Math.Round (nilai, 2)' alih-alih value.ToString("n2")menghemat beberapa karakter, sebagian karena itu membutuhkan lebih sedikit tanda kurung
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;}
HatsuPointerKun
sumber
Anda dapat menyimpan 5 byte jika Anda menghapus #definedan sebaliknyavoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem
Tidak, karena jika saya melakukan itu, waktu akan dimulai sebelum input pertama, sementara itu dikatakan Timing dimulai pada input pertama. Not start of program
HatsuPointerKun
Apakah mungkin untuk mengubah baris 3 ke #define G;getchar()dan kemudian mengubah clock();Gke clock()G?
Zacharý
@ Zacharý Saya mendapatkan kesalahan sintaks
HatsuPointerKun
Untuk beberapa alasan, kompiler saya mengeluh round.
Zacharý
2

Kutukan Python +, 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))

Membutuhkan cursesmodul untuk dimuat.

-9 byte berkat Felipe Nardi Batista

HyperNeutrino
sumber
Apa yang dilakukan modul kutukan? Kutukan kamu?
Magic Gurita Guci
@ MagicOctopusUrn Tentu saja itu yang dilakukannya.
HyperNeutrino
time () harus dimulai pada input pertama dan bukan pada eksekusi program.
xNinjaKittyx
@xNinjaKittyx diperbaiki; terima kasih
HyperNeutrino
@MagicOctopusUrn Bercanda, itu adalah perpustakaan GUI berbasis terminal.
Kroltan
2

vba, 57

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

tekan enter, atau klik OK di kotak pesan.

SeanC
sumber
2

Python 3 , 74 byte

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

Cobalah online!

Ini akan memberi Anda angka-angka konyol di TIO karena menjalankan semua input sekaligus tetapi berhasil. timeit()mengembalikan waktu eksekusi pernyataan 'input()'dalam hitungan detik tidak termasuk parameter pengaturan input(). TIO dengan penundaan 1s per input untuk validasi.

nocturama
sumber
1

Java 8, 180 135 byte

-45 byte terima kasih kepada @SocraticPhoenix yang menyarankan untuk digunakan System.insecara langsung.

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

Fungsi lambda anonim dengan argumen yang tidak digunakan yang harus ditugaskan ke metode antarmuka fungsional yang melempar Exception(contoh di bawah). Membaca dari konsol; ketukan dikirim dengan menekan enter.

Tidak Terkotak-kotak dengan Kode Uji Sekitarnya

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);
    }
}
Justin Mariner
sumber
1
Apakah akan lebih pendek untuk hanya membaca langsung dari System.in?
Socratic Phoenix
@ SocratesPhoenix Saya belum pernah benar-benar mencobanya, tetapi sepertinya berhasil; hanya menggunakan System.in.read()untuk memblokir sampai input diterima. Terima kasih! Akan memperbarui jawaban.
Justin Mariner
25559105,43 bpm dengan lol ini
V. Courtois
1

C #, 117 byte

Sudah ada jawaban C # (.NET Core) yang dibangun di atas ini. Menambahkan string interpolasi (yang. NET Core tampaknya kurang) untuk output dan mencukur beberapa byte dengan menggunakan array panjang, bukan 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}";}

Versi manusiawi

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);
    }
}
Luc
sumber
1

R, 79 84 byte

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

Hanya berfungsi ketika menggunakan enter, karena itu akan segera mengakhiri pemindaian. Secara eksplisit menggunakan printuntuk nya digitsargumen, penanganan pembulatan.

> 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
JAD
sumber
Apakah ini juga benar dengan CPM lebih besar dari 1000?
Roman Gräf
@ RomanGräf woops, tidak. Diedit.
JAD
0

Ruby, 58 byte

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
Nilai Tinta
sumber