Строим метроном

36

Введение

Несколько дней назад мне был нужен метроном для чего-то. У меня не было ни одного доступного, поэтому я скачал приложение из App Store. Приложение имело размер 71 МБ !!!
71 МБ для изготовления тик-ток ...?!
Так что мне пришла в голову код-гольф, и мне было интересно, могут ли некоторые из вас это улучшить.

Вызов

Гольф какой-то код, который выводит звук. Это довольно неважно, что за звук. Если необходимо, создайте какой-нибудь звуковой файл ... но системный звуковой сигнал также сделает эту работу. ( Вот какой-то звук, который я создал ... ничего особенного. )

Вход : количество ударов в минуту на выходе метронома.

пример

Это Java-версия без игры в гольф! Это просто, чтобы показать вам задачу.

public class Metronome {
  public static void main(String[] args) throws InterruptedException {
    int bpm = Integer.valueOf(args[0]);
    int interval = 60000 / bpm;

    while(true) {
        java.awt.Toolkit.getDefaultToolkit().beep();
        // or start playing the sound
        Thread.sleep(interval);
        System.out.println("Beep!");

    }
  }
}

правила

Вы не можете использовать внешние библиотеки, разрешены только инструменты самого языка.
Только байты подсчета исходного кода ... не звуковой файл.

Это , поэтому выигрывает представление с наименьшим количеством байтов!

РЕДАКТИРОВАТЬ:

Пример вывода: что-то вроде этого будет выводом для 120 бит / с : ссылка

ГРУША
источник
1
Можете ли вы добавить несколько примеров для ввода / вывода (запишите звук и загрузите его, разместите ссылки здесь)?
Эддисон Крамп
2
Вопрос: когда вы говорите «внешние библиотеки», включает ли это библиотеки, которые предлагаются с языком? (Я не буду использовать это, но пример в Vitsy, где я могу получить доступ к shell или JS (но JS встроен))
Addison Crump
3
Можете ли вы добавить фрагмент списка лидеров ?
Эддисон Крамп
1
Я подозреваю, что большая часть того приложения, которое вы скачали, это красивая графика и звуковые эффекты. Это как те фонарик приложений , которые ничего не делают , но повернуть экран все белое , но все же удается как - то использовать до десятков МБ ...
Даррел Хоффман
1
Какие требования к точности? В вашем примере, beep()и вывод на консоль не совсем мгновенный IIRC. Никто sleep()не известен как точный.
Num Lock

Ответы:

19

Mathematica, 26 байтов

