Calculando BPM com entradas


30

Programe o código mais curto que calculará o BPM médio (batimentos por minuto) usando 8 pontos de dados passados. Este é o meu primeiro post, e eu não vi uma pergunta semelhante a esta. Como sou fã de jogos de ritmo, seria bom ter uma pequena ferramenta útil para calcular o BPM usando seu próprio teclado e seu próprio senso de ritmo (se você tiver um ...)

Desafio

  • Todas as entradas devem ser singulares. (ou seja, apenas pressionando "enter" como "input")
  • Seu programa deve receber pelo menos 9 entradas. (Para criar 8 pontos de dados passados.)
  • Seu programa deve gerar o BPM das teclas pressionadas, arredondadas em 2 casas decimais. (ie 178,35)
  • O tempo começa na primeira entrada. Não iniciar do programa

Isso é , então a resposta mais curta vence.

Exemplo de entrada e saída

Forneça pelo menos um exemplo de entrada e saída. Verifique se eles correspondem à sua própria descrição de como deve ser a entrada.

Entrada:

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

Saída:

> 60

O vencedor atual é KarlKastor em 22 Bytes usando Pyth

Mesmo que o vencedor estivesse usando Pyth, a resposta do Matlab foi notável.


5
Ha! Interessante, bem-vindo ao PPCG; para referência futura, também temos uma caixa de areia onde você pode obter feedback sobre seus desafios antes de publicá-los. Isso é muito bem feito.
Magic Octopus Urn

Como computamos o BPM? Começamos a cronometrar no primeiro pressionamento de tecla ou quando o código começa a ser executado? Dividimos por 7 ou 8 antes de extrapolar?
Xnor

Hmm .. Então, o tempo deve começar com o primeiro pressionamento de tecla. Quanto à divisão, vou alterá-lo para fazer 9 entradas (para que você divida por 8)
xNinjaKittyx

Pergunta legal! Boa sorte
Noah Cristino

Respostas:


1

Pitão , 22 bytes

 wJ.d0 mw8.Rc480-.d0J2

(sim, existe um espaço de liderança)

A entrada é pressionada 'enter'.

Se saída adicional for permitida, posso remover os espaços e obter uma pontuação de 20 bytes.

exemplo de execução

explicação

 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 / Oitava, 58 56 55 bytes

Obrigado @LuisMendo por -1 byte!

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

Você deve pressionar enter 9 vezes. (Também funciona na oitava.)

Aqui você vê em ação, à esquerda do MATLAB, à direita do Octave:


D'oh! mas round(.,2)não funciona ou nas versões mais recentes?
flawr

Ah, ele só funciona em 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))

Cria um onclickevento no windowobjeto global . Envie batidas clicando em qualquer lugar da janela.

Snippet de teste


632,41! um bom cálculo :) +1
V. Courtois


5

Bash + utilitários comuns do Linux, 58

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

5

Javascript, 100 , 84 graças a Powelles , 82 bytes graças a Justin Mariner

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


1
Você deve poder usar em Date.now()vez de new Date().getTime()e em 48e4vez de 480000.
Powelles

Além disso, você pode alertar o resultado de volta em vez de devolvê-lo e atribuir alerta a uma variável como (a=alert)()para o seu primeiro uso e depois o uso a().
Powelles

Ah muito obrigado, eu nunca pensei 48e4, e instanciar e chamar alertjuntos: (a=alert)().
Serge K.

1
Você também pode mudar spara usar Date.now()e largar .getTime()mais tarde. E então você pode alias Date.nowpara um nome mais curto. E a inicial z=não é necessária, pois você não está chamando a função recursivamente. Abaixo até 69 bytes aqui
Justin Mariner

Ah, e sua solução não arredonda para duas casas decimais, como o desafio pede.
Justin Mariner

4

Java 1.5+, 345 339 361 337 bytes

-34 bytes graças a Michael por apontar que esqueci de corrigir minhas importações

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

Escuta o usuário enquanto pressiona a barra de espaço. Em seguida, quando o usuário pressionar 9 vezes, imprime novamente para o usuário o BPM atual:

insira a descrição da imagem aqui

A imagem possui mensagens de depuração não presentes no código golfado.


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

Meio divertido de tentar obter um recorde ...

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

Eu fiz uma pequena alteração e que eu queria 9 entradas para que pudesse ter 8 pontos de dados para a entrada em vez de 7. (deve ser apenas uma pequena mudança.)
xNinjaKittyx

