LilyPond 285 288 291 310 315 330 333 340 350 znaków

34

Ruby - 125 znaków

146 144 140 137 134 126 125 znaków

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

(Drugi znak nowej linii nie jest konieczny i jest dodawany tylko w celu uniknięcia paska przewijania w SO. W razie potrzeby średniki można zastąpić nowymi wierszami).

Ruby 1,9 wersja jest inna, ale tę samą długość (zamiast a[0]przez a.ordi "_"za ?_)

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

Zadzwoń z

$ ruby piano.rb C 14
molf
źródło
Hej VIM liczy 138 znaków na pierwszym?!?
hurikhan77
a, n = gets.split; ... wykonuje tę samą pracę, -3 znaki
hurikhan77
1
Możesz nawet zamienić „gets.split” na „$ *” i podać dane wejściowe w wierszu poleceń, -8 znaków
hurikhan77
Zmiana i%7%4<1||t>4?"_|___":"###__"do i%7%4&&t<5?"###__":"_|___"zaoszczędzisz 2 znaki. Uwielbiam ten %7%4idiom
mob
1
Więc jesteśmy przy najkrótszym rozwiązaniu, co? Ruby rulez! :-D
hurikhan77

Odpowiedzi:

29

LilyPond 285 288 291 310 315 330 333 340 350 znaków

Zgodnie z motywem muzycznym, oto rozwiązanie w języku przeznaczonym do składu nut, 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))))

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

KirarinSnow
źródło
4
jest to prawdopodobnie pierwszy i jedyny raz, kiedy widziałem LilyPond używany w golfie kodowym.
cobbal
26

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

Dla czytelności wyświetlany w wielu wierszach, ale powinien być jednym wierszem:

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)

Może być testowany za pomocą tego interpretera Applesoft BASIC w Javascript lub emulatorze .

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

Carlos Gutiérrez
źródło
Czy można odczytać oba argumenty w tej samej linii, zgodnie ze specyfikacją?
KirarinSnow,
18

C # - 315

Nadal gram w golfa w C #, chociaż nie jest to zbyt lakoniczny język ...

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
źródło
23
Teraz rozwiązanie F #, aby zakończyć melodię.
LiraNuna
13
+1 dla humoru, -1 dla banalnego humoru i +1, ponieważ C # i F # są zgodne.
Steve Tjoa
Otrzymałem System.IndexOutOfRangeException podczas próby uruchomienia.
Fitzchak Yitzchaki,
@ Mendy: Po uruchomieniu musisz podać argumenty wiersza poleceń. Jeśli uruchomisz go z programu Visual Studio, otwórz właściwości projektu, przejdź do karty debugowania iw obszarze Opcje uruchamiania możesz wprowadzić argumenty wiersza polecenia. Jeśli skompilowałeś kod do pliku exe, po prostu uruchom go z okna konsoli z argumentami po nazwie programu.
Guffa,
1
Bardzo przyjemne użycie operatora ->.
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]
gnibblera
źródło
Czy nie mógłbyś uratować niektórych znaków, usuwając powtarzającą się część ti ui mnożąc przez 7?
Matthew Crumley
@Matthew Crumley, nie krępuj się pożyczyć od mojego rozwiązania :)
John La Rooy,
@gnibbler, tak naprawdę nie jestem programistą Pythona (trochę się nim bawiłem, ale nie za bardzo), więc wątpię, czy byłbym w stanie wiele z tym zrobić. Nie wiedziałem nawet, że Python może mnożyć takie łańcuchy, dopóki nie zobaczyłem Twojego oryginalnego rozwiązania.
Matthew Crumley
@gnibbler - fajne rozwiązanie, chciałbym go uruchomić, ale otrzymuję błąd SyntaxError .... C 14 Traceback (ostatnie wywołanie ostatnie): Plik "piano.py", wiersz 1, w? k, n = input (). split () Plik "<string>", wiersz 1 C 14 ^
AJ.
@AJ, wygląda na to, że ten błąd pochodzi z rozwiązania Python3. Nie jestem pewien, dlaczego to rozumiesz
John La Rooy
15

Oktawę, 153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268 znaków

Po co używać tylko C lub C # lub F # (lub B lub D), skoro można programować z pełną oktawą?

(zawijane co 60 znaków dla przejrzystości)

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

Tak ... to rozwiązanie naprawdę oblicza złożoną sprzężoną transpozycję ciągu.

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

KirarinSnow
źródło
13

C - 197 203 207 216 224 232 240 postacie

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

Ta odpowiednik 194- znakowej wersji zakłada, że ​​przepełnienie bufora jest w porządku.

#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
źródło
1
for(j=0; j<=l*5+h; j++)<- bezużyteczne spacje i wydaje się, że uwzględniłeś je również w liczbie znaków
Nicolás,
12

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