Pause[Beep[];60/#]~Do~∞&

Doобычно используется как цикл for в самом узком смысле: повторяйте этот фрагмент кода для каждого iот xдо y... или даже просто повторяйте этот фрагмент кода nраз. Вместо числа nмы можем задать ему бесконечность, хотя и создать бесконечный цикл. Тело цикла - Pause[Beep[];60/#]это простой способ записать, Beep[];Pause[60/#]где #аргумент функции.

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

#0[Beep[];Pause[60/#];#]&
Мартин Эндер
источник
Я не знал, что ~Do~∞это возможно. ForПетля только у меня до 29 байт. (Кроме того, я лично считаю, что 26-байтовая версия является единственной верной.)
LegionMammal978
@ LegionMammal978 К сожалению, ~Do~∞не работает, когда приходит из переменной. (Я пытался использовать это, когда играю в гольф на вашей машине правды.)
Мартин Эндер
1
Attributes[Do]включает в себя HoldAll, так что я думаю, что _~Do~∞имеет специальный шаблон оценки.
LegionMammal978
@ LegionMammal978 Это больше похоже на переменные, потому что сообщение об ошибке для Do[...,a]где aсодержит бесконечность фактически показывает вызов как Do[...,{a}].
Мартин Эндер
14

Pyth, 11 10 9 байт

Спасибо Аднану за напоминание #.

#C7.dc60Q

Навсегда ( #), напечатайте Cхар-код 7. Затем sleep ( .d) 60секунд, разделенных на ( c) input ( Q).

PurkkaKoodari
источник
@Adnan Забыл об этом. Спасибо.
PurkkaKoodari
Вам нужно место?
lirtosiast
@ThomasKwa Да. IIRC 7.будет проанализирован как число.
Конор О'Брайен
5
Ой. #pythnoob
Конор О'Брайен
2
Я не мог уснуть, когда пытался. Это продолжало печатать время Unix
busukxuan
8

JavaScript, 36 45 42 41 34 байта

Сохранено 1 байт благодаря @RikerW

Сохранено 1 байт благодаря @ETHproductions

n=>{for(;;sleep(60/n))print("\7")}

Это функция.

Если я использую `\7`, SpiderMonkey жалуется, что восьмеричные литералы устарели.

Альтернатива, 31 байт

n=>{for(;;sleep(60/n))print``}

Проблема в том, что непечатные надписи удалены, но это должно сработать.

Downgoat
источник
Черт возьми, я как раз собирался опубликовать что-то вроде этого. Я все еще собираюсь опубликовать его (потому что он использует узел и все), потому что я использую другой подход.
Эддисон Крамп
Если вы посмотрите на то, как я задал вопрос, рекурсивное решение будет невозможно. Метрономы предназначены для работы и работы ... а не для того, чтобы рухнуть через некоторое время.
Груша
@PEAR это не должно привести к сбою, потому что ни одна переменная не увеличивается. Единственное, что может привести к его сбою - это буфер терминала, за исключением современных компьютеров, которые, как мне кажется, могут занять> 50-100 лет
Downgoat
В какой среде это работает? Я пробовал chrome и Node.js, но не могу заставить его работать.
starbeamrainbowlabs
@starbeamrainbowlabs это использует оболочку JavaScript (SpiderMonkey)
Downgoat
8

Баш, 53 55 41 байт

Спасибо @Dennis за бритье 14 байтов 1

Хорошо, время истины: я ужасен в игре в гольф. Любая помощь будет очень признательна.

echo " ";sleep `bc -l<<<60/$1`;exec $0 $1
      ^ That's ASCII char 7

1 Святое дерьмо. Неудивительно, что никто не может переиграть Денниса.

Аддисон Крамп
источник
while 1Возможно ли ?
Груша
@PEAR Nupe - уже пробовал это.
Эддисон Крамп
while printf \\aвозможно?
Нил
Это не работает, так как bash использует целочисленное деление. Вам нужно будет использовать bc.
спагетто
1. Символ BEL не является особенным для Bash, поэтому вам не нужны кавычки. 2. Если вы читаете ввод как CLA, вам не нужно read. 3. echoсуществует с кодом 0, так что вы можете использовать это утверждение вместо true.
Денис
7

JavaScript ES6 (браузер), 43 байта

Это может растягивать правила:

x=>setInterval('new Audio(1).play()',6e4/x)

Дайте этой функции имя (например F=x=>...) и введите его в консоли браузера на этой странице . Затем вызовите функцию с помощью вашего bps, например F(60), и подождите, пока не произойдет волшебство. :-)

Почему это работает? Ну, b.htmlнаходится в той же папке, что и файл с именем 1, который является образцом звукового файла из OP. Я не уверен, что это в правилах (я думаю, что это похоже на версию оболочки; ее нужно запускать в определенной среде), но это стоило того.

Более безопасная версия, 57 байт

Если приведенный выше код не разрешен по какой-либо причине, попробуйте вместо этого:

x=>setInterval('new Audio("//ow.ly/Xrnl1").play()',6e4/x)

Работает на любой странице!

ETHproductions
источник
Это интересное решение. Это еще короче, когда вы загружаете и переименовываете файл, не так ли?
Груша
@PEAR Это будет короче, но тогда для запуска потребуется собственная веб-страница со звуковым файлом в той же папке.
ETHproductions
О, это JavaScript xD ... ты прав
Груша
@PEAR Там, я сделал это. Это новое решение в правилах?
ETHproductions
Да. Вы можете указать, что это JS с определенной веб-страницей. Это существующий переводчик, так что это действительный язык.
Эддисон Крамп
6

05AB1E , 31 байт

Код:

I60s/[7ç?D.etime.sleep(#.pop())

Если бы у меня была встроенная функция ожидания N секунд, это могло бы быть 11 байтов. К сожалению, это не случай. Вот объяснение:

I                               # Push input
 60                             # Push 60
   s                            # Swap the top 2 items
    /                           # Divide the top 2 items
     [                          # Infinite loop
      7ç                        # Push the character \x07
        ?                       # Output it, which give a sound
         .e                     # Evaluate the following as Python code
           time.sleep(       )  # Wait for N seconds
                      #         # Short for stack
                       .pop()   # Pop the last item

Использует кодировку ISO 8859-1.

Аднан
источник
Это должен быть один из первых ответов 05AB1E o.Ô Выглядит очень странно, когда вы видите код time.sleepи .pop()в середине этого кода. ;)
Кевин Круйссен
6

osascript, 39 байт

on run a
repeat
beep
delay 60/a
end
end

Есть буквально команда под названием beep? Sweeeet!

Запускается только на Mac OS X из-за ограниченной лицензии, но для запуска выполните:

osascript -e "on run a
repeat
beep
delay 60/a
end
end" bpm
Аддисон Крамп
источник
6

Python, 68 67 57 байт

Сохранено 1 байт благодаря @FlagAsSpam

Сохранено 9 байтов благодаря @Adnan

import time
a=input()
while 1:print"\7";time.sleep(60./a)

Также потребовалось на 2 байта меньше после преобразования концов строк в формат UNIX.

Старая версия, которая фактически принимает bpm в качестве аргумента командной строки (66 байт):

import sys,time
while 1:print"\7";time.sleep(60./int(sys.argv[1]))
webwarrior
источник
4
Вы не можете сделать print"\7";? Я не уверен, но я уверен, что это работает.
Эддисон Крамп
@Andan Нет, input () запрашивает ввод у пользователя. Я не знаю, считается ли это допустимым. Кроме того, преобразование в число необходимо в любом случае.
веб-воин
1
Как насчет a=input()и aзамены int(sys.argv[1])? Я всегда думал, что Python 2 автоматически оценивает ввод и поэтому не нуждается в преобразовании int, но я могу ошибаться.
Аднан
@Андан на input()самом деле делает автоматическую оценку. Я забыл об этой функции. Это довольно не пифонично, хотя - вероятно, наследие от старых времен.
веб-воин
Можно time.sleep(60./a)заменить time.sleep(60./input()), полностью удалив a=input()?
хлопните
4

Витси, 14 байтов

a6*r/V1m
<wVO7

Подробный режим (скоро появится переводчик):

0:                              // a6*r/V1m
push a; // 10
push 6;
multiply top two; // 60
reverse stack; // bpm on top
divide top two; // bpm/60
save/push permanent variable; 
push 1;
goto top method; // goes to 1
1:                              // <wVO7
go backward; // infinite loop, from the bottom of 1
wait top seconds;
save/push permanent variable; // pushes the bpm in terms of seconds of delay
output top as character;
push 7;

В основном, я использую wоператор, чтобы ждать определенное количество секунд, как указано bpm/60, завернутый в бесконечный цикл. Затем я шуметь с выводом терминала ASCII символа 7 ( BEL).

Аддисон Крамп
источник
Выглядит хорошо, но как я могу это проверить? :)
PEAR
@PEAR Вам придется скачать переводчик (забыл связать его в заголовке). Сохраните его в файле и запустите java -jar Vitsy.jar <filename>.
Эддисон Крамп
4

C #, 118 байт

class A{static int Main(string[]a){for(;;System.Threading.Thread.Sleep(60000/int.Parse(a[0])))System.Console.Beep();}}

Основное решение.

LegionMammal978
источник
Почему бы не распечатать ASCII char 7?
Эддисон Крамп
@FlagAsSpam Это длиннее: системный сигнал использует System.Console.Beep();, а печать использует символ System.Console.Write('<\a character>');.
LegionMammal978
Ого. Это много, чтобы написать персонажа.
Эддисон Крамп
4

Java, 103 82 байта

Спасибо @Justin за то, что он сбрил 21 байт!

О Боже.

void x(int b)throws Exception{for(;;Thread.sleep(60000/b))System.out.print('\7');}

Метод и версия игры в гольф.

Аддисон Крамп
источник
Почему не System.out.print('\7');вместо java.awt.Toolkit.getDefaultToolkit().beep();?
Джастин
@Justin \ предназначен исключительно для экранирования символов регулярных выражений.
Эддисон Крамп
1
нет обратная косая черта является escape-последовательностью. '\7'является символом колокола, который издает звук при распечатке
Джастин
@ Джастин Да. Я всегда выбрасывал ошибки (при использовании двойных кавычек). Моя ошибка. Благодарность! : D
Эддисон Крамп
3

Машинный код GMC-4 , 21,5 байта

GMC-4 - это 4-битный компьютер компании Gakken, который обучает принципам языка ассемблера в упрощенном наборе инструкций и на компьютере. Эта процедура требует ввода в адресах памяти данных 0x5Dчерез 0x5F, в большом обратном порядке байт десятичного (то есть, одна цифры на клев).

Алгоритм в основном добавляет ввод в память и ждет 0,1 с, пока он не достигнет 600, а затем вычитает 600 и издает звуковой сигнал в бесконечном цикле. Поскольку GMC-4 имеет множество функций обмена регистрами, но не имеет функций копирования регистров , это делается трудным путем.

В шестнадцатеричном формате (вторая строка - позиция в памяти):

A24A14A04 80EC AF5A2EF AE5A1EF AD5A0EF 8A6 F2AF09 86ADEEE9F09
012345678 9ABC DEF0123 4567890 ABCDEF0 123 456789 ABCDEF01234

В сборе:

    tiy 2     ;ld y, 0x2
    AM        ;ld a, [0x50 + y]
    tiy 1
    AM
    tiy 0
    AM
start:
    tia 0     ;ld a, 0x0
    cal timr  ;pause for (a+1)*0.1 seconds
    tiy F
    MA        ;ld [0x50 + y], a
    tiy 2
    cal DEM+  ;add a to [0x50 + y]; convert to decimal and carry.
    tiy E     ;do the same for the second digit
    MA
    tiy 1
    cal DEM+
    tiy D     ;and the third.
    MA
    tiy 0
    cal DEM+
    tia A
    M+
    jump beep
    jump start
beep:
    tia 6
    tiy D
    cal DEM-
    cal SHTS  ;'play short sound'
    jump start

Отказ от ответственности:

Я на самом деле не владею GMC-4. Я тщательно проверил эту программу с документацией из сети, но, возможно, я допустил ошибку. Я также не знаю порядка байтов. Похоже, что GMC-4 является байтовым порядком байтов, но я не уверен. Если кто-то владеет GMC-4 и сможет это проверить / подсказать порядковый номер GMC-4, я был бы очень признателен.

lirtosiast
источник
3

C, 48 байтов

void f(int b){while(printf(""))Sleep(60000/b);}
                            ^ literal 0x07 here

Решение только для Windows (функция Sleep (), если быть точным).

Я также (ab) использовал тот факт, что printf () возвращает количество напечатанных символов, чтобы использовать его в качестве условия бесконечного цикла.

В двойных кавычках в вызове printf () есть символ IS, но он почему-то здесь не отображается. Если вы сомневаетесь, скопируйте и вставьте в Sublime Text 2 или Notepad ++, символ будет отображаться как BEL.

Это началось как решение C ++, но оно как бы попало в C-подмножество C ++ (потому что, вы знаете, Sleep()немного короче std::this_thread::sleep_for(std::chrono::milliseconds())) и printf()короче std::cout<<).

Александр Рево
источник
3

AppleScript 94 байта

Я знаю, что довольно поздно, и это мой первый пост здесь, но неважно.

отобразить диалог "" ответ по умолчанию ""
установить x в 60000 / текст результата возвращается
повторение
гудок
задержка х
конец

Ungolfed:

отобразить диалог "" ответ по умолчанию ""
установите x на 60000 / (текст результата возвращается)
повторение
    гудок
    задержка х
конец повтора
Вы
источник
Привет, новые ответы :) К сожалению, я не могу попробовать ваш пост, если у меня нет Mac;) - но большое спасибо
PEAR
@PEAR Не за что. :)
Вы
Добро пожаловать в Программирование головоломок и Code Golf. Это хороший ответ, +1. Пожалуйста, продолжайте отвечать!
wizzwizz4
2

