建立节拍器


36

介绍

几天前,我需要节拍器来做一些事情。我没有空,所以我从App Store下载了一个应用。该应用程序的大小为71 MB !!!
71 MB用于制作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 bpslink


1
您能否添加一些I / O示例(录制一些声音并上传,在此处发布链接)?
Addison Crump

2
问题:当您说“外部库”时,是否包括该语言建议的库?(我不会使用它,但是在Vitsy中是一个示例,其中我可以访问shell或JS(但是JS是内置的))
Addison Crump

3
您可以在其中添加排行榜代码段吗?
Addison Crump

1
我怀疑您下载的大多数应用程序都是漂亮的图形和声音效果。就像那些手电筒应用程序什么都不做,只不过将屏幕变成白色,但仍然设法以某种方式用完了数十MB ...
Darrel Hoffman

1
对精度有什么要求?在您的示例中,beep()控制台输出和控制台输出都不都是即时的IIRC。两者都不sleep()以准确为人所知。
Num Lock

Answers:


19

Mathematica,26个字节

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

Do通常从最狭义上说,它用作“ for”循环:对i从... xy...的每个重复这段代码,甚至只是重复这段代码n时间。取而代之的是一些n我们可以给它无穷虽然创建一个无限循环。循环体是Pause[Beep[];60/#]一种简单的编写方式,Beep[];Pause[60/#]其中#函数参数是。

如果该解决方案最终可以使调用堆栈崩溃,那么我们可以使用递归解决方案节省一个字节:

#0[Beep[];Pause[60/#];#]&

我不知道那~Do~∞是可能的。一个For循环只得到了我29个字节。(此外,我个人认为26字节版本是唯一有效的版本。)
LegionMammal978 '16

@ LegionMammal978不幸的是,~Do~∞来自变量时,它似乎不起作用。(我在打真机时尝试使用它。)
Martin Ender

1
Attributes[Do]包括HoldAll,因此我的猜测是它_~Do~∞具有特殊的评估模式。
LegionMammal978 '16

@ LegionMammal978它似乎更喜欢做的变量,因为这条错误消息Do[...,a],其中a持有无限实际显示此呼叫Do[...,{a}]
马丁·恩德


8

JavaScript,36 45 42 41 34字节

@RikerW节省了1个字节

@ETHproductions节省了1个字节

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

这是一个功能。

如果使用`\7`,SpiderMonkey会抱怨八进制文字已被弃用。

备用,31个字节

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

问题是无法打印的东西被剥离了,但这应该可以工作。


该死,我正要发布这样的内容。我仍然要发布它(因为它使用了node和all),因为我使用了不同的方法。
Addison Crump

如果从我提出问题的方式看待它,那么递归解决方案将是不可能的。节拍器是为工作和工作而设计的...一段时间后不会崩溃。
PEAR 2016年

@PEAR不会崩溃,因为没有变量在递增。可能导致崩溃的唯一原因是终端缓冲区,但我认为现代计算机可能需要50到100年的时间
Downgoat

它在什么环境下运行?我已经尝试了chrome和Node.js,但是无法正常工作。
starbeamrainbowlabs '16

@starbeamrainbowlabs,它使用JavaScript Shell(SpiderMonkey)
Downgoat

8

Bash,53 55 41字节

感谢@Dennis削减了14个字节1

好的,真相时间:我对打高尔夫球非常恐惧。任何帮助将非常感谢。

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

1废话 难怪没人能超越丹尼斯。


while 1可能吗
PEAR 2016年

@PEAR Nupe-已经尝试过了。
Addison Crump

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的示例声音文件。我不确定这是否在规则范围内(我想它就像是shell版本;它需要在特定的环境中运行),但是值得一试。

安全版本:57字节

如果由于某些原因不允许上述代码,请尝试以下方法:

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

适用于任何页面!


这是一个有趣的解决方案。下载并重命名文件时它更短,不是吗?
PEAR

@PEAR会更短一些,但随后它将需要它自己的网页,并且声音文件位于同一文件夹中才能运行。
ETHproductions 2016年

哦,是JavaScript xD ...您是对的
PEAR 2016年

@PEAR在那里,我做到了。该新解决方案是否符合规则?
ETHproductions 2016年

嗯 您可以使用特定网页将其指定为JS。这是一个预先存在的口译员,因此它是一种有效的语言。
Addison Crump

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答案之一。Ô看到这样的代码time.sleep.pop()中间看起来很奇怪。;)
Kevin Cruijssen,

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

