BPM mit Eingaben berechnen

30

Programmieren Sie den kürzesten Code, der die durchschnittliche BPM (Beats per Minute) anhand von 8 verstrichenen Datenpunkten berechnet. Dies ist mein erster Beitrag, und ich habe keine ähnliche Frage gesehen. Da ich ein Fan von Rhythmus-Spielen bin, wäre es schön, ein kleines handliches Tool zu haben, um BPM mit Ihrer eigenen Tastatur und Ihrem eigenen Rhythmus-Gefühl zu berechnen (wenn Sie eines haben ...)

Herausforderung

  • Alle Eingaben müssen Singular sein. (dh nur "enter" als "input" drücken)
  • Ihr Programm muss mindestens 9 Eingaben enthalten. (So ​​erstellen Sie 8 verstrichene Datenzeitpunkte.)
  • Ihr Programm sollte die BPM der Tastendrücke auf 2 Dezimalstellen gerundet ausgeben. (dh 178,35)
  • Das Timing beginnt bei der ersten Eingabe. Programm nicht gestartet

Das ist , also gewinnt die kürzeste Antwort.

Beispiel für Ein- und Ausgabe

Geben Sie mindestens ein Beispiel für die Eingabe und Ausgabe an. Stellen Sie sicher, dass sie mit Ihrer eigenen Beschreibung der Eingabe übereinstimmen.

Eingang:

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

Ausgabe:

> 60

Aktueller Gewinner ist KarlKastor mit 22 Bytes mit Pyth

Obwohl der Gewinner Pyth verwendete, war die Antwort von Matlab eine bemerkenswerte Antwort.

xNinjaKittyx
quelle
5
Ha! Interessant, willkommen bei PPCG; Zum späteren Nachschlagen haben wir auch eine Sandbox, in der Sie Feedback zu Ihren Herausforderungen erhalten können, bevor Sie diese veröffentlichen. Das ist aber ziemlich gut gemacht.
Magic Octopus Urn
Wie berechnen wir den BPM? Beginnen wir mit dem ersten Tastendruck oder wenn der Code zu laufen beginnt? Teilen wir vor der Extrapolation durch 7 oder 8?
Xnor
Hmm .. Das Timing sollte also beim ersten Tastendruck beginnen. Was die Division
angeht
Coole Frage! Viel Glück
Noah Cristino

Antworten:

1

Pyth , 22 Bytes

 wJ.d0 mw8.Rc480-.d0J2

(Ja, es gibt ein führendes Leerzeichen)

Die Eingabe erfolgt durch Drücken der Eingabetaste.

Wenn zusätzliche Ausgabe zulässig ist, kann ich die Leerzeichen entfernen und eine Punktzahl von 20 Bytes erhalten.

Beispielausführung

Erläuterung

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

MATLAB / Octave, 58 56 55 Bytes

Danke @LuisMendo für -1 Byte!

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

Sie müssen die Eingabetaste 9 Mal drücken. (Funktioniert auch in Octave.)

Hier sehen Sie es in Aktion, links MATLAB, rechts Octave:

Fehler
quelle
D'oh! aber geht round(.,2)das nicht, oder geht das in den neueren versionen?
Fehler
Oh, es funktioniert nur in Matlab
Luis Mendo
7

JavaScript (ES6), 77 bis 74 Byte

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

Erstellt ein onclickEreignis für das globale windowObjekt. Senden Sie Beats, indem Sie auf eine beliebige Stelle im Fenster klicken.

Testschnipsel

Justin Mariner
quelle
632,41! ziemlich gut calc :) +1
V. Courtois
6

Python 3, 93 92 81 Bytes

11 Bytes dank Felipe gespeichert .

import time
a,*l,b=[input()or time.time()for i in' '*9]
print(round(480/(b-a),2))
Justin
quelle
1
81 Bytes
Felipe Nardi Batista
Ich habe versucht print('%.2f'%(480/(b-a)))und print(f'{480/(b-a):.2f}')(Python3.6 +), aber beide haben die gleichen bytecount
Felipe Nardi Batista
5

