Bekerja pada gerakan Knight saya

16

Catur heksagonal menggambarkan keluarga varian catur dimainkan di papan di mana sel-selnya adalah segi enam bukan kotak tradisional. Ada banyak varian seperti itu; dalam tantangan ini kita akan fokus pada varian Gliński, yang merupakan yang paling umum.

Papan terdiri dari tiga warna (sehingga warna yang sama tidak berbagi tepi), dengan tepi segi enam menghadap pemain. Papan memiliki 11 file, ditandai dengan huruf amelalui l(huruf jtidak digunakan), dan 11 peringkat (yang menekuk 60 ° pada file f). Jajaran 1melalui 6masing-masing berisi 11 sel, peringkat 7memiliki 9 sel, peringkat 8memiliki 7, dan sebagainya. Peringkat 11persis mengandung satu sel: f11 . (Jika itu membantu, anggaplah setiap peringkat membuat bentuk "V" yang sangat luas.)

Berikut adalah contoh gambar papan, dengan ksatria di sel tengah. Sel-sel yang ditandai dengan titik adalah langkah hukum ksatria khusus ini. Ksatria bergerak dengan cara yang mirip dengan catur "normal", dua turun dan satu. Dalam istilah catur heksagonal, ini adalah langkah ortogonal (melintasi tepi), kemudian langkah diagonal dalam arah yang sama (gerakan terdekat dengan warna yang sama). Misalnya dengan ksatria di bawah, gerakan ortogonal "naik" ke coklat muda kemudian disertai dengan gerakan diagonal "ke atas dan kanan" atau "ke atas dan ke kiri" ke cokelat muda terdekat.

Gliński ini varian knight

Dari domain publik melalui https://commons.wikimedia.org/wiki/File:Glinski_Chess_Knight.svg

Ksatria ini diposisikan di f6 dan langkah hukumnya demikian

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

Memasukkan

Satu input memberi sel awal ksatria kita. Ini bisa berupa string tunggal "b6", dua string "b", "6", dll., Dalam format apa pun yang nyaman . Huruf input dapat berupa huruf besar atau kecil - pilihan Anda.

Keluaran

Daftar gerakan valid yang dapat dilakukan oleh seorang ksatria di lokasi itu. Ini bisa berupa array string, string tunggal dengan pembatas yang jelas dan konsisten, memisahkan string dengan baris baru, dll., Apa pun yang paling nyaman. Output tidak harus dalam urutan, dan dapat dalam huruf besar atau kecil - pilihan Anda.

Aturan

  • Asumsikan tidak ada bagian lain di papan tulis atau mengganggu gerakan. Kami fokus hanya pada ksatria.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Contohnya

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
AdmBorkBork
sumber
12
Sistem koordinat ini adalah pekerjaan iblis.
Martin Ender
2
@MartinEnder Points jika Anda melakukannya di Hexagony lalu :)
Erik the Outgolfer
Saya merasa seperti saya bisa mengubah ini menjadi ruang vektor lain dengan mendefinisikan kembali dua sumbu ke horizontal dan 60 derajat diagonal, dan kemudian hanya menggunakan gerakan biasa dan kemudian menerjemahkannya kembali menggunakan aljabar linier, tapi saya pikir itu hal-hal yang rumit: P Dan juga Saya setuju bahwa sistem koordinat adalah hal paling jahat yang pernah saya lihat di sini di situs ini. : P
HyperNeutrino

Jawaban:

11

JavaScript (ES6), 184 byte

Mengambil file Fsebagai karakter dan pangkat Rsebagai integer dalam sintaks currying (F)(R). Mengembalikan array string.

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)

Bagaimana?

Langkah # 1: konversi file / peringkat ke koordinat Cartesian

Kami mengonversi koordinat catur heksagonal ke koordinat Cartesius (x, y) dengan x di [0 .. 10] dan y di [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               

Langkah # 2: terapkan vektor pemindahan

Di bawah ini adalah daftar vektor pemindahan dalam sistem Cartesian:

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

Kami menerapkan masing-masing ke koordinat sumber (x, y) dan mendapatkan daftar koordinat target (X, Y) .

Langkah # 3: Uji koordinat sasaran

Kita sekarang perlu memeriksa koordinat target mana yang sebenarnya terletak di dalam papan. Ini dilakukan dengan menguji X + Y dan X - Y :

X / Y

Koordinat valid jika semua perbandingan berikut ini benar:

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

Kami juga harus memastikan bahwa X adalah dalam [0 .. 10] . Ini tidak dilakukan secara eksplisit karena s[X]tidak terdefinisi jika tidak, yang akhirnya menghasilkan nilai palsu yang akan disaring.

Langkah # 4: konversikan kembali ke koordinat catur heksagonal

Akhirnya koordinat target yang valid dikonversi kembali ke koordinat catur heksagonal, menggunakan kebalikan dari rumus yang dijelaskan pada langkah # 1.

Uji kasus

Arnauld
sumber
Ah, itu cara yang sangat pintar untuk menyiasati sistem koordinat heksagonal. Bagus!
AdmBorkBork
4

Batch. 403 byte

@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%%

Menyesuaikan sistem koordinat, meskipun dengan cara yang berbeda dengan jawaban @ Arnauld. The csubroutine mengambil keuntungan dari simetri dengan mencoba refleksi cermin masing-masing bergerak. (Saya juga mencoba memutar tetapi butuh terlalu banyak byte.)

Neil
sumber
3

JavaScript (ES6), 184 byte

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

Saya pikir saya akan pelabuhan solusi Batch saya untuk ES6 untuk melihat bagaimana hal ini dibandingkan ... Aku tidak berharap untuk menjadi yang dekat ...

Neil
sumber
3

CJam, 77

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

Cobalah online

Gambaran:

Saya menggunakan sistem koordinat yang terlihat seperti ..f dan 1..6 di sisi kiri, diperpanjang tanpa menekuk, dengan huruf diganti dengan angka, dan diubah menjadi berbasis 0 (b3 → [1 2], g1 → [6 1], k3 → [9 6]). Gerakan relatif dalam sistem ini adalah [1 3], [2 -1], [2 3] dan refleksinya (negatif dan bertukar, misalnya [1 3] → [-1 -3], [3 1], [- 3 -1]). Posisi [xy] yang dihasilkan adalah valid jika [xyz] ⊂ [0 1 .. 10] di mana z = x-y + 5.

aditsu
sumber
Menarik. Jadi, Anda menerjemahkan input ke sistem koordinat itu, melakukan perhitungan, lalu menerjemahkan kembali? Rapi.
AdmBorkBork
@ AdmBorkBork cukup banyak, yeah
aditsu
1

Dyalog APL, 72 bytes

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

mencoba

membangun daftar adari semua sel yang valid:'A1' 'A2' ... 'L6'

a digunakan untuk input dan output

membangun daftar jkoordinat terkait ke adalam sistem di mana sumbu x sepanjang A6-L1dan y sepanjangF1-F11

koordinat ketiga imajiner adalah perbedaan dari dua yang pertama

jika sel input diterjemahkan menjadi coords 0 0 0, knight dapat berpindah ke sel-sel yang produk coords-nya adalah 6 atau -6

ngn
sumber
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)]

Fungsi anonim dipanggil dengan dua string untuk file dan peringkat; mengembalikan daftar string.

Tidak Terkumpul:

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
RootTwo
sumber