รหัสกอล์ฟ: เปียโน


88

ความท้าทาย

รหัสที่สั้นที่สุดตามจำนวนอักขระเพื่อส่งออกส่วนหนึ่งของแป้นพิมพ์เปียโนโดยเริ่มจากบันทึกการป้อนข้อมูลตามความยาวที่กำหนด

ข้อมูลที่ป้อนจะประกอบด้วยโน้ต ( [ACDFG]#|[A-G]) เพื่อเริ่มพิมพ์แป้นพิมพ์และตัวเลขบวกแทนความยาวของแป้นที่จะพิมพ์รวมทั้งโน้ตตัวแรก

ควรพิมพ์คีย์แรกแบบเต็ม - หากมีคีย์ซ้ายคมจะถูกตัดเช่นเดียวกับเมื่อคีย์เริ่มต้นคมคีย์ซ้ายจะถูกตัดเช่นกัน

ไม่นับคีย์ชาร์ปเฉพาะปุ่มสีขาว

กรณีทดสอบ

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
Next code golf: ใช้อินเทอร์เฟซ MIDI สำหรับเปียโนเหล่านี้
— mmx

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

ฉันกำลังจะส่งรายการ Golfscript ครั้งแรกของฉันสำหรับการท้าทายอื่น ( stackoverflow.com/questions/2104556/… ) แต่มันปิด :-(
— ม็อบ

2
ฉันหวังว่าพวกเขาจะสอน Golfscript ในโรงเรียน ฉันต้องการเงินคืน
— Steve Tjoa

6
ดี. ฉันจะโพสต์วิธีแก้ปัญหาของฉันใน PianoScript ในภายหลัง มันมีแค่ 6 ตัว :-)
— molf

112

Perl, 133 (129) ตัวอักษร

Perl, 167 160 156 147 142 133 D'โอ้! 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 * ป๊อป) $ /) x9

นี่คือวิธีแก้ปัญหา 129 ถ่านโดยยืมแนวคิดหลายอย่างจากโซลูชัน Ruby ของ molf:

    ($ _, $ c) = @ ARGV; $ j = ($ k = / # /) + ord;
    สำหรับ $ n (0..8) {พิมพ์ $ /, substr + (join '', แมป {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
ฉันจะบุ๊กมาร์กเพื่อแสดงให้คนที่ไม่เข้าใจเรื่อง "ลิง"
— mmx

3
@ สตีฟ - มาเป็น Yamaha กันเถอะ
— ม็อบ

6
@mobrule คุณเกลียด grep หรือไม่? ทำไมถึงอยากให้มันตาย :(
— LiraNuna

Golfscript * 1.3 จะเป็น 105 :)
— John La Rooy

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

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
เรามาหาทางแก้ปัญหาที่สั้นที่สุดใช่มั้ย? รูบี้ rulez! :-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 พื้นฐาน: 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 พื้นฐานล่ามใน 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 เมื่อพยายามเรียกใช้
— Fitzchak Yitzchaki

@Mendy: คุณต้องจัดหาอาร์กิวเมนต์บรรทัดคำสั่งเมื่อคุณเรียกใช้ ถ้าคุณเรียกใช้จาก Visual Studio ให้เปิดคุณสมบัติสำหรับโครงการไปที่แท็บดีบักและภายใต้ตัวเลือกเริ่มคุณสามารถป้อนอาร์กิวเมนต์บรรทัดคำสั่งได้ หากคุณได้รวบรวมโค้ดลงใน exe เพียงแค่เรียกใช้จากหน้าต่างคอนโซลที่มีอาร์กิวเมนต์หลังชื่อโปรแกรม
— Guffa

1
ใช้ตัวดำเนินการ -> ได้ดีมาก
— 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]

ไม่สามารถที่คุณจะบันทึกตัวอักษรบางตัวโดยการเอาส่วนที่ซ้ำtและuและคูณด้วย 7?
— Matthew Crumley

@Matthew Crumley อย่าลังเลที่จะยืมจากโซลูชันของฉัน :)
— John La Rooy

@gnibbler ฉันไม่ใช่โปรแกรมเมอร์ python จริงๆ (เคยเล่นกับมันบ้าง แต่ไม่ครอบคลุมมากนัก) ดังนั้นฉันสงสัยว่าฉันจะทำอะไรกับมันได้มาก ฉันไม่รู้ด้วยซ้ำว่า python สามารถคูณสตริงแบบนั้นได้จนกว่าฉันจะเห็นโซลูชันดั้งเดิมของคุณ
— Matthew Crumley

@gnibbler - ทางออกที่ดีชอบที่จะรัน แต่ได้รับ SyntaxError .... C 14 Traceback (โทรล่าสุดล่าสุด): ไฟล์ "piano.py" บรรทัด 1 ใน? k, n = input (). split () ไฟล์ "<string>", บรรทัด 1 C 14 ^
— AJ.

@AJ ดูเหมือนว่าข้อผิดพลาดนั้นมาจากโซลูชัน Python3 ไม่แน่ใจว่าทำไมคุณถึงได้รับสิ่งนั้น
— John La Rooy

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) ในเมื่อคุณสามารถเขียนโปรแกรมด้วย Octave แบบเต็มได้?

(ห่อทุกๆ 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++)<- ช่องว่างที่ไร้ประโยชน์และดูเหมือนว่าคุณจะรวมไว้ในจำนวนอักขระด้วย
— Nicolás

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

ฉันใช้โมดูล 2 เพื่อตรวจจับช่องว่างหรือปอนด์ '' คือ 32% 2 = 0 '#' คือ 35% 2 = 1 และเนื่องจากค่าศูนย์ส่งคืนตามเงื่อนไขของฉันเป็นเท็จฉันจึงคูณผลลัพธ์ของโมดูล

ใช้ปุ่ม <| ตัวดำเนินการเพื่อกำจัดถ่านพื้นที่หนึ่งตัว ใช้ตัวดำเนินการมากเกินไปเพื่อบันทึกถ่านอื่น

ต้นฉบับ

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
เสียดายที่คุณไม่ใช่คนแรกที่คิดไอเดียนี้
— นูน่า

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) เป็นแค่ 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 ตัวอักษร!
— เบญจพล

ฉันพบว่าเมื่อเล่นกอล์ฟซ้ำเป็นวิธีที่ดีในการลบคำอธิบายประกอบประเภท
— gradbot

3

SETL

165 ตัวอักษร; คำแปลของ gribblers Python solution

get(l);[k,n]:=split(l);o:=(abs k(1)-65)*5;n:=1+5*val n;(for x in['##  ###   |   ### ']*5+[n*'|    ']*3+[n*'|____'])print(((x+reverse x(2..))*n)(o+4*#k-3..o+n));end;

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 () ช่างเป็นคนเกียจคร้าน ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.