Làm việc trên các động tác Hiệp sĩ của tôi


16

Cờ lục giác mô tả một họ các biến thể cờ được chơi trên một bảng trong đó các ô là hình lục giác thay vì hình vuông truyền thống. Có nhiều biến thể như vậy; trong thử thách này, chúng tôi sẽ tập trung vào biến thể của Gliński, là biến thể phổ biến nhất.

Bảng này bao gồm ba màu (sao cho cùng một màu không chia sẻ một cạnh), với các cạnh của hình lục giác đối diện với người chơi. Bảng có 11 tệp, được đánh dấu bằng các chữ cái athông qua l(chữ cái jkhông được sử dụng) và 11 cấp bậc (uốn cong 60 ° tại tệp f). Xếp hạng 1qua 6mỗi ô chứa 11 ô, thứ hạng 7có 9 ô, thứ hạng 8có 7 ô, v.v. Thứ hạng 11chứa chính xác một ô: f11 . (Nếu có ích, hãy nghĩ về mỗi cấp bậc như tạo hình chữ "V" rất rộng.)

Dưới đây là một hình ảnh ví dụ của bảng, với hiệp sĩ trên ô trung tâm. Các ô được đánh dấu bằng một dấu chấm là động thái hợp pháp của hiệp sĩ đặc biệt này. Các hiệp sĩ di chuyển theo kiểu tương tự như cờ vua "bình thường", hai lần một xuống. Theo thuật ngữ cờ lục giác, đó là một nước đi trực giao (qua một cạnh), sau đó là một đường chéo di chuyển theo cùng một hướng (di chuyển gần nhất với cùng màu). Ví dụ, với hiệp sĩ bên dưới, một chuyển động trực giao "lên" sang màu nâu nhạt sau đó đi kèm với một đường chéo di chuyển "lên và phải" hoặc "lên và trái" sang màu nâu nhạt gần nhất.

Hiệp sĩ biến thể của Gliński

Từ miền công cộng thông qua https: //commons.wik mega.org/wiki/File:Glinski_Chess_Knight.svg

Hiệp sĩ này được định vị ở f6 và do đó di chuyển hợp pháp

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

Đầu vào

Một đầu vào duy nhất cho tế bào bắt đầu của hiệp sĩ của chúng tôi. Đây có thể là một chuỗi đơn "b6", như hai chuỗi "b", "6", v.v., ở bất kỳ định dạng thuận tiện nào . Các chữ cái đầu vào có thể là chữ hoa hoặc chữ thường - sự lựa chọn của bạn.

Đầu ra

Một danh sách các động thái hợp lệ mà một hiệp sĩ ở vị trí đó có thể thực hiện. Đây có thể là một chuỗi các chuỗi, một chuỗi với một dấu phân cách rõ ràng và nhất quán, các chuỗi riêng biệt theo dòng mới, v.v., bất cứ điều gì thuận tiện nhất. Đầu ra không nhất thiết phải theo thứ tự được sắp xếp, và có thể ở dạng chữ hoa hoặc chữ thường - sự lựa chọn của bạn.

Quy tắc

  • Giả sử không có mảnh nào khác trên bảng hoặc can thiệp vào việc di chuyển. Chúng tôi đang tập trung vào chỉ hiệp sĩ.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

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
Hệ thống phối hợp này là công việc của ma quỷ.
Martin Ender

2
@MartinEnder Điểm nếu bạn làm điều đó trong Hexagony sau đó :)
Erik the Outgolfer

Tôi cảm thấy mình có thể biến đổi nó thành một không gian vectơ khác bằng cách xác định lại hai trục thành đường chéo và đường chéo 60 độ, sau đó chỉ cần sử dụng các bước di chuyển thông thường và sau đó dịch lại bằng đại số tuyến tính, nhưng tôi nghĩ đó là những điều quá phức tạp: P Và cũng Tôi đồng ý rằng hệ thống tọa độ là thứ tệ hại nhất mà tôi đã thấy xung quanh đây trên trang web này. : P
HyperNeutrino

Câu trả lời:


11

JavaScript (ES6), 184 byte

