팩맨이 팩 도트를 세도록 도와주세요


29

과체중이 걱정되는 Pac-Man의 조언에 따라 Pac-Man은 매일 Pac-Dot 섭취량을 추적하기로 결정했습니다. 미로에서 주어진 길에 Pac-Dots의 수를 세도록 도와주세요!

미로

미로

미로의 자체 인코딩을 구축하려면 여기에서 원시 데이터를 얻을있습니다 .

팩맨 여행

이 문제와 관련하여 다음 규칙이 적용됩니다.

  • 첫째, 좋은 소식은 귀신이 없다는 것입니다.
  • 팩맨은 항상 동쪽으로 향하는 위의 그림에 표시된 위치에서 레이스를 시작합니다. 시작 위치에 Pac-Dot이 없습니다.
  • 그가 직선 경로를 따르는 한 계속해서 다음 사각형으로 진행합니다.
  • 그가 발견 한 경우 90 ° 회전 가능한 다른 경로없이 (지도 오렌지 사각형), 그는 자동으로 체계적으로 회전을합니다.
  • 여러 경로를 사용할 수 있는 교차로 (지도의 녹색 사각형)가있는 경우 같은 방향으로 계속 (해당되는 경우) 계속하거나 다른 방향을 선택할 수 있습니다 (U 턴 포함).
  • 팩맨은 미로의 왼쪽 중앙 또는 오른쪽 중앙에있는 출구 중 하나를 통과하면 즉시 반대편에 다시 나타납니다.
  • 팩맨은 자신이 따르는 경로에서 팩 팩 도트를 모두 먹는다. Pac-Dot를 먹으면 미로에서 제거됩니다.

도전

입력

Pac-Man의 정션에 대한 팩맨의 행동을 설명하는 문자열이 제공됩니다. 이 문자열은 다음 문자로 구성됩니다.

  • L: 왼쪽으로 90 ° 회전
  • R: 오른쪽으로 90도 회전
  • F: 앞으로 이동 (방향 변경 없음)
  • B: 뒤로 이동 (U 턴)

모든 캐릭터가 처리되면 Pac-Man은 다음 번 만나는 지점에서 멈 춥니 다.

산출

입력 경로를 따라 먹는 Pac-Dots의 수를 인쇄하거나 출력해야합니다.

규칙

  • 전체 프로그램이나 함수를 작성할 수 있습니다.
  • 문자열 또는 문자 배열로 대문자 또는 소문자를 입력 할 수 있습니다. 에서 다른 문자 (방향 당 한 문자 만) 또는 정수를 사용할 수도 있습니다 [0 .. 9]. 그렇게 할 경우 답을 명확하게 지정하십시오.
  • 입력이 항상 유효하다고 가정 할 수 있습니다. (아래의 jsFiddle은 오류를 감지하지만 그렇지는 않습니다.)
  • 이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다.
  • 표준 허점은 금지되어 있습니다.

힌트

미로의 정확한 모양을 저장하는 것이 필요하거나 최적이 아닐 수도 있습니다.

테스트 사례 및 데모

이 jsFiddle에서 다음 테스트 케이스 또는 기타 입력을 테스트 할 수 있습니다 .

1. Input  : ""
   Output : 1
   Comment: Pac-Man just advances to the first junction, eats the Pac-Dot on it and stops.

2. Input  : "L"
   Output : 7

3. Input  : "FFR"
   Output : 13

4. Input  : "LFLR"
   Output : 17
   Comment: Pac-Man will exit on the middle right side and re-appear on the left side.

5. Input  : "BBBB"
   Output : 2

6. Input  : "BRRFFFL"
   Output : 15

7. Input  : "LFFRLFFFFRF"
   Output : 50

8. Input  : "BRFRLRFRLFR"
   Output : 54
   Comment: Pac-Man will exit on the middle left side and re-appear on the right side.

9. Input  : "FFLRLFFLLLLFFBFLFLRRRLRRFRFLRLFFFLFLLLLFRRFBRLLLFBLFFLBFRLLR"
   Output : 244
   Comment: All cleared!

1
여기에 도움이되는 몇 가지 더 많은 데이터를 다음과 같습니다 pastebin.com/G4MnbVww . 그것은 당신이가는 방향 (0 = 위, 1 = 왼쪽, 2 = 아래, 3 = 오른쪽)에 따라 다음 교차점으로가는 길의 모든 접점과 pac-dot의 목록입니다. 일부 오류가있을 수 있으며 정션 12, 13, 15, 16, 18 및 19는 중간에 점이 없지만 다른 모든 점은 점에 유의하십시오.
Esolanging 과일

@ Challenger5 이것은 좋아 보인다. 움직임은 상대적이기 때문에 다음 접합에 도달했을 때 Pac-Man의 새로운 방향을 추적하고 싶을 것입니다.
Arnauld

BTW 게임에서 pac man은 u 턴을 할 수 없습니다
Matthew Roh

4
@SIGSEGV 'u-turn'은 반대 방향으로 바꾸는 것을 의미합니다. 원래 아케이드 게임과 내가 아는 모든 클론에서 언제든지 가능합니다. 다른 용어를 사용해야합니까?
Arnauld

