Помогите разработать новейшую головоломку Alphys!

16

Альфис, королевский ученый подполья, завершил создание прототипа новой головоломки. Тем не менее, она не может найти никого, кто хотел бы проверить это.

Правила ее загадки следующие:

Цель состоит в том, чтобы попасть на правую сторону, начиная с центральной плитки слева. Для головоломок с четными высотами, начните с нижней из двух центральных плиток. (Примеры: в массиве 4x4 с нулевым индексом начальная позиция будет [2,0] - строка 2, столбец 0. В массиве 5x5 с нулевым индексом начальная позиция будет [2,0] - строка 2, столбец 0.)

Каждая цветная плитка имеет свою «садистскую» функцию:

  • Розовые и зеленые плитки (обозначенные буквами «P» и «G») ничего не делают
  • Красные и желтые плитки («R», «Y») непроходимы.
  • Оранжевые плитки («О») заставляют игрока пахнуть апельсинами
  • Фиолетовые плитки («U») вынуждают игрока перейти к следующей плитке в направлении, в котором они находятся, и заставляют их пахнуть лимонами
  • Синие плитки («B») проходимы до тех пор, пока игрок не пахнет апельсинами.

Чтобы прояснить механику вкуса, запах игрока будет сохраняться бесконечно или пока не будет перекрыт плиткой с другим запахом, то есть, если игрок наступит на оранжевую плитку, он будет пахнуть как апельсины, пока не наступит на фиолетовую плитку.

Кроме того, желтая плитка, расположенная вертикально или горизонтально рядом с синей плиткой, также приведет к непроходимости синей плитки.


Ваша задача - написать программу или функцию, которая принимает двумерный массив символов (или массив строк 1D, или некоторый другой допустимый формат), представляющий макет головоломки в качестве входных данных, и выводит как исходную головоломку, так и решенную головоломку, со звездочками или некоторыми другой символ, показывающий правильный путь. Предположим, что данная головоломка разрешима.

Используйте эту головоломку в качестве примера:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Ваша программа выдаст:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Любая используемая головоломка должна быть сгенерирована с использованием этого .

Применяются стандартные правила игры в гольф. Лучшие ответы будут самыми короткими для каждого языка. Ответы должны содержать язык, количество байтов и три контрольных примера. Первые два могут быть любым макетом, который вы выберете, но третий должен быть:

RRRR
RPPR
PUOR
RPBP
EnragedTanker
источник
Предлагаемый контрольный пример: RRRR | RPPR | PUOR | RPBP. Если я не ошибся, для этого нужно дважды пройти плитку U. Также я не уверен в поведении U, когда плитка после того, как она непроходима, вы все еще можете ходить по U или вы не можете это сделать?
FryAmTheEggman
@FryAmTheEggman Если плитка после плитки U непроходима, вы не можете идти по плитке U в этом направлении.
EnragedTanker
@TimmyD Думаю, я не заметил этого, когда впервые сделал эту головоломку.
EnragedTanker
@crayzeedude Я думаю, ты неправильно понял контрольный пример Фрая. Это должен быть RPPR во втором ряду, а не RPRR.
Sherlock9
@ Sherlock9 Ой! Действительно, спасибо.
EnragedTanker

Ответы:

2

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

Подходим к головоломке, шагая сначала вправо, при условии, что мы не заблокированы, затем пробуем вверх, затем вниз и, наконец, снова налево. Поиск является рекурсивным, и как только мы определяем успешный путь, мы помечаем пробелы в нашей матрице и возвращаемся.

Попробуйте онлайн

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

Пример вывода 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Пример вывода 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Пример вывода 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Сет
источник