Alphysの最新パズルの開発を支援してください!


16

地下の王立科学者アルフィスは、新しいパズルのプロトタイプを完成させました。しかし、彼女はそれをテストしてくれる人を見つけることができないようです。

彼女のパズルのルールは次のとおりです。

目標は、左側の中央のタイルから開始して右側に到達することです。高さが偶数のパズルの場合は、2つの中央のタイルの下から始めます。(例:インデックス0の4x4配列では、開始位置は[2,0]-行2、列0になります。インデックス0の5x5配列では、開始位置は[2,0]-行2、列になります0.)

各色のタイルには、独自の「サディスティック」機能があります。

  • ピンクと緑のタイル(「P」と「G」として表される)は何もしません
  • 赤と黄色のタイル(「R」、「Y」)は通過できません。
  • オレンジ色のタイル(「O」)により、プレイヤーはオレンジのような香りがします。
  • 紫色のタイル(「U」)は、プレーヤーを向いている方向の次のタイルに移動させ、レモンのような匂いを与えます。
  • 青いタイル(「B」)は、プレイヤーがオレンジのような匂いがしない限り問題ありませ

フレーバーのメカニズムを明確にするために、プレイヤーの匂いは無期限に、または異なる香りのタイルで上書きされるまで持続します。つまり、プレイヤーがオレンジ色のタイルを踏むと、紫色のタイルを踏むまでオレンジの匂いがします。

さらに、青のタイルに垂直または水平に隣接して黄色のタイルを配置すると、青のタイルも通過できなくなります。


あなたのタスクは、入力としてパズルのレイアウトを表す2次元文字配列(または1D文字列配列、または他の有効な形式)を受け入れ、元のパズルと解かれたパズルの両方をアスタリスクなどで出力するプログラムまたは関数を書くことです正しいパスを示す他の文字。与えられたパズルは解けると仮定します。

このパズルを例として使用してください。

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

プログラムは次を出力します。

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

使用するパズルは、これを使用し生成する必要があります。

標準コードのゴルフ規則が適用されます。最良の回答は、各言語で最短になります。回答には、言語、バイト数、および3つのテストケースが含まれている必要があります。最初の2つは任意のレイアウトにすることができますが、3つ目は次のようにする必要があります。

RRRR
RPPR
PUOR
RPBP

提案されたテストケース:RRRR | RPPR | 悪い| RPBP。間違いを犯さなかった場合は、Uタイルを2回通過する必要があります。また、タイルが通過できない場合のUの動作についてはわかりませんが、まだUの上を歩くことができますか、それともできませんか?
FryAmTheEggman

@FryAmTheEggman Uタイルの後のタイルが通過できない場合、その方向にUタイルの上を歩くことはできません。
EnragedTanker

@TimmyD私が最初にそのパズルをやったとき、私はそれに気づかなかったと思います。
-EnragedTanker

@crayzeedude Fryのテストケースが間違っていたと思います。2行目の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++]);}

ブロックされていない場合は、最初に右にステップしてパズルに近づき、次に試し、次にダウンして、最後に左に戻ります。検索は再帰的であり、成功したパスを特定したら、マトリックス内のスペースにマークを付けて戻ります。

オンラインで試す

非ゴルフ

#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###
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.