나는 Pac-Man이 아케이드 게임에서 왼쪽이 아닌 오른쪽으로 향하기 시작했다고 확신합니다.
mbomb007

답변:


10

Pyth, 356 345 + 1 = 346 바이트

이 코드에는 인쇄 할 수없는 일부가 포함되어 있으므로 뒤집을 수있는 xxd16 진 덤프가 있습니다.

0000000: 4a4b 304c 2c3d 2b4b 4062 4a58 624a 3041  JK0L,=+K@bJXbJ0A
0000010: 2c63 6a43 2201 e120 49b4 efbc e267 27f4  ,cjC".. I....g'.
0000020: a11b f5d5 7f79 d1a0 ab8a 7689 449f 0c50  .....y....v.D..P
0000030: b2d4 7c30 99c3 368e aa67 4213 ab9b d276  ..|0..6..gB....v
0000040: d75f 6e99 5757 04a6 08cc 99d0 7141 3d2f  ._n.WW......qA=/
0000050: d854 7cf7 4a70 954e 6e35 f9b9 e0c5 1d53  .T|.Jp.Nn5.....S
0000060: 36d5 63f9 cf13 0f66 c113 4dec 956e 5225  6.c....f..M..nR%
0000070: b14a 1659 dcb5 6822 3534 2034 6a43 2203  .J.Y..h"54 4jC".
0000080: ffe3 8fff 2232 3d59 636a 4322 0b8a 4624  ...."2=YcjC"..F$
0000090: 7815 4a94 192c 79f6 d6e5 e098 5e97 76bc  x.J..,y.....^.v.
00000a0: 23cf 027c 35c5 5098 2a83 68f1 823a 83f6  #..|5.P.*.h..:..
00000b0: dfa4 7e12 443f 0257 7adb ab2d 8e6f 1199  ..~.D?.Wz..-.o..
00000c0: 9a3e 3f9d a524 d331 c5ff 94ae e5a2 3507  .>?..$.1......5.
00000d0: bd22 3334 2032 3d6b 2b30 6a43 2202 25f2  ."34 2=k+0jC".%.
00000e0: f55c 2252 c250 0002 c250 0000 065c 225c  .\"R.P...P...\"\
00000f0: 2247 5289 3698 4227 5350 8822 3136 3d64  "GR.6.B'SP."16=d
0000100: 636a 4322 8223 a80e 5c22 981d d272 729d  cjC".#..\"...rr.
0000110: d88d 981d 5c22 5c22 2bd7 91dd 9428 73d7  ....\"\"+....(s.
0000120: 1dd7 2234 2032 5651 2079 483d 547e 4a40  .."4 2VQ yH=T~J@
0000130: 4047 4a2b 5a78 2246 5242 4c22 4e20 796b  @GJ+Zx"FRBL"N yk
0000140: 3d5a 4040 647e 4a40 4059 4a3d 5421 7840  =Z@@d~J@@YJ=T!x@
0000150: 594a 5454 2968 7948 0a                   YJTT)hyH.

-M메모를 비활성화 하려면 플래그가 필요합니다 . 불행히도 이것은 내가 아는 온라인 유언 집행 인에서는 할 수 없습니다.

읽을 수있는 인쇄 가능한 ASCII 버전 은 다음과 같습니다 .

JK0L,=+K@bJXbJ0A,cj746957013238413906925468440008893181365431681519974815772691846219267045007717553452313017550830370829477591340658010575885616582299429376501117428763541235628345630376341520044712982918668584832091126800263024965443560007480163218792 54 4j17178005503 2=Ycj664551201217474826979459068682259492333017695780569003557724234375880492114440213266014621594427584622393511454741615093293082181365458295035985321888753898774398909 34 2=k+0j883734055588186287049718559289059922762611092840989558085734536 16=dcj53536195844172273707047543644202986760006840011986146398708374999 4 2VQ yH=T~J@@GJ+Zx"FRBL"N yk=Z@@d~J@@YJ=T!x@YJTT)hyH

설명

이것은 진행중인 작업이므로 아직 완전한 설명을 게시하지는 않습니다.

기본적으로이 프로그램은 보드를 5 개의 조회 테이블 (연결 용 2 개, 접합 방향 용 1 개, 도트 수용 2 개)을 사용하여 (이상한 이상한) 그래프로 나타냅니다. 이것은 너무 많은 시간을 보낸 200 줄 파이썬 스크립트로 작성되었습니다. 그런 다음 프로그램은 입력을 통과하고 점을 계산하여 점이 수집 될 때 점 테이블을 0으로 업데이트합니다.

할 것:

  • 조회 테이블에 가능한 한 이스케이프 문자가 거의 없을 때까지 노드를 재정렬하는 Python 루틴을 작성하십시오.
  • 섹션 처리를 완전히 제거하십시오 (조회 테이블 하나를 제거해야 함)
    • 업데이트 : 이것을 시도했지만 테이블을 제거하지 않고 코드를 길게하는 것 같습니다.
  • Pyth 측 논리를 다시 작성하십시오 (현재는 골퍼가 아닙니다)
    • 업데이트 : 다소 완료, 코드는 여전히 불완전합니다.

