Pomóż opracować najnowsze puzzle Alphys!

16

Alphys, Królewski Naukowiec Podziemia, ukończył prototyp nowej układanki. Wydaje się jednak, że nie może znaleźć nikogo, kto chciałby to przetestować.

Zasady jej układanki są następujące:

Celem jest przejście na prawą stronę, zaczynając od środkowej płytki po lewej stronie. W przypadku puzzli o parzystych wysokościach zacznij od dolnej z dwóch środkowych płytek. (Przykłady: w tablicy 4x4 o indeksie zerowym pozycja początkowa wynosiłaby [2,0] - wiersz 2, kolumna 0. W tablicy 5x5 o indeksie zerowym pozycja początkowa to [2,0] - wiersz 2, kolumna 0.)

Każda kolorowa płytka ma własną funkcję „sadystyczną”:

  • Różowe i zielone kafelki (reprezentowane jako „P” i „G”) nic nie robią
  • Czerwone i żółte płytki („R”, „Y”) są nieprzejezdne.
  • Pomarańczowe płytki („O”) sprawiają, że gracz pachnie pomarańczami
  • Fioletowe kafelki („U”) zmuszają gracza do następnego kafelka w kierunku, w którym są skierowane i sprawiają, że pachną cytrynami
  • Niebieskie płytki („B”) są przejezdne, o ile gracz nie pachnie pomarańczami.

Aby wyjaśnić mechanikę smaku, zapach gracza utrzyma się przez czas nieokreślony lub dopóki nie zostanie zastąpiony przez inny pachnący kafelek, tj. Jeśli gracz nadepnie na pomarańczową płytkę, będzie pachniał pomarańczą, dopóki nie wejdzie na fioletową płytkę.

Dodatkowo żółta płytka umieszczona pionowo lub poziomo w sąsiedztwie niebieskiej płytki spowoduje, że niebieska płytka również stanie się nieprzejezdna.


Twoim zadaniem jest napisanie programu lub funkcji, która akceptuje dwuwymiarową tablicę znaków (lub tablicę łańcuchów 1D lub inny prawidłowy format) reprezentującą układ kostki jako dane wejściowe i wyjściowe zarówno oryginalnej, jak i rozwiązanej układanki, z gwiazdkami lub niektórymi inny znak wskazujący prawidłową ścieżkę. Załóż, że daną łamigłówkę można rozwiązać.

Użyj tej układanki jako przykładu:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Twój program wyświetli:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Każda użyta łamigłówka musi zostać wygenerowana przy użyciu tego .

Obowiązują standardowe zasady gry w golfa. Najlepsze odpowiedzi będą najkrótsze dla każdego języka. Odpowiedzi muszą zawierać język, liczbę bajtów i trzy przypadki testowe. Pierwsze dwa mogą być dowolnymi wybranymi układami, ale trzeci musi być:

RRRR
RPPR
PUOR
RPBP
EnragedTanker
źródło
Proponowany przypadek testowy: RRRR | RPPR | PUOR | RPBP. Jeśli nie popełniłem błędu, wymaga to dwukrotnego przejścia przez kafelek U. Nie jestem również pewien zachowania U, gdy kafelek po nim jest nieprzejezdny, czy nadal możesz wejść na U lub nie jesteś w stanie tego zrobić?
FryAmTheEggman
@FryAmTheEggman Jeśli kafelek po kafelku U jest nieprzejezdny, nie możesz chodzić po kafelku U w tym kierunku.
EnragedTanker 10.03.16
@ TimmyD Chyba nie zauważyłem tego, kiedy po raz pierwszy zrobiłem tę łamigłówkę.
EnragedTanker
@crayzeedude Myślę, że źle popełniłeś przypadek testowy Fry. Powinien to być RPPR w drugim rzędzie, a nie RPRR.
Sherlock9,
@ Sherlock9 Ups! Rzeczywiście, dzięki.
EnragedTanker

Odpowiedzi:

2

C 529 bajtów

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

Podchodzimy do łamigłówki, przechodząc najpierw w prawo, pod warunkiem, że nie jesteśmy zablokowani, następnie próbujemy w górę, potem w dół i wreszcie z powrotem w lewo. Wyszukiwanie jest rekurencyjne i po znalezieniu udanej ścieżki zaznaczamy spacje w naszej macierzy i wracamy.

Wypróbuj online

Nie golfił

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

Przykładowy wynik 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Przykładowy wynik 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Przykładowy wynik 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Seth
źródło