ช่วยพัฒนาตัวต่อใหม่ล่าสุดของ Alphys!


16

Alphys นักวิทยาศาสตร์ระดับสูงของ Underground ได้สร้างต้นแบบสำหรับปริศนาตัวใหม่เสร็จแล้ว อย่างไรก็ตามเธอดูเหมือนจะไม่พบใครที่ต้องการทดสอบ

กฎของตัวต่อมีดังนี้:

เป้าหมายคือการไปทางด้านขวาเริ่มต้นจากแผ่นกระเบื้องศูนย์กลางด้านซ้าย สำหรับปริศนาที่มีตัวเลขสูงให้เริ่มที่ด้านล่างของแผ่นกลางสองแผ่น (ตัวอย่าง: ในอาร์เรย์ 4x4 ที่ทำดัชนีเป็นศูนย์ตำแหน่งเริ่มต้นจะเป็น [2,0] - แถว 2, คอลัมน์ 0 ในอาร์เรย์ 5x5 ที่มีดัชนีเป็นศูนย์ตำแหน่งเริ่มต้นจะเป็น [2,0] - แถว 2, คอลัมน์ 0. )

กระเบื้องแต่ละสีมีฟังก์ชัน "ซาดิสต์" ของตัวเอง:

  • กระเบื้องสีชมพูและสีเขียว (แสดงเป็น "P" และ "G") ไม่ทำอะไรเลย
  • กระเบื้องสีแดงและสีเหลือง ("R", "Y") ไม่สามารถใช้ได้
  • กระเบื้องส้ม ("O") ทำให้ผู้เล่นมีกลิ่นเหมือนส้ม
  • กระเบื้องสีม่วง ("U") บังคับให้ผู้เล่นไปยังแผ่นถัดไปในทิศทางที่พวกเขากำลังเผชิญอยู่และทำให้พวกเขามีกลิ่นเหมือนมะนาว
  • กระเบื้องสีฟ้า ( "B") เป็นพอตราบใดที่ผู้เล่นจะไม่ได้กลิ่นเหมือนส้ม

เพื่ออธิบายให้ชัดเจนเกี่ยวกับกลไกกลิ่นรสกลิ่นของผู้เล่นจะคงอยู่ไม่สิ้นสุดหรือจนกว่าจะถูกแทนที่ด้วยกระเบื้องที่มีกลิ่นต่างกันนั่นคือถ้าผู้เล่นเหยียบกระเบื้องสีส้มพวกเขาจะได้กลิ่นเหมือนส้มจนกว่าพวกเขาจะเหยียบกระเบื้องสีม่วง

นอกจากนี้การเรียงต่อกันของกระเบื้องสีเหลืองที่วางในแนวตั้งหรือแนวนอนกับกระเบื้องสีน้ำเงินจะทำให้กระเบื้องสีน้ำเงินไม่สามารถใช้ได้เช่นกัน


งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับอาร์เรย์อักขระสองมิติ (หรือสตริงสตริง 1D หรือรูปแบบที่ถูกต้องอื่น ๆ ) ที่แสดงถึงเค้าโครงของปริศนาเป็นอินพุตและเอาต์พุตทั้งปริศนาต้นฉบับและปริศนาที่แก้ไขด้วยเครื่องหมายดอกจันหรือบางส่วน ตัวละครอื่น ๆ แสดงเส้นทางที่ถูกต้อง สมมติว่าปริศนาที่ให้นั้นสามารถแก้ไขได้

ใช้ตัวต่อนี้เป็นตัวอย่าง:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

โปรแกรมของคุณจะแสดงผล:

BGYBG
PGPBG
PUBPB
OUGYB
PPOPP

BGYBG
PGPBG
*****
OUGYB
PPOPP

ปริศนาใด ๆ ที่ใช้ต้องได้รับการสร้างขึ้นโดยใช้นี้

บังคับใช้กฎกอล์ฟมาตรฐาน คำตอบที่ดีที่สุดจะสั้นที่สุดสำหรับแต่ละภาษา รู้รอบต้องประกอบด้วยภาษาจำนวนไบต์และกรณีทดสอบสามกรณี สองรูปแรกสามารถเป็นเลย์เอาต์ที่คุณเลือกได้

RRRR
RPPR
PUOR
RPBP

กรณีทดสอบที่เสนอ: RRRR | RPPR | PUOR | RPBP หากฉันไม่ได้ทำผิดพลาดคุณต้องไปที่ไทล์ U สองครั้ง นอกจากนี้ฉันไม่แน่ใจเกี่ยวกับพฤติกรรมของ U เมื่อกระเบื้องหลังจากมันไม่สามารถใช้ได้คุณยังสามารถเดินไปที่ U หรือคุณไม่สามารถทำเช่นนั้นได้หรือไม่?
FryAmTheEggman

@FryAmTheEggman หากไทล์หลังไพ่ U ไม่สามารถใช้งานได้คุณจะไม่สามารถเดินบนไทล์ U ในทิศทางนั้นได้
EnragedTanker

@ TimmyD Guess ฉันไม่ได้สังเกตว่าเมื่อฉันทำปริศนานั้นเป็นครั้งแรก
EnragedTanker

@ crayzeedude ฉันคิดว่าคุณมีกรณีทดสอบของ Fry ผิด ควรเป็น 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###
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.