Calcolo del BPM con input


30

Programmare il codice più breve che calcolerà il BPM medio (battiti al minuto) utilizzando 8 punti di tempo di dati trascorsi. Questo è il mio primo post e non ho visto una domanda simile a questa. Dato che sono un fan dei giochi ritmici, sarebbe bello avere un piccolo strumento utile per calcolare i BPM usando la tua tastiera e il tuo senso del ritmo (se ne hai uno ...)

Sfida

  • Tutti gli ingressi devono essere singolari. (cioè premendo solo "invio" come "input")
  • Il tuo programma deve avere almeno 9 input. (Per creare 8 punti di tempo di dati trascorsi.)
  • Il programma dovrebbe generare il BPM dei tasti premuti arrotondato con 2 punti decimali. (ovvero 178.35)
  • Il cronometraggio inizia al primo input. Non avviare il programma

Questo è , quindi vince la risposta più breve.

Esempio di input e output

Fornire almeno un esempio di input e output. Assicurati che corrispondano alla tua descrizione di come dovrebbe apparire l'input.

Ingresso:

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

Produzione:

> 60

Il vincitore attuale è KarlKastor a 22 byte usando Pyth

Anche se il vincitore stava usando Pyth, la risposta di Matlab era una risposta notevole.


5
Ha! Interessante, benvenuto in PPCG; per riferimento futuro abbiamo anche una sandbox in cui è possibile ottenere un feedback sulle sfide prima di pubblicarle. Questo è abbastanza ben fatto però.
Magic Octopus Urn

Come calcoliamo il BPM? Iniziamo il cronometraggio alla prima pressione del tasto o quando il codice inizia a funzionare? Dividiamo per 7 o 8 prima di estrapolare?
xnor

Hmm .. Quindi il cronometraggio dovrebbe iniziare al primo tasto. Per quanto riguarda la divisione, la cambierò per fare 9 input (quindi dividi per 8)
xNinjaKittyx

Bella domanda! Buona fortuna
Noah Cristino,

Risposte:


1

Pyth , 22 byte

 wJ.d0 mw8.Rc480-.d0J2

(sì, c'è uno spazio iniziale)

L'ingresso è 'invio' preme.

Se è consentito un output aggiuntivo, posso rimuovere gli spazi e ottenere un punteggio di 20 byte.

esecuzione di esempio

spiegazione

 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

Grazie @LuisMendo per -1 byte!

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

Devi premere invio 9 volte. (Funziona anche in Octave.)

Qui lo vedi in azione, a sinistra MATLAB, a destra Octave:


D'oh! ma round(.,2)non funziona o funziona nelle versioni più recenti?
Flawr,

Oh, funziona solo in Matlab
Luis Mendo il

7

JavaScript (ES6), 77 74 byte

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

Crea un onclickevento windowsull'oggetto globale . Invia ritmi facendo clic in qualsiasi punto della finestra.

Test dello snippet


632,41! piuttosto un bel calcolo :) +1
V. Courtois,


5

Bash + utility Linux comuni, 58

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

5

Javascript, 100 , 84 grazie a Powelles , 82 byte grazie a Justin Mariner

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


1
Dovresti essere in grado di usare Date.now()invece di new Date().getTime()e 48e4invece di 480000.
Powelles,

Inoltre, è possibile avvisare il risultato invece di restituirlo e assegnare un avviso a una variabile come (a=alert)()per il primo utilizzo e successivamente l'utilizzo a().
Powelles,

Ah grazie mille, non avevo mai pensato 48e4, e instanciate e call alertinsieme: (a=alert)().
Serge K.

1
Puoi anche passare sa usare Date.now()e rilasciare in .getTime()seguito. E poi puoi alias Date.nowcon un nome più breve. E l'iniziale z=non è necessaria poiché non stai chiamando la funzione in modo ricorsivo. Fino a 69 byte qui
Justin Mariner,

Oh, e la tua soluzione non arriva a 2 decimali come richiede la sfida.
Justin Mariner,

4

Java 1.5+, 345 339 361 337 byte

-34 byte grazie a Michael per aver sottolineato che ho dimenticato di riparare le mie importazioni

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

Ascolta l'utente mentre premono la barra spaziatrice. Quindi, quando l'utente lo ha premuto 9 volte, stampa all'utente il BPM corrente:

inserisci qui la descrizione dell'immagine

L'immagine ha messaggi di debug non presenti nel codice golf.


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

Un po 'divertente provare a ottenere un punteggio elevato ...

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

Ho apportato una piccola modifica e volevo 9 input in modo da poter disporre di 8 punti dati per input anziché 7. (dovrebbe essere solo una piccola modifica.)
xNinjaKittyx

