죽은 개구리 걷기


17

소개

Jonny는 Frogger를하고 싶다. 그러나 그는 매우 좋지 않습니다. 실제로, 그는 플랫폼이 이동 한 후에 만 ​​앞으로 나아가려고 시도 할 것입니다.

Jonny의 개구리가 길의 끝에 도달했는지 또는 길에서 죽었는지 알아보십시오.

도전

프로그램은 다음 형식 으로 0s와 1s 로 구성된 Frogger 그리드를 입력으로 수신 합니다.

  • 격자는 임의의 너비와 길이, 그리고 최소 3x3입니다.
  • 1 플랫폼을 나타냅니다
  • 0 물을 나타냅니다
  • F 개구리의 시작 위치를 나타냅니다
  • 그리드의 첫 번째와 마지막 줄은 모두 1s 로 구성되며 움직이지 않으며 개구리 F는 마지막 줄에 무작위로 배치됩니다.
  • 모든 중간층은 항상 움직이는 것, 그리고이있을 것이다 <또는 >나타내는 모든 라인의 마지막에 왼쪽 또는 오른쪽으로 이동하는 경우

이 기호들은 모두 고유하고 답변에 대체물을 지정하는 한 자신의 기호로 대체 할 수 있습니다.

입력은 호환 가능한 형식 (줄 바꿈이있는 문자열, 문자열 배열, 문자 배열 등) 일 수 있습니다.

도전 규칙

  • 매 턴마다, 모든 플랫폼은 <또는 >기호로 표시된 방향에 따라 하나의 사각형을 움직 입니다.
  • 플랫폼이 "스크린"에서 벗어나면 그리드의 다른쪽에 다시 나타납니다.
  • 개구리가 움직이는 플랫폼에 있으면 개구리와 함께 움직입니다.
  • 그 후, 개구리는 맨 위 줄을 향해 한 정사각형을 뛰어 넘을 것입니다. 개구리는 매 차례 움직입니다.
  • 개구리가 물에서 뛰어 내리 0거나 ( ) 움직이는 플랫폼과 함께 격자면에 닿으면 죽습니다.

당신의 프로그램은 개구리가 살아남 으면 진실한 가치를, 그렇지 않으면 거짓 가치를 산출해야합니다.

이것은 이므로 바이트 단위의 최단 답변이 이깁니다. 표준 허점이 적용됩니다.

실시 예 1

입력

11111
00111>
00101<
1F111

산출

1

실행

1 회전

11111
10011
01010
1F111

11111
10011
0F010
11111

차례 2 :

11111
11001
F0100
11111

11111
F1001
10100
11111

3 회전

11111
1F100
01001
11111

1F111
11100
01001
11111

실시 예 2

입력

11111
00100<
00100<
1F111

산출

0

실행

1 회전

11111
01000
01000
1F111

11111
01000
0F000
11111

차례 2 :

11111
10000
F0000
11111

11111
F0000
10000
11111

3 회전

11111
00001
00001
11111

중간 선이 항상 움직입니까? 행 목록을 입력으로 사용할 수 있습니까? 라인이 이동하지 않을 경우 우리는 이외는 문자로 끝나는 가정 할 수있다 <또는 >우리는 입력으로 직사각형 배열을 할 수 있습니까? 그건 그렇고, 좋은 도전!
dylnan

@ dylnan 나는 도전 텍스트에서 그것을 명확히했다. 중간 레이어는 항상 움직이고 항상 <또는 >끝에 있습니다.
BgrWorker 2016 년

개구리 0가 앞에 있을 때에도 개구리가 매 차례 앞으로 움직 1입니까? 아니면 다음을 기다릴 것 입니까? 기다릴 수 있다면, 앞으로 나아갈 1수 있습니까, 아니면 똑똑하게 기다릴 수 있습니까? 즉, 테스트 케이스 11111 00001< 00011< 11F11를 사용하면 물에 뛰어 들기 때문에 허위가 될 것 입니다 (단계의 페이스트 빈 ). 프레임 밖으로 이동하기 때문에 잘못된 것입니까 ( 단계의 pastebin ); 그것은 앞으로 (점프하기 전에 두 번째 플랫폼에 스마트 대기하기 때문이거나 truthy 될 것이다 단계의 페이스트 빈을 )?
Kevin Cruijssen

이 모든 회전을 이동하고 의지 행복하게 자살 @KevinCruijssen (내가 말했듯이, 조니는 매우 좋은 선수되지 않습니다)
BgrWorker

@BgrWorker Ok, 그 도전은 실제로 더 가능합니다. :) 어쩌면 도전 설명에서 그것을 편집 할 수 0있습니다.
케빈 크루이 센

답변:


4

파이썬 (2) , 168 (165) 152 145 137 129 바이트

s=input();x=s[-1].find('F');L=len(s[0]);i=k=1
for l in s[-2:0:-1]:d=('<'in l)%-2|1;k*=l[(x-d*i)%L]>'0'>-1<x+d<L;x+=d;i+=1
print k

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

입력 형식은 문자열 목록입니다. 문제 설명에 주어진 의미를 갖는 문자

설명:

i턴 번호 (턴 1부터 시작)입니다. x그 턴이 시작될 때 개구리의 위치입니다.

