미세 중력 공


33

당신은 고급 은하 간 우주 정거장에 있습니다. Study of Gravity에서 미성년자 친구가 공을 움직일 수있는 방법으로 미세 중력을 사용하는 게임을 만들었습니다.

그녀는 네 개의 방향 화살표가있는 작은 컨트롤러와 공이 왼쪽에있는 미로와 같은 구조를 건네줍니다. 그녀는 게임이 어떻게 작동하는지 설명하기 시작합니다.

  • 당신은 왼쪽 <과 오른쪽 두 개의 방향 버튼이 있습니다 >.
  • 또한 ^위와 아래에 2 개의 중력 버튼이 있습니다 v(적어도 기준 프레임에서)
  • 이 화살표 버튼을 사용하여 화면에서 공을 움직입니다.

"이제 따라야 할 몇 가지 규칙이 있습니다." 그녀는 말한다

  1. 컵에 닿기 전에 모든 플랫폼을 통과해야합니다. \ /
  2. 화살표 < > ^ v는 공의 움직임을 지정하는 데 사용됩니다
  3. 중력은 ^ v(위와 아래)입니다. 이렇게하면 공이 그 방향으로 다음 플랫폼으로 끝까지 이동합니다. (거리는 위아래로 계산되지 않습니다)
  4. 공을 잃는 것은 나쁘다! 가장자리에 떨어지지 말고 공이 플랫폼에 닿지 않도록 너무 빨리 중력을 전환하지 마십시오
  5. 운동은 단계적으로 계산됩니다 < >
  6. 규칙 1을 따르는 한 공은 어느 방향에서나 컵에 들어갈 수 있습니다.
  7. 공이 떠오르지 않도록 무게 방향을 지정해야합니다
  8. 규칙 1과 규칙 4를 따르는 한 이동이 임의적 일 수 있습니다.
  9. 해결할 수없는 경우 False 또는 Invalid 출력

볼, 플랫폼 및 컵의 간단한 예 :

v
o
---\ /

v>

 o
---\ /

v>>

  o
---\ /

v>>>

   o
---\ /

v>>>>


---\o/

동일한 플랫폼을 다시 통과하는 예.

v    

 o
 ----

\ /-------

v>   

  o
 ----

\ /-------

v>>

   o
 ----

\ /-------

v>>>

    o
 ----

\ /-------

v>>>>


 ----
     o
\ /-------

v>>>>>


 ----
      o
\ /-------

v>>>>>>


 ----
       o
\ /-------

v>>>>>>>


 ----
        o
\ /-------

v>>>>>>>>


 ----
         o
\ /-------

v>>>>>>>><<<<<<<< # move all the way to the left to get to the cup


 ----

\o/-------

중력 전환의 예

v
   --/ \

o
----

v>
   --/ \

 o
----

v>>
   --/ \

  o
----

v>>>
   --/ \

   o
----

v>>>^
   --/ \
   o

----

v>>>^>
   --/ \
    o

----

v>>>^>>
   --/ \
     o

----

v>>>^>>>
   --/o\


----

태스크

당신의 임무는 과정의 ASCII 표현을 입력으로 취할 프로그램을 만드는 것입니다. 그리고 <>^voplatforms컵으로 옮기기 위해 방향과 중력을 나타내는 화살표 줄을 출력하십시오 .

표준 코드 골프 규칙 적용

테스트 사례

입력 (중력이 전환되는 상황)

         ----   --/ \
---    --
o

  ------    -----

산출

^>>v>>>>>^>>>>>v>>>>^>>>

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


입력 (방향이 전환되는 상황)

       ---
o   
----
    ---

     -----  

    --\ /

산출

v>>>>>>^>>>v<<<<<v>>>

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


입력 (같은 플랫폼을 두 번 횡단해야하는 상황)

 o
 ------

  ------

 ------ 

\ /------

산출

v>>>>>><<<<<<>>>>>>><<<<<<

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


