Código Golf: Piano

88

El reto

El código más corto por número de caracteres para generar una parte de un teclado de piano a partir de la nota de entrada en una longitud determinada.

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

La primera clave debe imprimirse en su totalidad; si tiene una clave aguda izquierda, se cortará, lo mismo que cuando la clave inicial es aguda, la clave izquierda también se cortará.

Una tecla aguda no se cuenta, solo las 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).

LiraNuna
fuente
5
[A-G]#*? ¿Significa esto que tenemos que manejar, digamos, B#####como E?
Anon.
5
Para el recuento de claves, defina "clave". ¿Por qué el ejemplo "C 14" imprime 24 teclas?
Guffa
53
Bien, ahora que tenemos las soluciones C y C #, necesitamos B, D y F #.
LiraNuna
7
Siguiente código golf: Implemente una interfaz MIDI para estos pianos.
Mehrdad Afshari
10
Estimados cerradores, los felicito por haber logrado cerrar este desafío después de 3 días. Conseguimos que reabriera en 5 minutos. Eso solo debería decirte algo: a la comunidad le gustan y acepta este tipo de preguntas, te gusten o no. Sin embargo, si no lo hace, agregue code-golf a su lista de etiquetas ignoradas.
LiraNuna

Respuestas:

27

GolfScript - 80 caracteres

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 caracteres

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

Versión con buen formato (27 x 3)

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

GolfScript - 82 caracteres

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

GolfScript - 85 caracteres

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

Versión con un formato agradable (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 caracteres

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

GolfScript - 98 caracteres

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

GolfScript - 101 caracteres

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

GolfScript - 109 caracteres

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

GolfScript - 120 caracteres

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

GolfScript - 127 caracteres

' '/~~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 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|
gnibbler
fuente
Estaba a punto de enviar mi primera entrada de golfscript para otro desafío ( stackoverflow.com/questions/2104556/… ), pero se cerró :-(
mob
2
Ojalá enseñaran golfscript en la escuela. Quiero mi dinero de vuelta.
Steve Tjoa
6
Agradable. Publicaré mi solución en PianoScript más tarde. Son solo 6 caracteres. :-)
molf
112

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 prestadas varias ideas de la solución Ruby de molf:

    ($ _, $ c) = @ ARGV; $ j = ($ k = / # /) + ord;
    por $ n (0..8) {imprimir $ /, substr + (unirse '', mapa {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)
          ;   '                            \   /
           | |                              | |
           /_\                              /';
mob
fuente
7
Jajaja, genial. ¿Es un Steinway, Yamaha, Young Chang?
Steve Tjoa
2
Voy a marcar esto para mostrárselo a las personas que no entienden el chiste del "mono".
Mehrdad Afshari
3
@Steve - Hagámoslo una Yamaha
mob
6
@mobrule, ¿odias a grep? ¿Por qué quieres que muera? :(
LiraNuna
Golfscript * 1.3 sería 105 :)
John La Rooy
34

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 coma se pueden reemplazar por líneas nuevas si se desea).

La versión Ruby 1.9 es diferente pero de igual longitud (reemplazando a[0]por a.ordy "_"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
molf
fuente
¡¿VIM cuenta 138 caracteres en el primero?!?
hurikhan77
a, n = gets.split; ... hace el mismo trabajo, -3 caracteres
hurikhan77
1
Incluso podría reemplazar "gets.split" por "$ *" y dar la entrada en la línea de comando, -8 caracteres
hurikhan77
Cambiar i%7%4<1||t>4?"_|___":"###__"a i%7%4&&t<5?"###__":"_|___"y guardar 2 caracteres. Me encanta ese %7%4modismo
mob
1
Así que nos quedamos con la solución más corta, ¿eh? Ruby rulez! :-D
hurikhan77
29

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

De acuerdo con el tema musical, aquí hay una solución en un lenguaje diseñado para componer partituras musicales, 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

KirarinSnow
fuente
4
Esta es posiblemente la primera y única vez que veo a LilyPond en código golf.
cobbal
26

RetroGolf - Applesoft BÁSICO: 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 probarse con este intérprete de Applesoft BASIC en Javascript o un emulador .

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

Carlos Gutiérrez
fuente
¿Es posible leer ambos argumentos en la misma línea, según las especificaciones?
KirarinSnow
18

C # - 315

Persisto jugando al 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,"|__|__");}}
Guffa
fuente
23
Ahora, la solución F # para completar la melodía.
LiraNuna
13
+1 para humor, -1 para humor cursi y +1 ya que C # y F # son concordantes.
Steve Tjoa
Obtuve una excepción System.IndexOutOfRangeException cuando intenté ejecutarla.
Fitzchak Yitzchaki
@Mendy: Tienes que proporcionar argumentos de línea de comando cuando lo ejecutas. Si lo ejecuta desde Visual Studio, abra las propiedades del proyecto, vaya a la pestaña de depuración y en Opciones de inicio puede ingresar argumentos de línea de comando. Si ha compilado el código en un archivo ejecutable, simplemente ejecútelo desde una ventana de consola con los argumentos después del nombre del programa.
Guffa
1
Muy buen uso del operador ->.
Kevin
16

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]
gnibbler
fuente
¿No podrías salvar algunos personajes eliminando la parte repetida de ty uy multiplicando por 7?
Matthew Crumley
@Matthew Crumley, siéntase libre de tomar prestado de mi solución :)
John La Rooy
@gnibbler, no soy realmente un programador de Python (he jugado un poco con él, pero no mucho), así que dudo que pueda hacer mucho con él. Ni siquiera sabía que Python podía multiplicar cadenas así hasta que vi su solución original.
Matthew Crumley
@gnibbler - buena solución, me encantaría ejecutarlo pero obteniendo un SyntaxError .... C 14 Traceback (última llamada más reciente): Archivo "piano.py", línea 1, en? k, n = input (). split () Archivo "<cadena>", línea 1 C 14 ^
AJ.
@AJ, parece que ese error es de la solución Python3. Sin embargo
John La Rooy
15

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

