Cálculo de BPM con entradas

30

Programe el código más corto que calculará el promedio de BPM (latidos por minuto) utilizando 8 puntos de datos de tiempo transcurrido. Esta es mi primera publicación, y no he visto una pregunta similar a esta. Como soy un fanático de los juegos de ritmo, sería bueno tener una pequeña herramienta útil para calcular BPM usando su propio teclado y su propio sentido del ritmo (si tiene uno ...)

Reto

  • Todas las entradas deben ser singulares. (es decir, solo presionando "enter" como "input")
  • Su programa debe tomar al menos 9 entradas. (Para crear 8 puntos de datos de tiempo pasado).
  • Su programa debería generar los BPM de las pulsaciones de teclas redondeadas a 2 puntos decimales. (es decir, 178.35)
  • El tiempo comienza en la primera entrada. No inicio del programa

Este es el , por lo que gana la respuesta más corta.

Ejemplo de entrada y salida

Proporcione al menos un ejemplo de entrada y salida. Asegúrese de que coincidan con su propia descripción de cómo debería verse la entrada.

Entrada:

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

Salida:

> 60

El ganador actual es KarlKastor a 22 Bytes usando Pyth

Aunque el ganador estaba usando Pyth, la respuesta de Matlab fue una respuesta notable.

xNinjaKittyx
fuente
55
¡Decir ah! Interesante, bienvenido a PPCG; para referencia futura también tenemos un sandbox donde puede obtener comentarios sobre sus desafíos antes de publicarlos. Sin embargo, esto está bastante bien hecho.
Magic Octopus Urn
¿Cómo calculamos el BPM? ¿Comenzamos a cronometrar la primera pulsación de tecla o cuando el código comienza a ejecutarse? ¿Dividimos por 7 u 8 antes de extrapolar?
xnor
Hmm .. Entonces el tiempo debe comenzar en la primera pulsación de tecla. En cuanto a la división, lo cambiaré para hacer 9 entradas (así que divides por 8)
xNinjaKittyx
Buena pregunta! Buena suerte
Noah Cristino

Respuestas:

1

Pyth , 22 bytes

 wJ.d0 mw8.Rc480-.d0J2

(sí, hay un espacio principal)

La entrada es 'enter' presiona.

Si se permite una salida adicional, puedo eliminar los espacios y obtener una puntuación de 20 bytes.

ejemplo de ejecución

explicación

 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
fuente
9

MATLAB / Octave, 58 56 55 bytes

¡Gracias @LuisMendo por -1 byte!

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

Tienes que presionar enter 9 veces. (También funciona en Octave).

Aquí lo ves en acción, izquierda MATLAB, derecha Octave:

falla
fuente
D'oh! pero round(.,2)no funciona o funciona en las versiones más recientes?
flawr
Oh, solo funciona en Matlab
Luis Mendo
7

JavaScript (ES6), 77 74 bytes

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

Crea un onclickevento en el windowobjeto global . Envíe ritmos haciendo clic en cualquier lugar de la ventana.

Fragmento de prueba

Justin Mariner
fuente
632.41! bastante buen cálculo :) +1
V. Courtois
6

Pitón 3, 93 92 81 bytes

Guardado 11 bytes gracias a Felipe .

import time
a,*l,b=[input()or time.time()for i in' '*9]
print(round(480/(b-a),2))
Justin
fuente
1
81 bytes
Felipe Nardi Batista
Lo intenté print('%.2f'%(480/(b-a)))y print(f'{480/(b-a):.2f}')(python3.6 +), pero ambos tienen el mismo bytecount
Felipe Nardi Batista
5

Bash + utilidades comunes de Linux, 58

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

Javascript, 100 , 84 gracias a Powelles , 82 bytes gracias a Justin Mariner

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

Serge K.
fuente
1
Debería poder usar en Date.now()lugar de new Date().getTime()y en 48e4lugar de 480000.
powelles
También puede alertar el resultado en lugar de devolverlo y asignar alerta a una variable como (a=alert)()su primer uso y luego su uso posterior a().
powelles
Ah muchas gracias, yo nunca había pensado 48e4, y instanciar y llamar a alertjuntos: (a=alert)().
Serge K.
1
También puede cambiar sa usar Date.now(), y soltar el .getTime()posterior. Y luego puedes alias Date.nowa un nombre más corto. Y la inicial z=no es necesaria ya que no está llamando a la función de forma recursiva. Hasta 69 bytes aquí
Justin Mariner
Ah, y su solución no se redondea a 2 decimales como pide el desafío.
Justin Mariner
4

Java 1.5+, 345 339 361 337 bytes

-34 bytes gracias a Michael por señalar que olvidé arreglar mis importaciones

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

Escucha al usuario cuando presiona la barra espaciadora. Luego, cuando el usuario lo ha presionado 9 veces, imprime al usuario el BPM actual:

ingrese la descripción de la imagen aquí

La imagen tiene mensajes de depuración que no están presentes en el código de golf.