나쁜 경우, 프로그램은 이것에 대해 거짓을 출력해야합니다

공이 다음 플랫폼에 도달 할 방법이 없습니다

o
--- ---

공이 우주로 떠올랐다

---
o
   ---

공이 컵에 닿지 만 모든 플랫폼이 통과하지 않는 상황.

o
----
    ----
        \ /----

4
규칙 1은 이것을 매우 어렵게 만듭니다 ... 흠 ...
JungHwan Min

퍼즐은 항상 풀 수 있습니까? 또한 역 추적이 필요한 테스트 사례를 포함해야한다고 생각합니다.
FryAmTheEggman

예, 퍼즐은 항상 풀 수 있어야합니다. 공을 잃는 틈이나 점프 또는 미로를 해결할 수없는 상황은 수행되지 않습니다.
tisaconundrum 4

4
@JungHwanMin 규칙 1은 이것이 까다로운 문제가 아닌 까다로운 이유입니다.
Outgolfer Erik

2
나는 codegolf 질문에 토끼 구멍을 지금까지 느낀 적이 없다
dj0wns

답변:


11

Pyth, 431 바이트

이것은 나의 첫 번째 Pyth 프로그램입니다 (실제로 이것은 코드 골프 언어로 된 첫 번째 프로그램입니다).

Jmmck\:cd\%c.Z"xÚU±Ã@DÅ W,J áDPáÒ­V`ýüw{g$ÍÀÞÇr§o.÷å8èÝÇr{øºy{~1åõ:noßÃú/.yçíäÂ'ëL¢êF¸èÆ\ka´QÒnÒ@tãÒÁµÆ¾õö»bÍH¥¦$¨%5Eyîÿ}ó§ûrh³oÄåËÄqõ XÔHû"\_KYDrGHFN@JGIn=bm:d.*NHHRb)RHDiNTR.turNG.tT;M:jH)hh@JG0DXGHN=Ti+3qG\^HI!},GTK aK,GT aY+eKNI&!g5T}\EjT)N.q;D(GHNT)INIqHhT=ZrGhtTInZhtTXHZ+eTN))).?I&nHhTgGhtTXHhtT+eTH; aK,di2i1r0.z aY+eKk#=N.(Y0(6\vkN)(7\^kN)(8\v\<N)(9\v\>N)(10\^\<N)(11\^\>N

여기에서 시도하십시오 (마지막 테스트 케이스가 너무 오래 필요하므로 로컬 Pyth 설치로 테스트해야합니다).

코드의 16 진 덤프 ( xxd -r <filename>디코딩에 사용 ) :

