Giúp phát triển câu đố mới nhất của Alphys!


16

Alphys, Nhà khoa học Hoàng gia của Tàu điện ngầm, đã hoàn thành một nguyên mẫu cho một câu đố mới. Tuy nhiên, cô ấy dường như không thể tìm thấy bất cứ ai sẵn sàng thử nghiệm nó.

Các quy tắc của câu đố của cô như sau:

Mục tiêu là để đến bên phải, bắt đầu từ ô trung tâm ở bên trái. Đối với các câu đố có chiều cao được đánh số chẵn, bắt đầu ở phía dưới của hai ô trung tâm. (Ví dụ: Trong mảng 4x4 được lập chỉ mục 0, vị trí bắt đầu sẽ là [2,0] - hàng 2, cột 0. Trong mảng 5x5 được lập chỉ mục 0, vị trí bắt đầu sẽ là [2,0] - hàng 2, cột 0.)

Mỗi ô màu có chức năng "tàn bạo" riêng:

  • Gạch màu hồng và màu xanh lá cây (đại diện là "P" và "G") không làm gì cả
  • Gạch đỏ và vàng ("R", "Y") là không thể vượt qua.
  • Gạch màu cam ("O") làm cho người chơi có mùi như cam
  • Gạch màu tím ("U") buộc người chơi đến ô tiếp theo theo hướng họ đang đối mặt và khiến chúng có mùi như chanh
  • Gạch màu xanh lam ("B") có thể qua được miễn là người chơi không có mùi như cam.

Để làm rõ cơ chế hương vị, mùi của người chơi sẽ tồn tại vô thời hạn hoặc cho đến khi bị đè lên bởi một viên gạch có mùi khác, tức là nếu người chơi bước lên một viên gạch màu cam, họ sẽ ngửi thấy mùi cam cho đến khi họ bước lên một viên ngói màu tím.

Ngoài ra, một ô màu vàng được đặt theo chiều dọc hoặc chiều ngang liền kề với ô màu xanh lam cũng sẽ khiến ô màu xanh trở nên không thể xuyên thủng.


Nhiệm vụ của bạn là viết một chương trình hoặc hàm chấp nhận mảng ký tự 2 chiều (hoặc mảng chuỗi 1D hoặc một số định dạng hợp lệ khác) biểu thị bố cục của câu đố làm đầu vào và xuất ra cả câu đố gốc và câu đố đã giải, bằng dấu hoa thị hoặc một số nhân vật khác hiển thị đường dẫn chính xác. Giả sử rằng câu đố đã cho là có thể giải được.

Sử dụng câu đố này làm ví dụ:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

Chương trình của bạn sẽ xuất ra:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

Bất kỳ câu đố được sử dụng phải được tạo ra bằng cách này .

Quy tắc golf tiêu chuẩn áp dụng. Câu trả lời tốt nhất sẽ là ngắn nhất cho mỗi ngôn ngữ. Câu trả lời phải chứa ngôn ngữ, số byte và ba trường hợp kiểm tra. Hai cái đầu tiên có thể là bất kỳ bố cục nào bạn chọn, nhưng cái thứ ba phải là:

RRRR
RPPR
PUOR
RPBP

Trường hợp thử nghiệm đề xuất: RRRR | RPPR | PUOR | RPBP. Nếu tôi không phạm sai lầm, điều này đòi hỏi bạn phải vượt qua ô chữ U hai lần. Ngoài ra tôi không chắc chắn về hành vi của U khi gạch sau nó không thể vượt qua được, bạn vẫn có thể đi lên U hay bạn không thể làm điều đó?
FryAmTheEggman

@FryAmTheEggman Nếu gạch sau gạch U là không thể vượt qua, bạn không thể đi trên gạch U theo hướng đó.
EnragedTanker 10/03/2016

@TimmyD Đoán tôi đã không nhận thấy rằng khi tôi lần đầu tiên thực hiện câu đố đó.
EnragedTanker 10/03/2016

@crayzeedude Tôi nghĩ bạn đã hiểu sai trường hợp của Fry. Nó phải là RPPR ở hàng thứ hai, không phải RPRR.
Sherlock9

@ Sherlock9 Rất tiếc! Quả thực tôi đã làm, cảm ơn.
EnragedTanker 11/03/2016

Câu trả lời:


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

Chúng tôi tiếp cận câu đố bằng cách bước đầu tiên sang phải, với điều kiện chúng tôi không bị chặn, sau đó cố gắng lên, rồi xuống và cuối cùng quay lại bên trái. Tìm kiếm là đệ quy và một khi chúng tôi xác định một đường dẫn thành công, chúng tôi đánh dấu các khoảng trắng trong ma trận của chúng tôi và trả về.

Dùng thử trực tuyến

Bị đánh cắp

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

Ví dụ đầu ra 1

PYYOPPPP
YRGGRYRG
PGPBYPUR
PYRBOYOG
OBPGYYPP
PRGPOYPO
YPYOUGPP
YGROBRYY
RGRYBBOG

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

Ví dụ đầu ra 2

PBYRYPGP
OBRGOOBG
PGPGUROO
PUGORBUG
PUPUUURO
BGGUYPRG
GBOPGGRG
PUPUBUYB
GYOPRPOG

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

Ví dụ đầu ra 3

RRRR
RPPR
PUOR
RPBP

RRRR
R##R
###R
R###
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.