Bash + gängige Linux-Dienstprogramme, 58

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

Javascript, 100 , 84 dank Powelles , 82 Bytes dank Justin Mariner

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

Serge K.
quelle
1
Sie sollten in der Lage sein, Date.now()anstelle von new Date().getTime()und 48e4anstelle von zu verwenden 480000.
Powelles
Sie können das Ergebnis auch zurückmelden, anstatt es zurückzugeben, und einer Variablen wie (a=alert)()für Ihre erste Verwendung und spätere Verwendung eine Warnung zuweisen a().
Powelles
Ah vielen Dank, ich hätte nie gedacht , von 48e4und Instanciate und rufen alertzusammen: (a=alert)().
Serge K.
1
Sie können auch szur Verwendung wechseln Date.now()und diese .getTime()später löschen . Und dann können Sie einen Alias Date.nowauf einen kürzeren Namen setzen. Und die Initiale z=wird nicht benötigt, da Sie die Funktion nicht rekursiv aufrufen. Bis zu 69 Bytes hier
Justin Mariner
Oh, und Ihre Lösung rundet nicht auf zwei Dezimalstellen, wie es die Herausforderung verlangt.
Justin Mariner
4

Java 1.5+, 345 339 361 337 Bytes

-34 Bytes Danke an Michael für den Hinweis, dass ich vergessen habe, meine Importe zu reparieren

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

Hört dem Benutzer beim Drücken der Leertaste zu. Wenn der Benutzer sie dann neunmal gedrückt hat, wird die aktuelle BPM an den Benutzer zurückgedruckt:

Bildbeschreibung hier eingeben

Das Bild enthält Debug-Meldungen, die im Golf-Code nicht vorhanden sind.


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

Ein bisschen Spaß zu versuchen und einen Highscore zu bekommen ...

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
Magische Kraken-Urne
quelle
Ich habe eine kleine Änderung vorgenommen und wollte 9 Eingaben, damit Sie 8 Datenpunkte anstelle von 7
eingeben können
Verpasste ein Leerzeichen:String[]a) {new java
Stephen
Eine andere Sache ist, dass ich eine Anforderung formuliere, die besagt: "Sie sollte den BPM der Tastendrücke ausgeben, die auf 2 Dezimalstellen gerundet sind." Rundet dies auf 2 Dezimalstellen?
xNinjaKittyx
1
@xNinjaKittyx macht jetzt.
Magic Octopus Urn
1
Rekord ist 2027.03BPM xD leicht verändert den Code für ein besseres Benchmarking
XtremeBaumer
3

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

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

Auch zur Byteanzahl hinzugefügt:

using System;

Gesamtes Programm:

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
quelle
1
Es wäre kürzer, wenn zwei Variablen nach dem ersten Tastendruck für die Startzeit eine außerhalb der Schleife haben und dann eine andere in der Schleife überschreiben würden. Ich glaube nicht, dass Sie den Ausgabewert so formatieren müssen, +""dass es in Ordnung wäre, einfach oder gar das Doppelte zurückzugeben. namespace System.Diagnostics{}ist wahrscheinlich kürzer, aber du verwendest nur Diagnosticsdas wso vollwertige Qualifying, das wahrscheinlich auch kürzer ist. Beachten Sie, dass Sie die using System;Anzahl der Bytes für den ConsoleAufruf angeben sollten.
TheLethalCoder
2
Ersetzen 540000.0durch5.4e5
Nazar554
1
Na du würdest sowas machen (end-start).Millisecondsund einstellen endund startauf DateTime.Now.
TheLethalCoder
1
Ich denke, Sie haben einen Fehler in Ihrer Berechnung. Wenn Sie ReadKey durch Thread.Sleep (100) ersetzen, sollten Sie etwas weniger als 600 BPM erhalten, aber Ihr Code bietet mehr als das (ungefähr 670 BPM). Die Formel sollte "60sec * 1000ms / (DeltaMs / 8points)" lauten, was "48e8 / DeltaMs" bedeutet. Sie können auch $ "{48e8 / (d [8] -d [0]) zurückgeben. Ticks: n2}" fo -20 ;-)
Luc
1
Ich denke, Sie sollten in der Lage sein, einige Bytes zu sparen, indem Sie tun, 8/TimeSpan.TotalMinutesanstatt 54e4/TimeSpan.TotalMilliseconds. Auch durch eine schnelle Überprüfung mit 'Math.Round (Wert, 2)' statt value.ToString("n2")schien ein paar Zeichen zu speichern, zum Teil, weil es weniger Klammern benötigt
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
quelle
Sie könnten 5 Bytes sparen, wenn Sie das entfernen #defineund stattdessen tunvoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem
Nein, denn wenn ich das tue, beginnt das Timing vor der ersten Eingabe, während gesagt wird, dass das Timing bei der ersten Eingabe beginnt. Nicht Programmstart
HatsuPointerKun
Wäre es für die Änderung der Linie 3 zu möglich sein #define G;getchar()und dann Wechsel clock();Gzu clock()G?
Zacharý
@ Zacharý Ich bekomme Syntaxfehler
HatsuPointerKun
Aus irgendeinem Grund beschwert sich mein Compiler über round.
Zacharý
2

