Kode Golf: Piano


88

Tantangan

Kode terpendek menurut jumlah karakter untuk mengeluarkan bagian dari keyboard piano mulai dari nada masukan dalam panjang tertentu.

Input akan terdiri dari not ( [ACDFG]#|[A-G]) untuk mulai mencetak keyboard dan angka positif mewakili panjang tombol untuk dicetak termasuk not pertama.

Kunci pertama harus dicetak penuh - jika memiliki kunci tajam kiri maka akan dipotong, begitu juga ketika kunci start tajam, kunci kiri akan dipotong juga.

Tombol Sharp tidak dihitung, hanya tombol putih.

Kasus uji

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

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

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

Hitungan kode termasuk input / output (yaitu program penuh).


5
[A-G]#*? Apakah ini berarti kita perlu menangani, katakanlah, B#####sebagai E?
Anon.

5
Untuk hitungan kunci, tentukan "kunci". Mengapa contoh "C 14" mencetak 24 kunci?
Guffa

53
Oke, sekarang kita mendapat solusi C dan C #, kita membutuhkan B, D dan F #.
LiraNuna

7
Kode golf berikutnya: Terapkan antarmuka MIDI untuk piano ini.
Mehrdad Afshari

10
Penutup yang terhormat, saya salut kepada Anda karena telah berhasil menutup tantangan ini setelah 3 hari. Kami mendapatkannya kembali dalam 5 menit. Itu saja seharusnya memberi tahu Anda sesuatu - komunitas menyukai dan menerima pertanyaan semacam ini, suka atau tidak. Namun, jika tidak, tambahkan kode-golf ke daftar tag yang diabaikan.
LiraNuna

Jawaban:


27

GolfScript - 80 Karakter

Muat dalam satu baris #SO tanpa bilah gulir :)

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

GolfScript - 81 Karakter

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

Versi yang diformat dengan baik (27 x 3)

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

GolfScript - 82 Karakter

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

GolfScript - 85 Karakter

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

Versi yang diformat dengan baik (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 Karakter

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

GolfScript - 98 Karakter

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

GolfScript - 101 Karakter

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

GolfScript - 109 Karakter

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

GolfScript - 120 Karakter

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

GolfScript - 127 Karakter

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

Saya akan mengirimkan entri golfscript pertama saya untuk tantangan lain ( stackoverflow.com/questions/2104556/… ), tetapi ditutup :-(
mafia

2
Saya berharap mereka mengajar golfscript di sekolah. Aku ingin uangku kembali.
Steve Tjoa

6
Bagus. Saya akan memposting solusi saya di PianoScript nanti. Ini hanya 6 karakter. :-)
molf

112

Perl, 133 (129) karakter

Perl, 167 160 156 147 142 133 D'oh! 147 144 137 134 133 chars

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

Berikut adalah solusi 129 karakter, meminjam beberapa ide dari solusi Ruby molf:

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

dan dengan bantuan dari 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, luar biasa. Apakah itu Steinway, Yamaha, Young Chang?
Steve Tjoa

2
Saya akan menandai ini untuk ditunjukkan kepada orang-orang yang tidak mengerti lelucon "monyet".
Mehrdad Afshari

3
@ Steve - Mari kita jadikan Yamaha
mafia

6
@mobrule, apakah kamu benci grep? kenapa kamu menginginkannya mati? :(
LiraNuna

Golfscript * 1.3 akan menjadi 105 :)
John La Rooy

34

Ruby - 125 karakter

146 144 140 137 134 126 125 chars

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

(Baris baru kedua tidak diperlukan dan ditambahkan hanya untuk menghindari scrollbar pada SO. Titik koma dapat diganti dengan baris baru jika diinginkan.)

Versi Ruby 1.9 berbeda tetapi memiliki panjang yang sama (diganti a[0]oleh a.orddan "_"oleh ?_):

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

Telepon dengan

$ ruby piano.rb C 14

Hei VIM menghitung 138 karakter pada yang pertama?!?
hurikhan77

a, n = gets.split; ... melakukan pekerjaan yang sama, -3 karakter
hurikhan77

1
Anda bahkan dapat mengganti "gets.split" dengan "$ *" dan memberikan masukan pada baris perintah, -8 karakter
hurikhan77

Ubah i%7%4<1||t>4?"_|___":"###__"ke i%7%4&&t<5?"###__":"_|___"dan simpan 2 karakter. Saya suka %7%4idiom itu
mafia

1
Jadi kita sampai pada solusi terpendek, eh? Ruby rulez! :-D
hurikhan77

29

LilyPond, 285 288 291 310 315 330 333 340 350 karakter

Sesuai dengan tema musik, berikut adalah solusi dalam bahasa yang dirancang untuk penyusunan huruf partitur musik, 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))))

