ทำงานกับอัศวินของฉัน


16

หมากรุกหกเหลี่ยมอธิบายถึงตระกูลหมากรุกหลากหลายรูปแบบที่เล่นบนกระดานซึ่งเซลล์เป็นรูปหกเหลี่ยมแทนที่จะเป็นสี่เหลี่ยมจตุรัสดั้งเดิม มีหลายสายพันธุ์เช่น; ในการท้าทายนี้เราจะมุ่งเน้นไปที่ตัวแปรของGlińskiซึ่งเป็นเรื่องที่พบได้บ่อยที่สุด

กระดานประกอบด้วยสามสี (เพื่อให้สีเดียวกันไม่แบ่งขอบ), กับขอบของรูปหกเหลี่ยมหันหน้าไปทางผู้เล่น กระดานนี้มี 11 ไฟล์, ทำเครื่องหมายด้วยตัวอักษรaผ่านl( jไม่ได้ใช้ตัวอักษร), และ 11 อันดับ (ซึ่งงอ 60 °ที่ไฟล์f) จัดอันดับ1ผ่าน6แต่ละเซลล์ประกอบด้วย 11 เซลล์อันดับ7มี 9 เซลล์อันดับ8มี 7 และอื่น ๆ อันดับ11มีอีกหนึ่งมือถือ: f11 (ถ้ามันช่วยได้ลองคิดว่าแต่ละระดับนั้นสร้างรูปร่าง "V" ที่กว้างมาก)

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

อัศวินแปรปรวนของGliński

จากโดเมนสาธารณะผ่านhttps://commons.wikimedia.org/wiki/File:Glinski_Chess_Knight.svg

อัศวินนี้อยู่ในตำแหน่งที่f6และเคลื่อนไหวอย่างถูกกฎหมาย

c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5

อินพุต

อินพุตเดียวให้เซลล์เริ่มต้นของอัศวินของเรา นี้สามารถเป็นสายเดียว"b6"เป็นสองสาย"b", "6"ฯลฯในรูปแบบที่สะดวกใดตัวอักษรที่ป้อนอาจเป็นตัวพิมพ์ใหญ่หรือเล็ก - ตัวเลือกของคุณ

เอาท์พุต

รายการของการเคลื่อนไหวที่ถูกต้องที่อัศวินในตำแหน่งนั้นสามารถทำได้ สิ่งนี้อาจเป็นอาร์เรย์ของสตริงสตริงเดี่ยวที่มีตัวคั่นที่ไม่คลุมเครือและสอดคล้องกันสตริงที่แยกจากกันโดยการขึ้นบรรทัดใหม่ ฯลฯ อะไรก็ตามที่สะดวกที่สุด เอาต์พุตไม่จำเป็นต้องเรียงตามลำดับและอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก - ตัวเลือกของคุณ

กฎระเบียบ

  • สมมติว่าไม่มีชิ้นส่วนอื่น ๆ อยู่บนกระดานหรือรบกวนการเคลื่อนไหว เรามุ่งเน้นไปที่อัศวิน
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดใส่ลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

b6
a3, c4, d5, d9, e7, e8

f6
c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5

f11
d8, e8, g8, h8

i1
f2, f3, g4, h4, l2, k3

12
ระบบพิกัดนี้เป็นผลงานของปีศาจ
Martin Ender

2
@MartinEnder คะแนนถ้าคุณทำมันใน Hexagony แล้ว :)
Erik the Outgolfer

ฉันรู้สึกว่าฉันสามารถแปลงมันให้เป็นพื้นที่เวคเตอร์อื่นได้โดยกำหนดแกนสองแกนใหม่เป็นแนวนอนและแนวทแยง 60 องศาจากนั้นใช้การเคลื่อนไหวปกติแล้วแปลมันกลับมาโดยใช้พีชคณิตเชิงเส้น แต่ฉันคิดว่ามันซับซ้อนเกินไป: P และ ฉันยอมรับว่าระบบพิกัดเป็นสิ่งที่เลวร้ายที่สุดที่ฉันเคยเห็นในไซต์นี้ : P
HyperNeutrino

คำตอบ:


11

JavaScript (ES6), 184 ไบต์

นำไฟล์Fเป็นตัวอักษรและการจัดอันดับเป็นจำนวนเต็มในไวยากรณ์ความดีความชอบR (F)(R)ส่งคืนอาร์เรย์ของสตริง

