помещается в одну строку #SO без полосы прокрутки : )
' ':s/~~5*\(7&5*\,.4*@+):k;+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*s.+*k>c<n+}%)s/'_'*
GolfScript - 81 символ
' ': /((7&\,.4*@5*+:k;\~~5*+):c;9,{5<'#'9**' | '4*+3/4<.1>+c* +*k)>c<n+}%) /'_'*
Приятно отформатированный вариант (27 x 3)
' ': /((7&\,.4*@5*+:k;\~~5*
+):c;9,{5<'#'9**' | '4*+3/4
<.1>+9* +*k)>c<n+}%) /'_'*
GolfScript - 82 символа
' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{5<3*'### '*' | '4*+20<.5>+c*k)>c<n+}%)' '/'_'*
GolfScript - 85 символов
' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{.5<3*'### '*' _'1/@8=='|'1$3*++4*+20<.5>+c*k)>c<n}%
Приятно отформатированный вариант (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 символа
' ': /~~5*:c;(7&5*:^;,:&;['### '3*' | '+.5>+c*1>{^4&*+>&c+)<n}:f~]5*' _'1/{'|'\4*+7*c*f}%
GolfScript - 98 символов
' ': /~~5*:c;(7&5*:^;,:&;['### '3*' | '+.5>+c*^4&*+:^)>&c+):&<n]5*[ '_']{['|'\4*+7*c*^>&<n]}%
GolfScript - 101 символ
' ': /~~5*:c;(7&5*:^;,:&;['### '3*' | '+.5>+c*^4&*+)>&c+)<n]5*[ '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%
GolfScript - 109 символов
' ': /~~5*:c;(7&5*:^;,:&;['##'' ###'.' | '++.' #'+++c*^4&*+>&c+)<n]5*[ '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%
GolfScript - 120 символов
' '/~~5*:c;(7&5*:^;,:&;['##'' ###'.' | '++.' #'+++c*^4&*+>&c+)<n]5*['| '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<
GolfScript - 127 символов
' '/~~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
## ### | ### ### | ### ##
## ### | ### ### | ### ##
## ### | ### ### | ### ##
## ### | ### ### | ### ##
## ### | ### ### | ### ##
| | | | | | | |
| | | | | | | |
| | | | | | | |
|____|____|____|____|____|____|____|
Сохранить на input
по сравнению с raw_input
. Проиграйте на ()
для 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])
#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)]));}
Эта эквивалентная версия с 194 -символами предполагает, что с переполнением буфера все в порядке.
#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)]));}
Я упорствовать в гольф в C #, хотя это не очень краткий язык ...
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,"|__|__");}}
В соответствии с музыкальной темой, вот решение на языке, разработанном для набора нот, 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))))
Использование: $ lilypond thisfile.ly
//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)
О, и один бонус, этот скрипт на самом деле будет правильно обрабатывать "F# 372" - я не буду вас раздражать, вставляя его здесь, хотя...
System.Console.ReadLine() - такой облом...
(на основе решения Ruby).
Сжатый:
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);}
Объяснение:
/**
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);
}
Поскольку мы не можем передавать параметры из dmd
, ввод должен выполняться в коде. Поддерживает до 99 ключей.
165 символов; перевод 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;
Работает для 99 ключей. Стандартное пианино имеет 52 белые клавиши, так что этого должно быть достаточно.
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/ /_/
Примеры:
$ 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
## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ##
## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ##
## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ##
## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ##
## ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ### ### | ### ### ### | ##
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
В последнем примере печатается стандартная клавиатура вместе с воображаемыми черными клавишами с обеих сторон.
Это однострочный текст:
go
Использование:
PianoScript piano.ps G# 11
Вывод:
### ### | ### ### | ### ### ### | ### ##
### ### | ### ### | ### ### ### | ### ##
### ### | ### ### | ### ### ### | ### ##
### ### | ### ### | ### ### ### | ### ##
### ### | ### ### | ### ### ### | ### ##
| | | | | | | | | | | |
| | | | | | | | | | | |
_|____|____|____|____|____|____|____|____|____|____|____|
Дополнительная информация о языке PianoScript можно найти здесь .
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]
/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[
Двоичная версия расширена с помощью кодировки ASCII85 в 219-символьную программу, содержащую только печатные символы 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[
Использование: $ gs -q -dNOPROMPT -dNODISPLAY -dBATCH thisfile.ps
Perl, 167 160 156 147 142 133 Ооо! 147 144 137 134 133 символа
$_=shift;die grep{5>$n?y/*/#/:y/#*/ |/;$n++-8||y/ /_/} @Q=(substr(("*# #".("*# #*# | #")x2)x9, 4*/#/+(7&ord)*5,1+/#/+5*pop).$/)x9
Вот решение на 129 символов, заимствованное из решения molf на Ruby:
($_,$c)=@ARGV;$j=($k=/#/)+ord; for$n(0..8){print$/,substr+(join'',map{8-$n?5>$n&&$_%7%4?"### " :" | ":"_|___"}$j..$j+$c),!$k,-3}
и с помощью 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)
; ' \ /
| | | |
/_\ /';
Показано в нескольких строках для удобочитаемости, но должно быть одной строкой:
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)
Может быть протестировано с помощью данного Applesoft BASIC Interpreter в Javascript или эмулятора.
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,"_"}
(Вторая новая строка не обязательна и добавляется только для того, чтобы избежать полосы прокрутки на SO. При желании точки с запятой можно заменить на новые строки.)
Версия Ruby 1.9 отличается, кроме равной длины (заменив a [0]
на a.ord
и "_"
на ? _
):
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,?_}
Позвоните с
$ ruby piano.rb C 14
Haskell: 212 211 208 символов
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
Он по-прежнему предполагает символы, совместимые с ascii (в частности, последовательность «@ABCDEFG»), но больше не требует Char.ord
F #: 355 значащих символов
Все в одной строке:
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"
Расширенное:
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"
Зачем использовать только C или C# или F# (или B или D), если можно программировать на полную октаву?
(обернуто каждые 60 символов для наглядности)
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
Да... это решение действительно вычисляет комплексно сопряженное транспонирование строки.
Использование: $ octave -q thisfile.m
Эй, гольф - это игра, в которой ты соревнуешься только против себя, верно? :)
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)
Решение от gnarf; портирован на Rhino (с небольшими исправлениями и изменениями форматирования) KirarinSnow; далее сколотый неровностями; ошибка исправлена KirarinSnow. cache k [1]
от cwallenpoole
Использование: $ cp input.in 0; rhino thisfile.js
Быстрая демонстрационная версия HTML:
Golf Test -
Добавляет readFile = prompt; print = function (a) {document.write ("
" + a);}
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
Я использовал модули по 2, чтобы обнаружить пробел или фунт. '' равно 32% 2 = 0 '#' равно 35% 2 = 1 , и поскольку мои условные возвращенные нули для false я просто умножил результат модулей.
Использовал <| оператор для удаления одного символа пробела. Используется перегрузка оператора для сохранения другого символа.
оригинал
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
Runs with command line arguments
$ 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 символов
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]}