Calcul du BPM avec des entrées

30

Programmez le code le plus court qui calculera le BPM moyen (battements par minute) en utilisant 8 points de temps écoulés. Ceci est mon premier post, et je n'ai pas vu de question similaire à celle-ci. Puisque je suis un fan des jeux de rythme, ce serait bien d'avoir un petit outil pratique pour calculer le BPM en utilisant votre propre clavier et votre propre sens du rythme (si vous en avez un ...)

Défi

  • Toutes les entrées doivent être singulières. (c'est-à-dire en appuyant uniquement sur "entrée" comme "entrée")
  • Votre programme doit prendre au moins 9 entrées. (Pour créer 8 points de temps de données passés.)
  • Votre programme doit sortir le BPM des touches pressées arrondi à 2 décimales. (soit 178,35)
  • Le chronométrage commence à la première entrée. Pas de début de programme

C'est le , donc la réponse la plus courte l'emporte.

Exemple d'entrée et de sortie

Fournissez au moins un exemple d'entrée et de sortie. Assurez-vous qu'ils correspondent à votre propre description de l'aspect de l'entrée.

Contribution:

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

Sortie:

> 60

Le gagnant actuel est KarlKastor à 22 octets utilisant Pyth

Même si le gagnant utilisait Pyth, la réponse Matlab était une réponse notable.

xNinjaKittyx
la source
5
Ha! Intéressant, bienvenue chez PPCG; pour référence future, nous avons également un bac à sable où vous pouvez obtenir des commentaires sur vos défis avant de les publier. C'est assez bien fait cependant.
Magic Octopus Urn
Comment calculons-nous le BPM? Commençons-nous le chronométrage à la première pression de touche ou lorsque le code commence à s'exécuter? Divisons-nous par 7 ou 8 avant d'extrapoler?
xnor
Hmm .. Le chronométrage devrait donc commencer dès la première pression sur une touche. Quant à la division, je vais la changer pour faire 9 entrées (donc vous divisez par 8)
xNinjaKittyx
Cool question! Bonne chance
Noah Cristino

Réponses:

1

Pyth , 22 octets

 wJ.d0 mw8.Rc480-.d0J2

(oui il y a un espace de tête)

L'entrée consiste à appuyer sur "Entrée".

Si une sortie supplémentaire est autorisée, je peux supprimer les espaces et obtenir un score de 20 octets.

exemple d'exécution

explication

 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
la source
9

MATLAB / Octave, 58 56 55 octets

Merci @LuisMendo pour -1 octet!

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

Vous devez appuyer sur Entrée 9 fois. (Fonctionne également dans Octave.)

Ici vous le voyez en action, à gauche MATLAB, à droite Octave:

flawr
la source
Oh! mais round(.,2)ne fonctionne pas, ou est-ce dans les versions plus récentes?
2017
Oh, cela ne fonctionne que dans Matlab
Luis Mendo
7

JavaScript (ES6), 77 74 octets

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

Crée un onclickévénement sur l' windowobjet global . Envoyez des temps en cliquant n'importe où dans la fenêtre.

Extrait de test

Justin Mariner
la source
632.41! assez bon calc :) :)
V. Courtois
6

Python 3, 93 92 81 octets

Enregistré 11 octets grâce à Felipe .

import time
a,*l,b=[input()or time.time()for i in' '*9]
print(round(480/(b-a),2))
Justin
la source
1
81 octets
Felipe Nardi Batista
j'ai essayé print('%.2f'%(480/(b-a)))et print(f'{480/(b-a):.2f}')(python3.6 +), mais les deux ont le même bytecount
Felipe Nardi Batista
5

Bash + utilitaires Linux courants, 58

script -tt -c'sed -n 9q'
sed '1c2k0
s/ 2/+/;$a480r/p' t|dc
Traumatisme numérique
la source
5

Javascript, 100 , 84 grâce à Powelles , 82 octets grâce à Justin Mariner

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

Serge K.
la source
1
Vous devriez pouvoir utiliser Date.now()au lieu de new Date().getTime()et 48e4au lieu de 480000.
powelles
Vous pouvez également alerter le résultat au lieu de le renvoyer et attribuer une alerte à une variable comme (a=alert)()pour votre première utilisation, puis une utilisation ultérieure a().
powelles
Ah merci beaucoup, je n'y avais jamais pensé 48e4, et instancie et APPELLENT alertensemble: (a=alert)().
Serge K.
1
Vous pouvez également passer sà l'utilisation Date.now()et supprimer la .getTime()dernière. Et puis vous pouvez créer Date.nowun pseudonyme pour un nom plus court. Et l'initiale z=n'est pas nécessaire car vous n'appelez pas la fonction récursivement. Jusqu'à 69 octets ici
Justin Mariner
Oh, et votre solution ne s'arrondit pas à 2 décimales comme le défi le demande.
Justin Mariner du
4

Java 1.5+, 345 339 361 337 octets

-34 octets merci à Michael d'avoir souligné que j'avais oublié de réparer mes importations

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

Écoute l'utilisateur lorsqu'il appuie sur la barre d'espace. Ensuite, lorsque l'utilisateur l'a pressé 9 fois, il réimprime à l'utilisateur le BPM actuel:

entrez la description de l'image ici

L'image contient des messages de débogage non présents dans le code golfé.