Pemakaian: $ lilypond thisfile.ly <input.in >output.out 2>/dev/null


4
ini mungkin yang pertama dan satu-satunya saat saya melihat LilyPond digunakan dalam golf kode.
cobbal


26

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

Ditampilkan dalam beberapa baris agar mudah dibaca, tetapi harus satu baris:

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)

Dapat diuji dengan Applesoft BASIC Interpreter ini dalam Javascript atau emulator .

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


Apakah mungkin membaca kedua argumen pada baris yang sama, menurut spesifikasinya?
KirarinSnow

18

C # - 315

Saya tetap bermain golf di C # meskipun itu bukan bahasa yang sangat singkat ...

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
Sekarang untuk solusi F # untuk menyelesaikan melodi.
LiraNuna

13
+1 untuk humor, -1 untuk humor klise, dan +1 karena C # dan F # selaras.
Steve Tjoa

Saya mendapat System.IndexOutOfRangeException saat mencoba menjalankannya.
Fitzchak Yitzchaki

@Mendy: Anda harus menyediakan argumen baris perintah saat Anda menjalankannya. Jika Anda menjalankannya dari Visual Studio, buka properti untuk proyek tersebut, buka tab debug dan di bawah Opsi Mulai Anda dapat memasukkan argumen baris perintah. Jika Anda telah mengompilasi kode menjadi exe, jalankan saja dari jendela konsol dengan argumen setelah nama program.
Guffa

1
Penggunaan -> operator yang sangat bagus.
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]

Tidak bisakah Anda menyimpan beberapa karakter dengan menghapus bagian berulang dari tdan udan mengalikan dengan 7?
Matthew Crumley

@Matthew Crumley, jangan ragu untuk meminjam dari solusi saya :)
John La Rooy

@gnibbler, saya sebenarnya bukan pemrogram python (saya pernah bermain-main dengannya, tapi tidak secara ekstensif) jadi saya ragu saya bisa berbuat banyak dengannya. Saya bahkan tidak tahu python dapat menggandakan string seperti itu sampai saya melihat solusi asli Anda.
Matthew Crumley

@gnibbler - solusi bagus, ingin menjalankannya tetapi mendapatkan SyntaxError .... C 14 Traceback (panggilan terakhir terakhir): File "piano.py", line 1, in? k, n = input (). split () File "<string>", baris 1 C 14 ^
AJ.

@ AJ, sepertinya kesalahan itu berasal dari solusi Python3. Tidak yakin mengapa Anda mendapatkannya
John La Rooy

15

Oktaf, 153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268 karakter

Mengapa hanya menggunakan C atau C # atau F # (atau B atau D) saat Anda dapat memprogram dengan Oktaf penuh?

(dibungkus setiap 60 karakter untuk kejelasan)

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

Ya ... solusi ini benar-benar menghitung transpos konjugat kompleks dari sebuah string.

Pemakaian: $ octave -q thisfile.m <input.in >output.out


13

C - 197 203 207 216 224 232 240 karakter

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

Versi 194 karakter yang setara ini mengasumsikan buffer overflow baik-baik saja.

#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++)<- spasi tidak berguna, dan Anda tampaknya telah memasukkannya juga dalam hitungan karakter
Nicolás

12

