¡Ayuda a desarrollar el nuevo rompecabezas de Alphys!

16

Alphys, el Científico Real del Subterráneo, ha terminado un prototipo para un nuevo rompecabezas. Sin embargo, parece que no puede encontrar a nadie dispuesto a probarlo.

Las reglas de su rompecabezas son las siguientes:

El objetivo es llegar al lado derecho, comenzando desde el mosaico más central en el lado izquierdo. Para rompecabezas con alturas pares, comience en la parte inferior de las dos fichas centrales. (Ejemplos: en una matriz 4x4 indexada a cero, la posición inicial sería [2,0] - fila 2, columna 0. En una matriz 5x5 indexada a cero la posición inicial sería [2,0] - fila 2, columna 0.)

Cada mosaico de color tiene su propia función "sádica":

  • Las fichas rosadas y verdes (representadas como "P" y "G") no hacen nada
  • Las fichas rojas y amarillas ("R", "Y") son intransitables.
  • Las fichas naranjas ("O") hacen que el jugador huela a naranjas
  • Las baldosas moradas ("U") obligan al jugador a la siguiente baldosa en la dirección que están mirando y las hacen oler a limones
  • Las fichas azules ("B") son pasables siempre que el jugador no huela a naranjas.

Para aclarar la mecánica del sabor, el olor de un jugador persistirá indefinidamente o hasta que sea anulado por una ficha de olor diferente, es decir, si un jugador pisa una ficha de color naranja, olerá a naranja hasta que pise una ficha de color púrpura.

Además, una ficha amarilla colocada vertical u horizontalmente adyacente a una ficha azul hará que la ficha azul también se vuelva intransitable.


Su tarea es escribir un programa o función que acepte una matriz de caracteres bidimensionales (o una matriz de cadenas 1D, o algún otro formato válido) que represente el diseño del rompecabezas como entrada y salida tanto del rompecabezas original como del rompecabezas resuelto, con asteriscos o algunos otro personaje que muestra la ruta correcta. Suponga que el rompecabezas dado es solucionable.

Usa este rompecabezas como ejemplo:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Su programa generaría:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Cualquier rompecabezas usado debe ser generado usando esto .

Se aplican reglas estándar de golf de código. Las mejores respuestas serán las más cortas para cada idioma. Las respuestas deben contener el idioma, el número de bytes y tres casos de prueba. Los dos primeros pueden ser cualquier diseño que elija, pero el tercero debe ser:

RRRR
RPPR
PUOR
RPBP
EnfurecidoTanker
fuente
Caso de prueba propuesto: RRRR | RPPR | PUOR | RPBP. Si no cometí un error, esto requiere que revises el mosaico U dos veces. Además, no estoy seguro sobre el comportamiento de U cuando la loseta después de que es intransitable, ¿puedes caminar hacia la U o no puedes hacerlo?
FryAmTheEggman
@FryAmTheEggman Si el mosaico después del mosaico U es intransitable, no puedes caminar sobre el mosaico U en esa dirección.
EnragedTanker
@TimmyD Supongo que no me di cuenta cuando hice ese rompecabezas por primera vez.
EnragedTanker
@crayzeedude Creo que te equivocaste en el caso de prueba de Fry. Debe ser RPPR en la segunda fila, no RPRR.
Sherlock9
@ Sherlock9 ¡Vaya! De hecho lo hice, gracias.
EnragedTanker

Respuestas:

2

C 529 bytes

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

Nos acercamos al rompecabezas dando un paso primero a la derecha, siempre que no estemos bloqueados, luego intentemos subir, luego bajar y finalmente volver a la izquierda. La búsqueda es recursiva y una vez que identificamos una ruta exitosa, marcamos los espacios en nuestra matriz y regresamos.

Pruébalo en línea

Sin golf

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

Ejemplo de salida 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Ejemplo de salida 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Ejemplo de salida 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Seth
fuente