高尔夫代码:钢琴


88

挑战

从字符计数开始的最短代码,以给定长度从输入音符开始输出钢琴键盘的一部分。

输入将由一个音符([ACDFG]#|[A-G])和一个正数表示,该音符将开始从中打印键盘,正数代表要打印的键的长度,包括第一个音符。

第一个键应完整打印-如果它具有左尖键,则将被剪裁;与之相同的是,当开始键变尖时,左键也将被剪裁。

夏普键不算,只算白键。

测试用例

Input
    C 14
Output
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|____|____|____|____|____|____|____|

Input
    D# 1
Output
    ###   |
    ###   |
    ###   |
    ###   |
    ###   |
     |    |
     |    |
     |    |
    _|____|

Input
    A 7
Output
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|

代码计数包括输入/​​输出(即完整程序)。


5
[A-G]#*?这是否意味着我们需要处理B#####例如E
Anon。

5
对于键的数量,请定义“键”。为什么示例“ C 14”打印24个键?
Guffa'2

53
好的,现在我们有了C和C#解决方案,我们需要B,D和F#。
LiraNuna

7
下一曲高尔夫:为这些钢琴实现MIDI接口。
Mehrdad Afshari'2

10
亲爱的亲密朋友,我向您致敬,感谢您在3天后成功解决了这一挑战。我们让它在5分钟内重新打开。仅此一项就可以告诉您一些信息-社区喜欢并接受此类问题,无论您是否喜欢。但是,如果您不这样做,请将代码高尔夫添加到忽略标签的列表中。
LiraNuna

Answers:


27

GolfScript-80个字符

适合#SO的一行,没有滚动条:)

' ':s/~~5*\(7&5*\,.4*@+):k;+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*s.+*k>c<n+}%)s/'_'*

GolfScript-81个字符

' ': /((7&\,.4*@5*+:k;\~~5*+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*  +*k)>c<n+}%) /'_'*

格式精美的版本(27 x 3)

' ': /((7&\,.4*@5*+:k;\~~5*
+):c;9,{5<'#'9**' | '4*+3/4
<.1>+9*  +*k)>c<n+}%) /'_'*

GolfScript-82个字符

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{5<3*'###  '*' |   '4*+20<.5>+c*k)>c<n+}%)' '/'_'*

GolfScript-85个字符

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{.5<3*'###  '*' _'1/@8=='|'1$3*++4*+20<.5>+c*k)>c<n}%

格式精美的版本(17 x 5)

' '/((7&\,.4*@5*+
:k;\~~5*+):c;9,{.
5<3*'###  '*' _'1
/@8=='|'1$3*++4*+
20<.5>+c*k)>c<n}%

GolfScript-94个字符

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*1>{^4&*+>&c+)<n}:f~]5*'   _'1/{'|'\4*+7*c*f}%

GolfScript-98个字符

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+:^)>&c+):&<n]5*[   '_']{['|'\4*+7*c*^>&<n]}%

GolfScript-101个字符

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+)>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript-109个字符

' ': /~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript-120个字符

