기사 거리


24

체스에서, 격자 위의 기사 (x, y)는 (x-2, y-1), (x-2, y + 1), (x-1, y-2), (x-1, y + 2), (x + 1, y-2), (x + 1, y + 2), (x + 2, y-1), (x + 2, y + 1). (0, 0)에 기사 만있는 무한 체스 판을 상상해보십시오.

기사를 (0, 0)에서 (t x , t y ) 로 옮기려면 몇 단계가 필요 합니까?

입력

두 개의 정수 : t x , t y ;

-100 <t x <100, -100 <t y <100

산출

기사를 (0, 0)에서 (t x , t y ) 로 이동하는 데 필요한 최소 단계 .

규칙

  • 코드 골프

테스트 케이스

  x    y -> out
  0,   0 ->  0
  0,   1 ->  3
  0,   2 ->  2
  1,   1 ->  2
  1,   2 ->  1
  3,   3 ->  2
  4,   0 ->  2
 42,  22 -> 22
 84,  73 -> 53
 45,  66 -> 37
 99,  99 -> 66
-45, -91 -> 46
-81,   1 -> 42
 11,  -2 ->  7

document.write('<div>');[..."EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CBCBABA9A9898787878787878787878989A9ABABCBC;BCBABA9A989878767676767676767878989A9ABABCB;CBABA9A98987876767676767676767878989A9ABABC;BABA9A9898787676565656565656767878989A9ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432323032323454567678989ABAB;CBA9A987876565434321232123434565678789A9ABC;BABA98987676545432341214323454567678989ABAB;CBA9A987876565434323232323434565678789A9ABC;BABA98987676545434323232343454567678989ABAB;CBA9A987876565454343434343454565678789A9ABC;BABA98987676565454343434345456567678989ABAB;CBA9A987876765654545454545456567678789A9ABC;BABA98987876765654545454545656767878989ABAB;CBA9A989878767656565656565656767878989A9ABC;BABA9A9898787676565656565656767878989A9ABAB;CBABA9A98987876767676767676767878989A9ABABC;BCBABA9A989878767676767676767878989A9ABABCB;CBCBABA9A9898787878787878787878989A9ABABCBC;DCBCBABA9A98987878787878787878989A9ABABCBCD;CDCBCBABA9A989898989898989898989A9ABABCBCDC;DCDCBCBABA9A9898989898989898989A9ABABCBCDCD;EDCDCBCBABA9A9A9A9A9A9A9A9A9A9A9ABABCBCDCDE;DEDCDCBCBABA9A9A9A9A9A9A9A9A9A9ABABCBCDCDED;EDEDCDCBCBABABABABABABABABABABABABCBCDCDEDE;FEDEDCDCBCBABABABABABABABABABABABCBCDCDEDEF;EFEDEDCDCBCBCBCBCBCBCBCBCBCBCBCBCBCDCDEDEFE"].forEach(c=>document.write(c==';'?'<br>':`<span class="d-${c}">${c}</span>`));
document.write('<style>body{line-height:16px;color:rgba(255,255,255,0.2);}span{display:inline-block;width:16px;font-size:16px;text-align:center;}div{white-space:pre;}');[...'0123456789ABCDEF'].map((c,i)=>document.write(`.d-${c}{background:hsl(${60-4*i},80%,${65-2*i}%)}`));

관련 OEIS

자세한 내용은 OEIS를 참조하십시오.

  • A018837 : 기사가 무한 체스 판에서 (n, 0)에 도달하는 단계 수입니다.
  • A018838 : 기사가 무한 체스 판에서 (n, n)에 도달하는 단계 수입니다.
  • A065775 : 대각선으로 읽은 배열 T : T (i, j) = (0,0)에서 (i, j)로 이동하는 데 필요한 체스 판에서 기사의 이동 수가 가장 적습니다 (모든 방향으로 무한).
  • A183041 : 무한 체스 판에서 기사의 이동 수가 최소 (0,0)에서 (n, 1)로 감소했습니다.


