Aidez à développer le nouveau puzzle d'Alphys!

16

Alphys, le scientifique royal du métro, a terminé un prototype pour un nouveau puzzle. Cependant, elle ne semble pas trouver quelqu'un prêt à le tester.

Les règles de son puzzle sont les suivantes:

Le but est d'arriver sur le côté droit, en commençant par la tuile la plus centrale sur le côté gauche. Pour les puzzles avec des hauteurs paires, commencez par le bas des deux tuiles centrales. (Exemples: dans un tableau 4x4 indexé zéro, la position de départ serait [2,0] - ligne 2, colonne 0. Dans un tableau 5x5 indexé zéro, la position de départ serait [2,0] - ligne 2, colonne 0.)

Chaque tuile colorée a sa propre fonction "sadique":

  • Les carreaux roses et verts (représentés par "P" et "G") ne font rien
  • Les tuiles rouges et jaunes ("R", "Y") sont infranchissables.
  • Les tuiles orange ("O") font sentir au joueur des oranges
  • Les tuiles violettes ("U") forcent le joueur à la tuile suivante dans la direction à laquelle elles sont confrontées et les font sentir comme des citrons
  • Les tuiles bleues ("B") sont passables tant que le joueur ne sent pas comme les oranges.

Pour clarifier le mécanisme de saveur, l'odeur d'un joueur persistera indéfiniment ou jusqu'à ce qu'elle soit remplacée par une tuile à odeur différente, c'est-à-dire que si un joueur marche sur une tuile orange, il sentira comme des oranges jusqu'à ce qu'il marche sur une tuile violette.

De plus, une tuile jaune placée verticalement ou horizontalement à côté d'une tuile bleue rendra également la tuile bleue impraticable.


Votre tâche consiste à écrire un programme ou une fonction qui accepte un tableau de caractères à 2 dimensions (ou un tableau de chaînes 1D, ou un autre format valide) représentant la disposition du puzzle en entrée et génère à la fois le puzzle d'origine et le puzzle résolu, avec des astérisques ou certains autre personnage montrant le chemin correct. Supposons que le puzzle donné soit résoluble.

Utilisez ce puzzle comme exemple:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Votre programme afficherait:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Tout puzzle utilisé doit être généré à l'aide de cela .

Les règles de golf du code standard s'appliquent. Les meilleures réponses seront les plus courtes pour chaque langue. Les réponses doivent contenir la langue, le nombre d'octets et trois cas de test. Les deux premiers peuvent être n'importe quelle mise en page que vous choisissez, mais le troisième doit être:

RRRR
RPPR
PUOR
RPBP
EnragedTanker
la source
Cas de test proposé: RRRR | RPPR | PUOR | RPBP. Si je n'ai pas fait d'erreur, cela nécessite que vous passiez deux fois sur la tuile U. De plus, je ne suis pas sûr du comportement de U lorsque la tuile est impraticable, pouvez-vous toujours marcher sur le U ou êtes-vous incapable de le faire?
FryAmTheEggman
@FryAmTheEggman Si la tuile après la tuile U est infranchissable, vous ne pouvez pas marcher sur la tuile U dans cette direction.
EnragedTanker
@TimmyD Je suppose que je ne l'ai pas remarqué lorsque j'ai fait ce puzzle pour la première fois.
EnragedTanker
@crayzeedude Je pense que vous avez mal fait le cas de test de Fry. Il doit s'agir de RPPR dans la deuxième ligne, pas de RPRR.
Sherlock9
@ Sherlock9 Oups! Oui, merci.
EnragedTanker

Réponses:

2

C 529 octets

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

Nous approchons du puzzle en faisant un premier pas vers la droite, à condition de ne pas être bloqués, puis en essayant, puis en descendant et enfin de nouveau à gauche. La recherche est récursive et une fois que nous avons identifié un chemin réussi, nous marquons les espaces dans notre matrice et revenons.

Essayez-le en ligne

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

Exemple de sortie 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Exemple de sortie 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Exemple de sortie 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Seth
la source