' '/~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*['|    '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<

GolfScript-127个字符

' '/~~5*:c;(7&5*:^;,:&;['##  ###  ###   |   ###  ###   |   #'c*^4&*+>&c+)<n]5*['|    '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<

$ echo -n C 14 | ruby golfscript.rb piano.gs 
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
$ echo -n D# 1| ruby golfscript.rb piano.gs 
###   |
###   |
###   |
###   |
###   |
 |    |
 |    |
 |    |
_|____|
$ echo -n A 7| ruby golfscript.rb piano.gs 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|

我正准备提交我的第一个golfscript条目以进行另一个挑战(stackoverflow.com/questions/2104556/…),但是它已经关闭:-(
mob 2010年

2
我希望他们在学校教高尔夫球手。我想要回我的钱。
Steve Tjoa'2

6
真好 稍后,我将在PianoScript中发布我的解决方案。只有6个字符。:-)
molf'2

112

Perl,133(129)个字符

Perl,167 160 156 147 142 133 D'哦!147 144 137 134 133个字符

    $ _ = shift; die grep {5> $ n?y / * /#/:y /#* / | /; $ n ++-8 || y / / _ /}
    @ Q =(substr((“ *##”。(“ *##*#|#”)x2)x9,
    4 * /#/ +(7&ord)* 5,1 + /#/ + 5 * pop)。$ /)x9

这是129个字符的解决方案,它借鉴了molf的Ruby解决方案的一些想法:

    ($ _,$ c)= @ ARGV; $ j =($ k = /#/)+ ord;
    for $ n(0..8){print $ /,substr +(join'',map {8- $ n?5> $ n && $ _%7%4?“ ###”
    :“ |”:“ _ | ___”} $ j .. $ j + $ c),!$ k,-3}

并在Acme :: AsciiArtinator的帮助

                sub init_piano{$S=$";$H='#';
                (                            $
               T                              ,$P,$U)=qw(
              T                                          |
             _                                            |
            /                                              )
           ;                                                $
          d             =$T.$H.$S.$S;$t                     =
         $             d               .                   $H
        .              $               d                  . $
       S               .$P.$S.$S.$S.$H;$                t=  $
      d.$H.$t.$t;};$_=shift;-/-/;&init_piano();$Z=/#/;-/|   |
      |                                                 |   |
      |                    YAMAHA                       |  /
      ;die grep{4>$n++?y/T/#/:y/#T/ |/;$n-8||y/ /_/;}@q=(m{
     // // /// // /// // /// // /// // /// // /// // /// /   
    // // /// // /// // /// // /// // /// // /// // /// /
   }                                                   .
   substr(${t}x(9),4*${Z}+(7&ord)*5,1+$Z+5*pop).$/)x(8)
          ;   '                            \   /
           | |                              | |
           /_\                              /';

7
哈哈哈,太棒了。那是施坦威,雅马哈,杨昌吗?
史蒂夫·乔亚

2
我将为此添加书签,以向那些没有“猴子”笑话的人展示。
Mehrdad Afshari'2

3
@Steve-让我们把它做成雅马哈
暴民2010年

6
@mobrule,您讨厌grep吗?你为什么要死呢?:(
LiraNuna

Golfscript * 1.3将为105 :)
John La Rooy 2010年

34

红宝石-125个字符

146 144 140 137 134 126 125个字符

a,n=$*;h=a[1]?0:1;s=a[0]-h+1
9.times{|t|puts (s..s+n.to_i).map{|i|i%7%4<1||t>4?" |   ":"###  "
}.join[h..-4].tr t>7?" ":n,"_"}

(第二个换行符不是必需的,只是为了避免SO上出现滚动条而添加。如果需要,可以用换行符代替分号。)

红宝石1.9版本不同但相等的长度(代替a[0]通过a.ord"_"通过?_):

a,n=$*;h=a[1]?0:1;s=a.ord-h+1
9.times{|t|puts (s..s+n.to_i).map{|i|i%7%4<1||t>4?" |   ":"###  "
}.join[h..-4].tr t>7?" ":n,?_}

致电

$ ruby piano.rb C 14

嘿,VIM的第一个有138个字符吗?
hurikhan77 2010年

a,n = gets.split; ...做同样的工作,-3个字符
hurikhan77 2010年

1
你甚至可以通过更换“gets.split”“$ *”,给在命令行中输入,字符-8
hurikhan77

更改i%7%4<1||t>4?"_|___":"###__"i%7%4&&t<5?"###__":"_|___"并保存2个字符。我喜欢那个%7%4成语
暴民

1
因此,我们有最短的解决方案了,是吗?Ruby Rulez!:-D
hurikhan77'2

29

LilyPond的,285 288 291 310 315 330 333 340 350字符

为了与音乐主题保持一致,以下是一种用于排版乐谱的语言解决方案LilyPond:

x=#ly:string-substitute
u=#(x"*""###  ""|   *** |   ** ")t=#(x"###"" | "u)q=#read-char
z=#(q)v=#(if(eq?(q)#\#)1 0)y=#(iota(+(*(read)5)1 v))#(format #t"~{~{~a~}
~}"(map(lambda(s)(map(lambda(i)(string-ref s(modulo(+(*(char->integer z)5)i(* v
4))35)))y))(list u u u u u t t t(x" ""_"t))))

用法: $ lilypond thisfile.ly <input.in >output.out 2>/dev/null


4
这可能是我第一次看到也是唯一一次在代码高尔夫中使用LilyPond。
cobbal


26

RetroGolf - Applesoft BASIC:236 239 245 249 257 245 267 285

为便于阅读,以多行显示,但应为单行:

