Girişleri ile BPM hesaplanması


30

Geçen 8 veri noktasını kullanarak ortalama BPM'yi (Dakikada Kalp Atışı) hesaplayacak en kısa kodu programlayın. Bu benim ilk gönderim ve buna benzer bir soru görmedim. Ritim oyunlarının hayranı olduğum için BPM'yi kendi klavyenizi ve kendi ritim duygunuzu kullanarak hesaplamak için küçük bir kullanışlı araca sahip olmak güzel olurdu (eğer bir tane varsa ...)

Meydan okuma

  • Tüm girişler tekil olmalıdır. (yani sadece "basıldığında" "girdi" olarak girin)
  • Programınız en az 9 giriş almalıdır. (Zamanın 8 veri noktasını oluşturmak için.)
  • Programınız, 2 ondalık basamağa yuvarlanan tuş basmalarının BPM'sini çıkarmalıdır. (yani 178.35)
  • Zamanlama ilk girişte başlar. Programın başlangıcı değil

Bu , bu yüzden en kısa cevap kazanır.

Örnek Giriş ve Çıkış

En az bir örnek giriş ve çıkış sağlayın. Girişin nasıl görünmesi gerektiğine dair kendi tanımınıza uyduklarından emin olun.

Giriş:

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

Çıktı:

> 60

Güncel kazanan Pyth kullanarak 22 Byte'ta KarlKastor

Kazanan Pyth kullanıyor olsa da, Matlab cevabı kayda değer bir cevaptı.


5
Ha! İlginç, PPCG'ye hoş geldiniz; Gelecekte referans olması için, göndermeden önce zorluklarınız hakkında geri bildirim alabileceğiniz bir sanal alana sahibiz . Bu olsa oldukça iyi yapılır.
Magic Octopus Urn

BPM'yi nasıl hesaplıyoruz? İlk tuşa basıldığında veya kod çalışmaya başladığında zamanlamaya mı başlıyoruz? Ekstrapolasyondan önce 7 ya da 8'e bölüyor muyuz?
xnor

Hmm .. Yani zamanlama ilk tuşa basılmalı. Bölünmeye gelince, bunu 9 girdi yapacak şekilde değiştireceğim (yani 8'e
bölersiniz

Güzel soru! İyi şanslar
Noah Cristino

Yanıtlar:


1

Pyth , 22 bayt

 wJ.d0 mw8.Rc480-.d0J2

(evet önde gelen bir yer var)

Giriş 'enter' tuşuna basar.

Ek çıktıya izin verilirse boşlukları kaldırabilir ve 20 baytlık bir puan alabilirim.

örnek uygulama

açıklama

 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 bayt

-1 bayt için @LuisMendo teşekkürler!

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

9 kez enter tuşuna basmanız gerekir. (Ayrıca Octave'da da çalışır.)

Burada hareket halinde görüyorsunuz, sol MATLAB, sağ Octave:


D'oh! ancak round(.,2)çalışmıyor mu, yoksa yeni sürümlerde mi?
kusur

Oh, sadece Matlab'da çalışıyor
Luis Mendo

7

JavaScript (ES6), 77 74 bayt

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

Globalde bir onclicketkinlik yaratırwindow nesne . Pencerede herhangi bir yeri tıklatarak atım gönderin.

Test Parçacığı


632,41! oldukça iyi bir hesapla :) +1
V. Courtois


5

Bash + ortak Linux yardımcı programları, 58

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

5

JavaScript, 100 , 84 sayesinde Powelles , 82 sayesinde bayt Justin Mariner

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


1
Date.now()Yerine new Date().getTime()ve 48e4yerine kullanabilirsiniz 480000.
powelles,

Ayrıca sonucu geri döndürmek yerine geri uyarabilir ve (a=alert)()ilk kullanımınız gibi bir değişkene daha sonra uyarı verebilirsiniz a().
powelles,

Ah çok teşekkürler, ben hiç düşünmediğim 48e4ve instanciate VE çağrı alertbirlikte: (a=alert)().
Serge K.,

1
Ayrıca skullanmaya geçebilir Date.now()ve .getTime()daha sonra bırakabilirsiniz . Ve sonra Date.nowdaha kısa bir isme takma ad atabilirsiniz . z=Fonksiyonu özyinelemeli olarak çağırmadığınız için başlangıç gerekli değildir. Aşağı 69 burada bayt
Justin Mariner

Oh, ve çözümün, sorduğun gibi 2 ondalık basamağa kadar gitmiyor.
Justin Mariner

4

Java 1.5+, 345 339 361 337 bayt

-34 bayt Michael teşekkür ederim ithalatı düzeltmek için unuttum işaret için

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

Boşluk çubuğuna basarken kullanıcıyı dinler. Ardından, kullanıcı 9 kez bastığında, kullanıcıya geçerli BPM'yi geri yazdırır:

görüntü tanımını buraya girin

Görüntüde golf kodunda bulunmayan hata ayıklama mesajları var.


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

Denemek ve yüksek puan almak için biraz eğlenceli ...

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

Ben küçük bir değişiklik yapılmış ve 7 yerine girişi için 8 veri noktası olabilir bu yüzden 9 girdi istediğini (sadece küçük bir değişiklik olmalıdır.)
xNinjaKittyx

Bir boşluk String[]a) {new java
Stephen

Başka bir şey, "2 ondalık basamağa yuvarlanan tuş basımlarının BPM'sini çıkarması gerektiğini" söyleyen bir gereklilik belirtmiştim. Bu tur 2 ondalık basamağa mı çıkıyor?
xNinjaKittyx

1
@ xNinjaKittyx şimdi yapıyor.
Magic Octopus Urn

1
rekor 2027.03BPM xD biraz daha iyi bir kıyaslama için kodunu değiştirdi
XtremeBaumer

3

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

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

Ayrıca bayt sayımına eklendi:

using System;

Bütün program:

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
İki değişkenin başlangıç ​​zamanı için ilk tuşa basıldıktan sonra bir döngünün dışında olması ve daha sonra döngüde bir başkasının üzerine yazması daha kısa olacaktır. Çıktı değerini biçimlendirmeniz gerektiğini sanmıyorum, bu yüzden sadece +""ya da iki katına geri dönmek iyi olurdu. namespace System.Diagnostics{}Muhtemelen daha kısadır, ancak yalnızca Diagnosticso wkadar kısa olan tam yeterlilik için de kullanırsınız. Çağrı using System;için bayt sayınıza dahil etmeniz gerektiğini unutmayın Console.
TheLethalCoder

2
yerine 540000.0birlikte5.4e5
Nazar554

1
Peki böyle bir şey yapmak istiyorum (end-start).Millisecondsve seti endve startiçin DateTime.Now.
TheLethalCoder

1
Bence hesaplamada bir hata var. ReadKey'i Thread.Sleep (100) ile değiştirirseniz, 600 BPM'den biraz almanız gerekir, ancak kodunuz bundan daha fazlasını verir (yaklaşık 670 BPM). Formül, "48e8 / deltaMs" anlamına gelen "60sec * 1000ms / (deltaMs / 8points)" olmalıdır. Ayrıca, $ dönebilirsiniz "{48e8 / (d [8] -d [0]) Keneler: n2.}" -20 fo ;-)
Luc

