コードゴルフ:ピアノ


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 2010

7
次のコードゴルフ:これらのピアノのMIDIインターフェイスを実装します。
Mehrdad Afshari、2010

10
親愛なるクローザー、3日後にこのチャレンジをなんとか成し遂げたことを感謝します。5分後に再開しました。それだけで何かがわかるはずです。コミュニティは、この種の質問が好きかどうかに関わらず、好きで受け入れます。そうでない場合は、無視されるタグのリストにcode-golfを追加してください。
LiraNuna

回答:


27

GolfScript-80文字

スクロールバーなしで#SOの1行に収まります:)

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

GolfScript-81文字

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

うまくフォーマットされたバージョン(27 x 3)

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

GolfScript-82文字

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

GolfScript-85文字

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

うまくフォーマットされたバージョン(17 x 5)

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

GolfScript-94文字

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

GolfScript-98文字

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

GolfScript-101文字

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

GolfScript-109文字

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

GolfScript-120文字

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

GolfScript-127文字

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

$ echo -n C 14 | ruby golfscript.rb piano.gs 
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|   ###  ###   |   ###  ###  ###   |   ###  ###   |   ###  ###  ###   |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|____|____|____|____|____|____|____|
$ echo -n D# 1| ruby golfscript.rb piano.gs 
###   |
###   |
###   |
###   |
###   |
 |    |
 |    |
 |    |
_|____|
$ echo -n A 7| ruby golfscript.rb piano.gs 
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
##  ###   |   ###  ###   |   ###  ##
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|    |    |    |    |    |    |    |
|____|____|____|____|____|____|____|

私は別のチャレンジ(stackoverflow.com/questions/2104556/…)のために最初のGolfscriptエントリを送信しようとしていましたが、クローズされました:-(
mob

2
彼らが学校でゴルフスクリプトを教えてくれたらいいのに。返金してほしい。
スティーブTjoa

6
いいね。解決策は後でPianoScriptに投稿します。わずか6文字です。:-)
molf 2010

112

Perl、133(129)文字

Perl、167 160 156 147 142 133でしょ!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 * pop)。$ /)x9

これは129文字のソリューションで、molfのRubyソリューションからいくつかのアイデアを借りています。

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

Acme :: AsciiArtinatorの助けを借りて:

                sub init_piano{$S=$";$H='#';
                (                            $
               T                              ,$P,$U)=qw(
              T                                          |
             _                                            |
            /                                              )
           ;                                                $
          d             =$T.$H.$S.$S;$t                     =
         $             d               .                   $H
        .              $               d                  . $
       S               .$P.$S.$S.$S.$H;$                t=  $
      d.$H.$t.$t;};$_=shift;-/-/;&init_piano();$Z=/#/;-/|   |
      |                                                 |   |
      |                    YAMAHA                       |  /
      ;die grep{4>$n++?y/T/#/:y/#T/ |/;$n-8||y/ /_/;}@q=(m{
     // // /// // /// // /// // /// // /// // /// // /// /   
    // // /// // /// // /// // /// // /// // /// // /// /
   }                                                   .
   substr(${t}x(9),4*${Z}+(7&ord)*5,1+$Z+5*pop).$/)x(8)
          ;   '                            \   /
           | |                              | |
           /_\                              /';

7
ははは、すごい。スタインウェイ、ヤマハ、ヤングチャンですか?
スティーブTjoa

2
これをブックマークして、「猿」の冗談を知らない人に表示します。
Mehrdad Afshari、2010

3
@Steve-ヤマハにしましょう
mob

6
@mobrule、あなたはgrepが嫌いですか?どうして死にたいの?:(
LiraNuna

Golfscript * 1.3は105になります:)
John La Rooy、2010

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

(2番目の改行は不要で、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 2010

a、n = gets.split; ...同じ仕事をします、-3文字
hurikhan77

1
「gets.split」を「$ *」に置き換えて、コマンドラインに-8文字で入力することもできます
hurikhan77

2文字に変更i%7%4<1||t>4?"_|___":"###__"i%7%4&&t<5?"###__":"_|___"て保存します。私はその%7%4イディオムが大好きです
mob

1
だから私たちは最短の解決策に取り掛かっていますね ルビー・ルーズ!:-D
hurikhan77

29

LilyPond、285 288 291 310 315 330 333 340 350文字

音楽のテーマに沿って、譜面組版用に設計された言語LilyPondのソリューションを以下に示します。

x=#ly:string-substitute
u=#(x"*""###  ""|   *** |   ** ")t=#(x"###"" | "u)q=#read-char
z=#(q)v=#(if(eq?(q)#\#)1 0)y=#(iota(+(*(read)5)1 v))#(format #t"~{~{~a~}
~}"(map(lambda(s)(map(lambda(i)(string-ref s(modulo(+(*(char->integer z)5)i(* v
4))35)))y))(list u u u u u t t t(x" ""_"t))))

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