2
복소수로 입력 할 수 x+yi있습니까?
Lynn

1
@lynn 나는 그것이 받아 들일 수 있다고 생각합니다.
tsh

@ user202729는 코드 스 니펫을 업데이트하여 결과를 표시했습니다.
tsh

아주 좋은지도.
Willtech

답변:


11

Wolfram Language (Mathematica) , 64 바이트

내장 사용 KnightTourGraph.

Mathe172 덕분에 2 바이트를 절약했습니다 .

GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+4),y+2,(x-2)y-2]&

온라인으로 사용해보십시오!

ArrayPlot @ Array [GraphDistance [KnightTourGraph @@ ({x, y} = Abs @ {##} + 5), 2y + 3, (x-2) y-2] &, {65,65},-32]


14
Mathematica builtins 스트라이크
qwr

1
약간 짧음 :GraphDistance[KnightTourGraph@@({x,y}=Abs@{##}+5),2y+3,(x-2)y-2]&
Lukas Lang

이 언어는 무엇입니까? 이러한 모든 내장 기능은 어떻게 미리로드되어 있습니까? 탭으로 문구를 완성하려고하면 나이가 걸립니까?
OganM

@OganM Mathematica는 명령 행 인터페이스에서 자동 완성을 지원하지 않습니다. 노트북 인터페이스의 자동 완성은 다음과 같습니다 .
alephalpha

1
@OganM 개발자가 Trie (데이터 구조)를 사용하거나 정렬 된 내장 목록에서 이진 검색을 사용했을 수 있습니다. 예, 왜 선형 검색입니까? | Mathematica는 무료 비공개 소스 언어이므로 예측자가 실제로 어떻게 작동하는지 아무도 모릅니다. | 실제 프로그래머는 자동 완성이 필요하지 않습니다. : P
user202729

7

자바 스크립트 (ES6), 90 75 72 바이트

A065775에 주어진 공식에서 영감을 얻었습니다 . 장거리에 대해서는 지옥만큼 느립니다.

f=(x,y,z=x|y)=>z<0?f(-y,x):z>1?1+Math.min(f(x-1,y-2),f(x-2,y-1)):z*3^x&y

온라인으로 사용해보십시오!

방법?

zxy 사이의 비트 단위 OR로 정의 합니다.

1 단계

먼저 xy 를 모두 음이 아닌 값 으로 설정하여 특정 사분면에 위치하도록합니다 . 만큼 Z <0 (여기서 어느 것을 의미 X 또는 Y는 제외 함), 우리는 재귀 호출 프로세스 F (-y, X)를 :

(+1, -2) --> (+2, +1)
(-1, +2) --> (-2, -1) --> (+1, -2) --> (+2, +1)
(-1, -2) --> (+2, -1) --> (+1, +2)

2 단계

우리가 있지만 , Z를> 1 (여기서 어느 것을 의미 X 또는 Y가 이상이며 1 ), 우리는 재귀 개의 가까이 우리를 가지고 있음을 이동하려고 (0, 0) : F (X-1, Y-2)(F)을 ( x-2, y-1) . 우리는 결국 최단 경로를 유지합니다.

3 단계

경우 Z는 이하가 인 1 , 우리는 3으로 처리 가능성으로 남겨 z*3^x&y(우리가 사용할 수 z*3-x*y대신에)

  • X 및 Y == 1 의미 X를 | y == 1 이며 x = y = 1을 의미합니다 . (0, 0) 에 도달하려면 두 번 더 이동해야합니다 .

    2 동작

  • x & y == 0x | y == 1x = 1 / y = 0 또는 x = 0 / y = 1하나임을 의미합니다 . (0, 0) 에 도달하려면 세 번 더 이동해야합니다 .

    3 동작

  • x & y == 0x | y == 0x = y = 0 이 이미 있음을 의미합니다 .

chess.com 에서 빌린 그래픽


5

파이썬 3 , 90 바이트

-11 바이트 감사합니다.

def f(x,y):x=abs(x);y=abs(y);s=x+y;return(.9+max(x/4,y/4,s/6)-s/2+(s==1or x==y==2))//1*2+s

온라인으로 사용해보십시오!

(독자가 스크롤하지 않아도되는 인라인 코드 형식입니다. 죄송하지만 프로그램을 골프화해야합니다)

매우 효율적입니다.


이걸 어떻게 생각 해낼 수 있을까요!?

1. 패리티

전체 보드가 바둑판 패턴으로 표시되어 있다고 가정합니다 (즉, x+y홀수이고 x+y다른 색상으로 채색 된 셀 ).

각 단계는 서로 다른 색의 두 셀 사이를 이동해야합니다. 따라서:

  • 단계 수의 패리티는의 패리티와 같아야합니다 x+y.

2. 근사

기사가 coordinate (0,0)에서 시작하여 n단계를 이동 했으며 현재 위치에 있다고 가정합니다 (x,y).
단순화를 위해, 가정 x ≥ 0, y ≥ 0.
우리는 결론을 내릴 수 있습니다.

  • 각 단계는 이후 x최대로 증가하여 2, x ≤ 2×n. 마찬가지로 y ≤ 2×n.
  • 각 단계는 이후 x+y최대로 증가하여 3, x+y ≤ 3×n.

따라서 n ≥ l(x,y)여기서 l(x,y) = max(max(x,y)/2, (x+y)/3. (우리는 포함시킬 필요는 없습니다 -x또는 x-y화학식 때문에 가정에 의해, x ≥ 0 and y ≥ 0그래서 x+y ≥ max(x-y,y-x,-x-y)하고 x ≥ -x, y ≥ -y)

그것은 a(x,y) = round(0.4 + l(x,y))좋은 근사치로 밝혀졌습니다 n.

  • a(x,y)오차가보다 작은 근사치라고 가정 1하면 올바른 값은

    f(x,y) = round((a(x,y) - (x+y)) / 2) * 2 + (x+y)

    (빼기 x+y및 2로 나누는 중 라운드 )

3. 공식에 실패한 특별한 경우

가정 x ≥ 0y ≥ 0. 알고리즘이 실패하는 두 가지 특별한 경우가 있습니다.

  • x == 1 and y == 0또는 x == 0 and y == 1: 1정답이있는 동안 알고리즘이 잘못 반환 됩니다 3.
  • x == y == 2: 2정답이있는 동안 알고리즘이 잘못 반환 됩니다 4.

따라서 특별한 경우입니다. 및 2의 값 중 하나 인 경우 결과를 추가하십시오 .xy


1
@tsh 그러나 그것은 사실 x==y==0이기도합니다.
user202729

max(x+y,x-y,y-x)?
tsh

@tsh : 아니오, 참조 : x = -5, y = 5. x + y = 0, abs (xy) = 10 그리고 따라서 x + y <abs (xy)
Nova

@Nova "가정 x ≥ 0y ≥ 0".
user202729


4

TI 기본, 86 54 바이트

@ user202729의 이전 솔루션을 기반으로 함

Input :abs(X->C:abs(Y->D:C+Ans
Ans+2int(.9+(S=1 or C=2 and D=2)-.5Ans+max({C/4,D/4,Ans/6

2

MATL , 29 바이트

`JEQ2J-htZjht_h@Z^2&sG=~}@Gg*

입력은 실수 부와 허수 부 정수가있는 복소수입니다.

코드는 매우 비효율적입니다. 출력에 따라 메모리 요구 사항이 기하 급수적으로 증가합니다. 출력이 7을 초과하는 테스트 케이스의 경우 TIO에서 시간 종료됩니다.

온라인으로 사용해보십시오!


2

하스켈, 79 72 바이트

p l|elem(0,0)l=0|r<-[-2..2]=1+p[(x+i,y+j)|(x,y)<-l,i<-r,j<-r,(i*j)^2==4]

온라인으로 사용해보십시오!

입력을 단일 숫자 쌍의 단일 목록 으로 가져옵니다 .

단순한 무차별 대입. 결과> 8에 많은 시간과 메모리가 필요합니다. 단일 좌표 목록 (입력) (0,0)으로 시작하여이 목록에 있을 때까지 모든 요소에 도달 할 수있는 모든 위치를 반복적으로 추가 하십시오. 재귀 수준을 추적하고 결과로 반환하십시오.

편집 : @Lynn 덕분에 -7 바이트.



1

자바 스크립트 (ES6), 90 78 바이트

f=(x,y)=>y<0?f(x,-y):x<y?f(y,x):x+y<3?4-x-y&3:x-3|y-1?x-4|y-3?f(x-2,y-1)+1:3:2

편집 : 지적 @supercat 즉에 저장된 (12) 감사 바이트 x<0중 하나를 의미한다 y<0x<y. 설명 : 순환 솔루션입니다. 처음 두 조건은 다른 조건에 적합한 사분면을 보장합니다. 세 번째 조건은 원점 근처의 좌표에 대한 답을 생성하는 반면 마지막 두 조건은 다른 두 가지 특수한 경우 (두 이동을 테스트하는 것보다 1 바이트 더 짧은)를 처리합니다.

0
32
2++
+2++
+++3+
++++++
(etc.)

표시된 모든 사각형 +은 원점을 향해 직접 이동 한 다음 되풀이하여 결정할 수 있습니다.


x<0시험 이 필요하십니까 ? 예를 들어 -3,6이 주어지면 x<y테스트는 6, -3으로 y<0바뀌고 테스트는 6,3으로 x<y바뀌고 테스트는 3,6으로 바뀝니다.
supercat

@supercat 실제로 파이썬이 말했듯이 x>=y>=0...
Neil

1

코 틀린 , 148 (146) 140 바이트

fun s(x:Int,y:Int):Int=if(y<0)s(x,-y)else
if(x<y)s(y,x)else if(x+y<3)4-x-y and 3
else if(x!=3||y!=1)if(x!=4||y!=3)s(x-2,y-1)+1
else 3 else 2

온라인으로 사용해보십시오!


:Int반환 유형을 지정할 필요가 없습니다 .
therealfarfetch 님

컴파일러가 유형을 알아낼만큼 똑똑하지 않기 때문에 재귀 함수에는 반환 유형이 필요합니다.
JohnWells

1
아, 나는 재귀 전화를 놓쳤다. Whoops
therealfarfetch을

1

젤리 , 27 26 25 23 바이트

1,-pḤµ;UÆị
¢ṗS€;0i
0ç1#

온라인으로 사용해보십시오!

아주 느린; 6 이상의 출력에 대해서는 TIO에서 시간 초과됩니다. 복소수를 입력으로 취합니다.

설명

코드는 중간 단계에서 더 짧았고 훨씬 더 빠르기 때문에 복소수를 사용합니다. 당신은 또한 제거하여 쌍을 사용할 수 있습니다 Æi및 교체 0와 함께 0,0두 번째 줄에.

1,-pḤµ;UÆị    Helper link. No arguments.
1,-             Get the pair [1,-1].
    Ḥ           Double each to get [2,-2].
   p            Cartesian product: get [[1,2],[1,-2],[-1,2],[-1,-2]].
     µ          Start a new chain with the list of pairs as argument.
       U        Reverse each pair.
      ;         Append the reversed pairs to the list.
        Æi      Convert each pair [real,imag] to a complex number.

¢ṗS€;0i    Helper link. Arguments: iterations, target
¢            Call the previous link to get knight moves as complex numbers.
 ṗ           Get the iterations-th Cartesian power of the list. This will
             yield 8^n tuples containing move sequences.
  S€         Sum each move sequence to get the resulting square.
    ;0       Add the starting square, since the zeroth iteration results
             in no move sequences.
      i      Find the target squares (1-based) index in the results, or 0.

0ç1#    Main link. Argument: target
0         Starting from 0,
   #      find the
  1       first number of iterations where
 ç        calling the previous link results in a nonzero result.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.