Pola gerakan catur “leaper”

14

Sebuah leaper adalah kategori peri sepotong catur yang bergerak dengan "melompat." Seorang ksatria normal adalah (1,2) -lembaran, yang berarti setiap gerakan melibatkan bergerak jarak 1 kuadrat dalam arah ortogonal dan 2 kuadrat dalam arah tegak lurus.

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

Ada banyak jenis leaper yang berbeda. The (1,3) -laper disebut Long Knight, atau Unta. Pola gerakannya terlihat seperti ini:

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

Ada juga (2,2) Alfil ...

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

... dan bahkan (0,1) Wazir.

.o.
oWo
.o.

Tantangan

Diberikan sepasang angka sebagai input, output diagram gerakan yang sesuai. Anda dapat menulis sebuah program atau fungsi, dengan input yang disediakan melalui STDIN / baris perintah atau sebagai argumen, dan output disediakan oleh STDOUT atau nilai balik. Ini adalah kode-golf .

Memasukkan

Input akan berupa daftar dua bilangan bulat yang dipisahkan koma dan huruf besar. Dua bilangan bulat akan berada dalam kisaran 0-7(inklusif) dan dalam urutan yang tidak menurun. Mengikuti baris opsional untuk input dan output.

Berikut adalah input untuk empat contoh di atas:

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

Keluaran

Output akan berupa string multiline berbentuk persegi. Huruf kapital akan ditempatkan di tengah untuk mewakili lokasi potongan saat ini. Lokasi pergerakan akan diwakili oleh 4 atau 8 huruf kecil o. Semua ruang lain di alun-alun akan diisi dengan titik.

Jika pola pergerakannya adalah 0,0, output hanya huruf kapital.

Sebagai petunjuk, jika bilangan bulat kedua (yang lebih besar) memiliki nilai N, maka kuadrat akan selalu memiliki panjang sisi 2N + 1. The os akan selalu berada di sekeliling alun-alun.

Testcases tambahan

1,1,F

o.o
.F.
o.o

5,7,Q

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


0,0,J

J
PhiNotPi
sumber
Mengapa huruf testis unta huruf 'L'? Saya tahu tidak masalah tetapi mungkin bermanfaat untuk mengganti ke 'C'.
R
1
@RikerW Pilihan saya tidak sepenuhnya arbitrer, itu surat "standar".
PhiNotPi
1
Baik. Itu masuk akal.
R
1
Untuk suatu fungsi, apakah 3 argumen ok atau Anda ingin argumen string tunggal dipisahkan dengan koma?
edc65

Jawaban:

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

Tidak digabungkan dalam program uji

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]
Level River St
sumber
1

Pyth, 40 byte

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

Saya belajar Pyth! Cobalah .

Penjelasan

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
Lynn
sumber
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)

Dimana \n karakter garis baru secara literal. Bekerja dengan menghasilkan kuadran kanan bawah dan memantulkannya di kedua sumbu.

Sunting: Disimpan 2 byte berkat @ edc65.

(Saya tiba di sini melalui pertanyaan duplikat yang memungkinkan hasil array yang akan menjadi 19 byte lebih pendek, tetapi tidak menjamin urutan nececreasing, yang menghabiskan 8 byte.)

Neil
sumber
Anda dapat menyimpan 3 byte menggunakan string template tanpa tanda kurung untuk filldan baris baru literal
edc65
@ edc65 Saya sudah mencoba menyesuaikan untuk baris literal (saya selalu menulis "Di mana \nkarakter baris baru literal" ketika saya melakukan itu) tetapi terima kasih atas tip lainnya.
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`
`

Kurang golf

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

Uji

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>

edc65
sumber