งานของคุณคือการเขียนล่าม RoboZZle หากคุณไม่คุ้นเคยกับเกมนี้โปรดดูวิดีโอที่ robozzle.comหรืออ่านคำอธิบายของฉันด้านล่าง
หุ่นยนต์อาศัยอยู่บนกริดสี่เหลี่ยมของสี่เหลี่ยมสีแดงเขียวน้ำเงินหรือดำ สี่เหลี่ยมสีดำไม่สามารถเข้าถึงได้ คนอื่นสามารถเข้าถึงได้และบางคนก็มีดาว เป้าหมายคือการรวบรวมดาวทั้งหมดโดยไม่ต้องเหยียบบนช่องสี่เหลี่ยมสีดำหรือตกจากแผนที่ หุ่นยนต์ใช้พื้นที่หนึ่งตารางเมตรและหันไปทิศทางใดทิศทางหนึ่ง - ซ้าย, ขวา, ขึ้นหรือลง มันทำตามคำแนะนำเหมือนการประกอบที่จัดกลุ่มเป็นรูทีนย่อย F1, F2, ... , F5 คำสั่งเป็นคู่ของคำกริยา ("ไม่มี", "ถ้าเป็นสีแดง", "ถ้าเป็นสีเขียว", "ถ้าเป็นสีน้ำเงิน") และการกระทำ ("ไปข้างหน้า", "เลี้ยวซ้าย", "เลี้ยวขวา", "วาดสี่เหลี่ยมจัตุรัสสีแดงปัจจุบัน", "ทาสีเขียว", "ทาสีฟ้า", "ไม่ทำอะไรเลย", "เรียก F1", ... , "เรียก F5") การเรียกรูทีนย่อยใช้ stack และสามารถเรียกซ้ำได้ เช่นเดียวกับในการเขียนโปรแกรมทั่วไปหลังจากคำสั่งสุดท้ายของรูทีนย่อยเสร็จสมบูรณ์การดำเนินการจะดำเนินต่อจากจุดที่เรียกรูทีนย่อย การประหารเริ่มต้นจากคำสั่งแรกของ F1 และดำเนินต่อไปจนกระทั่งทั้งหุ่นยนต์ได้เยี่ยมชมช่องสี่เหลี่ยมที่มีดาวทั้งหมดหรือเมื่อหุ่นยนต์เหยียบบนสี่เหลี่ยมสีดำหรือนอกแผนที่หรือมีการดำเนินการคำสั่ง 1,000 ครั้ง (เพรดิเคตที่ล้มเหลว ไม่นับ) หรือไม่มีคำแนะนำในการดำเนินการอีกต่อไป (stack underflow)
ปัจจัยการผลิต:
a
- เมทริกซ์อักขระขนาด 12x16 (ตามปกติในภาษาของคุณเช่นอาร์เรย์ของสตริง) ที่เข้ารหัสแผนที่ -'#'
สำหรับสี่เหลี่ยมที่ไม่สามารถเข้าถึงได้ (สีดำ)'*'
สำหรับสี่เหลี่ยมที่มีดาว'.'
สำหรับส่วนที่เหลือc
- เมทริกซ์อักขระ 12x16 อธิบายสีของช่องสี่เหลี่ยมที่สามารถเข้าถึงได้ -'R'
(แดง),'G'
(เขียว) หรือ'B'
(น้ำเงิน) สี่เหลี่ยมที่ไม่สามารถเข้าถึงได้จะถูกแสดงด้วยตัวอักษรโดยพลการจากทั้งสามy
และx
- แถวและคอลัมน์ที่ใช้ 0 ของหุ่นยนต์a[y][x]
รับประกันว่าจะเป็น'.'
d
- ทิศทางที่หุ่นยนต์จะหัน:0 1 2 3
ผู้มีสิทธิลงซ้ายขึ้นคือต่อ(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- สตริงเดียวการประยุกต์ใช้แบบต่อเนื่องของ F1 ... F5 แต่ละการดำเนินงานเป็น (อาจจะเป็นที่ว่างเปล่า) ลำดับของคู่กริยาการกระทำ (พักได้สูงสุด 10 คู่ต่อ subroutine)'|'
สิ้นสุดลงด้วยเพรดิเคต:
'_'
ไม่มี,'r'
แดง,'g'
เขียว,'b'
น้ำเงินการดำเนินการ:
'F'
ไปข้างหน้า'L'
เลี้ยวซ้าย'R'
เลี้ยวขวา'r'
ทาสีแดง'g'
ทาสีเขียว'b'
ทาสีฟ้า'1'
โทร F1, ... ,'5'
โทร F5'_'
ไม่ต้องทำอะไรเลย
คุณไม่จำเป็นต้องตั้งชื่อที่คุณป้อนเช่นด้านบน แต่ค่าของพวกเขาจะต้องเป็นไปตามที่ระบุไว้
เอาท์พุท: 1
(หรือtrue
) ถ้าหุ่นยนต์รวบรวมดาวทั้งหมดตามกฎ0
( false
) มิฉะนั้น
ตัวอย่าง :
a=["################","################","##*....*...*#.##","##.####.#####.##","##.####.#####.##","##.####*...*#.##","##.########.####","##*........*#.##","################","################","################","################"]
c=["RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRBBBBRGGGGRRRR","RRBRRRRGRRRRRRRR","RRBRRRRGRRRRRRRR","RRBRRRRRGGGBRRRR","RRBRRRRRRRRGRRRR","RRRBBBBGGGGBRBRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR"]
y=2; x=6; d=2
// and then depending on "f":
f="_FrLg2_1|_FbLrR_2||||" // result:1
f="_FrRg2_1|_FbLrR_2||||" // result:0 (stepped on a black square)
f="_FrLrL_1|_FbLrR_2||||" // result:0 (1000-step limit exceeded)
f="_FrLg2__|________||||" // result:0 (stack underflow)
อีกตัวอย่างหนึ่งที่เกี่ยวข้องกับคำแนะนำ "สี":
a=["#***************","#*###*###*###*##","#*###*###*###*##","***#***#***#***#","***#***#***#***#","*###*###*###*###","***#***#***#***#","***#***#***#***#","***#***#***#***#","*###*###*###*###","*.*#***#***#***#","***#***#***#***#"]
c=["RGGGGGGGGGGGGGGG","RBRRRGRRRGRRRGRR","RBRRRGRRRGRRRGRR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BRRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BGRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR"]
y=10; x=1; d=0
f="_2_R_R_1|_FgRgFgFg3rRr4b2_Fgb|_F_F_R|_2_L_r||"
// result:1
หากต้องการสร้างการทดสอบของคุณเองไปที่ตัวต่อจากรายการที่ robozzle.comลองแก้ปัญหา (หรือไม่แก้) กด F12 ในเบราว์เซอร์ของคุณพิมพ์ในคอนโซล JS:
r=robozzle;s=JSON.stringify;with(r.level)console.log('a='+s(Items)+'\nc='+s(Colors)+'\ny='+RobotRow+'\nx='+RobotCol+'\nd='+RobotDir+'\nf='+s(r.encodeSolution()))
และจัดรูปแบบผลลัพธ์ใหม่สำหรับภาษาของคุณ
ชนะสั้นที่สุด ไม่มีช่องโหว่