Побудова метронома


36

Вступ

Деякі дні тому мені знадобився метроном для чогось. У мене не було жодного доступного, тому я завантажив додаток із App Store. Додаток мав розмір 71 МБ !!!
71 Мб для виготовлення tic-toc ...?!
Тож код-гольф прийшов мені в голову, і мені було цікаво, чи хтось із вас, хлопці, може це покращити.

Виклик

Гольф якийсь код, який видає якийсь звук. Який звук досить неважливо. Якщо потрібно, створіть якийсь звуковий файл ..., але системний звуковий сигнал також зробить роботу. ( Ось якийсь звук я створив ... нічого особливого. )

Вхід : удари за хвилину виводить метроном.

Приклад

Це не-гольф-версія 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 bps : link


1
Чи можете ви додати кілька прикладів вводу-виводу (записати якийсь звук і завантажити його, розмістити посилання тут)?
Аддісон Кримп

2
Питання: коли ви говорите "зовнішні бібліотеки", чи включають бібліотеки, запропоновані мовою? (Я не буду використовувати це, але приклад є у Vitsy, де я можу отримати доступ до оболонки або JS (але JS вбудований))
Addison Crump


1
Я підозрюю, що більшість завантажених вами додатків - це графіка та звукові ефекти. Це як ті програми ліхтариків, які нічого не роблять, але перетворюють екран у все біле, але все-таки вдається якось витратити десятки МБ ...
Даррел Хоффман,

1
Яка вимога щодо точності? У вашому зразку beep()і консольний вихід не є точно миттєвим IIRC. Ніхто sleep()не відомий для бджоли точності.
Num Lock

Відповіді:


19

Математика, 26 байт

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

Doзазвичай використовується як цикл "за" у найвужчому розумінні: повторіть цей фрагмент коду для кожного 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. Потім сплять ( .d) 60секунди, розділені на ( c) вхід ( Q).


@Adnan Забув про це. Спасибі.
PurkkaKoodari

Вам потрібен простір?
lirtosiast

@ThomasKwa Так. IIRC 7.буде розбиратися як число.
Conor O'Brien

5
Ой. #pythnoob
Conor O'Brien

2
Я не міг спати. D, коли я спробував. Він зберігав час друку 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)
Пуховик

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, який є зразковим звуковим файлом з ОП. Я не впевнений, чи це в межах правил (я думаю, це як версія оболонки; її потрібно запускати в певному середовищі), але це варто було зняти.

Більш безпечна версія, 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

Буквально є команда під назвою звуковий сигнал? Солодка!

Запускається лише на Mac OS X через обмежену ліцензію, але для запуску виконайте такі дії:

osascript -e "on run a
repeat
beep
delay 60/a
end
end" bpm

6

Пітон, 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, але я можу помилятися.
Аднан

@Andan 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 Вам доведеться завантажити перекладача (забув зв’язати його в заголовку). Збережіть його у файлі та запустіть його 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
ні зворотна косою рисою не є послідовністю виходу. '\7'- це символ дзвоника, який видає звук, коли його роздруковують
Джастін

@Justin Huh. Я завжди кидав на це помилки (при використанні подвійних лапок). Моя помилка. Спасибі! : 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 (), але він чомусь не відображається. Якщо ви сумніваєтесь, скопіюйте та вставте в 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 / повернутий текст результату
повторити
звуковий сигнал
затримка х
кінець

Безголівки:

діалогове вікно "" відповідь за замовчуванням ""
встановити x на 60000 / (текст результату повернуто)
повторити
    звуковий сигнал
    затримка х
кінець повторити

Гей, нові відповіді :) На жаль, я не можу спробувати ваш пост, якщо у мене немає Mac;) - але велике спасибі
PEAR

@PEAR Вітаємо вас. :)
Ти

Ласкаво просимо до головоломки програмування та коду для гольфу. Це гарна відповідь, +1. Будь ласка, продовжуйте відповідати!
wizzwizz4

2

VBScript, 113 66 байт

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

Ця програма досить проста; він приймає вклад, повторює символ БЕЛ і чекає. Дякуємо Нієлу за те, що збрив майже половину програми!


Що не так WScript.Echo CHR(7)? Також ви мали на увазі 60000?
Ніл

@Neil Ага, так. забув про те;
Conor O'Brien

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 У мене є лише 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

Ява, 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 Я забув акторський склад.
ім'я користувача.ak

@PEAR та імпорт
username.ak

@PEAR, я поміняв кілька операцій через відсутність звуку
ім'я користувача.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через те, як виконується оригінальний файл, але він буде працювати без нього.

Спробуйте в Інтернеті!


Ви спізнилися на вечірку, але це виглядає як справді чудове рішення!
ЧЕРВЕНЬ

Я знаю, що спізнююсь, але я просто відчував, що сьогодні займаюся гольфом. Вирішив перевірити музичний тег для задоволення і знайшов це завдання. Гарний, btw!
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 <code>) [<варіанти>] fish.py: помилка: аргумент -t / - галочка: очікується один аргумент
ЧЕРВЕНЬ

Ви bcвстановили? Схоже, що $(bc -l<<<"2/$1/60")не дало жодного результату. Я додам його до списку мов відповіді. Я ще не зміг повністю перевірити свою відповідь, тому може бути і якась помилка.
Аарон

0

SmileBASIC, 26 байт

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

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


0

Стакс, 17 байт

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

або, розпаковано:

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

Програма виводить байти, які при подачі через інструмент командного рядка в програму за замовчуванням видають шум метроному. Вхід використовується як bpm

приклад:

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

Ви повинні почути жахливий гудячий шум у потрібний хв

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.