Hilf Alphys neuestes Puzzle zu entwickeln!

16

Alphys, der Royal Scientist des Untergrunds, hat einen Prototyp für ein neues Puzzle fertiggestellt. Sie scheint jedoch niemanden zu finden, der bereit ist, es zu testen.

Die Regeln ihres Puzzles lauten wie folgt:

Das Ziel ist es, von der Mitte auf der linken Seite zur rechten Seite zu gelangen. Beginnen Sie bei Rätseln mit gerader Höhe auf dem unteren der beiden mittleren Kacheln. (Beispiele: In einem 4x4-Array mit Nullindex wäre die Startposition [2,0] - Zeile 2, Spalte 0. In einem 5x5-Array mit Nullindex wäre die Startposition [2,0] - Zeile 2, Spalte 0.)

Jede farbige Fliese hat ihre eigene "sadistische" Funktion:

  • Rosa und grüne Kacheln (dargestellt als "P" und "G") tun nichts
  • Rote und gelbe Kacheln ("R", "Y") sind unpassierbar.
  • Orange Kacheln ("O") lassen den Spieler nach Orangen riechen
  • Lila Kacheln ("U") zwingen den Spieler zum nächsten Kacheln in der Richtung, in die er schaut, und lassen sie nach Zitronen riechen
  • Blaue Kacheln ("B") sind passierbar, solange der Spieler nicht nach Orangen riecht.

Um die Geschmacksmechanik zu verdeutlichen, bleibt der Geruch eines Spielers unbegrenzt bestehen oder wird durch ein anders riechendes Plättchen überschrieben. Wenn ein Spieler auf ein orangefarbenes Plättchen tritt, riecht er wie Orangen, bis er auf ein lila Plättchen tritt.

Zusätzlich wird eine gelbe Fliese, die vertikal oder horizontal neben einer blauen Fliese platziert wird, dazu führen, dass die blaue Fliese ebenfalls unpassierbar wird.


Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die ein zweidimensionales Zeichenarray (oder ein 1D-Zeichenkettenarray oder ein anderes gültiges Format) akzeptiert, das das Layout des Puzzles als Eingabe darstellt und sowohl das ursprüngliche Puzzlespiel als auch das gelöste Puzzlespiel mit Sternchen oder einigen ausgibt anderes Zeichen, das den korrekten Pfad anzeigt. Angenommen, das gegebene Rätsel ist lösbar.

Verwenden Sie dieses Puzzle als Beispiel:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Ihr Programm würde folgendes ausgeben:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Jedes Puzzle verwendet wird, muss erzeugt werden unter Verwendung dieser .

Es gelten die Standard-Code-Golfregeln. Die besten Antworten sind für jede Sprache die kürzesten. Die Antworten müssen die Sprache, die Anzahl der Bytes und drei Testfälle enthalten. Die ersten beiden können ein beliebiges Layout sein, das dritte muss jedoch sein:

RRRR
RPPR
PUOR
RPBP
EnragedTanker
quelle
Vorgeschlagener Testfall: RRRR | RPPR | PUOR | RPBP. Wenn ich keinen Fehler gemacht habe, musst du das U-Plättchen zweimal durchgehen. Ich bin mir auch nicht sicher, wie sich U verhält, wenn die Kachel unpassierbar ist. Können Sie immer noch auf das U treten oder sind Sie dazu nicht in der Lage?
FryAmTheEggman
@FryAmTheEggman Wenn das Feld nach dem U-Feld unpassierbar ist, können Sie nicht in diese Richtung auf dem U-Feld gehen.
EnragedTanker
@TimmyD Vermutlich habe ich das nicht bemerkt, als ich das Puzzle zum ersten Mal gemacht habe.
EnragedTanker
@crayzeedude Ich glaube, du hast Frys Testfall falsch verstanden. Es sollte RPPR in der zweiten Reihe sein, nicht RPRR.
Sherlock9
@ Sherlock9 Hoppla! In der Tat, danke.
EnragedTanker

Antworten:

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

Wir nähern uns dem Rätsel, indem wir zuerst nach rechts gehen, sofern wir nicht blockiert sind, dann aufwärts, dann abwärts und schließlich zurück nach links. Die Suche ist rekursiv und sobald wir einen erfolgreichen Pfad gefunden haben, markieren wir die Leerzeichen in unserer Matrix und kehren zurück.

Probieren Sie es 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++]);
}

Beispielausgabe 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Beispielausgabe 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Beispielausgabe 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Seth
quelle