妖精チェスの「跳躍」運動パターン


14

リーパはで動く変則チェスピースのカテゴリである「ジャンプ。」通常の騎士は(1,2)-リーパーです。つまり、各移動には、直交方向に1正方形、垂直方向に2正方形の距離を移動する必要があります。

.o.o.
o...o
..N..
o...o
.o.o.

多くの異なる跳躍者がいます。(1,3)-リーパーはロングナイト、またはキャメルと呼ばれます。その移動パターンは次のようになります。

..o.o..
.......
o.....o
...L...
o.....o
.......
..o.o..

(2,2)Alfilもあります...

o...o
.....
..A..
.....
o...o

...さらに(0,1)ワジール。

.o.
oWo
.o.

チャレンジ

数値のペアを入力として、対応する運動図を出力します。入力をSTDIN /コマンドライン経由で、または引数として提供し、出力をSTDOUTまたは戻り値で提供して、プログラムまたは関数を作成できます。これはcode-golfです。

入力

入力は、2つの整数と大文字のコンマ区切りリストになります。2つの整数は、範囲内0-7(両端を含む)で、減少しない順序になります。入力および出力のオプションの末尾の改行。

上記の4つの例の入力を次に示します。

1,2,N
1,3,L
2,2,A
0,1,W

出力

出力は、正方形の複数行の文字列になります。大文字は、作品の現在の場所を表すために中央に配置されます。移動場所は、4個または8個の小文字で表されますo。正方形内の他のすべてのスペースはピリオドで埋められます。

移動パターンがの場合、0,0大文字のみを出力します。

ヒントとして、2番目の整数(大きい方)の値がNの場合、正方形の辺の長さは常に2N + 1になります。osが常に広場の周囲になります。

追加のテストケース

1,1,F

o.o
.F.
o.o

5,7,Q

..o.........o..
...............
o.............o
...............
...............
...............
...............
.......Q.......
...............
...............
...............
...............
o.............o
...............
..o.........o..


0,0,J

J

ラクダのテストケースの文字が「L」なのはなぜですか?関係ないことはわかっていますが、「C」に変更すると役立つ場合があります。
Rɪᴋᴇʀ

1
@RikerW私の選択は完全にarbitrary意的ではなかった、それはその「標準化された」手紙だ。
PhiNotPi

1
はい。それは理にかなっている。
Rɪᴋᴇʀ

1
関数の場合、3つの引数は大丈夫ですか、それとも単一の文字列引数をコンマで区切って欲しいですか?
edc65

回答:


2

ルビー、107

->a,b,n{(-b..b).map{|i|s='..'*b+?.
i%b==0&&(i==0?s[b]=n :s[b+a]=s[b-a]=?o)
i.abs==a&&s[0]=s[-1]=?o
puts s}}

テストプログラムでゴルフをしていない

f=->a,b,n{
  (-b..b).map{|i|                           #iterate from -i to i (lines of grit)
    s='..'*b+?.                             #make a string of 2n+1 .'s
    i%b==0&&(i==0?s[b]=n :s[b+a]=s[b-a]=?o) #if i%b=0 plot the centre character (if i=0) or the o's on the top and bottom rows
    i.abs==a&&s[0]=s[-1]=?o                 #if i.abs=a plot the o's in left and right columns
    puts s                                  #having substituted the .'s with o and centre as necessary, output the current line
  }
}

a=gets.to_i
b=gets.to_i
n=gets.chop
f[a,b,n]

1

Pyth、40バイト

JASv<2zFZK+rH_1SHFY,LZKp?qJSY\o?sY\.ez)k

Pythを学んでいます!試してみてください

説明

J             J =
 A                (G, H) =
  S                        sorted(
   v<2z                           eval(input[:-2]))

FZK+rH_1SH    for Z in K = [H, H-1, ..., 0] + [1, 2, ..., H]:
  FY,LZK          for Y in [(Z, k) for k in K]:
    p                 print the following value without newline:
     ?qJSY\o              if J = sorted(Y): 'o'
       ?sY\.              if sum(Y) != 0:   '.'
         ez               else:             input[-1]
  )               end for
k                 print newline

1

JavaScript(ES6)、163 161 145バイト

(x,y,c,m=a=>`\n`+a.slice(1).reverse().join``+a.join``,a=Array(y+1).fill`.`,q=a.map(_=>[...a]))=>m(q.map(m,q[x][y]=q[y][x]='o',q[0][0]=c)).slice(2)

\nリテラルの改行文字はどこですか。右下の象限を生成し、両方の軸に沿ってミラーリングすることにより機能します。

編集:@ edc65のおかげで2バイト保存されました。

(19バイト短くなる配列結果を許可する重複した質問でここに行きましたが、8バイトを無駄にする非減少順序を保証しませんでした。)


角かっこなしのテンプレート文字列とfillリテラルの改行を使用して3バイトを保存できます
-edc65

@ edc65文字通りの改行に合わせて調整しようとしましたが(そうするといつも「文字通りの改行\n文字はどこですか」と書きます)、他のヒントに感謝します。
ニール

0

JavaScriptの(ES6)144 150

(a,b,c,g=Array(b-~b).fill`.`)=>(g=g.map(x=>[...g])).map(x=>x.join``,[b-a,b+a].map(t=>g[t][0]=g[0][t]=g[t][2*b]=g[2*b][t]='o'),g[b][b]=c).join`
`

少ないゴルフ

(a,b,c)=> {
  var g=Array(b*2+1).fill('.');
  g=g.map(x=>[...g]);
  var q=(t)=>
    g[t][0] =
    g[0][t] =
    g[t][2*b] =
    g[2*b][t] = 'o';
  q(b+a);
  q(b-a);
  g[b][b] = c;
  return g.map(x=> x.join('')).join('\n')
}

テスト

f=(a,b,c,g=Array(b-~b).fill`.`)=>(g=g.map(x=>[...g])).map(x=>x.join``,[b-a,b+a].map(t=>g[t][0]=g[0][t]=g[t][2*b]=g[2*b][t]='o'),g[b][b]=c).join`
`

console.log=x=>O.textContent+=x+'\n'

t=`1,2,N
1,3,L
2,2,A
0,1,W
1,1,F
5,7,Q`.split`\n`
.forEach(t=>([x,y,z]=t.split`,`, console.log(t+'\n'+f(+x,+y,z)+'\n')))
<pre id=O></pre>

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