1K$="##   |   ###  #":K$="##  #"+K$+K$:
 FORI=1TO21:F$=F$+"|____":L$=L$+"|    ":NEXT:
 INPUTN$:S=MID$(N$,2,1)="#":O=(ASC(N$)-65)*5+1+S*4:L=VAL(RIGHT$(N$,2))*5+1+S:
 FORI=1TO5:?MID$(K$+K$+K$,O,L):NEXT:FORI=1TO3:?MID$(L$,O,L):NEXT:?MID$(F$,O,L)

可以使用Javascript或仿真器中的Applesoft BASIC解释进行测试。

钢琴http://img685.imageshack.us/img685/3407/piano2.png


根据规范,是否可以在同一行上读取两个参数?
KirarinSnow 2010年

18

C#-315

尽管语言不是很简洁,但我仍然坚持用C#打高尔夫球。

using C=System.Console;class P{static void L(int o,int c,string s){while(c-->0)C.Write(s[(420>>o++%5*2&3)+(91>>(o+2)/5%7&1)*3]);C.WriteLine();}static void Main(string[]a){int i=0,s=a[0].Length-1,c=int.Parse(a[1])*5+1+s,o=(a[0][0]-65+s)*5-s;while(i++<5)L(o,c,"|  ## ");while(i++<8)L(o,c,"|  |  ");L(o,c,"|__|__");}}

23
现在为F#解决方案完成旋律。
LiraNuna'2

13
+1表示幽默,-1表示讨厌的幽默,+ 1表示C#和F#是一致的。
史蒂夫·乔亚

尝试运行它时,我得到了System.IndexOutOfRangeException。
Fitzchak Yitzchaki'2

@Mendy:运行时必须提供命令行参数。如果从Visual Studio运行它,请打开项目的属性,转到“调试”选项卡,然后在“启动选项”下可以输入命令行参数。如果您已将代码编译为exe,则只需在控制台窗口中使用程序名称后的参数运行它即可。
Guffa'2

1
->运算符的很好用法。
凯文

16

蟒蛇-164

k,n=raw_input().split()
m=k[1:]>""
n=int(n)*5+1
o=(ord(k[0])-65)*5+4*m
for x in["##  ###   |   ### "]*5+[n*"|    "]*3+[n*"|____"]:print((x+x[::-1][:-1])*n)[o:o+n+m]

无法通过删除的重复部分节省一些字符t,并u通过7乘以?
马修·克鲁姆利

@Matthew Crumley,请随时从我的解决方案中借用:)
John La Rooy

@gnibbler,我不是一个真正的python程序员(我已经使用过它,但是还没有广泛地使用它),所以我怀疑我能否使用它。在我看到您的原始解决方案之前,我什至不知道python可以像这样乘以字符串。
马修·克鲁姆利

@gnibbler-一个不错的解决方案,很想运行它,但会收到一个SyntaxError...。k,n = input()。split()文件“ <string>”,第1行C 14 ^
AJ。

@AJ,看来该错误来自Python3解决方案。不知道为什么你所得到的是,虽然
约翰·拉ROOY

15

八度,153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215个 219 240 244 268字符

可以使用完整的八度音程编程时,为什么只使用C或C#或F#(或B或D)?

(为清楚起见,每60个字符包装一次)