VBScript, 113 66 байт

a=InputBox("")
Do
WScript.Echo(Chr(7))
WScript.Sleep(60000/a)
Loop

Эта программа достаточно проста; он принимает ввод, повторяет символ BEL и ждет. Спасибо Нилу за то, что он сбрил почти половину программы!

Конор О'Брайен
источник
Что не так с WScript.Echo CHR(7)? Кроме того, вы имели в виду 60000?
Нил
@ Нил Ах, да. забыл о тех .;
Конор О'Брайен
2

Рубин, 37 33 байта

m=->b{loop{puts"\7"
sleep 6e1/b}}

Довольно просто.

Это лямбда-функция. Если вы хотите 60 ударов в минуту, вы могли бы сделать: m[60].

Джастин
источник
Теоретически $><<?\aтакже должно работать на звуковой сигнал. И не нужно , чтобы дать имя для прока (все решения JavaScript с содержанием жира функции стрелка также оставить его Unassigned), вы можете позвонить анонимно тоже: ->b{loop{$><<?\a;sleep 6e1/b}}[60].
manatwork
@manatwork У меня только Ruby 2.x, так что я не смог протестировать ?\a; у вас есть Ruby 1.x? Если да, можете ли вы проверить, что это работает?
Джастин
Ну, у меня есть Ruby 1.9.3, и код не вызывает ошибок с ним. Но у меня есть другая проблема с тестированием: на моей машине нет звукового сигнала. Ни Руби, ни что-либо еще. Установить что-то один раз, понятия не имею, что.
Манатворк
2