TIO에서 실제 코드를 실행할 수 있도록 URL을 생성하지 않는 이유는 무엇입니까? 아마도 Dennis는 더 쉬운 방법을 추가해야 할 것입니다.
mbomb007

@ mbomb007 TIO는 테스트 스위트 (Pyth, 어쨌든)를 지원하지 않으므로 Pyth의 자체 호스트를 사용하고 싶습니다. 또한 null 바이트를 올바르게 처리하는 브라우저에 대해서는 확신이 없습니다.
PurkkaKoodari

테스트되지 않은 제품군의 경우 가능합니다. 그리고 여전히 null로 코딩 할 수 있으며 복사 / 붙여 넣기 만 할 수 없으므로 URL을 생성해야합니다.
mbomb007

가장 긴 Pyth 답변?
Luis Mendo

@LuisMendo 최소한 빠른 검색을 기반으로합니다. : ~)
PurkkaKoodari

2

k, 264 바이트

b:,/16 16\'108_a:-135#0+1:"p.k"
(#(?27,r 1)^(12+!8)^14 17)+/b@?*|r:+1 27 0{i:a?64/(4!2+y+*x;x 1);(4 64\a i+1-2*2!i),_i%2}\0:""
\
...binary data...

육각 덤프 :

$ xxd p.k
00000000: 623a 2c2f 3136 2031 365c 2731 3038 5f61  b:,/16 16\'108_a
00000010: 3a2d 3133 3523 302b 313a 2270 2e6b 220a  :-135#0+1:"p.k".
00000020: 2823 283f 3237 2c72 2031 295e 2831 322b  (#(?27,r 1)^(12+
00000030: 2138 295e 3134 2031 3729 2b2f 6240 3f2a  !8)^14 17)+/b@?*
00000040: 7c72 3a2b 3120 3237 2030 7b69 3a61 3f36  |r:+1 27 0{i:a?6
00000050: 342f 2834 2132 2b79 2b2a 783b 7820 3129  4/(4!2+y+*x;x 1)
00000060: 3b28 3420 3634 5c61 2069 2b31 2d32 2a32  ;(4 64\a i+1-2*2
00000070: 2169 292c 5f69 2532 7d5c 303a 2222 0a5c  !i),_i%2}\0:"".\
00000080: 0a02 4005 c006 4109 c103 8008 8143 c244  ..@...A......C.D
00000090: c345 c446 c547 c648 c749 c84a 820a 830c  .E.F.G.H.I.J....
000000a0: 840d 870b 8889 cb0e 8a11 8b0f 4c4d cc10  ............LM..
000000b0: cd4e d14f ce51 d014 8e12 8f13 9017 9153  .N.O.Q.........S
000000c0: d215 9216 931e 5455 d41a d51b 5657 d61f  ......TU....VW..
000000d0: d718 941d 9759 d85a d95b da5c db5d dc98  .....Y.Z.[.\.]..
000000e0: de20 9921 9c5f 9d5e 60df e161 e089 9833  . .!._.^`..a...3
000000f0: 4222 2247 2662 7550 0000 0500 5000 c255  B""G&buP....P..U
00000100: 2c22 2202 2588 5ff2                      ,"".%._.

끝에 이진 데이터는 두 개의 배열을 인코딩합니다.

  • a 바이트 쌍으로 구성되며 각각은 (64 * direction) + junctionId를 나타냅니다.

  • b 각 접점 쌍 사이의 팩맨 도트 수 a

프로그램은 자체 소스 파일 ( p.k)을 읽고 데이터를 디코딩합니다.

입력은 stdin에서 가져오고 FLBR 대신 0x00,0x01,0x02,0x03 (일명 NUL, SOH, STX, ETX-첫 네 개의 ASCII 코드)을 사용합니다.

나는 실제 구현에 비해 제한적이고 부풀어 오르고 충돌하며 느린 k의 자체 구현을 사용 합니다. 다음 프로그램으로 테스트합니다.

t:{e:($y),"\n"; a:`sys[("/path/to/k";"./p.k");`c$"FLBR"?x]
   1@$[a~e;"ok\n";"failed ",x,"\n expected: ",e," actual: ",a,"\n"];}
t["";1]
t[,"L";7]
t["FFR";13]
t["LFLR";17]
t["BBBB";2]
t["BRRFFFL";15]
t["LFFRLFFFFRF";50]
t["BRFRLRFRLFR";54]
t["FFLRLFFLLLLFFBFLFLRRRLRRFRFLRLFFFLFLLLLFRRFBRLLLFBLFFLBFRLLR";244]
\

Linux 용 인터프리터 (죄송합니다, Windows가 아님)를 컴파일하고 여기에 테스트를 실행하는 데 필요한 파일을 넣었습니다. github.com/ngn/tmp 파일을 실행 하려면 다음을 입력하십시오. ./k tk pk : github.com/ngn/tmp/blob/master/pk?raw=true
ngn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.