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


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.