1
Bunun 8/TimeSpan.TotalMinutesyerine bazı baytları kaydedebilmeniz gerektiğini düşünüyorum 54e4/TimeSpan.TotalMilliseconds. Ayrıca, value.ToString("n2")kısmen daha az parantez gerektiğinden, birkaç karakter kaydetmek yerine 'Math.Round (value, 2)' kullanarak yapılan hızlı bir kontrolle
Kamil Drakari

2

C ++, 150 bayt

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

Eğer kaldırırsanız 5 bayt kurtarabilecek #defineve bunun yerine yapmakvoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem

Hayır, çünkü bunu yaparsam, ilk girişten önce zamanlama başlayacaktır, bununla birlikte Zamanlama ilk girişte başlamaktadır. Program başlamadı
HatsuPointerKun

Satır 3'ü #define G;getchar()değiştirip sonra değiştirmem clock();Gmümkün clock()Gmü?
Zacharý

@ Zacharý Sözdizimi hatası
alıyorum

Nedense derleyicim şikayetçi round.
Zacharý

2

Python + küfürler, 122 bayt

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

Gerektirir cursesModülün yüklenmesini .

Felipe Nardi Batista sayesinde -9 bayt


Curses modülü ne işe yarıyor? Lanet olsun sana?
Magic Octopus Urn

@MagicOctopusUrn Tabii ki kesinlikle yaptığı budur.
HyperNeutrino

time () ilk girişten başlamalı ve programın yürütülmesinde başlamalıdır.
xNinjaKittyx

@ xNinjaKittyx düzeltildi; teşekkürler
HyperNeutrino

@ MagicOctopusUrn Kenara Şakalar, terminal tabanlı bir GUI kütüphanesi.
Kroltan

2

vba, 57

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

enter tuşuna basın veya mesaj kutusunda Tamam'ı tıklayın.


2

Python 3 , 74 bayt

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

Çevrimiçi deneyin!

Bu, TIO'da size aptal sayıları verecektir çünkü tüm girişleri bir kerede çalıştırır ancak çalışır. setup parametresi hariç timeit()ifadenin yürütme süresini 'input()'saniye cinsinden döndürür input(). Doğrulama için giriş başına 1s gecikmeli TIO .


1

Java 8, 180 135 bayt

@SocraticPhoenix sayesinde System.indoğrudan kullanılmasını öneren -45 bayt .

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

Anonim bir lambda işlevi, kullanılmayan bir argümanla, bir işlevsellik sağlayan bir arabirim yöntemine atanması gereken bir işlevdir Exception(aşağıdaki örnek). Konsoldan okur; vuruşlar tuşuna basarak gönderilir.enter .

Ungolfed Çevreleyen Test Kodu

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
Doğrudan okumayı okumak daha kısa olur System.inmu?
Socratic Phoenix,

@SocraticPhoenix Bunu hiç denemedim, ama işe yarıyor gibi görünüyor; sadece System.in.read()giriş alınana kadar engellemek için kullanılır . Teşekkürler! Cevabı güncelleyecektir.
Justin Mariner,

İle 25.559.105,43 bpm bu lol
V. Courtois

1

C #, 117 bayt

Bunun üzerine kurulu bir C # (.NET Core) cevabı zaten var. Çıktı için enterpolasyonlu dize (.NET Core'un eksikliği gibi görünüyor) eklendi ve DateTime yerine uzun bir dizi kullanarak bazı baytları traş etti.

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

İnsancıl versiyonu

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 bayt

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

Yalnızca enter kullanımı sırasında çalışır, çünkü bu hemen taramayı sonlandırır. Yuvarlatmayı ele printalarak digitsargümanı için açıkça kullanır .

> 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

Bu aynı zamanda 1000'den büyük olan bir BGBM ile de doğru mu?
Roman Gräf

@ RomanGräf woops, hayır. Düzenlenen.
JAD

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.