Лилипонд, 285 288 291 310 315 330 333 340 350 знаков

34

Рубин - 125 символов

146 144 140 137 134 126 125 символов

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
molf
источник
Привет, VIM считает 138 символов на первом?!?
Hurikhan77 05
a, n = gets.split; ... делает то же самое, -3
символа
1
Вы даже можете заменить "gets.split" на "$ *" и ввести в командной строке -8 символов
hurikhan77 05
+ Изменить i%7%4<1||t>4?"_|___":"###__" к i%7%4&&t<5?"###__":"_|___"и сохранить 2 символов. Мне нравится эта %7%4идиома
моб
1
Итак, мы подошли к самому короткому решению, а? Руби рулез! :-D
Hurikhan77 06

Ответы:

29

Лилипонд, 285 288 291 310 315 330 333 340 350 знаков

В соответствии с музыкальной темой, вот решение на языке, предназначенном для набора нот, 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 <input.in >output.out 2>/dev/null

KirarinSnow
источник
4
Возможно, это первый и единственный раз, когда я видел, как LilyPond используется в кодовом гольфе.
коббал
26

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

Показано в несколько строк для удобства чтения, но должно быть одной строкой:

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 в Javascript или эмуляторе .

Фортепиано http://img685.imageshack.us/img685/3407/piano2.png

Карлос Гутьеррес
источник
Можно ли читать оба аргумента в одной строке согласно спецификации?
KirarinSnow 05
18

C # - 315

Я упорствовать в гольф в 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,"|__|__");}}
Гуффа
источник
23
Теперь решение F # для завершения мелодии.
LiraNuna
13
+1 за юмор, -1 за банальный юмор и +1, поскольку C # и F # совпадают.
Стив Тьоа,
Я получил исключение System.IndexOutOfRangeException при попытке его запустить.
Фитцхак Ицхаки
@Mendy: вы должны указать аргументы командной строки при запуске. Если вы запускаете его из Visual Studio, откройте свойства проекта, перейдите на вкладку отладки и в разделе Параметры запуска вы можете ввести аргументы командной строки. Если вы скомпилировали код в exe, просто запустите его из окна консоли с аргументами после имени программы.
Guffa
1
Очень хорошее использование оператора ->.
Кевин
16

Питон - 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]
5 оборотов
источник
Не могли бы вы сохранить некоторые символы, удалив повторяющуюся часть tи uи умножив на 7?
Мэтью Крамли,
@Matthew Crumley, не стесняйтесь позаимствовать из моего решения :)
Джон Ла Рой,
@gnibbler, я на самом деле не программист на Python (я немного поигрался с ним, но не очень много), поэтому я сомневаюсь, что смогу с ним многое сделать. Я даже не знал, что python может умножать такие строки, пока не увидел ваше исходное решение.
Мэтью Крамли,
@gnibbler - хорошее решение, хотелось бы запустить его, но получаю SyntaxError .... C 14 Traceback (последний вызов последним): файл «piano.py», строка 1, в? k, n = input (). split () Файл "<строка>", строка 1 C 14 ^
AJ.
@AJ, похоже, эта ошибка связана с решением Python3. Не уверен, почему вы это получаете
Джон Ла Рой,
15

Октава, 153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268 знаков

Зачем использовать только 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 <input.in >output.out

KirarinSnow
источник
13

С - 197 203 207 216 224 232 240 символы

#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)]));}
KennyTM
источник
1
for(j=0; j<=l*5+h; j++)<- бесполезные пробелы, и вы, кажется, тоже включили их в подсчет символов
Николас
12

PostScript: 239 245 293 312 (обычный); 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[

Двоичная версия расширена с помощью кодировки 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 <input.in >output.out

KirarinSnow
источник
10
Мне нравится видеть в этих конкурсах менее традиционные языки.
mob
12

F #: 224 225, 226, 248, 252, 270, 276, 299, 306 символов

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
градбот
источник
Я мог бы сократить 46 символов, если бы в F # был оператор умножения строк
gradbot
Чуть короче: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 05
Отлично, спасибо! Не знаю, почему я не смог этого найти. Я присвоил его переменной и использовал дважды.
Gradbot 05
Теперь я просто плачу налог в 48 символов за имена функций .net.
Gradbot 05
Поздравляю с версией 8! Я удивлен, как много вы урезали.
ChaosPandion 06
11

СЭД, 231 235 234 235 237 238 244 268 269 270 276 279 280 282 287 300 307 314 329 338 символов

Работает до 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
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
##  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |   ##
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|____|

В последнем примере печатается стандартная клавиатура вместе с воображаемыми черными клавишами с обеих сторон.

KirarinSnow
источник
10

PianoScript - 2 символа

Это однострочный:

go

Применение:

PianoScript piano.ps G# 11

Выход:

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

Более подробную информацию о языке PianoScript можно найти здесь .

Невежественный
источник
1
Это может быть 0 символов, не так ли?
ВЫ
Я предполагаю, что в PianoScript ++ вы сможете написать программу на один символ меньше.
Gradbot 06
4
Жаль, что вы не первый, кто придумал эту идею.
ЛираНуна
4
-1 за накрутку, да еще не придумывание крутого названия языку;)
gnarf
1
у пианино есть партитуры, а не скрипты
Джимми
10

JavaScript - 195 символов

Эй, гольф - это игра, в которой ты соревнуешься только сам с собой, верно? :)

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. кеш k[1]от cwallenpoole

Применение: $ cp input.in 0; rhino thisfile.js

Быстрая демонстрационная версия HTML: Гольф-тест - ДобавляетreadFile=prompt;print=function(a) {document.write("<pre>"+a);}

gnarf
источник
Ну, вы тоже соревнуетесь со спецификацией ... и я думаю, что вы проиграли. ;) Он даже не проходит тест-кейсы. Кажется, что начинается один раз.
Guffa
У вас есть только 1 ссылка на b. замените readFile (b) на readFile ('substring')
Ponkadoodle
@wallacoloo - понадобится позже, часть внизу:s=s[b](1-q,p=s.length-3)
gnarf
6

Python3 - 158

Сохранить на 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])
Джон Ла Рой
источник
5

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"
Джульетта
источник
@ Брайан, попросите команду реализовать getsили что-то подобное, мы бы сэкономили 22 символа!
Benjol 05
Я считаю, что при игре в гольф рекурсия - хороший способ удалить аннотации типов.
gradbot 05
3

SETL

165 символов; Перевод решения 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
источник
3

D2 (шаблоны): 331 370 400 + 17 персонажей

(на основе решения 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 ключей.

KennyTM
источник
2
Можете ли вы сделать ввод одной строкой? Часть проблемы состоит в том, чтобы разбить строку на примечание, необязательный диез и продолжительность. Сам синтаксический анализ может
содержать
2

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

оборота надвигающаяся буря
источник
2

Рубин - 113 символов

Работает с аргументами командной строки

$ 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]}

Рубин - 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]}
оборота
источник
2

PHP - 208 символов

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

Должны быть улучшены.

Вход должен быть доставлен в константе с именем PIANO.

оборота пользователь581149
источник
1

F # 414 386 372 значащих символа:

//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 () такой облом ...

оборота Benjol
источник