00000000: 4a6d 6d63 6b5c 3a63 645c 2563 2e5a 2278  Jmmck\:cd\%c.Z"x
00000010: da55 8eb1 8ac3 400c 447f c58d 2057 2c99  .U....@.D... W,.
00000020: 4aa0 e144 50e1 d2ad 5660 87fd 84fc 7f77  J..DP...V`.....w
00000030: 7b67 1f24 cdc0 8319 de1c c772 a76f 2ef7  {g.$.......r.o..
00000040: e538 e8dd c772 7bf8 9eba 797b 7e31 e5f5  .8...r{...y{~1..
00000050: 8e3a 6e8f 6fdf c3fa 2f2e 0c79 e717 ede4  .:n.o.../..y....
00000060: c21f 27eb 8395 189a 4c15 140b a28d ea82  ..'.....L.......
00000070: 46b8 e8c6 5c05 1b6b 1d61 b490 0251 d28c  F...\..k.a...Q..
00000080: 6ed2 4087 74e3 1ad2 c1b5 c6be f5f6 1cbb  n.@.t...........
00000090: 6286 cd48 a5a6 24a8 2535 4579 eeff 7df3  b..H..$.%5Ey..}.
000000a0: 8a8a 1613 a7fb 7204 68b3 6fc4 e51b 160c  ......r.h.o.....
000000b0: 1304 cbc4 8a71 f57f 2058 d448 fb22 5c5f  .....q.. X.H."\_
000000c0: 4b59 4472 4748 464e 404a 4749 6e3d 626d  KYDrGHFN@JGIn=bm
000000d0: 3a64 2e2a 4e48 4852 6229 5248 4469 4e54  :d.*NHHRb)RHDiNT
000000e0: 522e 7475 724e 472e 7454 3b4d 3a6a 4829  R.turNG.tT;M:jH)
000000f0: 6868 404a 4730 4458 4748 4e3d 5469 2b33  hh@JG0DXGHN=Ti+3
00000100: 7147 5c5e 4849 217d 2c47 544b 2061 4b2c  qG\^HI!},GTK aK,
00000110: 4754 2061 592b 654b 4e49 2621 6735 547d  GT aY+eKNI&!g5T}
00000120: 5c45 6a54 294e 2e71 3b44 2847 484e 5429  \EjT)N.q;D(GHNT)
00000130: 494e 4971 4868 543d 5a72 4768 7454 496e  INIqHhT=ZrGhtTIn
00000140: 5a68 7454 5848 5a2b 6554 4e29 2929 2e3f  ZhtTXHZ+eTN))).?
00000150: 4926 6e48 6854 6747 6874 5458 4868 7454  I&nHhTgGhtTXHhtT
00000160: 2b65 5448 3b20 614b 2c64 6932 6931 7230  +eTH; aK,di2i1r0
00000170: 2e7a 2061 592b 654b 6b23 3d4e 2e28 5930  .z aY+eKk#=N.(Y0
00000180: 2836 5c76 6b4e 2928 375c 5e6b 4e29 2838  (6\vkN)(7\^kN)(8
00000190: 5c76 5c3c 4e29 2839 5c76 5c3e 4e29 2831  \v\<N)(9\v\>N)(1
000001a0: 305c 5e5c 3c4e 2928 3131 5c5e 5c3e 4e    0\^\<N)(11\^\>N

설명

이 프로그램의 주요 아이디어는 정규식을 사용하여 입력을 수정하는 것이 었습니다. 공간을 절약하기 위해 이러한 모든 정규식은 압축 문자열에 포함되어 있습니다. 프로그램의 첫 번째 단계는 문자열을 압축 해제하고 단일 정규식과 해당하는 대체 문자열로 분할하는 것입니다.

            .Z"..."     Decompress the string
           c       \_   Split the result into pieces (separator is "_")
  m    cd\%             Split all pieces (separator is "%")
 m ck\:                 Split all sub-pieces (separator is ":")
J                       Assign the result to variable J

변수의 내용 J은 다음과 같습니다.

[[['\\\\ /', '=M='], ['/ \\\\', '=W=']],
 [[' (?=[V6M=-])', 'V'], ['o(?=[V6M=-])', '6']],
 [['(?<=[A9W=-]) ', 'A'], ['(?<=[A9W=-])o', '9'], ['(?<=[X0W=-])V', 'X'], ['(?<=[X0W=-])6', '0']],
 [['6V', 'V6'], ['0X', 'X0'], ['6-', '6='], ['0-', '0='], ['6M', 'VE'], ['0M', 'XE']],
 [['A9', '9A'], ['X0', '0X'], ['-9', '=9'], ['-0', '=0'], ['W9', 'EA'], ['W0', 'EX']],
 [['[MW-]']],
 [['[60]']],
 [['[90]']],
 [['V6', '6V'], ['V0', '6X'], ['X6', '0V'], ['X0', '0X']],
 [['6V', 'V6'], ['0V', 'X6'], ['6X', 'V0'], ['0X', 'X0']],
 [['A9', '9A'], ['A0', '9X'], ['X9', '0A'], ['X0', '0X']],
 [['9A', 'A9'], ['0A', 'X9'], ['9X', 'A0'], ['0X', 'X0']]]

KY   Set the variable K to an empty list

이 함수 rJ인덱스 G에 저장된 목록에서 목록의 모든 문자열에 정규식 대체를 적용 합니다 H. 문자열이 변경 되 자마자 반환합니다.

DrGH                         Define the function r(G,H)
    FN@JG              )     Loop for all entries in J[G]
             m:d.*NH         Regex substitution, replace N[0] with N[1] in all strings in list H
           =b                Store the result in variable b
         In         HRb      If b != H return b
                        RH   Return H

이 기능 ir두 가지 차이점 이있는 기능 과 유사합니다 . 대체 된 목록에 대체를 적용합니다 (수평 대신 수직). 또한 변경되는 한 반복하여 대체를 수행합니다.

DiNT          ;   Define the function i(N,T)
           .tT    Transpose the list T
       urNG       Apply r(N,...) repeatedly as long as something changes
    R.t           Transpose the result back and return it

이 함수 gJ인덱스에 저장된 목록의 정규식이 목록의 G문자열에서 찾을 수 있는지 확인 합니다 H.

M             Define the function g(G,H)
     hh@JG    Get the single regex stored in J[G]
  jH)         Join all strings in H
 :        0   Check if the regex is found anywhere in the joined string

나머지 코드에는 실제 프로그램 논리가 포함되어 있습니다. 솔루션을 찾을 때까지 가능한 이동에 대한 너비 우선 검색을 수행합니다. 검색 트리에서의 위치는 중력의 방향과 프로그램 입력의 수정 된 사본에 의해 고유하게 정의됩니다. 동일한 위치의 처리가 반복되는 것을 피하기 위해 처리 된 위치는 전역 목록에 저장됩니다 K. 여전히 처리해야하는 위치는 솔루션의 해당 부분과 함께 목록에 저장 Y됩니다.

입력 및 초기화의 변경 K과는 Y다음과 같은 코드에 의해 수행된다 :

           .z          Get all input as a line list
     i2i1r0            Apply the regular expressions stored in J[0] horizontally, and the the ones from J[1] and J[2] vertically
   ,d                  Create a list with " " (represents "no gravity set") and the modifed input
 aK                    Append the result to the list K
                 eK    Retrieve the appended list again
                +  k   Append "" to the list (represents the empty starting solution)
              aY       Append the result to the list Y

입력 수정은 다음과 같은 작업을 수행합니다. 입력 :

         ----   --/ \
---    --
o

  ------    -----

다음으로 변환됩니다.

VVVVVVVVV----VVV--=W=
---VVVV--AAAXVVVXAAAA
9AXVVVVXAAAAXVVVXAAAA
AAXVVVVXAAAAXVVVXAAAA
AA------AAAA-----AAAA

값의 의미는 다음과 같습니다.

  • - 여전히 방문해야하는 플랫폼
  • = 더 이상 방문 할 필요가없는 플랫폼
  • M 중력이 "down"으로 설정되어 들어갈 수있는 컵
  • W 중력을 "업"으로 설정하여 입력 할 수있는 컵
  • V 중력이 "down"으로 설정된 상태로 안전하게 이동할 수 있습니다.
  • A 중력이 "up"으로 설정된 상태로 안전하게 이동할 수 있습니다
  • X 중력 설정에 관계없이이 장소로 안전하게 이동
  • 6 로 표시 될 곳에 공 V
  • 9 로 표시 될 곳에 공 A
  • 0 로 표시 될 곳에 공 X

논리는 정규식을 사용하여 이동을 수행합니다. 위의 예에서 중력이 "up"으로 설정되면 "9A"를 "A9"로 바꾸고 정규식으로 공을 오른쪽으로 옮길 수 있습니다. 이것은 정규식을 적용하여 가능한 모든 움직임을 찾을 수 있음을 의미합니다.


함수 X 현재 중력 설정에 따라 수행 세로 공의 움직임은 글로벌 결과리스트에서 저장 K하고 Y있는 솔루션이 발견 된 경우를 체크한다.

DXGHN                                             ;   Define the function X(G,H,N)
        +3qG\^                                        Select the correct set of regular expressions based on the current gravity setting G (3 for "v" and 4 for "^")
     =Ti      H                                       Apply i(...,H) and store the result in T 
               I!},GTK                                If [G,T] not in K
                       aK,GT                          Store [G,T] in K 
                             aY+eKN                   Store [G,T,N] in Y 
                                   I&!g5T}\EjT)       If J[5] not found in T and T contains "E" (all platforms visited and ball in cup)
                                               N.q    Print N and exit

이 기능 (은 4 방향 / 중력 버튼에 대한 점검을 구현합니다. 중력 버튼은 현재 중력이 변경되고 볼이 중력을 변경하기에 안전한 장소에있는 경우에만 누를 수 있습니다. 방향 버튼은 해당 위치로 안전하게 이동할 수있는 경우에만 누를 수 있습니다.

D(GHNT)                                                    ;   Define the function ( (G,H,N,T)
       IN                           )                          If N is not empty (contains either "<" or ">" representing directional buttons)
         IqHhT                     )                           If H (gravity setting for which this test is performed) is equal T[0] (the current gravity)
              =ZrGhtT                                          Apply r(G,T[1]) and store the result in Z (G is the appropriate regex index for the combination of gravity and directional button, T[1] is the current modified input) 
                     InZhtT       )                            If Z != T[1] (the regex operation changed something, meaning we found a valid move)
                           XHZ+eTN                             Call X(H,Z,[T[2],N]) 
                                     .?                        Else (gravity button pressed)
                                       I                       If ...
                                         nHhT                  H (new gravity setting) is not equal T[0] (current gravity setting) 
                                        &                      ... and ...
                                             gGhtT             J[G] found in T[1] (ball is in an appropriate place to switch gravity) 
                                                  XHhtT+eTH    Call X(H,T[1],[T[2],H])

마지막으로 메인 루프. 의 첫 번째 요소 Y가 반복적으로 제거되고 가능한 모든 이동이 수행되는지 확인합니다.

#                                                        Loop until error (Y empty)
 =N.(Y0                                                  Pop first element of Y and store it in the variable N
       (6\vkN)                                           Call ( (6,"v","",N)
              (7\^kN)                                    Call ( (7,"^","",N)
                     (8\v\<N)                            Call ( (8,"v","<",N)
                             (9\v\>N)                    Call ( (9,"v",">",N)
                                     (10\^\<N)           Call ( (10,"^","<",N)
                                              (11\^\>N   Call ( (11,"^",">",N)

모든 입력을 해결할 수 있다고 가정한다고 생각합니까? 문제는 여전히 해결 불가능한 입력을 감지해야한다고 말하지만, 의견은 모든 입력을 해결할 수 있다고 제안합니다. 귀하의 코드가 해결할 수없는 것으로 감지한다고 생각하지만 어떤 경우인지 확실하지 않습니다.
Jonathan Frech

@JonathanFrech 입력을 해결할 수 없으면 출력이 없습니다. 모든 가능성을 확인하면 Y목록이 비어 있고 팝에 오류가 발생하고 #루프가 종료됩니다.
Sleafar

1
입력 (`/ \`)에서 컵을 제거하면 (컵에 도달 할 수 없으므로) 퍼즐을 풀 수 없지만 프로그램은 여전히 ​​출력을 생성합니다.
Jonathan Frech

나는 당신의 프로그램이 무엇을 의미하지 않았는지, 이 해결할 수없는 퍼즐 입력 이 출력을 생성 한다고 말합니다 .
Jonathan Frech

@JonathanFrech 당신이 맞아요. 방금 해결하려고하는데 압축 문자열에 인코딩 문제가 있습니다.
Sleafar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.