Fairy cờ vua cờ hoa hồng phong trào


14

Một người chơi cờ là một thể loại của quân cờ cổ tích di chuyển bằng cách "nhảy". Một hiệp sĩ bình thường là một (1,2) -leaper, nghĩa là mỗi lần di chuyển liên quan đến việc di chuyển một khoảng cách 1 hình vuông theo hướng trực giao và 2 hình vuông theo hướng vuông góc.

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

Có nhiều bước nhảy vọt khác nhau. Giá rẻ hơn (1,3) được gọi là Long Knight, hay Lạc đà. Mô hình di chuyển của nó trông như thế này:

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

Ngoài ra còn có (2,2) Alfil ...

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

... và thậm chí là (0,1) Wazir.

.o.
oWo
.o.

Thử thách

Cho một cặp số làm đầu vào, xuất sơ đồ chuyển động tương ứng. Bạn có thể viết chương trình hoặc hàm, với đầu vào được cung cấp qua STDIN / dòng lệnh hoặc làm đối số và đầu ra được cung cấp bởi STDOUT hoặc giá trị trả về. Đây là môn đánh gôn .

Đầu vào

Đầu vào sẽ là một danh sách được phân tách bằng dấu phẩy gồm hai số nguyên và một chữ cái viết hoa. Hai số nguyên sẽ nằm trong phạm vi 0-7(bao gồm) và theo thứ tự không giảm. Trailing newline tùy chọn cho đầu vào và đầu ra.

Dưới đây là các đầu vào cho bốn ví dụ trên:

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

Đầu ra

Đầu ra sẽ là một chuỗi multiline hình vuông. Chữ in hoa sẽ được đặt ở trung tâm để thể hiện vị trí hiện tại của mảnh. Các vị trí di chuyển sẽ được đại diện bởi 4 hoặc 8 chữ thường o. Tất cả các không gian khác trong quảng trường sẽ được lấp đầy bằng dấu chấm.

Nếu mô hình chuyển động là 0,0, đầu ra chỉ là chữ in hoa.

Như một gợi ý, nếu số nguyên thứ hai (số lớn hơn) có giá trị N, thì hình vuông sẽ luôn có độ dài cạnh 2N + 1. Các os sẽ luôn ở trên chu vi của hình vuông.

Test Test bổ sung

1,1,F

o.o
.F.
o.o

5,7,Q

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


0,0,J

J

Tại sao chữ thử của lạc đà là 'L'? Tôi biết không quan trọng nhưng có thể hữu ích khi đổi thành 'C'.
Rɪᴋᴇʀ

1
@RikerW Sự lựa chọn của tôi không hoàn toàn độc đoán, đó là bức thư "chuẩn hóa".
PhiNotPi

1
Được chứ. Điều đó có ý nghĩa.
Rɪᴋᴇʀ

1
Đối với một hàm, 3 đối số có ổn không hoặc bạn có muốn một đối số chuỗi được phân tách bằng dấu phẩy không?
edc65

Câu trả lời:


2

Ruby, 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}}

Ungolfed trong chương trình thử nghiệm

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

Bình thường, 40 byte

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

Tôi đang học Pyth! Hãy thử nó .

Giải trình

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 byte

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

Đâu \nlà nhân vật dòng chữ mới. Hoạt động bằng cách tạo góc phần tư phía dưới bên phải và phản chiếu nó dọc theo cả hai trục.

Chỉnh sửa: Đã lưu 2 byte nhờ @ edc65.

(Tôi đã nhận được ở đây thông qua một câu hỏi trùng lặp cho phép kết quả mảng ngắn hơn 19 byte, nhưng không đảm bảo thứ tự không tăng, làm lãng phí 8 byte.)


Bạn có thể lưu 3 byte bằng chuỗi mẫu không có dấu ngoặc fillvà dòng mới theo nghĩa đen
edc65

@ edc65 Tôi đã cố gắng điều chỉnh cho dòng mới theo nghĩa đen (Tôi luôn viết " \nKý tự dòng mới theo nghĩa đen" ở đâu khi tôi làm điều đó) nhưng cảm ơn vì mẹo khác.
Neil

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`
`

Ít chơi gôn

(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')
}

Kiểm tra

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.