4
これはおそらく、LilyPondがコードゴルフで使用されているのを目にした最初で唯一の機会です。
cobbal 2010


26

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

読みやすくするために複数行で示していますが、1行にする必要があります。

1K$="##   |   ###  #":K$="##  #"+K$+K$:
 FORI=1TO21:F$=F$+"|____":L$=L$+"|    ":NEXT:
 INPUTN$:S=MID$(N$,2,1)="#":O=(ASC(N$)-65)*5+1+S*4:L=VAL(RIGHT$(N$,2))*5+1+S:
 FORI=1TO5:?MID$(K$+K$+K$,O,L):NEXT:FORI=1TO3:?MID$(L$,O,L):NEXT:?MID$(F$,O,L)

このApplesoft BASICインタープリターでテストできますをJavascriptまたはエミュレータます

ピアノhttp://img685.imageshack.us/img685/3407/piano2.png


仕様に従って、両方の引数を同じ行で読み取ることはできますか?
KirarinSnow

18

C#-315

私はC#でゴルフを続けていますが、それほど簡潔な言語ではありません...

using C=System.Console;class P{static void L(int o,int c,string s){while(c-->0)C.Write(s[(420>>o++%5*2&3)+(91>>(o+2)/5%7&1)*3]);C.WriteLine();}static void Main(string[]a){int i=0,s=a[0].Length-1,c=int.Parse(a[1])*5+1+s,o=(a[0][0]-65+s)*5-s;while(i++<5)L(o,c,"|  ## ");while(i++<8)L(o,c,"|  |  ");L(o,c,"|__|__");}}

23
次に、F#ソリューションでメロディを完成させます。
LiraNuna

13
ユーモアは+1、コーニーユーモアは-1、C#とF#は一致しているので+1。
スティーブTjoa

実行しようとすると、System.IndexOutOfRangeExceptionが発生しました。
Fitzchak Yitzchaki 2010

@メンディ:コマンドライン引数を実行するときに指定する必要があります。Visual Studioから実行する場合は、プロジェクトのプロパティを開き、[デバッグ]タブに移動して、[開始オプション]でコマンドライン引数を入力できます。コードをexeにコンパイルした場合は、プログラム名の後に引数を指定して、コンソールウィンドウから実行します。
Guffa

1
->演算子の非常に優れた使用法。
ケビン

16

パイソン-164

k,n=raw_input().split()
m=k[1:]>""
n=int(n)*5+1
o=(ord(k[0])-65)*5+4*m
for x in["##  ###   |   ### "]*5+[n*"|    "]*3+[n*"|____"]:print((x+x[::-1][:-1])*n)[o:o+n+m]

あなたは、の繰り返しの部分を除去することにより、一部の文字を保存できませんでしたtし、u及び7を乗じ?
Matthew Crumley、2010

@Matthew Crumley、私のソリューションからお気軽に借りてください:)
John La Rooy

@gnibbler、私は本当はpythonプログラマではないので(私はそれをいじくり回しましたが、広範囲ではありません)、私はそれで多くのことができるとは思えません。私はあなたの元の解決策を見るまで、Pythonがそのような文字列を乗算できることさえ知りませんでした。
Matthew Crumley

@gnibbler-素晴らしい解決策、それを実行したいが、SyntaxErrorが発生する。C14トレースバック(最後の最新の呼び出し):ファイル "piano.py"、1行目?k、n = input()。split()ファイル "<string>"、1行目C 14 ^
AJ。

@AJ、そのエラーはPython3ソリューションによるもののようです。なぜそれが得られるのかわからない
John La Rooy、2010

15

オクターブ、153 154 155 158 159 162 172 180 186 185 188 197 199 200 206 207 209 212 214 215 219 240 244 268文字

完全なオクターブでプログラミングできるのに、なぜCまたはC#またはF#(またはBまたはD)だけを使用するのですか?

(明確にするために60文字ごとに折り返しています)