Perso uno spazio:String[]a) {new java
Stephen

Un'altra cosa è che ho inserito un requisito che dice "Dovrebbe emettere il BPM dei tasti premuti arrotondato a 2 punti decimali". Questo round al secondo decimale?
xNinjaKittyx,

1
@xNinjaKittyx ora.
Magic Octopus Urn

1
record è 2027.03BPM xD leggermente modificato il codice per un migliore benchmarking
XtremeBaumer

3

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

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

Aggiunto anche al conteggio dei byte:

using System;

Intero programma:

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
Sarebbe più breve che due variabili ne abbiano una al di fuori del ciclo dopo che il primo tasto ha premuto per l'ora di inizio e quindi ne ha sovrascritto un altro nel ciclo. Non penso che sia necessario formattare il valore di output in modo che sia giusto +""o addirittura restituito il doppio andrebbe bene. namespace System.Diagnostics{}è probabilmente più breve ma lo usi solo Diagnosticssu wqualificazioni così complete che probabilmente è anche più breve. Si noti che è necessario includere using System;nel conteggio dei byte per la Consolechiamata.
TheLethalCoder il

2
sostituire 540000.0con5.4e5
Nazar554

1
Bene si farebbe qualcosa di simile (end-start).Millisecondse insieme ended starta DateTime.Now.
TheLethalCoder il

1
Penso che tu abbia un errore nel tuo calcolo. Se sostituisci ReadKey con Thread.Sleep (100), dovresti ottenere un po 'meno di 600 BPM, ma il tuo codice ne fornisce di più (circa 670 BPM). La formula dovrebbe essere "60sec * 1000ms / (deltaMs / 8points)" che si traduce in "48e8 / deltaMs". Inoltre, puoi restituire $ "{48e8 / (d [8] -d [0]). Segni di spunta: n2}" fo -20 ;-)
Luc

1
Penso che dovresti essere in grado di salvare alcuni byte facendo 8/TimeSpan.TotalMinutes invece di 54e4/TimeSpan.TotalMilliseconds. Inoltre, con un rapido controllo usando "Math.Round (valore, 2)" invece di value.ToString("n2")salvare alcuni personaggi, in parte perché aveva bisogno di meno parentesi
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;}

È possibile salvare 5 byte se si rimuove #definee invece si favoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem

No, perché se lo faccio, il timing inizierà prima del primo input, mentre si dice Il timing inizia al primo input. Non avviare il programma
HatsuPointerKun

Sarebbe possibile cambiare la linea 3 in #define G;getchar()e poi cambiarla clock();Gin clock()G?
Zacharý,

@ Zacharý Ottengo errori di sintassi
HatsuPointerKun

Per qualche ragione, il mio compilatore si lamenta round.
Zacharý,

2

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

Richiede il cursescaricamento del modulo.

-9 byte grazie a Felipe Nardi Batista


Cosa fa il modulo maledizioni? Vi maledicono?
Magic Octopus Urn

@MagicOctopusUrn Certo che è certamente quello che fa.
HyperNeutrino,

time () deve iniziare al primo input e non all'esecuzione del programma.
xNinjaKittyx,

@xNinjaKittyx fixed; grazie
HyperNeutrino,

@MagicOctopusUrn Scherzi a parte, è una libreria GUI basata su terminali.
Kroltan,

2

vba, 57

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

premere invio o fare clic su OK nella finestra del messaggio.


2

Python 3 , 74 byte

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

Provalo online!

Questo ti darà numeri sciocchi in TIO poiché esegue tutti gli input contemporaneamente ma funziona. timeit()restituisce il tempo di esecuzione dell'istruzione 'input()'in secondi, escluso il parametro setupinput() . TIO con un ritardo di 1 secondo per input per la convalida.


1

Java 8, 180 135 byte

-45 byte grazie a @SocraticPhoenix che suggerisce di usare System.in direttamente.

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

Una funzione lambda anonima con un argomento inutilizzato che deve essere assegnato a un metodo di interfaccia funzionale che genera un Exception (esempio di seguito). Legge dalla console; i battiti vengono inviati premendo enter.

Ungolfed w / Surround Test Code

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
Sarebbe più breve leggere semplicemente direttamente System.in?
Socratic Phoenix,

@SocraticPhoenix Non l'ho mai provato, ma sembra funzionare; usando solo System.in.read()per bloccare fino a quando non viene ricevuto l'input. Grazie! Aggiornerà la risposta.
Justin Mariner,

25559105.43 bpm con questo lol
V. Courtois,

1

C #, 117 byte

C'è già una risposta C # (.NET Core) su cui si basa questa. Aggiunta stringa interpolata (che .NET Core sembra mancare) per l'output e rasato alcuni byte usando long array invece di 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}";}

Versione umana

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

Funziona solo quando si utilizza invio, poiché terminerà immediatamente la scansione. Usa esplicitamente printper il suo digitsargomento, gestendo l'arrotondamento.

> 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

Anche questo round si corregge con un CPM maggiore di 1000?
Roman Gräf,

@ RomanGräf woops, no. Modificato.
JAD,

0

Rubino, 58 byte

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.