Ajude a desenvolver o mais novo quebra-cabeça da Alphys!

16

Alphys, o Cientista Real do Underground, terminou um protótipo para um novo quebra-cabeça. No entanto, ela não consegue encontrar alguém disposto a testá-lo.

As regras de seu quebra-cabeça são as seguintes:

O objetivo é chegar ao lado direito, a partir do bloco mais central do lado esquerdo. Para quebra-cabeças com alturas de número par, comece na parte inferior das duas peças centrais. (Exemplos: em uma matriz 4x4 indexada a zero, a posição inicial seria [2,0] - linha 2, coluna 0. Em uma matriz 5x5 indexada a zero, a posição inicial seria [2,0] - linha 2, coluna 0.)

Cada ladrilho colorido tem sua própria função "sádica":

  • Ladrilhos rosa e verde (representados como "P" e "G") não fazem nada
  • Azulejos vermelhos e amarelos ("R", "Y") são intransitáveis.
  • Ladrilhos laranja ("O") fazem o jogador cheirar a laranja
  • Ladrilhos roxos ("U") forçam o jogador para o próximo ladrilho na direção em que estão voltados e os fazem cheirar a limões
  • Azulejos azuis ("B") são aceitáveis ​​desde que o jogador não cheire a laranja.

Para esclarecer a mecânica do sabor, o cheiro de um jogador persistirá indefinidamente ou até ser substituído por um ladrilho com cheiro diferente, ou seja, se um jogador pisar em um ladrilho laranja, ele sentirá o cheiro de laranja até pisar em um ladrilho roxo.

Além disso, um ladrilho amarelo colocado vertical ou horizontalmente adjacente a um ladrilho azul fará com que o ladrilho azul também fique intransitável.


Sua tarefa é escrever um programa ou função que aceite uma matriz de caracteres bidimensional (ou matriz de cordas 1D ou algum outro formato válido) representando o layout do quebra-cabeça como entrada e produza o quebra-cabeça original e o quebra-cabeça resolvido, com asteriscos ou alguns outro caractere mostrando o caminho correto. Suponha que o quebra-cabeça fornecido seja solucionável.

Use este quebra-cabeça como um exemplo:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Seu programa produziria:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Qualquer quebra-cabeça usado deve ser gerado usando isso .

Aplicam-se regras de código padrão de golfe. As melhores respostas serão as mais curtas para cada idioma. As respostas devem conter o idioma, número de bytes e três casos de teste. Os dois primeiros podem ser qualquer layout que você escolher, mas o terceiro deve ser:

RRRR
RPPR
PUOR
RPBP
EnragedTanker
fonte
Caso de teste proposto: RRRR | RPPR PUOR RPBP. Se eu não cometer um erro, isso exige que você repasse o bloco em U duas vezes. Também não tenho certeza sobre o comportamento de U quando o bloco depois de intransitável, você ainda pode entrar no U ou não consegue fazer isso?
FryAmTheEggman # 10/16
@FryAmTheEggman Se o bloco após o bloco U for intransitável, você não poderá andar no bloco U nessa direção.
EnragedTanker
@ TimmyD Acho que não percebi isso quando fiz esse quebra-cabeça.
EnragedTanker
@crayzeedude Acho que você errou no caso de teste de Fry. Deve ser RPPR na segunda linha, não RPRR.
Sherlock9
@ Sherlock9 Ops! Na verdade eu fiz, obrigado.
EnragedTanker

Respostas:

2

Bytes de 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++]);}

Abordamos o quebra-cabeça dando um primeiro passo para a direita, desde que não fiquemos bloqueados, tentando subir, depois descendo e finalmente voltando para a esquerda. A pesquisa é recursiva e, quando identificamos um caminho bem-sucedido, marcamos os espaços em nossa matriz e retornamos.

Experimente Online

Ungolfed

#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++]);
}

Exemplo de saída 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Exemplo de saída 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Exemplo de saída 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Seth
fonte