내 기사 이동 작업


16

6 각형 체스 는 셀이 전통적인 사각형 대신 육각형 인 보드에서 재생되는 일련의 체스 변형을 설명합니다. 이러한 변형이 많이 있습니다. 이 도전에서 우리는 가장 일반적인 Gliński의 변형에 초점을 맞출 것입니다.

보드는 육각형의 가장자리가 플레이어를 향하도록 세 가지 색상 (같은 색상이 가장자리를 공유하지 않도록)으로 구성됩니다. 이 보드는 문자로 표시 (11 개) 파일이 a스루 l(문자가 j사용되지 않음), 그리고 (파일에서 60 °를 구부리 11 순위 f). 순위 16각각 11 개의 셀을 포함하고 순위 7는 9 개의 셀을 8가지며 순위 는 7 을가 집니다. 순위 11에는 정확히 하나의 셀이 포함됩니다 : f11 . 도움이된다면 각 등급을 매우 넓은 "V"모양으로 생각하십시오.

다음은 기사가 중앙 셀에있는 보드의 예시 사진입니다. 점으로 표시된 셀은이 특정 기사의 법적 동작입니다. 기사는 "정상적인"체스와 비슷한 방식으로 투 다운 앤 투 오버 방식으로 움직입니다. 6 각형 체스 용어에서는 직교 이동 (가장자리를 가로 질러), 대각선 방향으로 같은 방향으로 (가장 가까운 색으로 이동)입니다. 예를 들어 아래 기사와 함께 연한 갈색의 "위"직교 이동에는 가장 가까운 연한 갈색의 "위와 오른쪽"또는 "위와 왼쪽"의 대각선 이동이 수반됩니다.

글렌 스키의 변형 기사

공개 도메인에서 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

자바 스크립트 (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 + YX-Y 를 테스트하여 수행됩니다 .

X / Y

다음 비교가 모두 참이면 좌표가 유효합니다.

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

또한 X[0 .. 10] 에 있는지 확인해야합니다 . 때문에 명시 적으로 수행되지 s[X]이다 정의되지 는 결국 필터링 가져옵니다 falsy 값에 어떤 결과가 아니라면.

4 단계 : 6 각형 체스 좌표로 다시 변환

마지막으로 유효한 목표 좌표는 1 단계에서 설명한 역수를 사용하여 6 각형 체스 좌표로 다시 변환됩니다.

테스트 사례


아, 그것은 육각형 좌표계를 돌아 다니는 정말 영리한 방법입니다. 좋은!
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

자바 스크립트 (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] 위치는 [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 입력과 출력 모두에 사용

x 축이 따라 y 가있는 시스템에서 j해당 좌표 의 목록 을 작성합니다.aA6-L1F1-F11

가상의 세 번째 좌표는 처음 두 좌표의 차이입니다.

입력 셀이 coords로 변환 0 0 0되면 기사는 coords의 곱이 6 또는 -6 인 셀로 이동할 수 있습니다


0

파이썬 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)]

파일과 순위에 대해 두 개의 문자열로 호출 된 익명 함수. 문자열 목록을 반환합니다.

언 골프 드 :

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.