Mã Golf: Piano


88

Các thách thức

Mã ngắn nhất tính theo số ký tự để xuất một phần của bàn phím đàn piano bắt đầu từ nốt đầu vào trong một độ dài nhất định.

Dữ liệu nhập sẽ bao gồm một ghi chú ( [ACDFG]#|[A-G]) để bắt đầu in bàn phím từ đó và một số dương đại diện cho độ dài các phím cần in bao gồm ghi chú đầu tiên.

Phím đầu tiên phải được in đầy đủ - nếu nó có phím nhọn bên trái, phím này sẽ bị cắt, tương tự như khi phím bắt đầu sắc nét, phím bên trái cũng sẽ bị cắt.

Phím Sharp không được tính, chỉ có phím trắng.

Các trường hợp thử nghiệm

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

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

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

Số lượng mã bao gồm đầu vào / đầu ra (tức là chương trình đầy đủ).


5
[A-G]#*? Điều này có nghĩa là chúng ta cần phải xử lý, nói, B#####như E?
Anon.

5
Để biết số lượng khóa, hãy xác định "khóa". Tại sao ví dụ "C 14" lại in 24 phím?
Guffa

53
OK, bây giờ chúng ta đã có các giải pháp C và C #, chúng ta cần B, D và F #.
LiraNuna

7
Mã tiếp theo chơi gôn: Triển khai giao diện MIDI cho những cây đàn piano này.
Mehrdad Afshari

10
Xin chào các bạn, tôi xin chào các bạn đã quản lý để hoàn thành thử thách này sau 3 ngày. Chúng tôi có thể mở lại sau 5 phút. Chỉ điều đó thôi cũng cho bạn biết điều gì đó - cộng đồng thích và chấp nhận những câu hỏi kiểu này, cho dù bạn có thích hay không. Tuy nhiên, nếu bạn không có, vui lòng thêm mã-gôn vào danh sách các thẻ bị bỏ qua của bạn.
LiraNuna

Câu trả lời:


27

GolfScript - 80 ký tự

Vừa với một dòng của #SO mà không cần thanh cuộn :)

' ':s/~~5*\(7&5*\,.4*@+):k;+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*s.+*k>c<n+}%)s/'_'*

GolfScript - 81 ký tự

' ': /((7&\,.4*@5*+:k;\~~5*+):c;9,{5<'#'9**' | '4*+3/4<.1>+c*  +*k)>c<n+}%) /'_'*

Phiên bản có định dạng độc đáo (27 x 3)

' ': /((7&\,.4*@5*+:k;\~~5*
+):c;9,{5<'#'9**' | '4*+3/4
<.1>+9*  +*k)>c<n+}%) /'_'*

GolfScript - 82 ký tự

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{5<3*'###  '*' |   '4*+20<.5>+c*k)>c<n+}%)' '/'_'*

GolfScript - 85 ký tự

' '/((7&\,.4*@5*+:k;\~~5*+):c;9,{.5<3*'###  '*' _'1/@8=='|'1$3*++4*+20<.5>+c*k)>c<n}%

Phiên bản có định dạng độc đáo (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 ký tự

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*1>{^4&*+>&c+)<n}:f~]5*'   _'1/{'|'\4*+7*c*f}%

GolfScript - 98 ký tự

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+:^)>&c+):&<n]5*[   '_']{['|'\4*+7*c*^>&<n]}%

GolfScript - 101 ký tự

' ': /~~5*:c;(7&5*:^;,:&;['###  '3*' |   '+.5>+c*^4&*+)>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript - 109 ký tự

' ': /~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*[   '_']{['|'\4*+7*c*^4&*+>&c+)<n]}%

GolfScript - 120 ký tự

' '/~~5*:c;(7&5*:^;,:&;['##''  ###'.'   | '++.'  #'+++c*^4&*+>&c+)<n]5*['|    '7*c*^4&*+>&c+)<n]3*'|____'7*c*^4&*+>&c+)<

GolfScript - 127 ký tự

' '/~~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 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|