Python,68 67 57字节

@FlagAsSpam节省了1个字节

@Adnan节省了9个字节

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

将行尾转换为UNIX格式后,它还少了2个字节。

较旧的版本,实际上以bpm作为命令行参数(66字节):

import sys,time
while 1:print"\7";time.sleep(60./int(sys.argv[1]))

4
你不能print"\7";吗?我不确定,但我很确定能奏效。
Addison Crump

@Andan不,input()请求用户输入。我不知道这是否被视为有效输入。无论如何,也需要转换为数字。
webwarrior

1
怎么样a=input()a更换int(sys.argv[1])?我一直认为Python 2自动评估输入,因此不需要int转换,但是我可能是错的。
阿德南

@Andan input()实际上会自动评估。我忘了那个功能。不过,这是相当荒谬的-可能是旧时代的遗产。
webwarrior

可以time.sleep(60./a)替换为time.sleep(60./input()),同时完全删除a=input()吗?
拍手


4

Vitsy,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>
Addison Crump

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?
Addison Crump

@FlagAsSpam更长:系统发出蜂鸣声System.Console.Beep();,并打印字符System.Console.Write('<\a character>');
LegionMammal978 '16

哇。写一个角色很多。
Addison Crump

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
Addison Crump

3

GMC-4机器代码,21.5字节

GMC-4是一家名为Gakken的公司生产的4位计算机,用于在简化的指令集和计算机中教授汇编语言的原理。此例程0x5D通过0x5F大尾数十进制(即每个半字节一位)输入数据存储器地址。

该算法基本上是将输入添加到内存并等待0.1s,直到至少为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是big-endian,但我不确定。如果有人拥有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
结束

取消高尔夫:

显示对话框“”默认答案“”
将x设置为60000 /(返回结果文本)
重复
    嘟
    延迟x
结束重复

嘿,新答案:)不幸的是,除非没有Mac,否则我无法尝试您的帖子;)-非常感谢
PEAR 2016年

@PEAR不客气。:)

欢迎使用编程难题和Code Golf。这是一个很好的答案,+ 1。请继续回答!
wizzwizz4 2016年

2

VBScript,113 66字节

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

这个程序很简单;它接受输入,回显BEL字符,然后等待。感谢Niel节省了将近一半的程序!


这有什么错WScript.Echo CHR(7)?还有,你的意思是60000
尼尔

@尼尔,是的。忘了那些。
Conor O'Brien 2016年

2

Ruby,37 33字节

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

非常简单。

这是一个lambda函数。如果您想以60 bpm的速度运行,请执行以下操作:m[60]


从理论上讲$><<?\a,也应发出哔哔声。无需为您的proc命名(所有带有胖箭头功能的JavaScript解决方案也将其保留为未分配状态),您也可以匿名调用它:->b{loop{$><<?\a;sleep 6e1/b}}[60]
manatwork '16

@manatwork我只有Ruby 2.x,所以我无法测试?\a; 你有Ruby 1.x吗?如果是这样,您可以测试一下是否可行吗?
贾斯汀

好吧,我有一个Ruby 1.9.3,并且代码没有引发任何错误。但是测试还有另一个问题:我的机器没有蜂鸣声。Ruby都没有。设置一次,不知道要做什么。
manatwork '16

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 '16

1

Jolf,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。执行另一个Jolf命令~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字符,从而产生系统提示音。它将循环直到被中断。
将该-t值设置为(2 / RPM)/ 60,以使整个代码每秒可播放RPM * 60次。


发布后经过一段时间后,非常感谢您提供新的答案。对我不起作用:(不知道我的系统是否有问题或其他问题。我从GitHub下载fish.py并执行了您的逗号(openSUSE)。得到此错误:(standard_in)1:语法错误用法:fish .py [-h](<脚本文件> | -c <代码>)[<选项>] fish.py:错误:参数-t /-tick:预期的一个参数
PEAR

bc安装好了吗?看起来像$(bc -l<<<"2/$1/60")没有产生任何输出。我将其添加到答案的语言列表中。我还不能完全测试我的答案,因此也可能会出现某种错误。
亚伦

0

SmileBASIC,26个字节

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

它可以演奏任何通用的Midi乐器,尽管9以上的任何东西都会使用更多的字节。


0

Stax,17个字节

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

或打开包装:

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

程序输出字节,当通过命令行工具以默认设置播放时,会产生节拍器噪音。输入用作bpm

例:

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

您应该以所需的bpm听到刺耳的哔哔声

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.