Non 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 peu amusant d'essayer d'obtenir un meilleur score ...

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
Urne de poulpe magique
la source
J'ai fait un changement mineur et je voulais 9 entrées pour que vous puissiez avoir 8 points de données pour l'entrée au lieu de 7. (devrait juste être un petit changement.)
xNinjaKittyx
A manqué un espace:String[]a) {new java
Stephen
Une autre chose est, j'ai mis une exigence qui dit "Il devrait sortir le BPM des touches pressées arrondi à 2 décimales." Est-ce arrondi à 2 décimales?
xNinjaKittyx
1
@xNinjaKittyx le fait maintenant.
Magic Octopus Urn
1
record est 2027.03BPM xD légèrement modifié le code pour une meilleure analyse comparative
XtremeBaumer
3

C # (.NET de base), 193 206 189 186 155 143 137 octets

-47 octets grâce à TheLethalCoder
-4 octets grâce à Nazar554
-16 octets grâce à Luc
-2 octets grâce à 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);}

Également ajouté au nombre d'octets:

using System;

Programme complet:

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
la source
1
Il serait plus court d'avoir deux variables dont une en dehors de la boucle après la première pression sur la touche pour l'heure de début, puis en écraser une autre dans la boucle. Je ne pense pas que vous ayez besoin de formater la valeur de sortie, donc juste +""ou même retourner le double serait bien. namespace System.Diagnostics{}est probablement plus court mais vous ne l'utilisez que Diagnosticssur les wqualifications si complètes qui sont probablement plus courtes aussi. Notez que vous devez inclure using System;dans votre nombre d'octets pour l' Consoleappel.
TheLethalCoder
2
remplacer 540000.0par5.4e5
Nazar554
1
Eh bien , vous feriez quelque chose comme (end-start).Millisecondset ensemble endet startà DateTime.Now.
TheLethalCoder
1
Je pense que vous avez une erreur dans votre calcul. Si vous remplacez ReadKey par Thread.Sleep (100), vous devriez obtenir un peu moins de 600 BPM, mais votre code donne plus que cela (environ 670 BPM). La formule doit être "60sec * 1000ms / (deltaMs / 8points)", ce qui se traduit par "48e8 / deltaMs". Vous pouvez également retourner $ "{48e8 / (d [8] -d [0]). Ticks: n2}" fo -20 ;-)
Luc
1
Je pense que vous devriez pouvoir sauvegarder quelques octets en faisant 8/TimeSpan.TotalMinutesau lieu de 54e4/TimeSpan.TotalMilliseconds. En outre, par une vérification rapide en utilisant `` Math.Round (valeur, 2) '' au lieu de value.ToString("n2")sembler enregistrer quelques caractères, en partie parce qu'il avait besoin de moins de parenthèses
Kamil Drakari
2

C ++, 150 octets

#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
la source
Vous pourriez économiser 5 octets si vous supprimez le #defineet à la placevoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem
Non, car si je le fais, le chronométrage commencera avant la première entrée, alors qu'il est dit que le chronométrage commence à la première entrée. Pas de début de programme
HatsuPointerKun
Serait-il possible de changer la ligne 3 en #define G;getchar()puis de changer clock();Gen clock()G?
Zacharý
@ Zacharý J'obtiens des erreurs de syntaxe
HatsuPointerKun
Pour une raison quelconque, mon compilateur se plaint round.
Zacharý
2

Python + curses, 122 octets

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

Nécessite le curseschargement du module.

-9 octets grâce à Felipe Nardi Batista

HyperNeutrino
la source
Que fait le module curses? Vous maudire?
Magic Octopus Urn
@MagicOctopusUrn Bien sûr, c'est certainement ce qu'il fait.
HyperNeutrino
time () doit commencer à la première entrée et non à l'exécution du programme.
xNinjaKittyx
@xNinjaKittyx corrigé; merci
HyperNeutrino
@MagicOctopusUrn Blagues à part, c'est une bibliothèque GUI basée sur un terminal.
Kroltan
2

vba, 57

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

appuyez sur entrée ou cliquez sur OK dans la boîte de message.

SeanC
la source
2

Python 3 , 74 octets

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

Essayez-le en ligne!

Cela vous donnera des chiffres stupides dans TIO car il exécute toutes les entrées à la fois mais cela fonctionne. timeit()renvoie le temps d'exécution de l'instruction 'input()'en secondes, à l'exclusion du paramètre de configuration input(). TIO avec un retard de 1 s par entrée pour validation.

nocturama
la source
1

Java 8, 180 135 octets

-45 octets grâce à @SocraticPhoenix suggérant d'utiliser System.indirectement.

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

Une fonction lambda anonyme avec un argument inutilisé qui doit être affecté à une méthode d'interface fonctionnelle qui lance une Exception(exemple ci-dessous). Lit à partir de la console; les temps sont envoyés en appuyant sur enter.

Non golfé avec code de test environnant

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
la source
1
Serait-il plus court de simplement lire directement System.in?
Socratic Phoenix
@SocraticPhoenix Je n'ai jamais vraiment essayé cela, mais cela semble fonctionner; il suffit d'utiliser System.in.read()pour bloquer jusqu'à ce que l'entrée soit reçue. Merci! Mettra à jour la réponse.
Justin Mariner
25559105.43 bpm avec ce lol
V. Courtois
1

C #, 117 octets

Il existe déjà une réponse C # (.NET Core) sur laquelle celle-ci s'appuie. Ajout d'une chaîne interpolée (que .NET Core semble manquer) pour la sortie et rasage de quelques octets en utilisant un long tableau au lieu 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}";}

Version humaine

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
la source
1

R, 79 84 octets

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

Fonctionne uniquement lorsque vous utilisez enter, car cela mettra immédiatement fin à l'analyse. Utilise explicitement printpour son digitsargument, la gestion de l'arrondi.

> 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
la source
Est-ce que ce tour est également correct avec un CPM supérieur à 1000?
Roman Gräf
@ RomanGräf woops, non. Édité.
JAD
0

Rubis, 58 octets

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
Encre de valeur
la source