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

34

Ruby - 125 karakter

146 144 140 137 134 126 125 chars

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

(Baris baru kedua tidak diperlukan dan ditambahkan hanya untuk menghindari scrollbar pada SO. Titik koma dapat diganti dengan baris baru jika diinginkan.)

Versi Ruby 1.9 berbeda tetapi memiliki panjang yang sama (diganti a[0]oleh a.orddan "_"oleh ?_):

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

Telepon dengan

$ ruby piano.rb C 14
molf
sumber
Hei VIM menghitung 138 karakter pada yang pertama?!?
hurikhan77
a, n = gets.split; ... melakukan pekerjaan yang sama, -3 karakter
hurikhan77
1
Anda bahkan dapat mengganti "gets.split" dengan "$ *" dan memberikan masukan pada baris perintah, -8 karakter
hurikhan77
Ubah i%7%4<1||t>4?"_|___":"###__"ke i%7%4&&t<5?"###__":"_|___"dan simpan 2 karakter. Saya suka %7%4idiom itu
mafia
1
Jadi kita sampai pada solusi terpendek, eh? Ruby rulez! :-D
hurikhan77

Jawaban:

29

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

Sesuai dengan tema musik, berikut adalah solusi dalam bahasa yang dirancang untuk penyusunan huruf partitur musik, 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))))

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

KirarinSnow
sumber
4
ini mungkin yang pertama dan satu-satunya saat saya melihat LilyPond digunakan dalam golf kode.
cobbal
26

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

Ditampilkan dalam beberapa baris agar mudah dibaca, tetapi harus satu baris:

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)

Dapat diuji dengan Applesoft BASIC Interpreter ini dalam Javascript atau emulator .

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

Carlos Gutiérrez
sumber
Apakah mungkin membaca kedua argumen pada baris yang sama, menurut spesifikasinya?
KirarinSnow
18

C # - 315

Saya tetap bermain golf di C # meskipun itu bukan bahasa yang sangat singkat ...

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
sumber
23
Sekarang untuk solusi F # untuk menyelesaikan melodi.
LiraNuna
13
+1 untuk humor, -1 untuk humor klise, dan +1 karena C # dan F # selaras.
Steve Tjoa
Saya mendapat System.IndexOutOfRangeException saat mencoba menjalankannya.
Fitzchak Yitzchaki
@Mendy: Anda harus menyediakan argumen baris perintah saat Anda menjalankannya. Jika Anda menjalankannya dari Visual Studio, buka properti untuk proyek tersebut, buka tab debug dan di bawah Opsi Mulai Anda dapat memasukkan argumen baris perintah. Jika Anda telah mengompilasi kode menjadi exe, jalankan saja dari jendela konsol dengan argumen setelah nama program.
Guffa
1
Penggunaan -> operator yang sangat bagus.
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
sumber
Tidak bisakah Anda menyimpan beberapa karakter dengan menghapus bagian berulang dari tdan udan mengalikan dengan 7?
Matthew Crumley
@Matthew Crumley, jangan ragu untuk meminjam dari solusi saya :)
John La Rooy
@gnibbler, saya sebenarnya bukan pemrogram python (saya pernah bermain-main dengannya, tapi tidak secara ekstensif) jadi saya ragu saya bisa berbuat banyak dengannya. Saya bahkan tidak tahu python dapat menggandakan string seperti itu sampai saya melihat solusi asli Anda.
Matthew Crumley
@gnibbler - solusi bagus, ingin menjalankannya tetapi mendapatkan SyntaxError .... C 14 Traceback (panggilan terakhir terakhir): File "piano.py", line 1, in? k, n = input (). split () File "<string>", baris 1 C 14 ^
AJ.
@ AJ, sepertinya kesalahan itu berasal dari solusi Python3. Tidak yakin mengapa Anda mendapatkannya
John La Rooy
15

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

Mengapa hanya menggunakan C atau C # atau F # (atau B atau D) saat Anda dapat memprogram dengan Oktaf penuh?

(dibungkus setiap 60 karakter untuk kejelasan)

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

Ya ... solusi ini benar-benar menghitung transpos konjugat kompleks dari sebuah string.

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

KirarinSnow
sumber
13

C - 197 203 207 216 224 232 240 karakter

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

Versi 194 karakter yang setara ini mengasumsikan buffer overflow baik-baik saja.

#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
sumber
1
for(j=0; j<=l*5+h; j++)<- spasi tidak berguna, dan Anda tampaknya telah memasukkannya juga dalam hitungan karakter
Nicolás
12

PostScript: 239 245 293 312 (biasa); 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 biner diperluas melalui pengkodean ASCII85 menjadi program 219 karakter dengan hanya karakter ASCII yang dapat dicetak:

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

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

KirarinSnow
sumber
10
Senang melihat bahasa yang kurang tradisional dalam kontes ini.
mafia
12

F #: 224225 , 226, 248, 252, 270, 276, 299, 306 Karakter

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