Tôi đã chuẩn bị gửi bài viết đánh gôn đầu tiên của mình cho một thử thách khác ( stackoverflow.com/questions/2104556/… ), nhưng nó đã bị đóng :-(
mob

2
Tôi ước gì họ dạy golfscript trong trường học. Tôi muốn lấy lại tiền của mình.
Steve Tjoa

6
Đẹp. Tôi sẽ đăng giải pháp của mình trong PianoScript sau. Nó chỉ có 6 ký tự. :-)
thứ

112

Perl, 133 (129) ký tự

Perl, 167 160 156 147 142 133 D'oh! 147 144 137 134 133 ký tự

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

Đây là giải pháp ký tự 129, vay mượn một số ý tưởng từ giải pháp Ruby của molf:

    ($ _, $ c) = @ ARGV; $ j = ($ k = / # /) + ord;
    cho $ n (0..8) {print $ /, substr + (join '', map {8- $ n? 5> $ n && $ _% 7% 4? "###"
    : "|": "_ | ___"} $ j .. $ j + $ c),! $ k, -3}

và với sự trợ giúp từ 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
Hahaha, tuyệt vời. Đó có phải là Steinway, Yamaha, Young Chang không?
Steve Tjoa

2
Tôi sẽ đánh dấu trang này để hiển thị cho những người không hiểu trò đùa "con khỉ".
Mehrdad Afshari

3
@Steve - Hãy biến nó thành Yamaha
đám đông

6
@mobrule, bạn có ghét grep không? tại sao bạn muốn nó chết? :(
LiraNuna

Golfscript * 1.3 sẽ là 105 :)
John La Rooy

34

Ruby - 125 ký tự

146 144 140 137 134 126 125 ký tự

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,"_"}

(Dòng mới thứ hai không cần thiết và chỉ được thêm vào để tránh thanh cuộn trên SO. Có thể thay dấu chấm phẩy bằng dòng mới nếu muốn.)

Các của Ruby 1.9 phiên bản là khác nhau nhưng chiều dài bằng nhau (thay thế a[0]bằng a.ord"_"bằng ?_):

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,?_}

Gọi với

$ ruby piano.rb C 14

Này VIM đếm 138 ký tự trên cái đầu tiên?!?
hurikhan77

a, n = gets.split; ... hiện công việc giống, -3 chars
hurikhan77

1
Bạn thậm chí có thể thay thế "gets.split" bởi "$ *" và cung cấp cho các đầu vào trên dòng lệnh, -8 chars
hurikhan77

Thay đổi i%7%4<1||t>4?"_|___":"###__"thành i%7%4&&t<5?"###__":"_|___"và lưu 2 ký tự. Tôi yêu %7%4thành ngữ
đám đông

1
Vì vậy, chúng ta đang tìm giải pháp ngắn nhất, hả? Ruby rulez! :-D
hurikhan77

29

LilyPond, 285 288 291 310 315 330 333 340 350 ký tự

Để phù hợp với chủ đề âm nhạc, đây là một giải pháp bằng ngôn ngữ được thiết kế để sắp chữ điểm nhạ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))))

Sử dụng: $ lilypond thisfile.ly <input.in >output.out 2>/dev/null


4
Đây có thể là lần đầu tiên và duy nhất tôi thấy LilyPond được sử dụng trong chơi gôn mã.
cobbal


26

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

Được hiển thị thành nhiều dòng để dễ đọc, nhưng phải là một dòng duy nhất:

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)

Có thể được kiểm tra bằng Trình thông dịch cơ bản của Applesoft này trong Javascript hoặc trình giả lập .

Piano http://img685.imageshack.us/img685/3407/piano2.png


Có thể đọc cả hai đối số trên cùng một dòng, theo các thông số kỹ thuật không?
KirarinSnow

18

C # - 315

Tôi vẫn tiếp tục chơi gôn bằng C # mặc dù nó không phải là một ngôn ngữ ngắn gọn ...

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
Bây giờ cho giải pháp F # để hoàn thành giai điệu.
LiraNuna

13
+1 cho sự hài hước, -1 cho sự hài hước ngô nghê và +1 vì C # và F # là phù hợp.
Steve Tjoa

Tôi nhận được một System.IndexOutOfRangeException khi cố gắng chạy nó.
Fitzchak Yitzchaki

