변죽의 기사는 잔인


48

소개

Aron Nimzowitsch는 최고의 체스 마스터이자 영향력있는 체스 작가였습니다.

그의 책 'My System'에서 첫 번째 장은 센터의 중요성과 왜 그것을 지배해야 하는지를 다루고 있습니다. 간단한 이유는 당신의 작품이 중앙에있을 때 다음 번에 직접 움직일 수 있기 때문에 플레이어에게 더 많은 힘을줍니다.

빈 보드에서 기사의 다른 위치와 다음 잠재적 이동 (분홍색으로 표시)을 볼 때 매우 분명합니다.

여기에 이미지 설명을 입력하십시오

객관적인

위치에 따라 빈 보드에서 기사의 직접적인 다음 이동 수를 평가하십시오.

입력 사양

기사의 위치.

먼저 x (열) 및 y (행)입니다. 0 0왼쪽 하단입니다.

간단하게하기 위해 체스 보드의 레이블을 숫자로만 변경했습니다. 예제와 테스트 사례에서는 0 기반 인덱스를 사용하지만 1 기반 인덱스를 자유롭게 사용할 수 있습니다.

가능한 모든 입력 형식, 배열, 함수 인수 등을 사용할 수 있습니다.

출력 사양

빈 보드에있는 기사에 대해 다음 번에 가능한 직접 이동 횟수입니다.

테스트 사례

3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3

테스트 사례는 0 기반 인덱스를 사용합니다. 전체 값 그리드는 다음과 같습니다.

2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

9
좋은 첫 도전! :-)
Luis Mendo 2016 년

14
"테두리의

2
@stacey 귀하의 의견은이 퍼즐의 훌륭한 제목이 될 것입니다 :)
starcorder

6
지금을 위해 정말 어려운 질문 : 위의 이미지에서 빨간색 기사는 모두 같은 색상 있습니까?
mbomb007

답변:


25

파이썬 2 , 35 바이트

lambda x,y:50/(8+x*x/7-x+y*y/7-y)-4

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


파이썬 2 , 39 바이트

lambda x,y:50/(8-x*(7-x)/5-y*(7-y)/5)-4

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

인덱싱 된 입력을받습니다.

표현식 x*(7-x)/5은 좌표 값 0..7

[0, 1, 2, 2, 2, 2, 1, 0]

( min(x,7-x,2)동일하지 않습니다,하지만 것입니다 이상.)이 합산 x하고 y올바른 패턴을 제공하지만, 잘못된 번호

0 1 2 2 2 2 1 0
1 2 3 3 3 3 2 1
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
1 2 3 3 3 3 2 1
0 1 2 2 2 2 1 0

( 이것이 올바른 패턴을 제공하는 이유에 대한 더 나은 추론에 대해서는 Neil의 솔루션 을 참조하십시오 .)

마지막으로 a -> 50/(8-a)-4층 나누기를 사용한 매핑 은 올바른 값을 제공합니다.

2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

1 인덱스 입력을 가진 동일하게 긴 대안 솔루션 :

lambda x,y:(x*(9-x)/6+y*(9-y)/6)**2/6+2

(7-a)*a/5보다 3 바이트 짧습니다 min(a,7-a,2).
Neil

1
*l실제로 전체 바이트 비용 lambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]은 41 바이트입니다.
Neil

@ Neil 방금 동일한 x*(9-x)/6색인을 사용하여 동일한 것을 찾았습니다 .
xnor

1
당신은 왜 <strike>골프 진행을 보여주기 위해 다른 사람들처럼 사용하지 않습니까?
Insane

4
@Insane 나는 그것이 못 생겼고 실제로 도움이되지 않는다고 생각합니다. 코드는 중요한 것이며, 진화를보고자하는 사람은 여전히 ​​편집 히스토리를 살펴 봐야합니다. 내 이전 코드가 보여줄 가치가 없을 때 here 과 같은 버전을 보여줍니다 . 그러나이 질문에서, 그것은 같은 전략을 약간 개선 한 것이므로 다른 가능성을 언급하는 것이 더 깨끗하다는 것을 알았습니다.
xnor

