我们面临的挑战
由字符计数的最短代码,这将输出乐谱基于用户输入。
投入将是由一系列的字母和数字 - 字母将代表音符的姓名和号码将代表音符的长度。 的说明是由4个垂直列。 该说明的头将是一个资本O
,干,如果存在的话将是3行高,从管道的个性使|
和标志(S)将来自反斜杠制成\
。
有效注长度是没有,1/4音符,音符的1/8,记下的1/16和音符的1/32。
| |\ |\ |\
| | |\ |\
| | | |\
O O O O O
1 1/4 1/8 1/16 1/32
注意事项都在工作人员的地方,根据自己的音符名称:
----
D ----
C
B ----
A
G ----
F
E ----
所有输入,可以认为是有效的,并没有错误 - 每个音符都与上一行空格分隔,至少有一个有效的注释。
测试用例
Input:
B B/4 B/8 B/16 B/32 G/4 D/8 C/16 D B/16
Output:
|\
--------------------------|---|\--------
| |\ |\ |\ | |\ |\
------|---|---|\--|\-----O----|--O----|\
| | | |\ | O |
-O---O---O---O---O----|--------------O--
|
---------------------O------------------
----------------------------------------
Input:
E/4 F/8 G/16 A/32 E/4 F/8 G/16 A/32
Output:
--------------------------------
--------------|\--------------|\
|\ |\ |\ |\
------|\--|\--|\------|\--|\--|\
| | | O | | | O
--|---|--O--------|---|--O------
| O | O
-O---------------O--------------
Input:
C E/32 B/8 A/4 B F/32 B C/16
Output:
------------------------------|\
|\ |\
----------|---|---------------|-
O | | O
---------O----|--O----|\-O------
|\ O |\
------|\--------------|\--------
|\ O
-----O--------------------------
码计数包括输入/输出(即完整的程序)。
Answer 1:
高尔夫球脚本(112个字符)
' '%:A;10,{):y;A{2/.0~|1=~:r;0=0=5\- 7%
4y@--:q' '' O'if-4q&!q*r*{16q/r<'|\\'
'| 'if}' 'if+{.32=y~&{;45}*}%}%n}%
Answer 2:
Perl中,126个字符(一百二十二分之一百十五带开关)
的Perl在239 226 218 216 183 180 178 172 157 142 136 133 129 128 126个字符
这在Perl 126字符的解决方案是自己和A.雷克斯之间的冗长的合作的结果。
@o=($/)x10;$/=$";map{m[/];$p=4+(5-ord)%7;
$_.=--$p?!($p&~3)*$'?16<$p*$'?" |\\":" | ":$/x4:" O ",
$|--&&y@ @-@for@o}<>;print@o
A.雷克斯还提出了一个解决方案与运行perl -ap
开关。 与111(!)在该溶液中字符加上4个冲程的额外命令行开关,该解决方案具有的115总得分。
$\="$:
"x5;$p=4+(5-ord)%7,s#..##,$\=~s#(.)\K$#--$p?
$_*!($p&~3)?"$1|".(16<$p*$_?"\\":$1).$1:$1x4:O.$1x3#gemfor@F
在这个解决方案的第一个换行符是显著。
或122个字符嵌入shebang行的开关:
#!perl -ap
$\="$:
"x5;$p=4+(5-ord)%7,s#..##,$\=~s#(.)\K$#--$p?$_*!($p&~3)?"$1|".(16<$p*$_?
"\\":$1).$1:$1x4:O.$1x3#gemfor@F
(第一两个新行是显著)。
半音符可以用一个额外的12个字符的支持:
@o=($/)x10;$/=$";map{m[/];$p=4+(5-ord)%7;
$_.=--$p?!($p&~3)*$'?16<$p*$'?" |\\":" | ":$/x4:$'>2?" @ ":" O ",
$|--&&y@ @-@for@o}<>;print@o
Answer 3:
LilyPond的- 244个字节
从技术上讲,这不符合输出规格,作为输出是一个很好的刻PDF,而不是一个贫穷的ASCII文本替代品,但我想这个问题只是哭出来了LilyPond的解决方案。 事实上,你可以删除“\ autoBeamOff \ cadenzaOn \ stemUp”,使它看起来更漂亮格式化。 您还可以添加“\ MIDI {}”后“\布局{}”来获得一个MIDI文件来听。
o=#(open-file"o""w")p=#ly:string-substitute
#(format o"~(~a"(p"2'1""2"(p"4'1""4"(p"6'1""6"(p"8'1""8"(p"/""'"(p"C""c'"(p"D""d'"(p" ""/1"(p"
"" "(ly:gulp-file"M")))))))))))#(close-port o)\score{{\autoBeamOff\cadenzaOn\stemUp\include"o"}\layout{}}
用法: lilypond thisfile.ly
笔记:
- 输入必须在在同一目录下命名节目“M”的文件。
- 输入文件必须以换行符结束。 (或者通过具有它在一个空格结束保存9个字节)。
- 输出是一个名为“thisfile.pdf” PDF,其中“thisfile.ly”是程序的名称。
- 我LilyPond的2.12.2测试这一点; 其他版本可能无法正常工作。
我没有做过的LilyPond的多,所以我不知道这是要做到这一点的最好办法,因为它必须输入到LilyPond的格式转换,将其写入到一个辅助文件,然后读取它。我现在无法获得内置LilyPond的解析器/评估工作。 :(
现在工作的一个ASCII输出解决方案.... :)
Answer 4:
C89(186个字符)
#define P,putchar(
N[99];*n=N;y;e=45;main(q){for(;scanf(" %c/%d",n,n+1)>0;n
+=2);for(;y<11;q=y-(75-*n++)%7 P+q-4?e:79)P*n&&q<4&q>0?
124:e)P*n++/4>>q&&q?92:e))*n||(e^=13,n=N,y++P+10))P+e);}
半音符支持(+7字)
#define P,putchar(
N[99];*n=N;y;e=45;main(q){for(;scanf(" %c/%d",n,n+1)>0;n
+=2);for(;y<11;q=y-(75-*n++)%7 P+q-4?e:v<4?79:64)P*n&&q<4&q>0?
124:e)P*n++/4>>q&&q?92:e))*n||(e^=13,n=N,y++P+10))P+e);}
Answer 5:
Python中字符178
167是虚惊一场,我忘了抑制茎的全音符。
R=raw_input().split()
for y in range(10):
r=""
for x in R:o=y-(5-ord(x[0]))%7;b=" -"[y&1]+"O\|";r+=b[0]+b[o==3]+b[-(-1<o<3and''<x[1:])]+b[2*(-1<o<":862".find(x[-1]))]
print r
的Python 167字符(破碎)
没有空间在这一个邪恶的眼睛,虽然有有2个填充字符,所以我加了一个笑脸。 这种技术利用了的音符长度的最后一个字符的独特性,所以对我来说幸运的是没有票据的1/2或1/64笔记
R=raw_input().split()
for y in range(10):
r=""
for x in R:o=y-(5-ord(x[0]))%7;b=" -"[y&1]+"O\|";r+=b[0]+b[o==3]+b[-(-1<o<3)]+b[2*(-1<o<":862".find(x[-1]))]
print r
Python中字符186 <<o>>
Python使用<<o>>
邪恶的眼睛运营商有很大的影响在这里。 该find()
方法返回-1,如果该项目没有找到,所以这就是为什么d不需要出现在笔记。
R=raw_input().split()
for y in range(10):
r=""
for x in R:o='CBAGFE'.find(x[0])+4;B=" -"[y%2];r+=B+(B,'O')[o==y]+(x[2:]and
y+4>o>y and"|"+(B,'\\')[int(x[2:])<<o>>6+y>0]or B*2)
print r
11个额外的字节给出了半个音符版本
R=raw_input().split()
for y in range(10):
r=""
for x in R:t='CBAGFE'.find(x[0])+4;l=x[2:];B=" -"[y%2];r+=B+(B,'@O'[l
in'2'])[t==y]+(l and y+4>t>y and"|"+(B,'\\')[int(l)>>(6+y-t)>0]or B*2)
print r
$ echo B B/2 B/4 B/8 B/16 B/32 G/4 D/8 C/16 D B/16| python notes.py
|\
------------------------------|---|\--------
| | |\ |\ |\ | |\ |\
------|---|---|---|\--|\-----@----|--O----|\
| | | | |\ | @ |
-O---O---@---@---@---@----|--------------@--
|
-------------------------@------------------
--------------------------------------------
Answer 6:
159个字符的Ruby
n=gets.split;9.downto(0){|p|m='- '[p%2,1];n.each{|t|r=(t[0]-62)%7;g=t[2..-1]
print m+(r==p ?'O'+m*2:p>=r&&g&&p<r+4?m+'|'+(g.to_i>1<<-p+r+5?'\\':m):m*3)}
puts}
Answer 7:
红宝石136
n=gets;10.times{|y|puts (b=' -'[y&1,1])+n.split.map{|t|r=y-(5-t[0])%7
(r==3?'O':b)+(t[1]&&0<=r&&r<3?'|'<<(r<t[2,2].to_i/8?92:b):b+b)}*b}
红宝石139(鸣叫)
n=gets;10.times{|y|puts (b=' -'[y&1,1])+n.split.map{|t|r=y-(5-t[0])%7
(r==3?'O':b)+(t[1]&&0<=r&&r<3?'|'<<(r<141>>(t[-1]&7)&3?92:b):b+b)}*b}
红宝石143
n=gets.split;10.times{|y|puts (b=' -'[y&1,1])+n.map{|t|r=y-(5-t[0])%7;m=t[-1]
(r==3?'O':b)+(m<65&&0<=r&&r<3?'|'<<(r<141>>(m&7)&3?92:b):b+b)}*b}
红宝石148
这里是另一种方式来计算标志,
其中m=ord(last character)
, #flags=1+m&3-(1&m/4)
和另一种方式#flags=141>>(m&7)&3
,即可以节省一个更多字节
n=gets.split;10.times{|y|b=' -'[y&1,1];n.each{|t|r=y-(5-t[0])%7;m=t[-1]
print b+(r==3?'O':b)+(m<65&&0<=r&&r<3?'|'<<(r<141>>(m&7)&3?92:b):b+b)}
puts}
红宝石181
第一次尝试是我的Python的解决方案的音译
n=gets.split;10.times{|y|r="";n.each{|x|o=y-(5-x[0])%7
r+=(b=" -"[y&1,1]+"O\\|")[0,1]+b[o==3?1:0,1]+b[-1<o&&o<3&&x[-1]<64?3:0,1]+b[-1<o&&o<(":862".index(x[-1]).to_i)?2:0,1]}
puts r}
Answer 8:
F#,458个字符
合理的短,并且仍然主要可读。
let s=Array.init 10(fun _->new System.Text.StringBuilder())
System.Console.ReadLine().Split([|' '|])
|>Array.iter(fun n->
for i in 0..9 do s.[i].Append(if i%2=1 then"----"else" ")
let l=s.[0].Length
let i=68-int n.[0]+if n.[0]>'D'then 7 else 0
s.[i+3].[l-3]<-'O'
if n.Length>1 then
for j in i..i+2 do s.[j].[l-2]<-'|'
for j in i..i-1+(match n.[2]with|'4'->0|'8'->1|'1'->2|_->3)do s.[j].[l-1]<-'\\')
for x in s do printfn"%s"(x.ToString())
随着简短评论:
// create 10 stringbuilders that represent each line of output
let s=Array.init 10(fun _->new System.Text.StringBuilder())
System.Console.ReadLine().Split([|' '|])
// for each note on the input line
|>Array.iter(fun n->
// write the staff
for i in 0..9 do s.[i].Append(if i%2=1 then"----"else" ")
// write note (math so that 'i+3' is which stringbuilder should hold the 'O')
let l=s.[0].Length
let i=68-int n.[0]+if n.[0]>'D'then 7 else 0
s.[i+3].[l-3]<-'O'
// if partial note
if n.Length>1 then
// write the bar
for j in i..i+2 do s.[j].[l-2]<-'|'
// write the tails if necessary
for j in i..i-1+(match n.[2]with|'4'->0|'8'->1|'1'->2|_->3)do s.[j].[l-1]<-'\\')
// print output
for x in s do printfn"%s"(x.ToString())
Answer 9:
Ç196个字符<<o>>
借用过strager的一些想法。 有趣的功能包括n+++1
“三重+”操作符和<<o>>
“邪眼”运营商
#define P,putchar
N[99];*n=N;y;b;main(o){for(;scanf(" %c/%d",n,n+1)>0;n+=2);for(;y<11;)
n=*n?n:(y++P(10),N)P(b=y&1?32:45)P((o=10-(*n+++1)%7-y)?b:79)P(0<o&o<4&&*n?'|':b)
P(*n++<<o>>6&&0<o&o<4?92:b);}
Answer 10:
在Perl 5.10 168个字符
我原来的解决方案是276个字符,但很多很多的调整幅度超过100个字符减少了!
$_=<>;
y#481E-GA-D62 #0-9#d;
s#.(/(.))?#$"x(7+$&).O.$"x($k=10).($1?"|":$")x3 .$"x(10-$2)."\\"x$2.$"x(9-$&)#ge;
s#(..)*?\K (.)#-$2#g;
print$/while--$k,s#.{$k}\K.#!print$&#ge
如果您有改善这个小建议,请随时只需编辑我的代码。
Answer 11:
Lua中,307个字符
b,s,o="\\",io.read("*l"),io.write for i=1,10 do for n,l in
s:gmatch("(%a)/?(%d*)")do x=n:byte() w=(x<69 and 72 or 79)-x
l=tonumber(l)or 1 d=i%2>0 and" "or"-"o(d..(i==w and"O"or
d)..(l>3 and i<w and i+4>w and"|"or d)..(l>7 and i==w-3
and b or l>15 and i==w-2 and b or l>31 and i==w-1 and b or
d))end o"\n"end
Answer 12:
Ç - 293个字符
还需要更多的压缩,它需要的ARGS在命令行上,而不是读他们...
i,j,k,l;main(c,v)char **v;{char*t;l=4*(c-1)+2;t=malloc(10*l)+1;for(i=0;i<10;i
++){t[i*l-1]='\n';for(j=0;j<l;j++)t[i*l+j]=i&1?'-':' ';}t[10*l-1]=0;i=1;while
(--c){j='G'-**++v;if(j<3)j+=7;t[j*l+i++]='O';if(*++*v){t[--j*l+i]='|';t[--j*l
+i]='|';t[--j*l+i]='|';if(*++*v!='4'){t[j++*l+i+1]='\\';if(**v!='8'){t[j++*l+
i+1]='\\';if(**v!='1'){t[j++*l+i+1]='\\';}}}}i+=3;}puts(t);}
编辑:固定对E
编辑:下降到293个字符,包括新行...
#define X t[--j*l+i]='|'
#define Y t[j++*l+i+1]=92
i,j,k,l;main(c,v)char**v;{char*t;l=4*(c-1)+2;t=malloc(10*l)+1;for(i=10;i;)t[--i*
l-1]=10,memset(t+i*l,i&1?45:32,l-1);t[10*l-1]=0;for(i=1;--c;i+=3)j=71-**++v,j<3?
j+=7:0,t[j*l+i++]=79,*++*v?X,X,X,*++*v-52?Y,**v-56?Y,**v-49?Y:0:0:0:0;puts(t);}
文章来源: Code Golf: Musical Notes