잃어버린 폰 문제


14

잃어버린 폰 문제

체스 게임이 끝난 후 살아남은 폰이 적의 선 뒤에 남았습니다. 집으로 돌아가는 가장 짧은 길을 찾도록 도와주세요.

원래 문제는 nXn "체스"보드와 f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+무게 의 기능 을 설명합니다 . 목표는 왼손, 오른손, 오른손, 왼쪽으로 올라가서 왼쪽으로 올라갈 수있는 가장 좋은 길을 찾는 것입니다.

동적 프로그래밍을 사용하여 O (n ^ 2)에서 문제를 해결하는 것은 비교적 쉽지만 이것은 코드 골프이며 실행 시간 복잡성과 같은 쓸모없는 것들에 대해서는 신경 쓰지 않습니다.

문제

입력 : 일반 체스 보드에 해당하는 3 차원 배열 (또는 선택한 다른 컬렉션, stdin을 통해 받거나 함수 인수로) : 정확히 7X8X3 (#linePasses X #rowSize X #movesPerPass) 음이 아닌 정수 움직임 비용 에서 어떤 위치 행 인덱스이며, 이고, 열 인덱스이다 :(i,j)ij

  • a[i][j][0]왼쪽에서 정사각형 (i+1,j-1)또는 그래픽 으로 이동하는 비용 : \.
  • a[i][j][1]비용을 정사각형 (i+1,j)또는 그래픽 으로 여행하는 경우 : |.
  • a[i][j][2]오른쪽에서 정사각형 (i+1,j+1)또는 그래픽 으로 이동하는 비용 : /.

보다 큰 경로를 포함하지 않는다고 가정 할 수 있습니다 MAX_INT.

출력 : 최상의 (가장 짧은, 즉 최소 가중치 합계) 경로를 나타내는 8X8 ASCII 출력 (최적의 결과가 둘 이상인 경우 원하는 임의의 경로를 표시 할 수 있음). 패스는 아래에서 위로 그려지며, 각 라인에서 패스에서 폰의 위치에 해당하는 캐릭터가 만들어 질 캐릭터입니다. 예를 들어, 폰이 3 열에서 2 열로 왼쪽 위로 이동하려는 경우 다음을 그려야합니다.

#?######
##\#####

여기서 ?다음 이동으로 대체해야합니다. 최종 위치는로 그려 져야합니다 X.

입력:

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

산출:

##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####

입력:

[
  [[41,27,38],[12,83,32],[50,53,35],[46,32,26],[55,89,82],[75,30,87],[2,11,64],[8,55,22]],
  [[56,21,0],[83,25,38],[43,75,63],[56,60,77],[68,55,89],[99,48,67],[94,30,9],[62,62,58]],
  [[23,18,40],[24,47,61],[96,45,72],[71,6,48],[75,63,98],[93,56,51],[23,31,30],[49,34,99]],
  [[20,47,42],[62,79,72],[32,28,44],[68,61,55],[62,39,57],[4,17,49],[97,85,6],[91,18,12]],
  [[51,50,11],[32,39,56],[12,82,23],[33,88,87],[60,55,22],[29,78,14],[70,11,42],[63,94,67]],
  [[75,64,60],[27,79,86],[70,72,56],[55,45,32],[95,67,12],[87,93,98],[81,36,53],[38,22,93]],
  [[31,80,50],[77,71,22],[59,46,86],[64,71,53],[41,19,95],[62,71,22],[92,80,41],[26,74,29]]
]

산출:

######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\

이것은 이므로 가장 짧은 코드가 승리합니다.

정정당당하게 경기하다. 허점 없음 ...

편집하다:

나는 당신이 볼 수 있는 스칼라에 골프가없는 직선형 솔루션을 작성 했습니다. :이 당신이 온라인 스칼라 코드와 함께 재생할 수있는 사이트이기도 scalakata (scalakata 그냥 복사 & 붙여 넣기 요점은, 및 재생 버튼을 누르면)

답변:


5

Q : 199 바이트

f:{m::x;n::{@/[+/-1 0 1_\:/:(x;m[y;;|!3]);0 2;(0W,),{x,0W}]};i:*<*|r:{&/n[x;y]}\[8#0;!7];  s:{-1+{*<x}'+n[y;z]}\[();(,8#0),-1_r;!7];j:i,{x+y x}\[i;|s];-1(@[8#"#";;:;]'[j;"X","/|\\"1+s'[|!7;-1_j]]);}

노트

  • 비상업적 용도로 사용할 수없는 Q 인터프리터 (kx.com) (Windows, Linux, Mac 버전)
  • 이 솔루션은 Q의 내부 코어 (내부적으로 k4)를 사용하므로 k 확장자를 가진 스크립팅 파일 또는 k 모드의 대화식 인터프리터 (첫 번째 프롬프트에서 \ 명령)가 필요합니다. 반대로 'verbose'(읽기 쉬운) 버전의 언어에는 q 확장자를 가진 스크립트가 필요하며 대화식 인터프리터의 기본 모드입니다.

테스트

f ((1 1 1; 1 1 1; 0 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 0 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 0; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 0; 1 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 1; 1 0 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 1; 1 0 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1)
   (1 1 1; 1 1 1; 1 1 1; 0 1 1; 1 1 1; 1 1 1; 1 1 1; 1 1 1))

##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####

f ((41 27 38; 12 83 32; 50 53 35; 46 32 26; 55 89 82; 75 30 87;  2 11 64;  8 55 22)
   (56 21  0; 83 25 38; 43 75 63; 56 60 77; 68 55 89; 99 48 67; 94 30  9; 62 62 58)
   (23 18 40; 24 47 61; 96 45 72; 71  6 48; 75 63 98; 93 56 51; 23 31 30; 49 34 99)
   (20 47 42; 62 79 72; 32 28 44; 68 61 55; 62 39 57;  4 17 49; 97 85  6; 91 18 12)
   (51 50 11; 32 39 56; 12 82 23; 33 88 87; 60 55 22; 29 78 14; 70 11 42; 63 94 67)
   (75 64 60; 27 79 86; 70 72 56; 55 45 32; 95 67 12; 87 93 98; 81 36 53; 38 22 93)
   (31 80 50; 77 71 22; 59 46 86; 64 71 53; 41 19 95; 62 71 22; 92 80 41; 26 74 29))

######X#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

설명

설명을 위해 두 번째 테스트 (매트릭스 ((41 27 38; 12 83 32; ....))를 가정합니다.

우리는 원래 행렬 (코드 레벨에서 m)을 변환합니다 : 각 좌표에 대해 삼중 항이있는 원래 matriz 대신 왼쪽, 위쪽 및 오른쪽 변위에 대한 행렬을 정의합니다. 왼쪽 행렬에는 7x7 값 (첫 번째 열 삭제), 위쪽 행렬 7x8 및 오른쪽 행렬 7x7 (마지막 열 축소)이 포함됩니다.

left                           up                         right
12 50 46 55 75 2  8       27 83 53 32 89 30 11 55     38 32 35 26 82 87 64
83 43 56 68 99 94 62      21 25 75 60 55 48 30 62     0  38 63 77 89 67 9 
24 96 71 75 93 23 49      18 47 45 6  63 56 31 34     40 61 72 48 98 51 30
62 32 68 62 4  97 91      47 79 28 61 39 17 85 18     42 72 44 55 57 49 6 
32 12 33 60 29 70 63      50 39 82 88 55 78 11 94     11 56 23 87 22 14 42
27 70 55 95 87 81 38      64 79 72 45 67 93 36 22     60 86 56 32 12 98 53
77 59 64 41 62 92 26      80 71 46 71 19 71 80 74     50 22 86 53 95 22 41

최종 게재 순위를 계산하려면 최소 비용 경로를 평가해야합니다. 초기 비용 0 0 0 0 0 0 0 (첫 번째 행의 각 열에 도달하는 비용)을 가정하고 다음 행마다 반복합니다. 각 열 i에서 세 가지 값을 계산합니다.

  • 이전 i + 1 값 + 왼쪽 [i + 1]의 비용. 비용의 첫 번째 구성 요소를 제거하고 (추가 할 열을 이동 및 정렬) 구성 요소에 구성 요소를 합산합니다.

  • 이전의 i 값에 더한 비용 [i]. 성분을 성분에 합한다

  • 이전 i-1 값에 오른쪽 비용 [i-1]. 비용의 마지막 구성 요소를 삭제 (추가 할 열을 이동 및 정렬)하고 구성 요소를 구성 요소에 합산

최소값을 계산하기 위해 무한과 오른쪽 비용을 앞에 추가하여 왼쪽 비용을 완성합니다. 8 개의 성분으로 구성된 3 개의 벡터로 최소 성분을 계산합니다. 결과 값은 새 반복의 기본 비용입니다.

첫 번째 반복의 경우 값을 얻습니다 (0에서 0은 무한)

0W 12 50 46 55 75 2  8
27 83 53 32 89 30 11 55
38 32 35 26 82 87 64 0W

각 열의 최소값을 계산합니다.

27 12 35 26 55 30 2 8

모든 반복 후에 각 사각형에 도달하는 최소 비용이 있습니다 (행 0은 맨 위, 7은 맨 아래). 우리는 마지막 열에 만 관심이 있지만 설명을 목적으로 모든 중간 결과를 그립니다.

0   0   0   0   0   0   0   0
27  12  35  26  55  30  2   8
27  37  78  82  110 78  11  70
45  61  123 88  173 129 34  104
87  123 151 143 212 133 40  122
98  155 163 176 234 147 51  185
158 182 219 208 246 234 87  207
208 204 265 261 265 256 128 233

이제 마지막 행 (128, 6 열)에서 최소값을 찾았습니다. 이것이 경로의 끝입니다 (출력의 X 문자).

비용 계산을 다시 반복하지만 이제 각 최소값을 얻은 방향에 주석을 답니다 (최소값을 계산하는 데 사용되는 3 개 값 중 선택된 값이 선택됨).

\|/|\///
\\\\\/|/
\\\|//|/
\\|\//|/
\\|//|\/
\\//|\|/
\|/|/|\/

우리는 행을 뒤집고 pos 6에 'X'를 넣고 열 6에서 끝나는 경로 만 유지합니다 (다른 것은 #으로 대체됩니다)

######X#
#####/##
####/###
#####\##
######\#
######|#
######|#
#######\

Iv'e는 Q 들어,하지만 결코 :) 같은 자세한 응답을 주셔서 감사합니다
길 라드 호크
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.