F=>R=>[...'100124566542'].map((X,i)=>(X-=3-(x=(s='abcdefghikl').search(F)))-7<(Y=('9641001469'[i]||10)-(A=Math.abs)(x-5)+17-2*R)&X+Y>3&X+16>Y&X+Y<27&&s[X]+(22-Y-A(X-5))/2).filter(n=>n)

อย่างไร?

ขั้นตอนที่ # 1: แปลงไฟล์ / อันดับเป็นพิกัดคาร์ทีเซียน

เราแปลงพิกัดหมากรุกหกเหลี่ยมเป็นพิกัดคาร์ทีเซียน(x, y)ด้วยxใน[0 .. 10]และyใน[0 .. 20] :

      00 01 02 03 04 05 06 07 08 09 10
   +----------------------------------
00 |                f11                     F = file (letter)
01 |             e10   g10                  R = rank in [1 .. 11]
02 |          d09   f10   h09               
03 |       c08   e09   g09   i08            F | a b c d e f g h i k l
04 |    b07   d08   f09   h08   k07         --+-----------------------
05 | a06   c07   e08   g08   i07   l06      x | 0 1 2 3 4 5 6 7 8 9 10
06 |    b06   d07   f08   h07   k06         
07 | a05   c06   e07   g07   i06   l05      y = 22 - |x - 5| - 2R
08 |    b05   d06   f07   h06   k05   
09 | a04   c05   e06   g06   i05   l04
10 |    b04   d05   f06   h05   k04   
11 | a03   c04   e05   g05   i04   l03
12 |    b03   d04   f05   h04   k03   
13 | a02   c03   e04   g04   i03   l02
14 |    b02   d03   f04   h03   k02   
15 | a01   c02   e03   g03   i02   l01
16 |    b01   d02   f03   h02   k01   
17 |       c01   e02   g02   i01      
18 |          d01   f02   h01         
19 |             e01   g01            
20 |                f01               

ขั้นตอนที่ # 2: ใช้เวกเตอร์ย้าย

ด้านล่างเป็นรายการของเวกเตอร์ย้ายในระบบคาร์ทีเซียน:

(-2, +4), (-1, -5), (+3, +1),
(-3, +1), (+1, -5), (+2, +4),
(-3, -1), (+2, -4), (+1, +5),
(-2, -4), (+3, -1), (-1, +5)

เราใช้แต่ละของพวกเขาไปยังพิกัดแหล่งที่มา(x, y)และได้รับรายการของพิกัดเป้าหมาย(X, Y)

ขั้นตอนที่ # 3: ทดสอบพิกัดเป้าหมาย

ตอนนี้เราต้องตรวจสอบว่าเป้าหมายพิกัดใดที่อยู่ภายในบอร์ด สิ่งนี้ทำได้โดยการทดสอบX + YและX - Y :

X / Y

พิกัดจะใช้ได้หากการเปรียบเทียบทั้งหมดต่อไปนี้เป็นจริง:

  • X + Y> 3
  • X + Y <27
  • X - Y <7
  • X - Y> -17

นอกจากนี้เรายังควรตรวจสอบว่าXอยู่ใน[0 .. 10] นี้ไม่ได้ทำอย่างชัดเจนเพราะs[X]จะไม่ได้กำหนดหากยังไม่ได้ซึ่งในที่สุดจะส่งผลให้ค่า falsy ที่ได้รับการกรองออก

ขั้นตอนที่ # 4: แปลงกลับเป็นพิกัดหมากรุกแบบหกเหลี่ยม

ในที่สุดพิกัดเป้าหมายที่ถูกต้องจะถูกแปลงกลับเป็นพิกัดหมากรุกหกเหลี่ยมโดยใช้ค่าผกผันของสูตรที่อธิบายไว้ในขั้นตอนที่ 1

กรณีทดสอบ


อานั่นเป็นวิธีที่ชาญฉลาดในการเดินทางรอบระบบพิกัดหกเหลี่ยม ดี!
AdmBorkBork

4

ชุด 403 ไบต์

@echo off
set j=a b c d e f g h i k l
set f=0
for %%f in (%j%)do set/af+=1&if %%f==%1 goto l
:l
set j=j%j: =%
set/a"r=6-f,r*=r>>31,r+=%2
for %%s in ("-3 -2" "-3 -1" "-2 1" "2 -1" "3 1" "3 2")do call:c %%~s
exit/b
:c
call:l %2 %1
:l
set/ag=f+%1,s=r+%2,t=g-s
if %g% geq 1 if %g% leq 11 if %s% geq 1 if %s% leq 11 if %t% geq -5 if %t% leq 5 set/a"t=6-g,s-=t*=t>>31"&call echo %%j:~%g%,1%%%%s%%

