รูปแบบการเคลื่อนไหวของนางฟ้าหมากรุก "leaper"


14

leaperเป็นหมวดหมู่ของชิ้นหมากรุกนางฟ้าซึ่งย้ายจาก "กระโดด". อัศวินปกติคือ (1,2) -leaper ซึ่งหมายถึงการเคลื่อนไหวแต่ละครั้งเกี่ยวข้องกับการเคลื่อนที่เป็นระยะทาง 1 ตารางในทิศทางมุมฉากและ 2 สี่เหลี่ยมในทิศทางตั้งฉาก

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

มี leapers ที่แตกต่างกันมากมาย leaper (1,3) เรียกว่า Long Knight หรือ Camel รูปแบบการย้ายของมันมีลักษณะดังนี้:

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

นอกจากนี้ยังมี (2,2) Alfil ...

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

... และแม้กระทั่ง (0,1) Wazir

.o.
oWo
.o.

ท้าทาย

เมื่อกำหนดตัวเลขเป็นคู่ให้ส่งออกแผนภาพการเคลื่อนไหวที่สอดคล้องกัน คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นโดยอินพุตที่ให้ผ่าน STDIN / command-line หรือเป็นอาร์กิวเมนต์และเอาต์พุตที่ให้โดย STDOUT หรือค่าส่งคืน นี่คือรหัสกอล์ฟ

อินพุต

ข้อมูลที่ป้อนจะเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคของจำนวนเต็มสองตัวและตัวอักษรตัวพิมพ์ใหญ่ จำนวนเต็มสองจำนวนจะอยู่ในช่วง0-7(รวม) และในลำดับที่ไม่ลดลง ขึ้นบรรทัดใหม่ทางเลือกสำหรับอินพุตและเอาต์พุต

นี่คืออินพุตสำหรับสี่ตัวอย่างข้างต้น:

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

เอาท์พุต

การส่งออกจะเป็นสตริง multiline รูปสี่เหลี่ยม อักษรตัวใหญ่จะถูกวางไว้ในศูนย์เพื่อเป็นตัวแทนที่ตั้งปัจจุบันของชิ้น สถานที่การเคลื่อนไหวจะแสดงโดยทั้ง 4 หรือ 8 ตัวพิมพ์เล็กos ช่องว่างอื่น ๆ ทั้งหมดในจัตุรัสจะเต็มไปด้วยจุด

หากรูปแบบการเคลื่อนไหวแสดง0,0เฉพาะอักษรตัวใหญ่

ถ้าจำนวนเต็มตัวที่สอง (จำนวนที่มากกว่า) มีค่า N ดังนั้นสี่เหลี่ยมจะมีความยาวด้าน 2N + 1 เสมอ oเสมอจะอยู่ในปริมณฑลของตาราง

Testcase เพิ่มเติม

1,1,F

o.o
.F.
o.o

5,7,Q

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


0,0,J

J

เหตุใดอูฐ testcase อักษร 'L' ฉันรู้ว่าไม่สำคัญ แต่มันอาจเป็นประโยชน์ในการเปลี่ยนเป็น 'C'
Rɪᴋᴇʀ

1
@RikerW ตัวเลือกของฉันไม่ได้เป็นไปตามอำเภอใจนั่นคือตัวอักษร "มาตรฐาน"
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}}

Ungolfed ในโปรแกรมทดสอบ

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อักขระบรรทัดใหม่ตัวอักษรอยู่ที่ไหน ทำงานโดยการสร้างควอดเรนท์ล่างขวาและทำมิเรอร์มันตามแกนทั้งสอง

แก้ไข: บันทึก 2 ไบต์ขอบคุณ @ edc65

(ฉันมาที่นี่ด้วยคำถามที่ซ้ำกันซึ่งอนุญาตให้มีผลลัพธ์อาร์เรย์ซึ่งจะมีขนาด 19 ไบต์ที่สั้นลง แต่ไม่รับประกันการสั่งซื้อที่ไม่ลบซึ่งเสีย 8 ไบต์)


คุณสามารถบันทึก 3 ไบต์โดยใช้สตริงเทมเพลตที่ไม่มีวงเล็บเหลี่ยมfillและขึ้นบรรทัดใหม่ตามตัวอักษร
edc65

@ edc65 ฉันพยายามปรับให้ขึ้นบรรทัดใหม่ตามตัวอักษรแล้ว (ฉันมักจะเขียนว่า " \nตัวอักษรขึ้นบรรทัดใหม่ตัวอักษร" เมื่อฉันทำเช่นนั้น) แต่ขอบคุณสำหรับเคล็ดลับอื่น ๆ
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`
`

น้อย golfed

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