Расчет BPM с входами

30

Запрограммируйте самый короткий код, который будет вычислять среднее значение ударов в минуту (ударов в минуту), используя 8 временных точек данных. Это мой первый пост, и я не видел подобного вопроса. Так как я фанат ритм-игр, было бы неплохо иметь небольшой удобный инструмент для расчета BPM, используя вашу собственную клавиатуру и ваше собственное чувство ритма (если оно у вас есть ...)

Вызов

  • Все входные данные должны быть единичными. (т.е. только нажимая «ввод» как «ввод»)
  • Ваша программа должна принимать не менее 9 входов. (Для создания 8 точек данных прошло время.)
  • Ваша программа должна выводить удары в минуту нажатий клавиш, округленные до 2 десятичных знаков. (т.е. 178,35)
  • Сроки начинается с первого ввода. Не запуск программы

Это , поэтому выигрывает самый короткий ответ.

Пример ввода и вывода

Предоставьте хотя бы один пример ввода и вывода. Убедитесь, что они соответствуют вашему собственному описанию того, как должен выглядеть ввод.

Входные данные:

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

Выход:

> 60

Текущий победитель - KarlKastor на 22 байта, использующий Pyth

Хотя победитель использовал Pyth, ответ Matlab был заметным ответом.

xNinjaKittyx
источник
5
Ха! Интересно, добро пожаловать в PPCG; для дальнейшего использования у нас также есть песочница, где вы можете получить отзывы о своих задачах, прежде чем публиковать их. Это довольно хорошо сделано, хотя.
Волшебная Осьминог Урна
Как мы вычисляем BPM? Мы начинаем синхронизацию при первом нажатии клавиши или когда код начинает работать? Делим ли мы на 7 или 8 перед экстраполяцией?
xnor
Хм .. Так что время должно начинаться при первом нажатии. Что касается деления, я изменю его, чтобы сделать 9 входов (так что вы
делите
Классный вопрос! Удачи
Ноа Кристино

Ответы:

1

Pyth , 22 байта

 wJ.d0 mw8.Rc480-.d0J2

(да, там ведущий пробел)

Ввод осуществляется нажатием кнопки ввода.

Если разрешен дополнительный вывод, я могу удалить пробелы и получить оценку 20 байт.

пример исполнения

объяснение

 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
источник
9

MATLAB / Octave, 58 56 55 байт

Спасибо @LuisMendo за -1 байт!

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

Вы должны нажать Enter 9 раз. (Также работает в Октаве.)

Здесь вы видите это в действии, слева MATLAB, справа Octave:

flawr
источник
D'о! но round(.,2)не работает или в новых версиях?
flawr
О, это работает только в Matlab
Луис Мендо
7

JavaScript (ES6), 77 74 байта

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

Создает onclickсобытие на глобальном windowобъекте. Отправить удары, нажав в любом месте окна.

Тестовый фрагмент

Джастин Маринер
источник
632,41! неплохой счет :) +1
В. Куртуа
6

Python 3, 93 92 81 байт

Сохранено 11 байтов благодаря Фелипе .

import time
a,*l,b=[input()or time.time()for i in' '*9]
print(round(480/(b-a),2))
Джастин
источник
1
81 байт
Фелипе Нарди Батиста,
я пробовал print('%.2f'%(480/(b-a)))и print(f'{480/(b-a):.2f}')(python3.6 +), но у обоих одинаковое количество участников
Фелипе Нарди Батиста
5

Bash + общие утилиты Linux, 58

script -tt -c'sed -n 9q'
sed '1c2k0
s/ 2/+/;$a480r/p' t|dc
Цифровая травма
источник
5

Javascript, 100 , 84 благодаря Пауэлл , 82 байта благодаря Джастину Маринеру

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

Серж К.
источник
1
Вы должны быть в состоянии использовать Date.now()вместо new Date().getTime()и 48e4вместо 480000.
Пауэлл
Также вы можете предупредить результат обратно, а не возвращать его и назначить оповещение переменной, как (a=alert)()при первом использовании, а затем при последующем использовании a().
Пауэлл
Ах, большое спасибо, я никогда не думал 48e4, и создать экземпляр И позвонить alertвместе (a=alert)().
Серж К.
1
Вы также можете переключиться sна использование Date.now(), и отказаться от .getTime()позже. И тогда вы можете использовать псевдоним Date.nowдля более короткого имени. И инициал z=не нужен, так как вы не вызываете функцию рекурсивно. Здесь до 69 байт
Джастин Маринер,
О, и ваше решение не округляется до 2 десятичных знаков, как требует задача.
Джастин Маринер
4

Java 1,5+, 345 339 361 337 байт

-34 байта спасибо Майклу за указание, что я забыл исправить мой импорт

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

Слушает пользователя, когда он нажимает пробел. Затем, когда пользователь нажал его 9 раз, печатает обратно текущий BPM:

введите описание изображения здесь

Изображение содержит сообщения отладки, которых нет в коде для игры в гольф.


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