frogger가 밟을 줄은 줄입니다 l(슬라이스를 통해 아래에서 위로 정렬 됨). d=('<'in l)%-2|1수율 -1또는 1행이 움직이는 방향에 따라

이번이 두 i번째 턴이므로 해당 행은 원래 위치에서 i바이트 단위 로 이동 합니다. 개구리가 뛰어 올라가려는 캐릭터는 행의 너비 가 l[(x-d*i)%L]어디에 있는지 L, 그래서 우리는 그 캐릭터가 같기를 원합니다 '1'. 즉 >'0'.

또한, 우리는 개구리가 다음 차례 가 시작될 때 가장자리에서 벗어나지 않는지 확인하고 싶습니다 . 그것이 expression의 함수입니다 -1<x+d<L.

이러한 조건은 연결되어 있습니다 ( '0'>-1항상 이므로 True). 그리고 결과 표현식이 거짓이면 언제든지 k(그리고 머물러 있습니다) 0.

어쨌든 우리는 frogger의 위치를 ​​업데이트 x+=d하고 행 번호를 충돌시킵니다. 그런 다음 거품을 내고 헹구고 반복하십시오.


1

파이썬 (2) , 246 (245) 244 242 바이트

Xcoder 덕분에 -3 바이트-Jonathan
Frech 덕분에 -1 바이트

m=input()
exec"""for i,r in enumerate(m):
 d=-int(min('1',r[-1]));q=r[d*2]
 if m[i+1:]:r=sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]
 if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j])
 m[i]=r
"""*~-len(m)
print'F'in m[0]

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

설명

  • d 각 레이어가 이동할 방향입니다
  • q 감싸 일 캐릭터입니다
    • [q,' '][q<'L'] 개구리를 화면 밖으로 떨어 뜨립니다
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]마지막 문자 (방향)를 제거한 다음 첫 번째 문자를 제거하고 추가하거나 마지막 문자를 제거하고 앞에 붙인 다음 (을 기준으로 d) 방향을 뒤로 추가하여 전체 행을 왼쪽 / 오른쪽으로 효과적으로 이동합니다.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) 개구리가 앞으로 나아갈 것입니다.
  • min('F',m[i-1][j]) 개구리가 물에 빠지게합니다
  • 문자 비교 ( min<)는 순서를 따릅니다.' ' < '0' < '1' < 'F' < 'L'

입력은 문자 목록의 목록입니다 :
' '-물
'F'-개구리
'L'-플랫폼
'0'-레이어를 왼쪽으로
'1'이동-레이어를 오른쪽으로 이동


if i<len(m)-1가능할 수도 있습니다 if~-len(m)>i.
Jonathan Frech 2016 년

0

자바 8, 293 277 바이트

a->{for(int l=a.length-1,x=a[l].indexOf('F'),y=l,i,t=a[0].length()-1,b;y>0;y--){for(i=l;i-->1;a[i]=a[i].endsWith("<")?a[i].substring(1,t+1)+a[i].charAt(0*(x-=b))+"<":a[i].charAt(t)+a[i].substring(0*(x+=b),t)+">")b=i==y?1:0;if(x<0|x>t||a[y].charAt(x)<49)return 0>1;}return 1>0;}

챌린지 설명 ( 01F<>)에 지정된 기본 문자를 사용합니다 .

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

설명:

a->{                         // Method with String-array parameter & boolean return-type
  for(int l=a.length-1,      //  Amount of rows minus 1
       x=a[l].indexOf('F'),  //  Start x-position of the frog
       y=l,                  //  Start y-position of the frog
       i,                    //  Index-integer
       t=a[0].length()-1,    //  Length of the rows minus 1
       b;                    //  Temp integer
       y>0;                  //  Loop as long as the frog hasn't reached the other side
       y--){                 //    Jump forward once after every turn
    for(i=l;l-->1;           //   Inner loop over all the moving rows
        ;a[i]=               //     After every iteration: Change the moving row to:
         a[i].endsWith("<")? //      If the current platform moves to the left:
          a[i].substring(1,t+1)
                             //       Last part of the platform
                             //        i.e. "00101<" → "0101"
          +a[i].charAt(0     //       Appended with the first character
                             //        i.e. "00101<" → '0'
            *(x-=b))         //       We are moving left, so subtract `b` from `x`      
          +"<"               //       And append the direction "<" again
                             //        so "00101<" becomes "01010<"
         :                   //      Else (the platform moves to the right):
          a[i].charAt(t)     //       Take the last character
                             //        i.e. "00111>" → '1'
          +a[i].substring(0  //       And append the first part of the platform
                             //        i.e. "00111>" → "0011"
            *(x+=b),t)       //       We are moving right, so add `b` to `x`
          +">")              //       And append the direction "<" again
                             //        so "00111>" becomes "10011>"
      b=i==y?                //    If the frog is on the current row:
         1                   //     Set `b` to 1
        :                    //    Else:
         0;                  //     Set `b` to 0
    if(x<0|x>t               //   If the Frog is out of bounds
       ||a[y].charAt(x)<49)  //   Or jumped into the water
      return 0>1;}           //    Return false
  return 1>0;}               //  If the loop ended the frog made it to the other side,
                             //  so return true
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.