Perl, 167 160 156 147 142 133 D'oh! 147 144 137 134 133 chars
$_=shift;die grep{5>$n?y/*/#/:y/#*/ |/;$n++-8||y/ /_/} @Q=(substr(("*# #".("*# #*# | #")x2)x9, 4*/#/+(7&ord)*5,1+/#/+5*pop).$/)x9
Here's a 129 char solution, borrowing several ideas from molf's Ruby solution:
($_,$c)=@ARGV;$j=($k=/#/)+ord; for$n(0..8){print$/,substr+(join'',map{8-$n?5>$n&&$_%7%4?"### " :" | ":"_|___"}$j..$j+$c),!$k,-3}
and with help from the 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)
; ' \ /
| | | |
/_\ /';
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,"_"}
(The second newline is not necessary and added only to avoid a scrollbar on SO. Semi-colons can be replaced by newlines if desired.)
The Ruby 1.9 version is different but of equal length (replacing a[0]
by a.ord
and "_"
by ?_
):
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,?_}
Call with
$ ruby piano.rb C 14
In keeping with the music theme, here's a solution in a language designed for typesetting music scores, 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))))
Usage: $ lilypond thisfile.ly <input.in >output.out 2>/dev/null
Fits in one line of #SO without the scroll bar :)
' ':s/~~5*\(7&5*\,.4*@+):k;+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*s.+*k>c<n+}%)s/'_'*
GolfScript - 81 Characters
' ': /((7&\,.4*@5*+:k;\~~5*+):c;9,{5<'#'9**' | '4*+3/4<.1>+c* +*k)>c<n+}%) /'_'*
Nicely formatted version (27 x 3)
' ': /((7&\,.4*@5*+:k;\~~5*
+):c;9,{5<'#'9**' | '4*+3/4
<.1>+9* +*k)>c<n+}%) /'_'*
GolfScript - 82 Characters
' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{5<3*'### '*' | '4*+20<.5>+c*k)>c<n+}%)' '/'_'*
GolfScript - 85 Characters
' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{.5<3*'### '*' _'1/@8=='|'1$3*++4*+20<.5>+c*k)>c<n}%
Nicely formatted version (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 Characters
' ': /~~5*:c;(7&5*:^;,:&;['### '3*' | '+.5>+c*1>{^4&*+>&c+)<n}:f~]5*' _'1/{'|'\4*+7*c*f}%
GolfScript - 98 Characters
' ': /~~5*:c;(7&5*:^;,:&;['### '3*' | '+.5>+c*^4&*+:^)>&c+):&<n]5*[ '_']{['|'\4*+7*c*^>&<n]}%
GolfScript - 101 Characters
' ': /~~5*:c;(7&5*:^;,:&;['### '3*' | '+.5>+c*^4&*+)>&c+)<n]5*[ '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%
GolfScript - 109 Characters
' ': /~~5*:c;(7&5*:^;,:&;['##'' ###'.' | '++.' #'+++c*^4&*+>&c+)<n]5*[ '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%
GolfScript - 120 Characters
' '/~~5*:c;(7&5*:^;,:&;['##'' ###'.' | '++.' #'+++c*^4&*+>&c+)<n]5*['| '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<
GolfScript - 127 Characters
' '/~~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
## ### | ### ### | ### ##
## ### | ### ### | ### ##
## ### | ### ### | ### ##
## ### | ### ### | ### ##
## ### | ### ### | ### ##
| | | | | | | |
| | | | | | | |
| | | | | | | |
|____|____|____|____|____|____|____|
Shown in multiple lines for readability, but should be a single line:
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)
Can be tested with this Applesoft BASIC Interpreter in Javascript or an emulator.
Piano http://img685.imageshack.us/img685/3407/piano2.png
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With