Python + Flüche, 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))

Erfordert das cursesLaden des Moduls.

-9 Bytes dank Felipe Nardi Batista

HyperNeutrino
quelle
Was macht das Curses-Modul? Verfluche dich?
Magic Octopus Urn
@MagicOctopusUrn Natürlich ist es das, was es tut.
HyperNeutrino
time () muss bei der ersten Eingabe und nicht bei der Programmausführung beginnen.
xNinjaKittyx
@xNinjaKittyx behoben; danke
HyperNeutrino
@MagicOctopusUrn Abgesehen von den Witzen handelt es sich um eine terminalbasierte GUI-Bibliothek.
Kroltan
2

vba, 57

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

Drücken Sie die Eingabetaste oder klicken Sie im Meldungsfeld auf OK.

SeanC
quelle
2

Python 3 , 74 Bytes

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

Probieren Sie es online!

Dies gibt Ihnen dumme Zahlen in TIO, da es alle Eingaben auf einmal ausführt, aber es funktioniert. timeit()Gibt die Ausführungszeit der Anweisung 'input()'in Sekunden ohne den Setup-Parameter zurück input(). TIO mit einer Verzögerung von 1s pro Eingang zur Validierung.

nocturama
quelle
1

Java 8, 180 135 Bytes

-45 Byte dank @SocraticPhoenix, das vorschlägt, System.indirekt zu verwenden .

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

Eine anonyme Lambda-Funktion mit einem nicht verwendeten Argument, das einer funktionellen Schnittstellenmethode zugewiesen werden muss, die eine auslöst Exception(Beispiel unten). Liest von der Konsole; Beats werden durch Drücken von gesendet enter.

Ungolfed mit Umgebungstestcode

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
quelle
1
Wäre es kürzer, einfach direkt abzulesen System.in?
Socratic Phoenix
@SocraticPhoenix Ich habe das eigentlich nie ausprobiert, aber es scheint zu funktionieren; nur mit System.in.read()sperren bis eingang ist. Vielen Dank! Wird die Antwort aktualisieren.
Justin Mariner
25559105.43 bpm mit diesem lol
V. Courtois
1

C #, 117 Bytes

Es gibt bereits eine C # (.NET Core) Antwort , auf der diese aufbaut. Es wurde eine interpolierte Zeichenfolge (die in .NET Core offenbar nicht vorhanden ist) für die Ausgabe hinzugefügt und einige Bytes mithilfe eines langen Arrays anstelle von DateTime rasiert.

_=>{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}";}

Humane Version

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

R 79 84 Bytes

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

Funktioniert nur mit der Eingabetaste, da der Scan sofort beendet wird. Verwendet explizit printfür sein digitsArgument, die Rundung zu behandeln.

> 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
quelle
Korrigiert dies auch mit einem CPM von mehr als 1000?
Roman Gräf
@ RomanGräf wirbt, nein. Bearbeitet
JAD
0

Ruby, 58 Bytes

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
Wert Tinte
quelle