17

MATL , 17 14 13 12 바이트

1 바이트 할인을 위해 @Neil에게 감사드립니다!

8:HZ^ZP5X^=s

입력은 1 기반입니다.

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

설명

입력에서 체스 판의 64 개 위치까지의 유클리드 거리를 계산하고 5의 제곱근에 해당하는 값의 수를 찾습니다.

좌표가 정수 값이므로 좌표에서 계산되고 직접 계산 된 5의 제곱근을 나타내는 두 개의 부동 소수점 값이 실제로 같은지 확인할 수 있습니다.

8:      % Push array [1 2 ... 8]
H       % Push 2
Z^      % Cartesian power. Gives 2D array [1 1; 1 2; ... 1 8; 2 1; ... 8 8]     
ZP      % Implicit input. Compute Euclidean distances, considering each row as a point
5X^     % Square root of 5
=s      % Compute how many squared distances equal sqrt(5). Implicit display

1
설명에 대한 감동과 감사
스타 코더

1
반올림 오류로 인해 5에서 5의 제곱근의 제곱을 비교할 수없는 경우 5의 제곱근을 5의 제곱근과 비교할 수 있습니까?
Neil

@Neil 아이디어에 감사드립니다! 예, 계산은 정수를 사용하기 때문에 두 "근 5"의 double숫자 가 같은지 확인할 수 있습니다. 그것은 바이트를 절약 개미
루이스 멘도

15

Mathematica 63 43 바이트

Martin Ender의 제안으로 20 바이트가 절약되었습니다!

EdgeCount[8~KnightTourGraph~8,#+1+8#2/<->_]&

위의 기사는 완전한 기사 여행 그래프에서 주어진 셀에서 1 홉 떨어진 사각형의 수를 찾습니다.


g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]

정점 이름과 좌표로 기사의 전체 여행 그래프를 표시합니다. Mathematica는 기본적으로 좌표에 대한 1 기반 색인화를 사용합니다.

그래프


#+1+8#2&[r,f]converts는 0부터 시작하는 값을 입력으로 사용하여 순위 (행) r및 파일 (열)의 제곱에 해당하는 정점을 반환합니다 f.

예를 들어 #+1+8#2&[2,1]11을 반환합니다.


EdgeCount 이웃 그래프의 가장자리 수를 나타냅니다.


순위 2, 파일 1 (사각 11)의 모서리 :

