workbook upstream the teacher picture national life geographic edition book big answers answer advanced achievers 2nd language-agnostic code-golf rosetta-stone

language agnostic - upstream - Código Golf: Piano



upstream advanced c1 teacher''s book pdf (22)

El reto

El código más corto por recuento de caracteres para mostrar una parte de un teclado de piano a partir de una nota de entrada en una longitud determinada.

La entrada estará compuesta de una nota ( [ACDFG]#|[AG] ) para comenzar a imprimir el teclado y un número positivo que representa la longitud de las teclas para imprimir, incluida la primera nota.

La primera clave debe imprimirse en su totalidad; si tiene una tecla nítida hacia la izquierda, se cortará, lo mismo para cuando la tecla de inicio sea nítida, también se cortará la tecla de la izquierda.

No se cuenta una tecla aguda, solo teclas blancas.

Casos de prueba

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

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

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

El recuento de códigos incluye entrada / salida (es decir, programa completo).


GolfScript - 80 Personajes

Cabe en una línea de #SO sin la barra de desplazamiento :)

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

GolfScript - 81 Personajes

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

Versión muy formateada (27 x 3)

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

GolfScript - 82 Personajes

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

GolfScript - 85 Personajes

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

Versión muy formateada (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 Personajes

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

GolfScript - 98 Personajes

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

GolfScript - 101 Personajes

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

GolfScript - 109 Personajes

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

GolfScript - 120 Personajes

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

GolfScript - 127 Personajes

'' ''/~~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 ## ### | ### ### | ### ## ## ### | ### ### | ### ## ## ### | ### ### | ### ## ## ### | ### ### | ### ## ## ### | ### ### | ### ## | | | | | | | | | | | | | | | | | | | | | | | | |____|____|____|____|____|____|____|


Python - 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]


Python3 - 158

Ahorre en la input vs raw_input . Perder en () para 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])


Ruby - 113 caracteres

Se ejecuta con argumentos de línea de comando

$ 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]}

Ruby - 118 caracteres

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]}


LilyPond, 285 288 291 310 315 330 333 340 350 caracteres

De acuerdo con el tema de la música, aquí hay una solución en un lenguaje diseñado para la composición de partituras, 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))))

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


Octave, 153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268 caracteres

¿Por qué utilizar solo C o C # o F # (o B o D) cuando puede programar con una Octava completa?

(envuelto cada 60 caracteres para mayor claridad)

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

Sí ... esta solución realmente computa la compleja transposición conjugada de una cuerda.

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


PostScript: 239 245 293 312 (regular); 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[

Versión binaria expandida a través de la codificación ASCII85 en un programa de 219 caracteres con solo caracteres imprimibles ASCII:

/(|____)/(| )[/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[

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


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

Funciona con hasta 99 claves. El piano estándar tiene 52 teclas blancas, así que esto debería ser suficiente.

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/ /_/

Ejemplos:

$ 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 ## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ## ## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ## ## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ## ## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ## ## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ## | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

El último ejemplo imprime el teclado estándar, junto con teclas negras imaginarias en cada extremo.


C # - 315

Persisto en el golf en C # aunque no es un lenguaje muy escueto ...

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,"|__|__");}}


C - 197 203 207 216 224 232 240 caracteres

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

Esta versión equivalente de 194 caracteres asume que el desbordamiento del búfer está bien.

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


D2 (plantillas): 331 370 400 + 17 caracteres

(basado en la solución de Ruby)

Comprimido:

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

Explicado:

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

Como no podemos pasar parámetros de dmd la entrada debe hacerse en el código. Admite solo hasta 99 llaves.


F #: 224 225, 226, 248, 252, 270, 276, 299, 306 caracteres

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

Usé módulos de 2 para detectar un espacio o una libra. '''' es 32% 2 = 0 ''#'' es 35% 2 = 1 y como mi condicional arrojó ceros falsos, simplemente multipliqué el resultado de los módulos.

Usó el <| operador para afeitarse un espacio char. Sobrecarga de operador utilizada para guardar otro char.

original

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


JavaScript - 195 caracteres

Oye, el golf es un juego donde solo compites contra ti ¿verdad? :)

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)

Solución por gnarf; portado a Rhino (con una pequeña corrección y cambios de formato) por KirarinSnow; más astillado por Gnarf; error corregido por KirarinSnow. caché k[1] por cwallenpoole

Uso: $ cp input.in 0; rhino thisfile.js $ cp input.in 0; rhino thisfile.js

Versión de demostración de HTML rápido: prueba de golf : agrega readFile=prompt;print=function(a) {document.write("<pre>"+a);}


Perl, 133 (129) caracteres

Perl, 167 160 156 147 142 133 ¡Oh! 147 144 137 134 133 caracteres

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

Aquí hay una solución de 129 caracteres, tomando prestada varias ideas de la solución de Ruby de molf:

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

y con la ayuda de 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) ; '' / / | | | | /_/ /'';


PianoScript - 2 caracteres

Es un trazador de líneas:

go

Uso:

PianoScript piano.ps G# 11

Salida:

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

Puede encontrar más información sobre el lenguaje PianoScript here .


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

Se muestra en varias líneas para facilitar la lectura, pero debe ser una sola línea:

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)

Puede ser probado con este intérprete de Applesoft BASIC en Javascript o un emulador .

Piano http://img685.imageshack.us/img685/3407/piano2.png


Ruby - 125 caracteres

146 144 140 137 134 126 125 caracteres

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,"_"}

(La segunda línea nueva no es necesaria y se agrega solo para evitar una barra de desplazamiento en SO. Los puntos y comas pueden reemplazarse por líneas nuevas si así lo desea).

La versión de Ruby 1.9 es diferente pero de igual longitud (reemplazando a[0] por a.ord y "_" por ?_ ):

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,?_}

Llamar con

$ ruby piano.rb C 14


SETL

165 caracteres; Traducción de Gribblers Python solution.

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;


F # 414 386 372 caracteres significativos:

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

Ah, y un extra, este script manejará correctamente "F # 372" correctamente - No te molestaré pegándolo aquí ...

System.Console.ReadLine () es un fastidio ...


Haskell: 212 211 208 caracteres

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

Todavía asume que las letras son compatibles con ascii (específicamente, la secuencia "@ABCDEFG"), pero ya no requiere Char.ord


F #: 355 caracteres significativos

Todo en una línea:

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"

Expandido:

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"


PHP - 208 caracteres

<?$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,~õ;

Tendrá que ser mejorado.

La entrada debe ser entregada en la constante llamada PIANO.