Japt, 30 байт

6e4/U i`?w Au¹o('../1').play()

?Должен быть буквальным байт 9A. Проверьте это онлайн! (Извините за всплывающее окно, задерживающее первые несколько ударов; это будет скоро удалено.)

Как это работает

6e4/U i"new Audio('../1').play()  // Implicit: U = input bps
6e4/U                             // Calculate 60000 / U.
      i                           // Set a timed event every that many milliseconds,
       "new Audio('../1').play()  // running this code every time.
                                  // ../1 is the path to the file used in my JS entry.
ETHproductions
источник
2

Свинка, 18 байт

R I F  H 60/I W *7

Считайте BPM в переменную I, затем F {с двумя пробелами после} является бесконечным циклом. Остановитесь на 60 секунд / BPM, затем запишите $ CHR (7) {Ascii: BEL} в стандартный вывод, давая требуемый аудиовыход, затем перезапустите в бесконечном цикле.

zmerch
источник
2

Java, 321 символ

Звучит очень хорошо. Работает только на системах с поддержкой MIDI.

import javax.sound.midi.*;import java.util.*;class A{public static void main(String[] a) throws Exception{int d=new Scanner(System.in).nextInt();Synthesizer b=MidiSystem.getSynthesizer();b.open();MidiChannel c=b.getChannels()[0];c.programChange(116);while(true){c.noteOn(0,100);Thread.sleep((int)(d/.06));c.noteOff(0);}}}

,

username.ak
источник
Выглядит хорошо, но это не работает для меня: pastebin.com/0CbGYkU0
PEAR
@PEAR исправлено. Я забыл актерский состав.
username.ak
@PEAR и импорт
username.ak
@PEAR, я поменял некоторые операции из-за отсутствия звука
username.ak
2

ChucK , 90 байт

Белый шум, который включается и выключается каждые два тика.

60./Std.atoi(me.arg(0))*1000=>float s;while(1){Noise b=>dac;s::ms=>now;b=<dac;s::ms=>now;}

объяснение

60./Std.atoi(me.arg(0)) //Convert the input to an int and divide 60 by it
*1000                   //Multiply by 1000 (in order to avoid s::second)
=>float s;              //Store it as a float in variable s
while(1)                //Forever,
{Noise b=>dac;          //Connect a noise generator b to the audio output
s::ms=>now;             //Wait for s milliseconds
b=<dac;                 //Disconnect b from the audio output
s::ms=>now;}            //Wait for s milliseconds

Это сделано, чтобы включить звук в такт, а затем выключить его в такт.

98 93-байтовая версия (любитель)

Белый шум воспроизводится в течение 10 миллисекунд на такт.

60./Std.atoi(me.arg(0))*1000-9=>float s;while(1){Noise b=>dac;10::ms=>now;b=<dac;s::ms=>now;}

Это сделано, чтобы быть щелчком вместо постоянного шума, включаемого и выключаемого.

The_Basset_Hound
источник
2

Perl 5, 36 байт

{{$|=print"\a";sleep 60/$_[0];redo}}

Подпрограмма; использовать его как

sub{{$|=print"\a";sleep 60/$_[0];redo}}->(21)
msh210
источник
sleepв секундах, поэтому вы не можете издавать более 60 звуковых сигналов в минуту, не уверен, является ли это требованием. Кроме того, вы, вероятно, можете сохранить тот же счетчик байтов, но иметь полную программу, выполнив что-то вроде: $|=<>;{print"\a";sleep 60/$|;redo}(не могу проверить это прямо сейчас).
ChatterOne
@ChatterOne, согласно его документации, вы правы sleep. Но это сработало для меня.
msh210
1

Джольф, 7 байт, неконкурентный

Я добавил звуки после того, как был сделан этот прекрасный вызов.

TΑa/Αaj
T       set an interval
 Αa      that plays a short beep (Α is Alpha)
   /Αaj  every 60000 / j (the input) seconds. (Αa returns 60000)

Если вы хотите очистить этот звук, обратите внимание на вывод. Скажи, что это число x. Выполните еще одну команду Джольфа ~CP"x", и интервал будет очищен.

Конор О'Брайен
источник
1

Zsh , 32 байта

<<<$'\a'
sleep $[60./$1]
. $0 $1

Основано на ответе ведущего bash, но sources вместо execs. Источники ссылок TIO$0:a из-за того, как выполняется исходный файл, но он будет работать без него.

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

GammaFunction
источник
Вы опоздали на вечеринку, но это выглядит действительно хорошим решением!
Груша
Я знаю, что опаздываю, но сегодня мне просто хотелось играть в гольф. Решил проверить музыкальную метку для удовольствия, и нашел этот вызов. Хороший, кстати!
GammaFunction
0

Bash + bc + > <> , 44 байта

Игра на том факте, что интерпретатор> <> позволяет вам определить время тика:

python fish.py -t $(bc -l<<<"2/$1/60") -c 7o

Код> <> является 7oи должен выводить BELсимвол, производя системный звуковой сигнал. Он будет повторяться до тех пор, пока не будет прерван. Значение устанавливается в (2 / RPM) / 60 , так что весь код играют RPM * 60 раз в секунду.
-t

Аарон
источник
Большое спасибо за новый ответ через некоторое время после публикации. У меня не работает :( Не уверен, что проблема в моей системе или что-то еще. Я скачал fish.py с GitHub и выполнил вашу запятую (openSUSE). Получил эту ошибку: (standard_in) 1: использование синтаксической ошибки: fish .py [-h] (<файл сценария> | -c <код>) [<options>] fish.py: ошибка: аргумент -t / - отметка: ожидается один аргумент
PEAR
Вы bcустановили? Похоже, что $(bc -l<<<"2/$1/60")не производил никакого вывода. Я добавлю это в список языков ответа. Я еще не смог полностью проверить свой ответ, поэтому может быть и какая-то ошибка.
Аарон
0

SmileBASIC, 26 байтов

INPUT B$BGMPLAY@8T+B$+"[C]

Он может играть на любом общем миди-инструменте, хотя все, что больше 9, будет использовать больше байтов.

12Me21
источник
0

Stax, 17 байт

ü7»♥O╚⌂╥☻≈OyM╜Δ∩`

или без упаковки:

4|A48*x/W2|A]pc{| }*

Программа выводит байты, которые при подаче через утилиту командной строки aplay с настройками по умолчанию производят шум метронома. Ввод используется в качестве ударов в минуту

пример:

example-stax-interpreter metronome.stax -i "60" | aplay

Вы должны услышать ужасный звуковой сигнал при желаемом ударов в минуту

user89655
источник