Alphys의 최신 퍼즐 개발을 도와주세요!


16

지하의 왕 과학자 인 Alphys는 새로운 퍼즐의 프로토 타입을 완성했습니다. 그러나 그녀는 그것을 기꺼이 테스트 할 사람을 찾지 못하는 것 같습니다.

그녀의 퍼즐 규칙은 다음과 같습니다.

목표는 왼쪽의 가장 중앙 타일에서 시작하여 오른쪽으로 이동하는 것입니다. 짝수 높이의 퍼즐의 경우 두 개의 중앙 타일 아래에서 시작하십시오. (예 : 인덱스가없는 4x4 배열에서 시작 위치는 [2,0]-행 2, 열 0입니다. 인덱스가없는 5x5 배열에서 시작 위치는 [2,0]-행 2, 열입니다. 0)

각 컬러 타일에는 고유 한 "가상적"기능이 있습니다.

  • 분홍색 및 녹색 타일 ( "P"및 "G"로 표시)은 아무 작업도 수행하지 않습니다.
  • 빨간색과 노란색 타일 ( "R", "Y")은 통과 할 수 없습니다.
  • 주황색 타일 ( "O")은 플레이어가 주황색 냄새를 맡게합니다.
  • 자주색 타일 ( "U")은 플레이어가 향하는 방향으로 다음 타일로 향하게하여 레몬 냄새를냅니다.
  • 플레이어가 주황색 냄새 가 나지 않는 한 파란색 타일 ( "B")을 ​​통과 할 수 있습니다.

풍미 역학을 명확히하기 위해, 플레이어의 냄새는 무기한 또는 다른 냄새가 나는 타일에 의해 재정의 될 때까지 지속됩니다. 즉, 플레이어가 주황색 타일을 밟으면 자주색 타일을 밟을 때까지 주황색 냄새가납니다.

또한 파란색 타일에 수직 또는 수평으로 인접한 노란색 타일은 파란색 타일도 통과 할 수 없게합니다.


당신의 임무는 입력으로 퍼즐의 레이아웃을 나타내는 2 차원 문자 배열 (또는 1D 문자열 배열 또는 다른 유효한 형식)을 허용하고 별표 또는 일부로 원래 퍼즐과 해결 된 퍼즐을 모두 출력하는 프로그램이나 함수를 작성하는 것입니다 올바른 경로를 보여주는 다른 문자. 주어진 퍼즐을 풀 수 있다고 가정하십시오.

이 퍼즐을 예로 사용하십시오.

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

프로그램은 다음을 출력합니다 :

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

사용 된 모든 퍼즐은 이것을 사용하여 생성되어야합니다 .

표준 코드 골프 규칙이 적용됩니다. 최상의 답변은 각 언어마다 가장 짧을 것입니다. 답변에는 언어, 바이트 수 및 세 가지 테스트 사례가 포함되어야합니다. 처음 두 개는 원하는 레이아웃이 될 수 있지만 세 번째는 다음과 같아야합니다.

RRRR
RPPR
PUOR
RPBP

제안 된 테스트 사례 : RRRR | RPPR | 열등 | RPBP. 내가 실수하지 않으면 U 타일을 두 번 통과해야합니다. 또한 타일이 통과 할 수 없을 때 U의 동작에 대해 확신하지 못합니다. 여전히 U 위로 걸어 갈 수 있습니까? 아니면 그렇게 할 수 없습니까?
FryAmTheEggman

@FryAmTheEggman U 타일 뒤의 타일을 통과 할 수 없으면 U 타일을 해당 방향으로 걸을 수 없습니다.
EnragedTanker

@ TimmyD 추측 내가 처음 그 퍼즐을했을 때 알아 차리지 않았다.
EnragedTanker

@ crayzeedude Fry의 테스트 사례가 잘못되었다고 생각합니다. RPRR이 아니라 두 번째 행에서 RPPR이어야합니다.
Sherlock9

트윗 담아 가기 정말로 감사했습니다.
EnragedTanker

답변:


2

C 529 바이트

#define M m[y][x]
char**m,*l,i;main(Y,X){for(;scanf("%ms",&l)>0;)(m=realloc(m,Y*8))[Y-1]=l,X=puts(m[Y++-1])-2;puts("");int s(x,y,c,d){(x<0|y<0|y/Y)?:({if(M^'R'&&M^'Y')if(M^'B'||c^2&&!((y&&m[y-1][x]=='Y')|(x&&m[y][x-1]=='Y')|(y<Y-1&&m[y+1][x]=='Y')|(x<X-1&&m[y][x+1]=='Y'))){x^X?:({M='#';return 1;});c=M^'O'?c:2;M^'U'?:({return s(x+(d<4?d-2:0),y+(d>3?d-5:0),1,d)?({M='#';1;}):0;});if(d^1&&s(x+1,y,c,3)||d^4&&s(x,y+1,c,6)||d^6&&s(x,y-1,c,4)||d^3&&s(x-1,y,c,1)){M='#';return 1;}}});return 0;}s(0,--Y/2,0,3);for(;i<Y;)puts(m[i++]);}

우리는 막히지 않았다면 먼저 오른쪽으로 밟아 퍼즐에 접근합니다. 검색은 재귀 적이며 성공적인 경로를 식별하면 행렬에 공백을 표시하고 반환합니다.

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

언 골프

#include <stdio.h>
#include <malloc.h>
char**m,*l,i;
main(Y,X) {
  for(Y=1;scanf("%ms",&l)>0;Y++)
      m=realloc(m,Y*8),
      m[Y-1]=l,
      X=puts(m[Y-1])-2;
  puts("");
  int step(x,y,c,d,i){
    if(x<0||y<0||y>=Y)return 0;
      if(m[y][x]=='R'||m[y][x]=='Y')return 0;
      if(m[y][x]=='B'&&(c==2||(y&&m[y-1][x]=='Y')||(x&&m[y][x-1]=='Y')
               ||(y<Y-1&&m[y+1][x]=='Y')||(x<X-1&&m[y][x+1]=='Y')))return 0;
      if(x==X){m[y][x]='#';return 1;}
      if(m[y][x]=='O')c=2;
      if(m[y][x]=='U')return step(x+(d<4?d-2:0),y+(d>3?d-5:0),1,d,i+1)?({m[y][x]='#';1;}):0;
      else if((d!=1&&step(x+1,y,c,3,i+1)) ||
    (d!=4&&step(x,y+1,c,6,i+1)) || (d!=6&&step(x,y-1,c,4,i+1)) ||
    (d!=3&&step(x-1,y,c,1,i+1))) {m[y][x]='#';return 1;}
      return 0;
  }
  step(0,--Y/2,0,3,0);
  for(;i<Y;)puts(m[i++]);
}

출력 예 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

PYY#####
YR##RYRG
###BYPUR
#YRBOYOG
#BPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

출력 예 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
###UUURO
BG#UYPRG
GB####RG
PUPUB#YB
GYOPR###

출력 예 3

RRRR
RPPR
PUOR
RPBP

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