Код гольфу: Фортепіано


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

7
Наступний код гольфу: Впровадьте інтерфейс MIDI для цих піаніно.
Мехрдад Афшарі

10
Шановні доводчики, я вітаю вас за те, що ви змогли закрити цю проблему через 3 дні. Ми відкрили його за 5 хвилин. Це одне має вам щось сказати - громада любить і приймає подібні запитання, подобається вам це чи ні. Якщо ви цього не зробите, додайте код-гольф у свій список ігнорованих тегів.
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/… ), але він закрився :-(
моб

2
Мені б хотілося, щоб вони викладали гольф у школі. Я хочу повернути свої гроші.
Steve Tjoa

6
Приємно. Я опублікую своє рішення в PianoScript пізніше. Це всього 6 символів. :-)
molf

112

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

Perl, 167 160 156 147 142 133 Да! 147 144 137 134 133 133 символи

    $ _ = shift; die grep {5> $ n? y / * / # /: y / # * / | /; $ n ++ - 8 || y / / _ /}
    @ Q = (substr (("* # #". ("* # # * # | #") X2) x9,
    4 * / # / + (7 і ордер) * 5,1 + / # / + 5 * поп). $ /) X9

Ось рішення для символів 129, що запозичує кілька ідей із рішення Ruby від molf:

    ($ _, $ c) = @ ARGV; $ j = ($ k = / # /) + ордер;
    для $ 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?
Steve Tjoa

2
Я збираюся зробити це в закладках, щоб показати людям, які не сприймають жарт "мавпи".
Мехрдад Афшарі,

3
@Steve - Давайте зробимо це Yamaha
натовп

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

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

34

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

146 144 140 137 134 126 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. При бажанні півтонки можна замінити новими.)

Рубін 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

a, n = gets.split; ... виконує ту саму роботу, -3 символи
hurikhan77

1
Ви навіть можете замінити "gets.split" на "$ *" і ввести в командному рядку, -8 символів
hurikhan77

Зміна i%7%4<1||t>4?"_|___":"###__"до i%7%4&&t<5?"###__":"_|___"і зберегти 2 символів. Я люблю цю %7%4ідіому
натовп

1
Тож ми приступили до найкоротшого рішення, так? Рубі Рулез! :-D
hurikhan77

29

LilyPond, 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 використовується в кодовому гольфі.
cobbal


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

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 # є суперечливими.
Steve Tjoa

Я отримав 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, не соромтеся запозичувати моє рішення :)
John La Rooy

@gnibbler, я насправді не програміст на python (я десь із ним бавився, але не надто широко), тому сумніваюся, що зміг би з цим багато чого зробити. Я навіть не знав, що python може так множити рядки, поки не побачив ваше оригінальне рішення.
Метью Крамлі,

@gnibbler - приємне рішення, хотів би запустити його, але отримати SyntaxError .... C 14 Traceback (останній дзвінок останній): Файл "piano.py", рядок 1, у? k, n = input (). split () Файл "<string>", рядок 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
Люблю бачити менш традиційні мови на цих конкурсах.
моб

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

Чудово, дякую! Не знаю, чому я не зміг цього знайти. Я призначив його змінній і використав його двічі.
gradbot

Зараз я просто плачу 48 податків на символи .net імен функцій.
gradbot

Вітаємо з версією 8! Я здивований, наскільки ти обрізав.
ChaosPandion

11

sed, 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

4
Шкода, що ви не перший, хто придумав цю ідею.
LiraNuna

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; далі відколотий gnarf; помилку виправлено 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) на just 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"

@Brian, будь ласка, нехай команда реалізує getsабо еквівалент, ми збережемо 22 символи!
Benjol

Я вважаю, що коли гольф рекурсія - це хороший спосіб видалити анотації типу.
gradbot

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
Чи можете ви зробити введення єдиним рядком? Частина виклику - синтаксичний розбір рядка на ноту, необов’язковий різкий і тривалість. Сам розбір може зайняти чимало символів на деяких мовах ...
KirarinSnow

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.