Wersja binarna rozszerzona przez kodowanie ASCII85 do 219-znakowego programu z tylko drukowalnymi znakami 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[

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

KirarinSnow
źródło
10
Uwielbiam oglądać mniej tradycyjne języki w tych konkursach.
tłum
12

F #: 224 225, 226, 248, 252, 270, 276, 299, 306 znaków

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

Użyłem modułów 2, aby wykryć przestrzeń lub funt. '' to 32% 2 = 0 '#' to 35% 2 = 1, a ponieważ moje zera warunkowe zwrócone dla fałszu po prostu pomnożyłem wynik modułów.

Użyto <| operator, aby zgolić jeden znak spacji. Użyto przeciążenia operatora, aby zapisać kolejny znak.

oryginał

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
gradbot
źródło
Mógłbym zgolić 46 znaków, gdyby F # miał operator mnożenia ciągów
gradbot
Nieco krócej: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
Wielkie dzieki! Nie wiem, dlaczego nie mogłem tego znaleźć. Przypisałem go do zmiennej i użyłem dwukrotnie.
gradbot
Teraz płacę tylko 48-znakowy podatek od nazw funkcji .net.
gradbot
Gratulacje dla wersji 8! Dziwię się, jak bardzo przyciąłeś.
ChaosPandion
11

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

Działa dla maksymalnie 99 kluczy. Standardowe pianino ma 52 białe klawisze, więc to powinno wystarczyć.

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

Przykłady:

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

Ostatni przykład wyświetla standardową klawiaturę wraz z wyimaginowanymi czarnymi klawiszami na obu końcach.

KirarinSnow
źródło
10

PianoScript - 2 znaki

To jest jedna linijka:

go

Stosowanie:

PianoScript piano.ps G# 11

Wynik:

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

Więcej informacji na temat języka PianoScript można znaleźć tutaj .

bezradny
źródło
1
Może mieć 0 znaków, prawda?
TY
Zakładam, że w PianoScript ++ będziesz w stanie napisać program o jeden znak mniej.
gradbot
4
Szkoda, że ​​nie jesteś pierwszym, który wpadł na ten pomysł.
LiraNuna,
4
-1 za oszukiwanie, a nawet nie
wymyślenie fajnej
1
fortepiany mają partytury, a nie scenariusze
Jimmy
10

JavaScript - 195 znaków

Hej, golf to gra, w której rywalizujesz tylko ze sobą, prawda? :)

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)

Rozwiązanie autorstwa gnarf; przeniesiony do Rhino (z drobną poprawką i zmianami formatowania) przez KirarinSnow; dodatkowo odłupane przez gnarf; błąd poprawiony przez KirarinSnow. cache użytkownika k[1]cwallenpoole

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

Szybka wersja demonstracyjna HTML: Test golfa - dodajereadFile=prompt;print=function(a) {document.write("<pre>"+a);}

gnarf
źródło
Cóż, rywalizujesz też ze specyfikacją ... i myślę, że przegrałeś. ;) To nawet nie przechodzi testów. Wydaje się, że zaczyna się od początku.
Guffa
Masz tylko 1 odniesienie do b. zmień readFile (b) na po prostu readFile ('podciąg')
Ponkadoodle,
@wallacoloo - potrzebne później, część na dole:s=s[b](1-q,p=s.length-3)
gnarf
6

Python3 - 158

Zapisać na inputżywo raw_input. Przegrać ()zaprint

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
źródło
5

F #: 355 znaczących znaków

Wszystko w jednej linii:

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"

Rozszerzony:

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"
Juliet
źródło
@Brian, poproś zespół o wdrożenie getslub odpowiednik, zaoszczędzilibyśmy 22 znaki!
Benjol,
Uważam, że podczas gry w golfa rekurencja jest dobrym sposobem na usunięcie adnotacji typu.
gradbot
3

SETL

165 znaków; Tłumaczenie rozwiązania 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
źródło
3

D2 (szablony): 331 370 400 + 17 znaków

(na podstawie rozwiązania Ruby).

Sprężony:

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

Wyjaśnił:

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

Ponieważ nie możemy przekazać parametrów z dmdwejścia, należy to zrobić w kodzie. Obsługuje tylko do 99 kluczy.

KennyTM
źródło
2
Czy możesz wprowadzić dane wejściowe jako pojedynczy ciąg? Częścią wyzwania jest przetworzenie linii na nutę, opcjonalny krzyżyk i czas trwania. Samo parsowanie może zająć sporo znaków w niektórych językach ...
KirarinSnow,
2

Haskell: 212 211 208 znaków

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

Nadal zakłada litery zgodne z ASCII (w szczególności sekwencja „@ABCDEFG”), ale nie wymaga już znaku Char.ord

3 obroty
źródło
2

Ruby - 113 znaków

Działa z argumentami wiersza poleceń

$ 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 znaków

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]}
gnibblera
źródło
2

PHP - 208 znaków

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

Trzeba to poprawić.

Wejście musi być dostarczone w stałej o nazwie PIANO.

użytkownika581149
źródło
1

F # 414 386 372 znaczące znaki:

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

Aha, i jeden bonus, ten skrypt właściwie obsłuży "F # 372" poprawnie - nie będę cię denerwować, wklejając go tutaj ...

System.Console.ReadLine () to taki kłopot ...

Benjol
źródło