В некотором роде весело, чтобы попытаться получить рекорд ...

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
Урна волшебного осьминога
источник
Я сделал небольшое изменение, и мне нужно было 9 входов, чтобы вы могли иметь 8 точек данных для ввода вместо 7. (должно быть небольшое изменение.)
xNinjaKittyx
Пропустил пробел:String[]a) {new java
Стивен
Другое дело, я поставил требование, которое гласит: «Он должен выводить BPM нажатий клавиш, округленных до 2 десятичных знаков». Есть ли в этом округе до 2 десятичных знаков?
xNinjaKittyx
1
@xNinjaKittyx делает сейчас.
Волшебная Осьминог Урна
1
запись 2027.03BPM xD немного изменил код для лучшего тестирования
XtremeBaumer
3

C # (.NET Core), 193 206 189 186 155 143 137 байт

-47 байт благодаря TheLethalCoder
-4 байт благодаря Nazar554
-16 байт благодаря Luc
-2 байт благодаря Камилу Дракари

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

Также добавлено к количеству байтов:

using System;

Вся программа:

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
Короче было бы, чтобы две переменные имели одну вне цикла после первого нажатия клавиши в течение времени начала, а затем перезаписывали другую в цикле. Я не думаю, что вам нужно форматировать выходное значение, чтобы просто +""или даже возвращение двойного было бы хорошо. namespace System.Diagnostics{}Вероятно, короче, но вы используете только Diagnosticsна wнастолько полной квалификации, что, вероятно, тоже короче. Обратите внимание, что вы должны включить using System;в свой счетчик байтов для Consoleвызова.
TheLethalCoder
2
заменить 540000.0на5.4e5
Nazar554
1
Ну вы могли бы сделать что - то вроде (end-start).Millisecondsи набор endи startк DateTime.Now.
TheLethalCoder
1
Я думаю, что у вас есть ошибка в ваших расчетах. Если вы замените ReadKey на Thread.Sleep (100), вы должны получить чуть менее 600 ударов в минуту, но ваш код дает больше (около 670 ударов в минуту). Формула должна быть «60 сек * 1000 мс / (дельтаМ / 8 точек)», что означает «48e8 / дельтаМ». Также вы можете вернуть $ "{48e8 / (d [8] -d [0]). Ticks: n2}" fo -20 ;-)
Люк
1
Я думаю, что вы должны быть в состоянии сохранить некоторые байты, выполнив 8/TimeSpan.TotalMinutesвместо 54e4/TimeSpan.TotalMilliseconds. Кроме того, путем быстрой проверки с использованием «Math.Round (value, 2)» вместо value.ToString("n2")сохранения нескольких символов, частично потому, что требовалось меньше скобок
Камил Дракари
2

C ++, 150 байт

#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
источник
Вы можете сохранить 5 байт, если вы удалите #defineи вместо этого сделаетеvoid f(){for(int i=0,auto s=clock();i++<9;){getchar();}std::cout<<round(6000/(double(clock()-s)/8000))/100;}
DJMcMayhem
Нет, потому что, если я это сделаю, синхронизация начнется перед первым вводом, в то время как сказано, что синхронизация начинается с первого ввода. Не запуск программы
HatsuPointerKun
Можно ли изменить строку 3 на, #define G;getchar()а затем изменить clock();Gна clock()G?
Захари
@ Zacharý Я получаю синтаксические ошибки
HatsuPointerKun
По какой-то причине мой компилятор жалуется на round.
Захари
2

Python + curses, 122 байта

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

Требуется cursesмодуль для загрузки.

-9 байт благодаря Фелипе Нарди Батисте

HyperNeutrino
источник
Что делает модуль curses? Проклинаю тебя?
Волшебная Осьминог Урна
@MagicOctopusUrn Конечно, это то, что он делает.
HyperNeutrino
time () должен запускаться при первом вводе, а не при выполнении программы.
xNinjaKittyx
@xNinjaKittyx исправлено; спасибо
HyperNeutrino
@MagicOctopusUrn Шутки в сторону, это библиотека GUI на основе терминала.
Кролтан
2

vba, 57

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

нажмите ввод или нажмите ОК в окне сообщения.

SeanC
источник
2

Python 3 , 74 байта

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

Попробуйте онлайн!

Это даст вам глупые числа в TIO, поскольку он запускает все входы одновременно, но работает. timeit()возвращает время выполнения оператора 'input()'в секундах, исключая параметр настройки input(). TIO с задержкой 1 с на вход для проверки.

Ноктюрама
источник
1

Java 8, 180 135 байт

-45 байт благодаря @SocraticPhoenix, предлагающему использовать System.inнапрямую.

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

Анонимная лямбда-функция с неиспользуемым аргументом, которая должна быть назначена методу функционального интерфейса, который выдает Exception(пример ниже). Читает из консоли; удары посылаются нажатием enter.

Ungolfed с окружающим тестовым кодом

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
Будет ли короче просто читать прямо с System.in?
Сократов Феникс
@SocraticPhoenix Я никогда не пробовал, но, похоже, это работает; просто использовать System.in.read()для блокировки, пока не получен ввод. Благодарность! Буду обновлять ответ.
Джастин Маринер
25559105,43 ударов в минуту с этим лол
В. Куртуа
1

C #, 117 байт

Уже есть ответ на C # (.NET Core), на котором он основывается. Добавлена ​​интерполированная строка (которой, по-видимому, не хватает .NET Core) для вывода и сокращенная часть байтов с использованием длинного массива вместо 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}";}

Гуманная версия

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 байта

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

Работает только при использовании Enter, так как это немедленно завершит сканирование. Явно использует printв качестве digitsаргумента обработку округления.

> 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
источник
Корректно ли это также при цене за тысячу показов больше 1000?
Роман Греф
@ RomanGräf woops, нет. Ред.
JAD
0

Рубин, 58 байт

gets;t=Time.now;8.times{gets};p (480/(Time.now-t)).round 2
Значение чернил
источник