@Mendy: Bạn phải cung cấp các đối số dòng lệnh khi chạy nó. Nếu bạn chạy nó từ Visual Studio, hãy mở thuộc tính cho dự án, chuyển đến tab gỡ lỗi và trong Tùy chọn bắt đầu, bạn có thể nhập các đối số dòng lệnh. Nếu bạn đã biên dịch mã thành một exe, chỉ cần chạy nó từ cửa sổ bảng điều khiển với các đối số sau tên chương trình.
Guffa

1
Sử dụng toán tử -> rất hay.
Kevin

16

Python - 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]

Bạn không thể lưu một số ký tự bằng cách loại bỏ phần lặp lại của tuvà nhân với 7?
Matthew Crumley

@Matthew Crumley, vui lòng mượn giải pháp của tôi :)
John La Rooy

@gnibbler, tôi không thực sự là một lập trình viên python (tôi đã chơi với nó một số, nhưng không rộng rãi) vì vậy tôi nghi ngờ mình sẽ có thể làm được nhiều điều với nó. Tôi thậm chí không biết python có thể nhân các chuỗi như vậy cho đến khi tôi thấy giải pháp ban đầu của bạn.
Matthew Crumley

@gnibbler - giải pháp tốt, rất muốn chạy nó nhưng nhận được Lỗi cú pháp .... C 14 Traceback (lần gọi gần đây nhất): File "piano.py", dòng 1, in? k, n = input (). split () Tệp "<chuỗi>", dòng 1 C 14 ^
AJ.

@AJ, có vẻ như lỗi đó là từ giải pháp Python3. Tuy nhiên, không chắc tại sao bạn lại nhận được điều đó
John La Rooy

15

Octave, 153 154 155 158 159 162 172 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268 ký tự

Tại sao chỉ sử dụng C hoặc C # hoặc F # (hoặc B hoặc D) khi bạn có thể lập trình với quãng tám đầy đủ?

(gói mỗi 60 ký tự để rõ ràng)

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

Vâng ... giải pháp này thực sự tính toán chuyển vị liên hợp phức tạp của một chuỗi.

Sử dụng: $ octave -q thisfile.m <input.in >output.out


13

C - 197 203 207 216 224 232 240 nhân vật

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

Phiên bản 194 ký tự tương đương này giả định rằng tràn bộ đệm là ổn.

#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++)<- không gian vô ích, và bạn dường như đã bao gồm chúng trong số ký tự quá
Nicolás

12

PostScript: 239 245 293 312 (thông thường); 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[

Phiên bản nhị phân được mở rộng thông qua mã hóa ASCII85 thành một chương trình 219 ký tự chỉ với các ký tự ASCII có thể in được:

/(|____)/(|    )[/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[

Sử dụng: $ gs -q -dNOPROMPT -dNODISPLAY -dBATCH thisfile.ps <input.in >output.out


10
Thích xem các ngôn ngữ ít truyền thống hơn trong các cuộc thi này.
đám đông

12

F #: 224 225, 226, 248, 252, 270, 276, 299, 306 Chars

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

Tôi đã sử dụng các mô-đun của 2 để phát hiện một dấu cách hoặc pound. '' là 32% 2 = 0 '#' là 35% 2 = 1 và vì các số không trả về có điều kiện của tôi là false nên tôi chỉ nhân kết quả mô-đun.

Đã sử dụng <| toán tử để cạo bỏ một dấu cách. Đã sử dụng quá tải toán tử để lưu một ký tự khác.

nguyên

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

Tôi có thể loại bỏ 46 ký tự nếu F # có một toán tử nhân chuỗi
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]
Ngắn

Thật sự cảm ơn! Tôi không biết tại sao tôi không thể tìm thấy điều đó. Tôi đã gán nó cho một biến và sử dụng nó hai lần.
gradbot

Bây giờ tôi chỉ phải trả 48 thuế char của các tên hàm .net.
gradbot

Xin chúc mừng phiên bản 8! Tôi ngạc nhiên vì bạn đã cắt tỉa nhiều như thế nào.
ChaosPandion

11

sed, 231 235 234 235 237 238 244 268 269 270 276 279 280 282 287 300 307 314 329 338 ký tự

Hoạt động với tối đa 99 phím. Đàn piano tiêu chuẩn có 52 phím màu trắng, vì vậy điều này là đủ.

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/ /_/

Ví dụ:

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

Ví dụ cuối cùng in bàn phím tiêu chuẩn, cùng với các phím đen tưởng tượng ở hai đầu.


10

PianoScript - 2 ký tự

Đó là một lớp lót:

go

Sử dụng:

PianoScript piano.ps G# 11

Đầu ra:

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

Có thể tìm thêm thông tin về ngôn ngữ PianoScript tại đây .


1
Nó có thể là 0 ký tự, phải không?
BẠN

Tôi giả sử trong PianoScript ++, bạn sẽ có thể viết chương trình bằng một ký tự nhỏ hơn.
gradbot

4
Thật tệ khi bạn không phải là người đầu tiên nghĩ ra ý tưởng này.
LiraNuna

4
-1 đối với gian lận, và thậm chí không đến với một tên mát mẻ cho ngôn ngữ;)
gnarf

1
piano có điểm số, không phải kịch bản
Jimmy

10

JavaScript - 195 ký tự

Này, gôn là một trò chơi mà bạn chỉ thi đấu với chính mình phải không? :)

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)

