Код Гольф: Фортепиано


88

Соревнование

Самый короткий код по количеству символов для вывода части фортепианной клавиатуры, начиная с входной ноты заданной длины.

Ввод будет состоять из примечания ( [ACDFG]#|[A-G]), с которого начинается печать клавиатуры, и положительного числа, представляющего длину клавиш для печати, включая первую ноту.

Первая клавиша должна быть напечатана полностью - если у нее острая левая клавиша, она будет обрезана, то же самое, когда начальная клавиша острая, левая клавиша также будет вырезана.

Ключ Sharp не считается, только белые ключи.

Тестовые примеры

Input
    C 14
Output
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|____|____|____|____|____|____|____|

Input
    D# 1
Output
    ###   |
    ###   |
    ###   |
    ###   |
    ###   |
     |    |
     |    |
     |    |
    _|____|

Input
    A 7
Output
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    ##  ###   |   ###  ###   |   ###  ##
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |    |    |    |    |    |    |    |
    |____|____|____|____|____|____|____|

Количество кодов включает ввод / вывод (т.е. полную программу).


5
[A-G]#*? Значит ли это, что нам нужно обращаться, скажем, B#####как E?
Аноним.

5
Для количества ключей определите «ключ». Почему в примере «C 14» печатаются 24 ключа?
Guffa,

53
Хорошо, теперь, когда у нас есть решения C и C #, нам нужны B, D и F #.
LiraNuna 05

7
Следующий код гольф: Реализуйте MIDI-интерфейс для этих фортепиано.
Mehrdad Afshari 05

10
Дорогие близкие, я приветствую вас за то, что вам удалось закрыть этот вызов через 3 дня. Мы заставили его снова открыть через 5 минут. Уже одно это должно вам кое-что сказать - сообществу нравятся и принимаются такие вопросы, нравится вам это или нет. Однако, если вы этого не сделаете, добавьте code-golf в список игнорируемых тегов.
LiraNuna

Ответы:


27

GolfScript - 80 символов

Умещается в одну строчку #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 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|

Я собирался отправить свою первую запись в гольф-скрипте для другого испытания ( stackoverflow.com/questions/2104556/… ), но он был закрыт :-(
mob

2
Я бы хотел, чтобы в школе учили игре в гольф. Я хочу свои деньги назад.
Стив Тьоа

6
Ницца. Позже я выложу свое решение на PianoScript. Всего 6 символов. :-)
molf 05

112

Perl, 133 (129) символов

Perl, 167 160 156 147 142 133 D'oh! 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;
    для $ 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)
          ;   '                            \   /
           | |                              | |
           /_\                              /';

7
Хахаха, круто. Это Steinway, Yamaha, Young Chang?
Стив Тхоа 05

2
Я собираюсь добавить это в закладки, чтобы показать людям, которые не понимают анекдота про "обезьяну".
Mehrdad Afshari 05

3
@Steve - Давайте сделаем это Yamaha
mob

6
@mobrule, ты ненавидишь grep? почему ты хочешь, чтобы он умер? :(
LiraNuna 06

Golfscript * 1.3 будет 105 :)
Джон Ла Рой

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

Привет, 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


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]

Не могли бы вы сохранить некоторые символы, удалив повторяющуюся часть 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


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

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


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

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


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


Ну, вы тоже соревнуетесь со спецификацией ... и я думаю, что вы проиграли. ;) Он даже не проходит тест-кейсы. Кажется, что начинается один раз.
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;

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 ключей.


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.


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.