Lấy tệp Fdưới dạng một ký tự và xếp hạng Rlà một số nguyên trong cú pháp currying (F)(R). Trả về một chuỗi các chuỗi.

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)

Làm sao?

Bước # 1: chuyển đổi tập tin / xếp hạng thành tọa độ Descartes

Chúng tôi chuyển đổi tọa độ cờ lục giác thành tọa độ Descartes (x, y) với x trong [0 .. 10]y trong [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               

Bước # 2: áp dụng các vectơ di chuyển

Dưới đây là danh sách các vectơ di chuyển trong hệ thống 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)

Chúng tôi áp dụng từng trong số chúng cho tọa độ nguồn (x, y) và nhận danh sách tọa độ đích (X, Y) .

Bước # 3: kiểm tra tọa độ đích

Bây giờ chúng ta cần kiểm tra tọa độ đích nào thực sự nằm trong bảng. Điều này được thực hiện bằng cách kiểm tra X + YX - Y :

X / Y

Các tọa độ là hợp lệ nếu tất cả các so sánh sau là đúng:

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

Chúng ta cũng nên xác minh rằng X nằm trong [0 .. 10] . Điều này không được thực hiện rõ ràng vì khôngs[X] được xác định nếu không, điều này cuối cùng dẫn đến một giá trị sai lệch được lọc ra.

Bước # 4: chuyển đổi trở lại tọa độ cờ lục giác

Cuối cùng, tọa độ đích hợp lệ được chuyển đổi trở lại tọa độ cờ lục giác, sử dụng nghịch đảo của các công thức được mô tả ở bước # 1.

Các trường hợp thử nghiệm


Ah, đó là một cách thực sự thông minh để đi xung quanh hệ tọa độ lục giác. Đẹp!
admBorkBork

4

Lô hàng. 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%%

Điều chỉnh hệ tọa độ, mặc dù theo một cách khác với câu trả lời của @ Arnauld. Chương ctrình con tận dụng tính đối xứng bằng cách thử phản xạ gương của mỗi lần di chuyển. (Tôi cũng đã thử xoay nhưng mất quá nhiều byte.)


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

Tôi nghĩ rằng tôi muốn cổng giải pháp hàng loạt của tôi để ES6 để xem nó như thế nào so ... Tôi không mong đợi nó sẽ gần ...


3

CJam, 77

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

Dùng thử trực tuyến

Tổng quat:

Tôi đang sử dụng hệ tọa độ trông giống như a..f và 1..6 ở bên trái, được mở rộng mà không bị uốn cong, với các chữ cái được thay thế bằng số và được đổi thành 0 dựa trên (b3 → [1 2], g1 → [6 1], k3 → [9 6]). Các chuyển động tương đối trong hệ thống này là [1 3], [2 -1], [2 3] và phản xạ của chúng (âm và hoán đổi, ví dụ [1 3] → [-1 -3], [3 1], [- 3 -1]). Vị trí [xy] kết quả là hợp lệ iff [xyz] ⊂ [0 1 .. 10] trong đó z = x-y + 5.


Hấp dẫn. Vì vậy, bạn dịch đầu vào cho hệ tọa độ đó, thực hiện các tính toán, và sau đó dịch lại? Khéo léo.
admBorkBork

@AdmBorkBork khá nhiều, yeah
aditsu

1

APL Dyalog, 72 byte

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

thử

xây dựng một danh sách atất cả các ô hợp lệ:'A1' 'A2' ... 'L6'

a được sử dụng cho cả đầu vào và đầu ra

xây dựng một danh sách jcác tọa độ tương ứng atrong một hệ thống có trục x dọc A6-L1và y dọcF1-F11

tọa độ thứ ba tưởng tượng là sự khác biệt của hai đầu tiên

nếu ô đầu vào được dịch thành coords 0 0 0, một hiệp sĩ có thể di chuyển đến các ô có sản phẩm của coords là 6 hoặc -6


0

Con trăn 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)]

Một hàm ẩn danh được gọi với hai chuỗi cho tệp và xếp hạng; trả về một danh sách các chuỗi.

Ung dung:

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