x=5*scanf("%2c%d");for k=-8:0disp((s={[t="|   ###  ###  ","#
##   ",t" "]"|    ","|____"}{(k>-4)+!k+1})(1+mod(5*(y=x(2)>1
60)+(-y:x(3))+x(1),rows(s'))))end

是的。此解决方案确实可以计算字符串的复共轭转置。

用法: $ octave -q thisfile.m <input.in >output.out


13

C – 197 203 207 216 224 232 240 人物

#define S"#   |   ###  ###  ##"
main(i,j,l,h,t){char*X[]={"____|","    |",S S,S S},s[i=11];for(scanf("%s%n%d",s,&h,&l);--i>1;puts(""))for(j=t=*s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}

等效的194个字符的版本假定缓冲区溢出正常。

#define S"#   |   ###  ###  ##"
i=11;main(j,l,h,t){char*X[]={"____|","    |",S S,S S},s;for(scanf("%s%n%d",&s,&h,&l);--i>1;puts(""))for(j=t=s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}

1
for(j=0; j<=l*5+h; j++)< -无用的空间,好像你在字符数已包括他们太
尼古拉斯

12

后记:239 245 293 312(经常); 219 224 225 231(ASCII85)

/r{(%stdin)(r)file token pop}def[(]){mul add}/z r(:-)cvs dup length 1
sub/v exch/p r/s(|   ###  ###  ###   |   ###  ###   )([){0 1 v p 5]{s
exch z 0 get 5]v 4]s length mod 1 getinterval print}for/
=}>>begin[[[[[/s(|    )def[[[/s(|____)def[

二进制版本通过ASCII85编码扩展为只有ASCII可打印字符的219个字符的程序:

/(|____)/(|    )[/r/(|   ###  ###  ###   |   ###  ###   )<~Ou%G5-$+0=Bl5@JE[d/;P,jagI?HCK@<*JGP,4<rOuSV60p8LhG*5%O8oc=a.=3b)!HsVu23Md=!IHJ_A<K->@5*j;23Md=!HoSBP&-9^09Tk/@ZkI\P"_$^I?I,S+?b-:5*?@Z>?b<9Ou$<H>EUc~>cvx
exec[

用法: $ gs -q -dNOPROMPT -dNODISPLAY -dBATCH thisfile.ps <input.in >output.out


10
很高兴在这些比赛中看到不太传统的语言。
暴徒

12

F#:224 225,226,248,252,270,276,299,306个字符

let x,(/)=System.Console.ReadLine(),String.replicate
let t,p=(int x.[0]-60)%7*5,int x.[1]%2
let g s i=printf"%s"(i/((99/s).[t+4*p..t+int x.[2..]*5+5*p]+"\n"))
g"|   ###  ###   |   ###  ###  ###   "5 
g"|    "3
g"|____"1

我使用2的模块来检测空格或磅。''是32%2 = 0'#'是35%2 = 1,由于我的条件返回的false为零,所以我只将模块结果乘以。

使用<| 运算符以删除一个空格字符。使用运算符重载来保存另一个字符。

原版的

let piano_long (input:string) = 
    let sharp, flat = if input.[1] = '#' then 4, 1 else 0, 0

    let note = (int input.[0] - 60) % 7
    let num = int (input.Substring 2)

    let start = note * 5 + sharp
    let stop = num * 5 + 1 + flat

    let top    = "|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |"
    let middle = "|    |    |    |    |    |    |    |    |    |    |    |    |    |    |"
    let bottom = "|____|____|____|____|____|____|____|____|____|____|____|____|____|____|"


    let mutable piano = ""

    for i in 1..5 do 
        piano <- piano + top.Substring(start, stop) + "\n"

    for i in 1..3 do 
        piano <- piano + middle.Substring(start, stop) + "\n"

    piano <- piano + bottom.Substring(start, stop)

    printf "%s\n\n" piano

如果F#具有字符串乘法运算符,我可以
删除

简短一点:let g s i=for i=1 to i do printfn"%s"(String.replicate 99 s).[t+4*p..t+int(x.[2..])*5+5*p]
cfern 2010年

很好,谢谢!我不知道为什么我找不到。我将其分配给变量并使用了两次。
gradbot

现在,我只需支付.net函数名称的48个字符的税。
gradbot

恭喜版本8!我很惊讶你修剪了多少。
ChaosPandion 2010年

11

sed的,231 235 234 235 237 238 244 268 269 270 276 279 280 282 287 300 307 314 329 338字符

适用于多达99个按键。标准钢琴有52个白键,因此足够了。

s/.*/CDEFGABC&=0123456789-/
s/(.).=(.*)\1.*/&\2\2\2\2\2\2\2\2\2\2/
s/ .?(.)=(.*)\1.*-/\2/
s/.*#/%&/
:
s/((.)(.).*\2)[#-9]/\1  \3/
t
s/[^ %CF]/###/g
s/C|F/ | /g
s/(%....)?.{25}(.*)./\2/p
p
p
p
p
s/## /|  /g
s/#[|#]/ |/g
p
p
p
y/ /_/

例子:

$ echo C 14 | sed -rf piano.sed
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
$ echo D# 1 | sed -rf piano.sed
###   |
###   |
###   |
###   |
###   |
 |    |
 |    |
 |    |
_|____|
$ echo A 7 | sed -rf piano.sed
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|
$ echo A 52 | sed -rf piano.sed
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

最后一个示例将打印标准键盘,以及两端的虚构黑键。


10

PianoScript-2个字符

这是单线的:

go

用法:

PianoScript piano.ps G# 11

输出:

###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ##
 |    |    |    |    |    |    |    |    |    |    |    |
 |    |    |    |    |    |    |    |    |    |    |    |
_|____|____|____|____|____|____|____|____|____|____|____|

此处可以找到有关PianoScript语言的更多信息。


1
可以是0个字符,不是吗?
您2010年

我假设在PianoScript ++中,您将能够以少一个字符的形式编写程序。
gradbot 2010年

4
不幸的是,您不是第一个提出这个想法的人。
LiraNuna 2010年

4
-1作弊,甚至没有想出一个很酷的语言名称;)
gnarf 2010年

1
钢琴有乐谱,而不是剧本
吉米

10

JavaScript-195个字符

嘿,高尔夫是您只与自己竞争的游戏吗?:)

k=readFile(0).split(' ')
q=!k[0][1]
r=k[1]
o=''
for(x=10;x--;){p=k[0].charCodeAt(0)-65+!q
s=''
for(j=+r+1;j--;){p=++p%7
s+=x>4&&!p|p%3?'###  ':x?' |   ':'_|___'}o+=s.substring(q,r*5+2)+'\n'}print(o)

由narf解决;KirarinSnow移植到Rhino(进行了较小的修复和格式更改);纳尔夫进一步削减了;由KirarinSnow更正的错误。k[1]由cwallenpoole 缓存

用法: $ cp input.in 0; rhino thisfile.js

快速HTML演示版本: 高尔夫测试 -添加readFile=prompt;print=function(a) {document.write("<pre>"+a);}


好吧,您还与规格竞争...我认为您输了。;)它甚至没有通过测试用例。似乎它开始了。
Guffa'2

您只有1个引用b。将readFile(b)更改为readFile('substring')
Ponkadoodle

@wallacoloo-稍后需要,在底部:s=s[b](1-q,p=s.length-3)
gnarf 2010年

6

Python3-158

节省inputVS raw_input。失去()print

k,n=input().split()
o=(ord(k[0])-65)*5
n=int(n)*5+1
for x in["##  ###   |   ### "]*5+[n*"|    "]*3+[n*"|____"]:print(((x+x[::-1][:-1])*n)[o+3*len(k[1:]):o+n])

5

F#:355个重要字符

全部一行:

let[|x;y|]=System.Console.ReadLine().Split([|' '|])in[for i in 1..9->let r (a:string) b j (s:string)=s.Replace(a,if i>j then b else a)in((String.replicate(int y+1)"23012123012121").Substring(int(x.[0])-65,int y*2+x.Length).Replace("0","|   ")|>r"1""#"0|>r"2""##  "0|>r"3"" "0).TrimEnd()|>r"###"" | "5|>r"##""| "5|>r" ""_"8]|>String.concat"\n"|>printfn "%s"

展开:

let piano() =
    let[|x;y|]=System.Console.ReadLine().Split([|' '|])in
    [for i in 1..9->
        let r (a:string) b j (s:string) = s.Replace(a,if i>j then b else a) in
        ((String.replicate (int y+1) "23012123012121")
            .Substring(int(x.[0])-65,int y*2+x.Length).Replace("0","|   ")
            |> r "1" "#" 0
            |> r "2" "##  " 0
            |> r "3" " " 0)
            .TrimEnd()|> r "###" " | " 5|> r "##" "| " 5|> r " " "_" 8]
    |> String.concat "\n"
    |> printfn "%s"

@Brian,请让团队实施gets或进行等效操作,我们将节省22个字符!
Benjol 2010年

我发现打高尔夫球递归是删除类型注释的好方法。
gradbot

3

塞特

165个字符;拼字游戏的翻译Python解决方案。

get(l);[k,n]:=split(l);o:=(abs k(1)-65)*5;n:=1+5*val n;(for x in['##  ###   |   ### ']*5+[n*'|    ']*3+[n*'|____'])print(((x+reverse x(2..))*n)(o+4*#k-3..o+n));end;

3

D2(模板):331 370 400 + 17个字符

(基于Ruby解决方案。)

压缩后:

template J(alias T,int b,int e,r...){static if(e)enum J=T!(b,r)~J!(T,b+1,e-1,r);else enum J="";}template K(int i,int t){enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";}template R(int t,int s,int l,int h){enum R=J!(K,s-h,l,t)[h..$-3]~"\n";}template M(alias k){enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);}

解释:

/**
    Macros:
        D = <tt>$0</tt>
 */
 ;

/**
    $(D_PSYMBOL J) (short for "join") will evaluate $(D T!(i,r)) for
    $(D_PARAM i) in $(D [b..b+e]). Then, these compile-time strings will be
    concatenated.
 */
template J(alias T,int b,int e,r...){
    static if(e)
        enum J=T!(b,r)~J!(T,b+1,e-1,r);
    else
        enum J="";
}

/**
    $(D_PSYMBOL K) (short for "key") will generate 5 characters as a row of
    key $(D_PARAM i) at row $(D_PARAM t).
 */
template K(int i,int t){
    enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";
}

/**
    $(D_PSYMBOL R) (short for "row") will generate the keyboard at row
    $(D_PARAM t), from key $(D_PARAM s) and sharpness $(D_PARAM h) with a
    length of $(D_PARAM l) keys.
 */
template R(int t,int s,int l,int h){
    enum R=J!(K,s-h,l,t)[h..$-3]~"\n";
}

/**
    $(D_PSYMBOL M) (short for "main") results in the whole keyboard as a string.

    Example:
    -----
    pragma(msg,M!("C 14"));
    pragma(msg,M!("D# 1"));
    pragma(msg,M!("A 7"));
    -----
 */
template M(alias k){
    enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);
}

由于我们无法从dmd输入传递参数,因此必须在代码中完成。仅支持99个按键。


2
您可以将输入设为单个字符串吗?挑战的一部分是将行解析为音符,可选的音符和持续时间。解析本身可能需要使用某些语言的很多字符……
KirarinSnow 2010年

2

Haskell中:212个 211 208字符

a="  |  "
b=" ### "
d=concat.cycle
e=d[b,b,a,b,b,a,b]
f=d[a]
t x s m n=map(take(5*read s+m).drop(5*length['@'..x]-n))[e,e,e,e,e,f,f,f,d["__|__"]]
u(x:'#':s)=t x s 2 4 
u(x:s)=t x s 1 8
main=interact$unlines.u

它仍然采用与ascii兼容的字母(特别是序列“ @ABCDEFG”),但不再需要Char.ord


2

红宝石-113个字符

使用命令行参数运行

$ ruby piano.rb A 7

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=k[0]*5-2+4*s=k.size)[j,c.to_i*5+s]}

红宝石-118个字符

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=2+k[0]*5+4*s=k.size-1)[j..c.to_i*5+s+j]}

2

PHP-208个字符

<?$e=45*substr($a=PIANO,2+$d=!($a[1]^~ì))+9+$d*45;$j=9*$c=4*$d;for($b=ord($a[0])-65,--$c;$j<$e;$f[$i=$j++%9].=($c=($c+!$i)%5)%4<2&$i>3&$b%3!=2?Ü:($c?$i?ß: :))$j%45-36?:$b=++$b%7;for(;$a=$f[$i--];)echo~$a,~õ;

必须加以改进。

输入必须以名为PIANO的常量传递。


1

F#414 386 372个显著特点:

//wins me 2 characters
open System

//String.replicate, didn't know this existed before reading Juliet
let r=String.replicate  

//print s n times, each time on a newline
let P n s=printf"%s"(r n (s+"\n"))  

//define top rows
let t="##  ###   |   ###  ###   |   ###  #" 

//middle and bottom rows can be defined using 'r'
let m,b=r 7"|    ",r 7"|____" 

//pick of chars from O to n+O from string, wrap round if we go beyond s.Length
let L(s:string)O n=String([|5*O..5*(n+O)|]|>Array.map(fun i->s.[i%35]))

//match input string into two halves
let[|k;n|]=Console.ReadLine().Split([|' '|])

//work out start pos and length (in chars, not keys)
let O,N=
 let K=int k.[0]-65                    //'A'=65, this is why t starts at A
 if k.[0]='#'then(K+3,int n+2)else(K,int n) 

//Print 5 top rows, 3 middle rows and the bottom row
P 5(L t O N)
P 3(L m O N)
P 1(L b O N)

哦,还有一个好处,这个脚本实际上可以正确处理“ F#372”-尽管我不会在此处粘贴它,但不会打扰您...

System.Console.ReadLine()真是令人讨厌

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.