Falhou um espaço:String[]a) {new java
Stephen

Outra coisa é que eu coloquei um requisito que diz "Ele deve gerar o BPM das teclas pressionadas, arredondadas em 2 casas decimais". Isso arredonda para 2 casas decimais?
XNinjaKittyx

1
@xNinjaKittyx faz agora.
Magic Octopus Urn

1
registro é 2027.03BPM xD ligeiramente modificado o código para algum melhor aferição
XtremeBaumer

3

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

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

Também adicionado à contagem 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));
        }
    }
}

1
Seria mais curto ter duas variáveis ​​com uma fora do loop após a primeira tecla ser pressionada pela hora de início e depois substituir outra no loop. Eu não acho que você precise formatar o valor de saída, portanto, apenas +""retornando o dobro seria bom. namespace System.Diagnostics{}provavelmente é mais curto, mas você só usa Diagnosticsna wqualificação tão completa que provavelmente também é mais curta. Observe que você deve incluir using System;na sua contagem de bytes para a Consolechamada.
TheLethalCoder

2
substituir 540000.0por5.4e5
Nazar554

1
Bem, você faria algo como (end-start).Millisecondse definir ende startfazer DateTime.Now.
TheLethalCoder

1
Acho que você encontrou um erro no seu cálculo. Se você substituir o ReadKey por Thread.Sleep (100), deverá obter um pouco menos de 600 BPM, mas seu código fornece mais do que isso (cerca de 670 BPM). A fórmula deve ser "60seg * 1000ms / (deltaMs / 8 pontos)", que se traduz em "48e8 / deltaMs". Além disso, você pode retornar $ "{48e8 / (d [8] -d [0]). Carrapatos: n2}" fo -20 ;-)
Luc

1
Eu acho que você deve conseguir salvar alguns bytes fazendo em 8/TimeSpan.TotalMinutesvez de 54e4/TimeSpan.TotalMilliseconds. Além disso, por uma verificação rápida usando 'Math.Round (valor, 2)' em vez de value.ToString("n2")parecia economizar alguns personagens, parcialmente porque precisava de menos parênteses
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;}

Você pode salvar 5 bytes se remover o #definee, em vez disso, fazervoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem

Não, porque se eu fizer isso, o tempo começará antes da primeira entrada, enquanto se diz que o tempo começa na primeira entrada. Não começar do programa
HatsuPointerKun

Seria possível mudar a linha 3 para #define G;getchar()e depois mudar clock();Gpara clock()G?
Zachary

@ Zacharý Eu recebo erros de sintaxe #
HatsuPointerKun

Por alguma razão, meu compilador reclama round.
Zacharý

2

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

Requer que o cursesmódulo seja carregado.

-9 bytes graças a Felipe Nardi Batista


O que o módulo de maldições faz? Maldito seja?
Magic Octopus Urn

@MagicOctopusUrn Claro que é certamente o que faz.
HyperNeutrino

time () precisa iniciar na primeira entrada e não na execução do programa.
XNinjaKittyx

@xNinjaKittyx corrigido; obrigado
HyperNeutrino

@MagicOctopusUrn Piadas à parte, é uma biblioteca GUI baseada em terminal.
Kroltan

2

vba, 57

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

pressione enter ou clique em OK na caixa de mensagem.


2

Python 3 , 74 bytes

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

Experimente online!

Isso fornecerá números tolos no TIO, pois ele executa todas as entradas de uma só vez, mas funciona. timeit()retorna o tempo de execução da instrução 'input()'em segundos, excluindo o parâmetro setup input(). TIO com um atraso de 1s por entrada para validação.


1

Java 8, 180 135 bytes

-45 bytes graças a @SocraticPhoenix que sugere usar System.indiretamente.

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

Uma função lambda anônima com um argumento não utilizado que deve ser atribuído a um método de interface funcional que gera um Exception (exemplo abaixo). Lê do console; as batidas são enviadas pressionando enter.

Ungolfed w / Surrounding 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
Seria mais curto ler apenas diretamente System.in?
Phoenix socrático

@SocraticPhoenix Eu nunca tentei isso de verdade, mas parece funcionar; apenas usando System.in.read()para bloquear até que a entrada seja recebida. Obrigado! Atualizará a resposta.
23717 Justin Mariner

25559105,43 bpm com este lol
V. Courtois

1

C #, 117 bytes

Já existe uma resposta em C # (.NET Core) em que este se baseia. Adicionada string interpolada (que o .NET Core parece não ter) para saída e raspou alguns bytes usando uma matriz longa em vez 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}";}

Versão 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);
    }
}

1

R, 79 84 bytes

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

Funciona apenas ao usar enter, pois isso terminará a verificação imediatamente. Usa explicitamente printo digitsargumento, manipulando o arredondamento.

> 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

Isso também corrige com um CPM maior que 1000?
Roman Gräf

@ RomanGräf woops, não. Editado.
JAD

0

Ruby, 58 bytes

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.