Sin golf:

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 poco divertido para tratar de obtener una puntuación más alta ...

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
Urna de pulpo mágico
fuente
Hice un cambio menor y que quería 9 entradas por lo que podría tener 8 puntos de datos para la entrada en lugar de 7. (debería ser sólo un pequeño cambio.)
xNinjaKittyx
Se perdió un espacio:String[]a) {new java
Stephen
Otra cosa es que pongo un requisito que dice "Debería generar los BPM de las pulsaciones de teclas redondeadas en 2 puntos decimales". ¿Esto se redondea a 2 decimales?
xNinjaKittyx
1
@xNinjaKittyx lo hace ahora.
Magic Octopus Urn
1
registro es 2027.03BPM xD ligeramente modificado el código para una mejor evaluación comparativa
XtremeBaumer
3

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

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

También agregado al conteo de bytes:

using System;

Programa completo:

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
fuente
1
Sería más corto tener dos variables que tengan una fuera del ciclo después de presionar la primera tecla para la hora de inicio y luego sobrescribir otra en el ciclo. No creo que necesite formatear el valor de salida, por lo que solo +""o incluso devolver el doble estaría bien. namespace System.Diagnostics{}es probablemente más corto, pero solo se usa Diagnosticsen la wcalificación tan completa que probablemente también sea más corta. Tenga en cuenta que debe incluir using System;en su conteo de bytes para la Consolellamada.
TheLethalCoder
2
reemplazar 540000.0con5.4e5
Nazar554
1
Así que harías algo así (end-start).Millisecondsy conjunto endy starta DateTime.Now.
TheLethalCoder
1
Creo que tienes un error en tu cálculo. Si reemplaza ReadKey con Thread.Sleep (100), debería obtener un poco menos de 600 BPM, pero su código da más que eso (alrededor de 670 BPM). La fórmula debe ser "60sec * 1000ms / (deltaMs / 8points)" que se traduce en "48e8 / deltaMs". Además, puede devolver $ "{48e8 / (d [8] -d [0]). Ticks: n2}" fo -20 ;-)
Luc
1
Creo que debería poder guardar algunos bytes haciendo en 8/TimeSpan.TotalMinuteslugar de 54e4/TimeSpan.TotalMilliseconds. Además, mediante una comprobación rápida utilizando 'Math.Round (valor, 2)' en lugar de value.ToString("n2")guardar algunos caracteres, en parte porque necesitaba menos paréntesis
Kamil Drakari
2

C ++, 150 bytes

#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
fuente
Podrías guardar 5 bytes si eliminas el #definey en su lugar lo hacesvoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem
No, porque si hago eso, el tiempo comenzará antes de la primera entrada, mientras que se dice que el tiempo comienza en la primera entrada. No inicio del programa
HatsuPointerKun
¿Sería posible cambiar la línea 3 a #define G;getchar()y luego cambiar clock();Ga clock()G?
Zacharý
@ Zacharý Recibo errores de sintaxis
HatsuPointerKun
Por alguna razón, mi compilador se queja round.
Zacharý
2

Python + maldiciones, 122 bytes

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

Requiere el curses que se cargue módulo.

-9 bytes gracias a Felipe Nardi Batista

Hiperneutrino
fuente
¿Qué hace el módulo de maldiciones? ¿Te maldigo?
Magic Octopus Urn
@MagicOctopusUrn Por supuesto, eso es ciertamente lo que hace.
HyperNeutrino
time () necesita comenzar en la primera entrada y no en la ejecución del programa.
xNinjaKittyx
@xNinjaKittyx corregido; gracias
HyperNeutrino
@MagicOctopusUrn Bromas aparte, es una biblioteca GUI basada en terminal.
Kroltan
2

vba, 57

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

presione enter o haga clic en Aceptar en el cuadro de mensaje.

SeanC
fuente
2

Python 3 , 74 bytes

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

Pruébalo en línea!

Esto le dará números tontos en TIO, ya que ejecuta todas las entradas a la vez pero funciona. timeit()devuelve el tiempo de ejecución de la declaración 'input()'en segundos, excluyendo el parámetro de configuración input(). TIO con un retraso de 1s por entrada para la validación.

nocturama
fuente
1

Java 8, 180 135 bytes

-45 bytes gracias a @SocraticPhoenix sugiriendo usar System.indirectamente.

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 función lambda anónima con un argumento no utilizado que debe asignarse a un método de interfaz funcional que arroje un Exception(ejemplo a continuación). Lee desde la consola; los latidos se envían presionando enter.

Ungolfed con código de prueba circundante

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
fuente
1
¿Sería más corto leer directamente System.in?
Phoenix socrático
@SocraticPhoenix Nunca he intentado eso, pero parece funcionar; simplemente usando System.in.read()para bloquear hasta que se reciba la entrada. ¡Gracias! Se actualizará la respuesta.
Justin Mariner
25559105.43 lpm con este lol
V. Courtois
1

C #, 117 bytes

Ya hay una respuesta C # (.NET Core) en la que se basa. Se agregó una cadena interpolada (que .NET Core parece carecer) para la salida y redujo algunos bytes usando una matriz larga en lugar de 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ón humana

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
fuente
1

R, 79 84 bytes

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

Solo funciona cuando se usa enter, ya que eso finalizará el escaneo de inmediato. Utiliza explícitamente printpara su digitsargumento, manejando el redondeo.

> 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
fuente
¿Esto también redondea correctamente con un CPM superior a 1000?
Roman Gräf
@ RomanGräf woops, no. Editado
JAD
0

Ruby, 58 bytes

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