PostScript: 239 245 293 312 (biasa); 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[

Versi biner diperluas melalui pengkodean ASCII85 menjadi program 219 karakter dengan hanya karakter ASCII yang dapat dicetak:

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

Pemakaian: $ gs -q -dNOPROMPT -dNODISPLAY -dBATCH thisfile.ps <input.in >output.out


10
Senang melihat bahasa yang kurang tradisional dalam kontes ini.
mafia

12

F #: 224225 , 226, 248, 252, 270, 276, 299, 306 Karakter

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

Saya menggunakan modul 2 untuk mendeteksi spasi atau pound. '' adalah 32% 2 = 0 '#' adalah 35% 2 = 1 dan karena bersyarat saya mengembalikan nol untuk salah, saya baru saja mengalikan hasil modul.

Menggunakan <| operator untuk mencukur satu karakter spasi. Overloading operator digunakan untuk menyimpan karakter lain.

asli

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

Saya bisa memangkas 46 karakter jika F # memiliki operator perkalian string
gradbot

Sedikit lebih pendek: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

Keren terima kasih! Saya tidak tahu mengapa saya tidak dapat menemukannya. Saya menugaskannya ke variabel dan menggunakannya dua kali.
gradbot

Sekarang saya hanya membayar pajak 48 karakter dari nama fungsi .net.
gradbot

Selamat atas versi 8! Saya terkejut betapa Anda telah memangkasnya.
ChaosPandion

11

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

Bekerja hingga 99 kunci. Piano standar memiliki 52 tuts putih, jadi ini sudah cukup.

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

Contoh:

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

Contoh terakhir mencetak keyboard standar, bersama dengan tombol hitam imajiner di kedua ujungnya.


10

PianoScript - 2 karakter

Ini satu baris:

go

Pemakaian:

PianoScript piano.ps G# 11

Keluaran:

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

Informasi lebih lanjut tentang bahasa PianoScript dapat ditemukan di sini .


1
Bisa 0 karakter, bukan?
ANDA

Saya berasumsi dalam PianoScript ++ Anda akan dapat menulis program dalam satu karakter yang kurang.
gradbot

4
Sayang sekali Anda bukan orang pertama yang muncul dengan ide ini.
LiraNuna

4
-1 untuk menyontek, dan bahkan tidak menemukan nama yang keren untuk bahasa tersebut;)
gnarf

1
piano memiliki skor, bukan skrip
Jimmy

10

JavaScript - 195 karakter

Hei, golf itu permainan dimana kamu hanya bertanding melawan diri sendiri kan? :)

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)

Solusi oleh gnarf; porting ke Rhino (dengan perbaikan kecil dan perubahan format) oleh KirarinSnow; selanjutnya terkelupas oleh gnarf; kesalahan dikoreksi oleh KirarinSnow. cache k[1]oleh cwallenpoole

Pemakaian: $ cp input.in 0; rhino thisfile.js

Versi Demo HTML Cepat: Tes Golf - MenambahkanreadFile=prompt;print=function(a) {document.write("<pre>"+a);}


Nah, Anda juga bersaing dengan spesifikasinya ... dan saya pikir Anda kalah. ;) Itu bahkan tidak lulus uji kasus. Tampaknya itu dimulai.
Guffa

Anda hanya memiliki 1 referensi untuk b. ubah readFile (b) menjadi hanya readFile ('substring')
Ponkadoodle

@wallacoloo - dibutuhkan nanti, bagian di bawah:s=s[b](1-q,p=s.length-3)
gnarf

6

Python3 - 158

Menghemat inputvs raw_input. Kalah ()karenaprint

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

Semua dalam satu baris:

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"

Diperluas:

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, tolong minta tim untuk mengimplementasikan getsatau setara, kami akan menghemat 22 karakter!
Benjol

Saya menemukan bahwa saat bermain golf rekursi adalah cara yang baik untuk menghapus anotasi jenis.
gradbot

3

SETL

165 karakter; Terjemahan solusi gribblers 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 (templat): 331 370 400 + 17 karakter

(berdasarkan solusi Ruby.)

Terkompresi:

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

Dijelaskan:

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

Karena kita tidak bisa melewatkan parameter dari dmdinput harus dilakukan dalam kode. Hanya mendukung hingga 99 kunci.


2
Bisakah Anda membuat input menjadi string tunggal? Bagian dari tantangannya adalah mengurai baris menjadi catatan, ketajaman opsional, dan durasi. Penguraiannya sendiri dapat mengambil beberapa karakter dalam beberapa bahasa ...
KirarinSnow

2

Haskell: 212 211 208 karakter

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

Ini masih mengasumsikan huruf yang kompatibel dengan ascii (khususnya, urutan "@ABCDEFG"), tetapi tidak lagi memerlukan Char.ord


2

Ruby - 113 karakter

Berjalan dengan argumen baris perintah

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

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 karakter

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

Harus ditingkatkan.

Input harus dikirim dalam konstanta bernama PIANO.


1

F # 414 386 372 karakter yang signifikan:

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

Oh, dan satu bonus, skrip ini sebenarnya akan menangani "F # 372" dengan benar - Saya tidak akan mengganggu Anda dengan menempelkannya di sini ...

System.Console.ReadLine () sangat mengecewakan ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.