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


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


@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``}

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


Черт возьми, я как раз собирался опубликовать что-то вроде этого. Я все еще собираюсь опубликовать его (потому что он использует узел и все), потому что я использую другой подход.
— Эддисон Крамп

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

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

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


Это интересное решение. Это еще короче, когда вы загружаете и переименовываете файл, не так ли?
— Груша

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

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

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


Почему бы не распечатать 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, я был бы очень признателен.


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.

2

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

R I F  H 60/I W *7

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


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

,


Выглядит хорошо, но это не работает для меня: 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;}

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


2

Perl 5, 36 байт

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

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

sub{{$|=print"\a";sleep 60/$_[0];redo}}->(21)

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

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, будет использовать больше байтов.


0

Stax, 17 байт

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

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

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

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

пример:

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.