ปรับระบบพิกัดแม้ว่าจะแตกต่างไปตามคำตอบของ @ Arnauld cย่อยใช้ประโยชน์ของสมมาตรโดยพยายามสะท้อนกระจกของแต่ละย้าย (ฉันยังลองหมุน แต่ใช้จำนวนไบต์มากเกินไป)


3

JavaScript (ES6), 184 ไบต์

(s,t,j=' abcdefghikl',f=j.search(s),r=f<6?t:t+f-6)=>[...'120405..162645'].map((c,i)=>[(i>>1)-3+f,c-3+r]).filter(([f,r])=>f>0&f<12&r>0&r<12&f-r<6&r-f<6).map(([f,r])=>j[f]+(f<6?r:r+6-f))

ฉันคิดว่าฉันจะส่งพอร์ตโซลูชัน Batch ของฉันไปที่ ES6 เพื่อดูว่ามันจะเปรียบเทียบกันอย่างไร ... ฉันไม่คิดว่ามันจะเป็น ว่าใกล้ ...


3

CJam, 77

1Z2W2Z]_Wf*+2/_Wf%+[r('a-_9>-_6-We>@~+]f.+{_~m5++B,-!},{~1$6-We>-\_8>+'a+\S}/

ลองออนไลน์

ข้อมูลทั่วไป:

ฉันใช้ระบบพิกัดที่ดูเหมือนว่า a. f และ 1..6 ทางด้านซ้ายยืดออกโดยไม่งอด้วยตัวอักษรที่ถูกแทนที่ด้วยตัวเลขและเปลี่ยนเป็นแบบ 0 (b3 → [1 2], g1 → [6 1], k3 → [9 6]) การเคลื่อนที่สัมพัทธ์ในระบบนี้คือ [1 3], [2 -1], [2 3] และการสะท้อนกลับ (ลบและสลับเช่น [1 3] → [-1 -3], [3 1], [- 3 -1]) ตำแหน่ง [xy] ที่ถูกต้องคือ iff [xyz] ⊂ [0 1 .. 10] โดยที่ z = x-y + 5


น่าสนใจ ดังนั้นคุณแปลอินพุตไปยังระบบพิกัดนั้นทำการคำนวณแล้วแปลกลับไหม เรียบร้อย
AdmBorkBork

@AdmBorkBork สวยมากใช่แล้ว
aditsu

1

Dyalog APL, 72 ไบต์

(6=|×/t,-/t←↑j[a⍳⊂⍞]-j←⊃,/i,¨¨↓∘i¨i-6)/a←⊃,/(11⍴⎕a~'J'),∘⍕¨¨⍳¨5+i⌊⌽i←⍳11

ลอง

สร้างรายการaของเซลล์ที่ถูกต้องทั้งหมด:'A1' 'A2' ... 'L6'

a ใช้สำหรับอินพุตและเอาต์พุต

สร้างรายการjของพิกัดที่สอดคล้องกันaในระบบที่แกน x เป็นไปตามA6-L1และ y ตามF1-F11

พิกัดที่สามในจินตนาการคือความแตกต่างของสองอย่างแรก

ถ้าเซลล์อินพุตถูกแปลเป็น coords 0 0 0อัศวินสามารถย้ายไปยังเซลล์เหล่านั้นซึ่งผลิตภัณฑ์ของ coords คือ 6 หรือ -6


0

Python 3.6, 149

H='abcdefghikl'
lambda f,r:[H[i]+str(j)for i,j in[(H.find(f)+p%4*s,int(r)+p//4)for p in[9,6,-1,-5,-11,-10]for s in(1,-1)]if 0<i<11if 0<j<12-abs(6-i)]

ฟังก์ชั่นที่ไม่ระบุชื่อเรียกว่ามีสองสายสำหรับไฟล์และอันดับ; ส่งคืนรายการสตริง

Ungolfed:

def h(f,r):
    H='abcdefghikl'

    A = []
    for p in[9,6,-1,-5,-11,-10]:
        for s in(1,-1):
            i = H.find(f) + p%4*s
            j = int(r) + p//4
            A.append(i, j)

    B = []
    for i,j in A:
        if 0 < i < 11 and 0 < j < 12 - abs(6 - i):
            B.append(H[i] + str(j))

    return B
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.