¿Por qué usar solo C o C # o F # (o B o D) cuando puedes 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 calcula la transpuesta conjugada compleja de una cadena.

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

KirarinSnow
fuente
13

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)]));}
KennyTM
fuente
1
for(j=0; j<=l*5+h; j++)<- espacios inútiles, y parece que también los incluiste en el recuento de caracteres
Nicolás
12

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

KirarinSnow
fuente
10
Me encanta ver los idiomas menos tradicionales en estos concursos.
mafia
12

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

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 libra. '' es 32% 2 = 0 '#' es 35% 2 = 1 y dado que mi condicional devolvió ceros por falso, simplemente multipliqué el resultado de los módulos.

Usó el <| operador para afeitarse un espacio char. Se usó la sobrecarga del operador para guardar otro carácter.

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
10 revoluciones
fuente
Podría recortar 46 caracteres si F # tuviera un operador de multiplicación de cadenas
gradbot
Un poco más corto: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
¡Genial gracias! No sé por qué no pude encontrar eso. Lo asigné a una variable y lo usé dos veces.
gradbot
Ahora solo estoy pagando el impuesto de 48 caracteres de los nombres de funciones .net.
gradbot
¡Felicitaciones por la versión 8! Me sorprende lo mucho que recortó.
ChaosPandion
11

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

Funciona para hasta 99 teclas. El piano estándar tiene 52 teclas blancas, por lo 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.

KirarinSnow
fuente
10

PianoScript - 2 caracteres

Es una sola línea:

go

Uso:

PianoScript piano.ps G# 11

Salida:

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

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

Despistado
fuente
1
Puede tener 0 caracteres, ¿no?
USTED
Supongo que en PianoScript ++ podrás escribir el programa en un carácter menos.
gradbot
4
Lástima que no seas el primero a quien se le ocurrió esta idea.
LiraNuna
4
-1 por hacer trampa, y ni siquiera
pensar en
1
los pianos tienen partituras, no guiones
Jimmy
10

JavaScript - 195 caracteres

Oye, el golf es un juego en el que solo compites contra ti mismo, ¿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]de cwallenpoole

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

Versión rápida de demostración HTML: Prueba de golf - AdicionesreadFile=prompt;print=function(a) {document.write("<pre>"+a);}

gnarf
fuente
Bueno, también compites contra la especificación ... y creo que perdiste. ;) Ni siquiera pasa los casos de prueba. Parece que comienza uno.
Guffa
Solo tiene 1 referencia a b. cambie readFile (b) a readFile ('substring')
Ponkadoodle
@wallacoloo - se necesita más tarde, la parte en la parte inferior:s=s[b](1-q,p=s.length-3)
gnarf
6

Python3 - 158

Ahorrar en inputcontra raw_input. Perder ()porprint

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])
John La Rooy
fuente
5

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"
Julieta
fuente
@Brian, haz que el equipo implemente getso equivalente, ¡ahorraríamos 22 caracteres!
Benjol
Encuentro que cuando se juega al golf, la recursividad es una buena manera de eliminar las anotaciones de tipo.
Gradbot
3

SETL

165 caracteres; Traducción de la solución Gribblers 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;
finnw
fuente
3

D2 (plantillas): 331 370 400 + 17 caracteres

(basado en la solución 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);
}

Dado que no podemos pasar los parámetros de dmdla entrada, debemos hacerlo en el código. Admite solo hasta 99 teclas.

KennyTM
fuente
2
¿Puedes hacer que la entrada sea una sola cadena? Parte del desafío es analizar la línea en una nota, un sostenido opcional y una duración. El análisis en sí puede tomar bastantes caracteres en algunos idiomas ...
KirarinSnow
2

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 letras compatibles con ascii (específicamente, la secuencia "@ABCDEFG"), pero ya no requiere Char.ord

3 revoluciones
fuente
2

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]}
gnibbler
fuente
2

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 entregarse en la constante denominada PIANO.

user581149
fuente
1

F # 414 386 372 personajes importantes:

//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 una ventaja, este script realmente manejará "F # 372" correctamente - aunque no te molestaré pegándolo aquí ...

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

Benjol
fuente