Saya menggunakan modul 2 untuk mendeteksi spasi atau pound. '' adalah 32% 2 = 0 '#' adalah 35% 2 = 1 dan karena bersyarat saya mengembalikan nol untuk salah, saya baru saja mengalikan hasil modul.

Menggunakan <| operator untuk mencukur satu karakter spasi. Overloading operator digunakan untuk menyimpan karakter lain.

asli

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
sumber
Saya bisa memangkas 46 karakter jika F # memiliki operator perkalian string
gradbot
Sedikit lebih pendek: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
Keren terima kasih! Saya tidak tahu mengapa saya tidak dapat menemukannya. Saya menugaskannya ke variabel dan menggunakannya dua kali.
gradbot
Sekarang saya hanya membayar pajak 48 karakter dari nama fungsi .net.
gradbot
Selamat atas versi 8! Saya terkejut betapa Anda telah memangkasnya.
ChaosPandion
11

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

Bekerja hingga 99 kunci. Piano standar memiliki 52 tuts putih, jadi ini sudah cukup.

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

Contoh:

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

Contoh terakhir mencetak keyboard standar, bersama dengan tombol hitam imajiner di kedua ujungnya.

KirarinSnow
sumber
10

PianoScript - 2 karakter

Ini satu baris:

go

Pemakaian:

PianoScript piano.ps G# 11

Keluaran:

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

Informasi lebih lanjut tentang bahasa PianoScript dapat ditemukan di sini .

Tidak mengerti
sumber
1
Bisa 0 karakter, bukan?
ANDA
Saya berasumsi dalam PianoScript ++ Anda akan dapat menulis program dalam satu karakter yang kurang.
gradbot
4
Sayang sekali Anda bukan orang pertama yang muncul dengan ide ini.
LiraNuna
4
-1 untuk menyontek, dan bahkan tidak menemukan nama yang keren untuk bahasa tersebut;)
gnarf
1
piano memiliki skor, bukan skrip
Jimmy
10

JavaScript - 195 karakter

Hei, golf itu permainan dimana kamu hanya bertanding melawan diri sendiri kan? :)

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)

Solusi oleh gnarf; porting ke Rhino (dengan perbaikan kecil dan perubahan format) oleh KirarinSnow; selanjutnya terkelupas oleh gnarf; kesalahan dikoreksi oleh KirarinSnow. cache k[1]oleh cwallenpoole

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

Versi Demo HTML Cepat: Tes Golf - MenambahkanreadFile=prompt;print=function(a) {document.write("<pre>"+a);}

gnarf
sumber
Nah, Anda juga bersaing dengan spesifikasinya ... dan saya pikir Anda kalah. ;) Itu bahkan tidak lulus uji kasus. Tampaknya itu dimulai.
Guffa
Anda hanya memiliki 1 referensi untuk b. ubah readFile (b) menjadi hanya readFile ('substring')
Ponkadoodle
@wallacoloo - dibutuhkan nanti, bagian di bawah:s=s[b](1-q,p=s.length-3)
gnarf
6

Python3 - 158

Menghemat inputvs raw_input. Kalah ()karenaprint

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
sumber
5

F #: 355 karakter penting

Semua dalam satu baris:

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"

Diperluas:

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
sumber
@ Brian, tolong minta tim untuk mengimplementasikan getsatau setara, kami akan menghemat 22 karakter!
Benjol
Saya menemukan bahwa saat bermain golf rekursi adalah cara yang baik untuk menghapus anotasi jenis.
gradbot
3

SETL

165 karakter; Terjemahan solusi 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
sumber
3

D2 (templat): 331 370 400 + 17 karakter

(berdasarkan solusi Ruby.)

Terkompresi:

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

Dijelaskan:

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

Karena kita tidak bisa melewatkan parameter dari dmdinput harus dilakukan dalam kode. Hanya mendukung hingga 99 kunci.

KennyTM
sumber
2
Bisakah Anda membuat input menjadi string tunggal? Bagian dari tantangannya adalah mengurai baris menjadi catatan, ketajaman opsional, dan durasi. Penguraiannya sendiri dapat mengambil beberapa karakter dalam beberapa bahasa ...
KirarinSnow
2

Haskell: 212 211 208 karakter

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

Ini masih mengasumsikan huruf yang kompatibel dengan ascii (khususnya, urutan "@ABCDEFG"), tetapi tidak lagi memerlukan Char.ord

badai datang
sumber
2

Ruby - 113 karakter

Berjalan dengan argumen baris perintah

$ 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 karakter

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
sumber
2

PHP - 208 karakter

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

Harus ditingkatkan.

Input harus dikirim dalam konstanta bernama PIANO.

pengguna581149
sumber
1

F # 414 386 372 karakter yang signifikan:

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

Oh, dan satu bonus, skrip ini sebenarnya akan menangani "F # 372" dengan benar - Saya tidak akan mengganggu Anda dengan menempelkannya di sini ...

System.Console.ReadLine () sangat mengecewakan ...

Benjol
sumber