Bantu kembangkan puzzle terbaru Alphys!

16

Alphys, Ilmuwan Kerajaan Bawah Tanah, telah menyelesaikan prototipe untuk sebuah teka-teki baru. Namun, dia sepertinya tidak bisa menemukan orang yang mau mengujinya.

Aturan teka-tekinya adalah sebagai berikut:

Tujuannya adalah untuk sampai ke sisi kanan, mulai dari ubin paling tengah di sisi kiri. Untuk teka-teki dengan ketinggian bernomor genap, mulailah dari bagian bawah dari dua ubin tengah. (Contoh: Dalam array 4x4 yang diindeks nol, posisi awal adalah [2,0] - baris 2, kolom 0. Dalam array 5x5 yang diindeks nol, posisi awal adalah [2,0] - baris 2, kolom 0.)

Setiap ubin berwarna memiliki fungsi "sadis" sendiri:

  • Ubin merah muda dan hijau (direpresentasikan sebagai "P" dan "G") tidak melakukan apa pun
  • Ubin merah dan kuning ("R", "Y") tidak dapat dilewati.
  • Ubin oranye ("O") membuat pemain berbau seperti jeruk
  • Ubin ungu ("U") memaksa pemain ke ubin berikutnya ke arah yang mereka hadapi dan membuatnya berbau seperti lemon
  • Ubin biru ("B") lumayan selama pemain tidak berbau seperti jeruk.

Untuk memperjelas mekanisme rasa, aroma pemain akan bertahan tanpa batas waktu atau sampai ditimpa oleh ubin berbau berbeda, yaitu jika pemain menginjak ubin oranye mereka akan berbau seperti jeruk sampai mereka menginjak ubin ungu.

Selain itu, ubin kuning yang ditempatkan secara vertikal atau horizontal berdekatan dengan ubin biru akan menyebabkan ubin biru menjadi tidak bisa dilewati juga.


Tugas Anda adalah menulis program atau fungsi yang menerima larik karakter 2 dimensi (atau larik string 1D, atau format valid lainnya) yang mewakili tata letak puzzle sebagai input dan output puzzle asli dan puzzle yang dipecahkan, dengan tanda bintang atau beberapa karakter lain yang menunjukkan jalur yang benar. Asumsikan bahwa teka-teki yang diberikan dapat dipecahkan.

Gunakan puzzle ini sebagai contoh:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Program Anda akan menampilkan:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Setiap puzzle yang digunakan harus dihasilkan menggunakan ini .

Aturan golf kode standar berlaku. Jawaban terbaik akan menjadi yang terpendek untuk setiap bahasa. Jawaban harus berisi bahasa, jumlah byte, dan tiga kasus uji. Dua yang pertama bisa berupa tata letak yang Anda pilih, tetapi yang ketiga harus:

RRRR
RPPR
PUOR
RPBP
EnragedTanker
sumber
Kasus uji yang diusulkan: RRRR | RPPR | PUOR | RPBP. Jika saya tidak melakukan kesalahan, ini mengharuskan Anda pergi ke ubin U dua kali. Juga saya tidak yakin tentang perilaku U ketika ubin setelah itu dilewati, dapatkah Anda masih berjalan ke U atau Anda tidak dapat melakukan itu?
FryAmTheEggman
@FryAmTheEggman Jika ubin setelah ubin U tidak dapat dilewati, Anda tidak dapat berjalan di ubin U ke arah itu.
EnragedTanker
@TimmyD Tebak saya tidak menyadari bahwa ketika saya pertama kali membuat puzzle itu.
EnragedTanker
@crayzeedude Saya pikir Anda salah dalam test case Fry. Itu harus RPPR di baris kedua, bukan RPRR.
Sherlock9
@ Sherlock9 Whoops! Memang saya lakukan, terima kasih.
EnragedTanker

Jawaban:

2

C 529 byte

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

Kami mendekati teka-teki dengan melangkah pertama ke kanan, asalkan kami tidak terhalang, lalu mencoba naik, lalu turun dan akhirnya kembali ke kiri. Pencarian bersifat rekursif dan setelah kami mengidentifikasi jalur yang berhasil, kami menandai spasi di matriks kami dan kembali.

Cobalah secara Online

Tidak disatukan

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

Contoh Output 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Contoh Output 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Contoh Output 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Seth
sumber