童话棋“游刃有余”的运动模式


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)Wazir。

.o.
oWo
.o.

挑战

给定一对数字作为输入,输出相应的运动图。您可以编写程序或函数,其输入通过STDIN /命令行提供或作为参数,而输出通过STDOUT或返回值提供。这是代码高尔夫球

输入值

输入将是两个整数和一个大写字母的逗号分隔列表。这两个整数将在范围内0-7(包括端值)并且以非降序排列。输入和输出的尾随换行符是可选的。

以下是上述四个示例的输入:

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

输出量

输出将是一个方形的多行字符串。大写字母将放置在中间,以表示作品的当前位置。移动位置将以4或8个小写字母表示o s表示。广场上的所有其他空间都将填充句点。

如果移动方式为0,0,则仅输出大写字母。

提示一下,如果第二个整数(较大的整数)的值为N,则该正方形将始终具有边长2N + 1。该o旨意永远是正方形的周长。

其他测试用例

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我的选择并不完全是任意的,那是它的“标准化”字母。
PhiNotPi

1
好的。那讲得通。
Rɪᴋᴇʀ

1
对于一个函数,可以使用3个参数,还是要用逗号分隔单个字符串参数?
edc65 '16

Answers:


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个字节。)


您可以使用模板字符串没有括号内为保存3个字节fill和换行
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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.