IncidenceList[8~KnightTourGraph~8, 8 #2 + # + 1] &[2, 1]

(*{1 <-> 11, 5 <-> 11, 11 <-> 17, 11 <-> 21, 11 <-> 26, 11 <-> 28}*)

강조 표시된 모서리 :

HighlightGraph[g, {1, 5, 11, 17, 21, 26, 28, Style[1 <-> 11, Thick, Blue], Style[5 <-> 11, Thick, Blue], Style[11 <-> 17, Thick, Blue], Style[11 <-> 21, Thick, Blue], Style[11 <-> 26, Thick, Blue], Style[11 <-> 28, Thick, Blue]},GraphHighlightStyle -> "DehighlightFade", PlotRangePadding -> .5]

가장 밝은 부분


방법 2 : 유클리드 거리

70 바이트

이 방법은 더 길지만 관심이있을 수 있습니다. 이 방법은 체스 판 중앙과 관심 셀 사이의 유클리드 거리를 확인하는 것입니다.

Which[(x=Sqrt@Tr[({3.5, 3.5}-#)^2])<2.2,8,x<3,6,x<4,4,x<4.6,3,x>4.6,2]&

예시

Which[(x=Sqrt@Tr[({3.5, 3.5}-#)^2])<2.2,8,x<3,6,x<4,4,x<4.6,3,x>4.6,2]&@{0, 0}
Which[(x=Sqrt@Tr[({3.5, 3.5}-#)^2])<2.2,8,x<3,6,x<4,4,x<4.6,3,x>4.6,2]&@{3, 3}

2

8


체스 판 중앙으로부터의 거리가 값을 할당하기에 얼마나 충분한지를 시각화합니다.

values={{2,3,4,4,4,4,3,2},{3,4,6,6,6,6,4,3},{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{4,6,8,8,8,8,6,4},{3,4,6,6,6,6,4,3},{2,3,4,4,4,4,3,2}};
f[x_]:=Text[x,#]&/@Position[values,x]r_~w~p_:=RegionMember[{3.5`,3.5`}~Disk~r,p]
h@y_:=Which[2.2~w~y,8,3~w~y,6,4~w~y,4,4.6~w~y,3,2<3,2]

Graphics[{Circle[{4.5, 4.5}, 2.3], Circle[{4.5, 4.5}, 3], 

서클 [{4.5, 4.5}, 4],

원 [{4.5, 4.5}, 4.6], Flatten [f / @ {2, 3, 4, 6, 8}, 1]}, 도끼-> 참, 도끼 오리진-> {-1, -1}]


숫자 2.2, 3, 4 및 4.6은 원의 반지름입니다.

영상


1
훌륭한 투어 그래프
스타 코더

20
KnightTourGraphMathematica와 그 내장 ... :-)
Luis Mendo 2016 년

#소스 코드 끝 부분에 오류 가 있다고 생각 합니다 ( ]. 그래도 IncidenceList대신 사용할 수 있어야합니다 EdgeList@NeighborhoodGraph. (또는 대안도 EdgeCount있지만 결국 더 길어질 것 같습니다.)
Martin Ender

1
아 잠깐만 요, 실제로 짧아요 :EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
Martin Ender

EdgeCount매우 멋지다!
DavidC

12

자바 스크립트 (ES6), 38 바이트

(x,y)=>+"23468"[((7-x)*x+(7-y)*y)/5|0]

0 인덱스 입력을받습니다. 설명 : 중심까지의 거리의 제곱을보십시오.

24.5 18.5 14.5 12.5 12.5 14.5 18.5 24.5
18.5 12.5  8.5  6.5  6.5  8.5 12.5 18.5
14.5  8.5  4.5  2.5  2.5  4.5  8.5 14.5
12.5  6.5  2.5  0.5  0.5  2.5  6.5 12.5
12.5  6.5  2.5  0.5  0.5  2.5  6.5 12.5
14.5  8.5  4.5  2.5  2.5  4.5  8.5 14.5
18.5 12.5  8.5  6.5  6.5  8.5 12.5 18.5
24.5 18.5 14.5 12.5 12.5 14.5 18.5 24.5

도달 가능한 사각형의 수는 5 개의 밴드로 나뉩니다.

8    0-5
6    5-10
4   10-15
3   15-20
2   20-25

실제로 24.5-(3.5-x) ** 2-(3.5-y) ** 2 = (7-x) * x + (7-y) * y는 더 짧은 계산이기 때문에 역순입니다. 밴드의 순서.


매우 간결하고 훌륭한 접근 방식이므로 더 이상 내 JS 솔루션을 시작할 필요가 없습니다. :)
starcorder

반지름의 제곱에 해당하는 수식에 대한 좋은 점입니다. 나는 x*(7-x)아래로 향하는 아크처럼 보이고 0..7곡선에 맞는 동작 이라고 생각 했지만, xand에 합산했을 때 왜 그렇게 멋진 패턴을 생성하는지 설명합니다 y.
xnor

11

젤리, 10 바이트

8ṗ2_³²S€ċ5

1- 색인. 형식의 단일 인수를 취합니다 [x,y]. 여기에서 시도하십시오.

8ṗ2          Cartesian square [[1,1],[1,2]…[8,8]]
   _³        Subtract the input
     ²S€     Compute the norm of each vector
        ċ5   Count fives

데니스는 바이트를 저장했습니다!


그냥 11 바이트, 와우!
starcorder

아침 에이 질문을 보았으며 시간이있을 때 Jelly에서 구현할 것이라고 생각한 정확한 알고리즘입니다. : P
PurkkaKoodari

8

매스 매 티카, 44 40 바이트

현재 동일한 바이트 수로 세 가지 솔루션이 있습니다.

2[3,4,6,8][[Tr@⌊3.2-.8Abs[#-4.5]⌋]]&
Tr@⌈.85(4-Abs[#-4.5])⌉/.{5->6,6->8}&
⌊Tr@⌈.85(4-Abs[#-4.5])⌉^1.1608⌋&

이것들은 {3, 4}모두 1 기반의 와 같은 좌표 쌍을 취하는 명명되지 않은 함수입니다 .

나는 다소 명백한 공식을 생각해 보았습니다. 전체 보드의 일반적인 패턴은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

해당 색상의 실제 값 (가장 밝음에서 가장 어둡게)은 2, 3, 4, 6, 8입니다. 그건:

2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

먼저 원점을 중심으로 이동하여 절대 값을 취하고에서 결과를 빼서 대칭을 이용합니다 4. 이를 통해 각 코너에서 증가하는 좌표 0.5를 얻을 수 3.5있습니다. 중심을 만들기 위해 우리는 매핑 할 필요가 같은 좌표 0.51.5다른 값과 2.53.5같은 값으로. 이것은 0.8(gives {0.4, 1.2, 2., 2.8}) 를 곱하고 결과를 바닥 으로 만들어 쉽게 수행 할 수 있습니다. 이제 우리는 {0, 1, 2, 2}중심에서 멀어졌습니다. 각 셀에 좌표를 합하면 다음 표가 나타납니다.

0 1 2 2 2 2 1 0
1 2 3 3 3 3 2 1
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
2 3 4 4 4 4 3 2
1 2 3 3 3 3 2 1
0 1 2 2 2 2 1 0

여기에는 가능한 모든 결과에 대해 고유 한 값이 있으므로에 대한 색인으로 간단히 사용합니다 2[3,4,6,8].

두 번째 버전에서는 천장 대신 천장을 사용합니다. 이 방법은 2, 3그리고 4이미 정확하지만, 우리는 얻을 수 56대신 6하고 8, 그래서 우리는 수동으로 대체 규칙들을 수정합니다.

마지막으로 세 번째 버전에서, 우리는 연장 5하고 6위쪽 68다른 층 조작 하였다 지수의 수단에 의해.


나는 보드의 일반적인 패턴을 사용하는 접근법을 매우 좋아합니다.
starcorder

6

APL, 21 자

{+/,5=+/¨×⍨(⍳8 8)-⊂⍵}

영어로:

  • (⍳8 8): 모든 셀의 좌표를 포함하는 8x8 rank-2 배열;
  • +/¨×⍨(⍳8 8)-⊂⍵: 보드의 모든 셀에 대한 주어진 셀의 유클리드 거리의 제곱;
  • 5=: 0/1의 행렬. 여기서 1은 5와 같은 제곱 거리에 나타납니다.
  • +/,: 평탄화 행렬 합

테스트 (원점 1) :

    f←{+/,5=+/¨×⍨(⍳8 8)-⊂⍵}
    f¨1+(3 4)(4 6)(7 7)(1 0)
8 6 2 3

이 형태로 :

f←{+/,5=+/¨×⍨(⍳⍺)-⊂⍵}

왼쪽 인수는 보드의 크기를 지정할 수 있습니다. 따라서 8 8 f표준 사각형 체스 판에서 작동합니다. 그러나 더 큰 직사각형 보드에서는 테스트 사례가 다른 결과를 낳습니다. 예를 들어 12x10 보드에서 :

    g←(10 12)∘f
    g¨1+(3 4)(4 6)(7 7)(1 0)
8 8 8 3

APL 전문 용어에서 행렬은 순위 2의 배열이며 셀의 내용에 대해서는 언급되지 않았습니다. 몇 년 동안 (ab)이 용어를 사용했을 때 나는 그것에 대해 무관심했다. 좀 더 전통적으로 기울어 진 독자들의 설명을 업데이트하겠습니다. 감사합니다.
lstefano

"차원 수"로 "순위"의 사용 @Istefano 같은 고통의 P는 고통 보인다
루이스 Mendo

내가 ... 당신이 맞아요! Linear Algebra를 복용 한 지 오래 된 것을 알 수 있습니다. 나는 포기 :-)
lstefano

1
전체 프로그램, 27 : ≢⍸5=+/¨×⍨-∘⎕¨⍳8 8 온라인으로 사용해보십시오!
Adám

@ Adám은 17을 의미합니다
ngn

6

자바 - 160 150 바이트

int m(int r,int c){int m=0,i,j;for(i=0;i<3;i+=2)for(j=0;j<3;j+=2){m+=r+i>0&r+i<9&c+2*j>1&c+2*j<11?1:0;m+=r+2*i>1&r+2*i<11&c+j>0&c+j<9?1:0;}return m;}

언 골프 드 :

public static int m(int r, int c) {
    int m=0;
    for(int i=-1;i<2;i+=2)
        for(int j=-1;j<2;j+=2){
            m += r+i>-1 && r+i<8 && c+2*j>0 && c+2*j<8 ? 1:0;
            m += r+2*i>0 && r+2*i<8 && c+j>1 && c+j<8 ? 1:0;
        }
    return m;
}

ungolfed 코드는 4 바이트를 저장하기 위해 for 루프의 경계를 변경하는 것을 제외하고 동일합니다. 가능한 각 이동을 반복하고 범위 검사 (> 0 및 <8)를 수행하여 작동합니다. 오프셋이 (1, 2), (2, 1), (-1, 2), (-2, 1) 등이라는 사실을 사용하며 i 및 j의 각 값에 대해 2 개의 이동을 확인할 수 있습니다.

편집 : Leaky Nun 및 u902383의 제안 덕분에 10 바이트가 절약되었습니다.


이것도 빠르고 좋았습니다!
starcorder

거기에 오류가 있었으므로 수정되었습니다.
ejaszewski

1
int m=0,i=-1,j;바이트를 절약하려면
Leaky Nun

1
논리 AND를 비트 AND로 변경하면 추가로 6자를 제거 할 수 있습니다.
user902383

6

C, 44 바이트

f(x,y){return "23468"[((7-x)*x+(7-y)*y)/5];}

그러나 이것은 더 낫습니다 :

f(x,y){return "2344443234666643468888644688886446888864468888643466664323444432"[x*8+y];}

1
누락되었습니다 ;. 컴파일하지 않습니다.
ugoren


1
스 니펫이 아니며 함수이며 금지 된 게시물 기능이 아닙니다. 세미콜론이 누락되어 죄송합니다. 결정된.
Giacomo Garabello 2016 년

5

하스켈, 49 48 바이트

w=[0..7]
x%y=sum[1|a<-w,b<-w,(a-x)^2+(b-y)^2==5]

1
[0..7]1 바이트의 변수에 저장할 수 있습니다 .
xnor

5

Java, 81 자 (113 바이트)

int r(int a,int b){return "⍄䐲㑦晃䚈衤䚈衤䚈衤䚈衤㑦晃⍄䐲".codePointAt(a*2+b/4)>>(3-b%4)*4&15;}

전체 결과 테이블을 유니 코드 테이블로 인코딩 한 다음 비트 단위 연산을 수행하는 적절한 바이트를 가져옵니다.

https://ideone.com/K9BojC에서 온라인으로 볼 수 있습니다.






1

실제로 18 바이트

`;7-2km`MΣ8-:50\¬¬

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

이것은 다른 많은 답변들이 사용했던 것과 같은 공식을 구현합니다 : 50/(8-x*(7-x)//5+y*(7-y))//5)-4. 입력은 목록으로 취해진 다 : [x,y](또는 파이썬에서 반복 가능한 리터럴, (x,y)또는 x,y).

설명:

`;7-2km`MΣ8-:50\¬¬
`;7-2km`M           for each value in input:
 ;7-                  make a copy, subtract from 7
    2                 push 2
     km               minimum of the three values (x, 7-x, 2)
         Σ          sum
          8-        subtract from 8
            :50\    integer divide 50 by the value
                ¬¬  subtract 2 twice

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.