x=5*scanf("%2c%d");for k=-8:0disp((s={[t="|   ###  ###  ","#
##   ",t" "]"|    ","|____"}{(k>-4)+!k+1})(1+mod(5*(y=x(2)>1
60)+(-y:x(3))+x(1),rows(s'))))end

はい...このソリューションは、実際には文字列の複素共役転置を計算します。

使用法: $ octave -q thisfile.m <input.in >output.out


13

C — 197 203 207 216 224 232 240 キャラクター

#define S"#   |   ###  ###  ##"
main(i,j,l,h,t){char*X[]={"____|","    |",S S,S S},s[i=11];for(scanf("%s%n%d",s,&h,&l);--i>1;puts(""))for(j=t=*s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}

この同等の194文字バージョンは、バッファオーバーフローが問題ないと想定しています。

#define S"#   |   ###  ###  ##"
i=11;main(j,l,h,t){char*X[]={"____|","    |",S S,S S},s;for(scanf("%s%n%d",&s,&h,&l);--i>1;puts(""))for(j=t=s%7*5+h*4;j<t+l*5+h;putchar(X[i/3][j++%(i>5?35:5)]));}

1
for(j=0; j<=l*5+h; j++)< -無用のスペース、そしてあなたも文字数にそれらが含まれているように見える
ニコラス

12

PostScript:239 245 293 312(通常); 219 224 225 231(ASCII85)

/r{(%stdin)(r)file token pop}def[(]){mul add}/z r(:-)cvs dup length 1
sub/v exch/p r/s(|   ###  ###  ###   |   ###  ###   )([){0 1 v p 5]{s
exch z 0 get 5]v 4]s length mod 1 getinterval print}for/
=}>>begin[[[[[/s(|    )def[[[/s(|____)def[

バイナリバージョンは、ASCII85エンコーディングを介して、ASCII印刷可能文字のみを含む219文字のプログラムに拡張されました。

/(|____)/(|    )[/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
これらのコンテストで、あまり伝統的でない言語を見るのが大好きです。
mob

12

F番号:224 225、226、248、252、270、276、299、306行の文字数

let x,(/)=System.Console.ReadLine(),String.replicate
let t,p=(int x.[0]-60)%7*5,int x.[1]%2
let g s i=printf"%s"(i/((99/s).[t+4*p..t+int x.[2..]*5+5*p]+"\n"))
g"|   ###  ###   |   ###  ###  ###   "5 
g"|    "3
g"|____"1

2のモジュールを使用して、スペースまたはポンドを検出しました。''は32%2 = 0です。 '#'は35%2 = 1であり、条件がfalseに対してゼロを返したため、モジュールの結果を乗算しました。

<|を使用 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

F#に文字列乗算演算子がある場合、46文字を削ることができる
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]
2010

素晴らしいです、ありがとう!なぜそれが見つからなかったのか分かりません。変数に割り当てて、2回使用しました。
gradbot

今、私は48文字の.net関数名の税金を払っています。
gradbot、

バージョン8おめでとうございます!あなたがどれだけ切り捨てたかに私は驚いています。
ChaosPandion、2010

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文字でもいいですよね?
2010

PianoScript ++では、プログラムを1文字少なく書くことができると思います。
gradbot

4
あなたがこのアイデアを思いついたのはあなたが最初ではありません。
LiraNuna 2010

4
不正行為の場合は-1、言語のクールな名前を
思い付く

1
ピアノには脚本ではなくスコアがあります
Jimmy

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によるソリューション。KirarinSnowによるRhinoへの移植(マイナーな修正とフォーマットの変更を含む)。さらにgnarfによって削られました。KirarinSnowによるエラー修正。k[1]cwallenpooleによるキャッシュ

使用法: $ cp input.in 0; rhino thisfile.js

クイックHTMLデモバージョン: ゴルフテスト -追加readFile=prompt;print=function(a) {document.write("<pre>"+a);}


ええと、あなたも仕様に反しています...そしてあなたは負けたと思います。;)テストケースにも合格しません。一発始まるようです。
Guffa

bへの参照は1つだけです。readFile(b)をreadFile( 'substring')に変更します
Ponkadoodle

@wallacoloo-後で必要になります、下部の部分:s=s[b](1-q,p=s.length-3)
gnarf

6

Python3-158

エクスペディアinputraw_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文字

すべて1行で:

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 文字節約できます!
Benjol

ゴルフの再帰は、型注釈を削除するための良い方法であることがわかりました。
Gradbot、

3

SETL

165文字。グリブラPythonソリューションの翻訳。

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

3

D2(テンプレート):331 370 400 + 17文字

(Rubyソリューションに基づく。)

圧縮:

template J(alias T,int b,int e,r...){static if(e)enum J=T!(b,r)~J!(T,b+1,e-1,r);else enum J="";}template K(int i,int t){enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";}template R(int t,int s,int l,int h){enum R=J!(K,s-h,l,t)[h..$-3]~"\n";}template M(alias k){enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);}

説明:

/**
    Macros:
        D = <tt>$0</tt>
 */
 ;

/**
    $(D_PSYMBOL J) (short for "join") will evaluate $(D T!(i,r)) for
    $(D_PARAM i) in $(D [b..b+e]). Then, these compile-time strings will be
    concatenated.
 */
template J(alias T,int b,int e,r...){
    static if(e)
        enum J=T!(b,r)~J!(T,b+1,e-1,r);
    else
        enum J="";
}

/**
    $(D_PSYMBOL K) (short for "key") will generate 5 characters as a row of
    key $(D_PARAM i) at row $(D_PARAM t).
 */
template K(int i,int t){
    enum K=t>7?"_|___":t<5&&3&i%7?"###  ":" |   ";
}

/**
    $(D_PSYMBOL R) (short for "row") will generate the keyboard at row
    $(D_PARAM t), from key $(D_PARAM s) and sharpness $(D_PARAM h) with a
    length of $(D_PARAM l) keys.
 */
template R(int t,int s,int l,int h){
    enum R=J!(K,s-h,l,t)[h..$-3]~"\n";
}

/**
    $(D_PSYMBOL M) (short for "main") results in the whole keyboard as a string.

    Example:
    -----
    pragma(msg,M!("C 14"));
    pragma(msg,M!("D# 1"));
    pragma(msg,M!("A 7"));
    -----
 */
template M(alias k){
    enum M=J!(R,0,9,k[0]+1,k[$-2]>32?k[$-1]+10*k[$-2]-527:k[$-1]-47,k[0]&1);
}

dmd入力からパラメーターを渡すことができないため、コードで行う必要があります。最大99個のキーのみをサポートします。


2
入力を単一の文字列にできますか?課題の一部は、ラインをノート、オプションのシャープ、デュレーションに解析することです。一部の言語では、構文解析自体にかなりの数の文字が必要になる場合があります...
KirarinSnow

2

Haskell:212 211 208文字

a="  |  "
b=" ### "
d=concat.cycle
e=d[b,b,a,b,b,a,b]
f=d[a]
t x s m n=map(take(5*read s+m).drop(5*length['@'..x]-n))[e,e,e,e,e,f,f,f,d["__|__"]]
u(x:'#':s)=t x s 2 4 
u(x:s)=t x s 1 8
main=interact$unlines.u

ASCII互換の文字(具体的には、シーケンス "@ABCDEFG")を想定していますが、Char.ordは不要になりました。


2

ルビー-113文字

コマンドライン引数で実行します

$ ruby piano.rb A 7

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=k[0]*5-2+4*s=k.size)[j,c.to_i*5+s]}

ルビー-118文字

k,c=$*
9.times{|x|puts (((b=x<8?'  |  ':'__|__')+(a=x<5?' ### ':b)*3+b+a*2)*j=2+k[0]*5+4*s=k.size-1)[j..c.to_i*5+s+j]}

2

PHP-208文字

<?$e=45*substr($a=PIANO,2+$d=!($a[1]^~ì))+9+$d*45;$j=9*$c=4*$d;for($b=ord($a[0])-65,--$c;$j<$e;$f[$i=$j++%9].=($c=($c+!$i)%5)%4<2&$i>3&$b%3!=2?Ü:($c?$i?ß: :))$j%45-36?:$b=++$b%7;for(;$a=$f[$i--];)echo~$a,~õ;

改善する必要があります。

入力は、PIANOという名前の定数で配信する必要があります。


1

F#414 386 372の重要な文字:

//wins me 2 characters
open System

//String.replicate, didn't know this existed before reading Juliet
let r=String.replicate  

//print s n times, each time on a newline
let P n s=printf"%s"(r n (s+"\n"))  

//define top rows
let t="##  ###   |   ###  ###   |   ###  #" 

//middle and bottom rows can be defined using 'r'
let m,b=r 7"|    ",r 7"|____" 

//pick of chars from O to n+O from string, wrap round if we go beyond s.Length
let L(s:string)O n=String([|5*O..5*(n+O)|]|>Array.map(fun i->s.[i%35]))

//match input string into two halves
let[|k;n|]=Console.ReadLine().Split([|' '|])

//work out start pos and length (in chars, not keys)
let O,N=
 let K=int k.[0]-65                    //'A'=65, this is why t starts at A
 if k.[0]='#'then(K+3,int n+2)else(K,int n) 

//Print 5 top rows, 3 middle rows and the bottom row
P 5(L t O N)
P 3(L m O N)
P 1(L b O N)

ああ、そして1つのボーナスとして、このスクリプトは実際には "F#372"を正しく処理します-ここに貼り付けても気になりません...

System.Console.ReadLine()はそのような厄介です...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.