Giải pháp của gnarf; được chuyển sang Rhino (với một bản sửa lỗi nhỏ và thay đổi định dạng) bởi KirarinSnow; tiếp tục bị cắt bởi gnarf; lỗi được sửa bởi KirarinSnow. bộ nhớ cache k[1]của cwallenpoole

Sử dụng: $ cp input.in 0; rhino thisfile.js

Phiên bản Demo HTML nhanh: Thử nghiệm chơi gôn - ThêmreadFile=prompt;print=function(a) {document.write("<pre>"+a);}


Chà, bạn cũng cạnh tranh với đặc điểm kỹ thuật ... và tôi nghĩ rằng bạn đã thua. ;) Nó thậm chí không vượt qua các trường hợp thử nghiệm. Có vẻ như nó bắt đầu một lần.
Guffa

Bạn chỉ có 1 tham chiếu đến b. thay đổi readFile (b) thành chỉ readFile ('chuỗi con')
Ponkadoodle

@wallacoloo - cần sau, phần ở dưới cùng:s=s[b](1-q,p=s.length-3)
gnarf

6

Python3 - 158

Tiết kiệm inputvs raw_input. Mất ()choprint

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 ký tự quan trọng

Tất cả trên một dòng:

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"

Đã mở rộng:

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, vui lòng yêu cầu nhóm thực hiện getshoặc tương đương, chúng tôi sẽ lưu 22 ký tự!
Benjol

Tôi thấy rằng khi chơi gôn đệ quy là một cách tốt để loại bỏ các chú thích kiểu.
gradbot

3

SETL

165 ký tự; Bản dịch giải pháp Python của gribblers.

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 (mẫu): 331 370 400 + 17 ký tự

(dựa trên giải pháp Ruby.)

Nén:

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

Giải thích:

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

Vì chúng ta không thể chuyển các tham số từ dmdđầu vào phải được thực hiện trong mã. Chỉ hỗ trợ tối đa 99 phím.


2
Bạn có thể đặt đầu vào là một chuỗi đơn không? Một phần của thử thách là phân tích cú pháp dòng thành một nốt, một sắc độ tùy chọn và một thời lượng. Bản thân việc phân tích cú pháp có thể mất khá nhiều ký tự trong một số ngôn ngữ ...
KirarinSnow

2

Haskell: 212 211 208 ký tự

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

Nó vẫn giả định các chữ cái tương thích ascii (cụ thể là chuỗi "@ABCDEFG"), nhưng không còn yêu cầu Char.ord


2

Ruby - 113 ký tự

Chạy với các đối số dòng lệnh

$ 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ý tự

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 ký tự

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

Sẽ phải được cải thiện.

Đầu vào phải được phân phối trong hằng số PIANO.


1

F # 414 386 372 ký tự quan trọng:

//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)

Ồ, và một điểm cộng nữa, tập lệnh này sẽ thực sự xử lý "F # 372" một cách chính xác - tôi sẽ không làm phiền bạn bằng cách dán nó vào đây ...

System.Console.ReadLine () là một lỗi ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.