เล่นกับหุ่นยนต์สำหรับเด็ก - ฉันจะไปถึงจดหมายฉบับไหน?


12

TL; DR:กำหนดอาร์เรย์ของตัวอักษรและหุ่นยนต์ในตำแหน่งเริ่มต้นของอาร์เรย์เขียนอัลกอริธึมที่สามารถอ่านสตริงที่มีการเคลื่อนไหว ( Fสำหรับ "ไปข้างหน้า" Rสำหรับ "หมุน 90 องศาขวา" และL"หมุน 90 องศา left ") และคำนวณตำแหน่งสิ้นสุดของหุ่นยนต์ รายละเอียดเพิ่มเติมในข้อความที่สมบูรณ์

เรามีอุปกรณ์ที่ตั้งโปรแกรมได้ง่าย ๆ ที่บ้านสำหรับเด็ก ๆ : ยานพาหนะขนาดเล็กที่มีปุ่มเพื่อให้รถเดินไปข้างหน้าเลี้ยวซ้าย 90 องศาหรือเลี้ยวขวา 90 องศา สิ่งที่คล้ายกับสิ่งนี้:

เมาส์ยานพาหนะ

เรายังมีแผ่นโฟมพร้อมตัวอักษรดังนี้:

กำลังเล่นเสื่อ

จุดประสงค์ทั้งหมดนี้คือการสอนเด็ก ๆ ทั้งตัวอักษรและพื้นฐานของการเขียนโปรแกรมทั้งหมดในครั้งเดียว

ความท้าทาย

สมมติว่าเราได้จัดเรียงแผ่นโฟมแบบสุ่มของเราดังนี้:

+---+---+---+---+---+---+---+
| E | R | L | B | I | X | N |
+---+---+---+---+---+---+---+
| O | A | Q | Y | C | T | G |
+---+---+---+---+---+---+---+
| F | W | H | P | D | Z | S |
+---+---+---+---+---+---+---+
    | K | V | U | M | J |   
    +---+---+---+---+---+
            |   |
            +---+

สมมติว่าเราได้ปรับเปลี่ยนยานพาหนะเพื่อให้เมื่อเราตั้งโปรแกรมคำสั่ง "ไปข้างหน้า" ยานพาหนะจะเดินไปข้างหน้าขนาดหนึ่งตารางในเสื่อ ดังนั้นถ้ายานพาหนะอยู่ในUจตุรัสและไปทางเหนือมันจะหยุดที่Pจัตุรัส

คำแนะนำทั้งหมดมอบให้กับยานพาหนะก่อนที่จะเริ่มเคลื่อนที่และนั่นคือ:

  • F: ยานพาหนะก้าวไปข้างหน้าสู่จตุรัสถัดไป
  • R: รถยนต์หันไปทางขวา 90 องศา (ไม่มีการเคลื่อนที่ใด ๆ เพิ่มเติม)
  • L: รถยนต์หันไปทางซ้าย 90 องศาแทน (ไม่มีการเคลื่อนไหวเพิ่มเติม)

เมื่อได้รับคำแนะนำคุณสามารถกดปุ่ม "ไป" และส่งยานพาหนะไปยังตำแหน่งที่กำหนดเนื่องจากมันจะเป็นไปตามคำสั่งทุกอย่างในลำดับที่กำหนด ดังนั้นคุณสามารถบอกเด็กให้ใส่คำแนะนำที่จำเป็นสำหรับยานพาหนะเพื่อไปที่ตัวอักษรที่กำหนด

คุณต้องเขียนโปรแกรม / ฟังก์ชั่นที่สั้นที่สุดที่ประมวลผลstring(พารามิเตอร์อินพุต) ด้วยชุดคำสั่งและคำนวณตัวอักษรที่ยานพาหนะจอดอยู่เหนือ (เอาต์พุตstring)

รายละเอียด:

  • ยานพาหนะจะเริ่มที่ช่องว่างด้านล่างเสมอและหันไปทางทิศเหนือ (ไปทางUจัตุรัส)
  • สายป้อนจะมีเพียงตัวอักษรF, R, LและG(สำหรับปุ่ม "ไป") คุณสามารถใช้ตัวอักษรพิมพ์เล็กสำหรับเสื่อและคำแนะนำหากคุณต้องการ
  • อัลกอริทึมจะต้องเชื่อฟังคำสั่งทุกคำสั่งในสตริงก่อนGคำสั่งแรก(ทุกคำสั่งหลังจากนั้นจะถูกเพิกเฉยเมื่อยานพาหนะเริ่มเคลื่อนที่)
  • ถ้ารถออกไปของเสื่อในขณะที่กำหนดใด ๆ (แม้ว่าสายป้อนยังไม่ได้รับการประมวลผลอย่างสมบูรณ์) Out of matอัลกอริทึมต้องกลับสตริง
  • หากไม่เป็นเช่นนั้นอัลกอริทึมจะต้องส่งคืนตัวอักษรที่ยานพาหนะหยุดทำงาน จุดเริ่มต้นนับเป็นถ่าน (หรือสตริงว่าง)

ตัวอย่าง:

Input: FFG
Output: P

Input: FRFRFG
Output: Out of mat

Input: RRFFG
Output: Out of mat

Input: FFFRFFLFG
Output: X

Input: FFFRFFLF
Output:      <-- Nothing or a whitespace (the robot has not started moving)

Input: FFFRRFFFG
Output:      <-- Nothing or a whitespace (the robot has returned to the starting point)

Input: RRRRRLFFFLFFRFRFGFFRRGRFF
Output: L    (Everything after the first G is ignored)

นี่คือดังนั้นโปรแกรมที่สั้นที่สุดสำหรับแต่ละภาษาจะชนะ!


1
ถัดไป: สิ่งเดียวกัน แต่ด้วยการกำหนดค่าเสื่อเป็นอินพุตสตริงโดย@เป็นตำแหน่งเริ่มต้นและช่องว่างที่อยู่นอกเสื่อดังนั้นการกำหนดค่านี้จะเป็นERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(ด้วยระยะห่างที่แตกต่างกัน SE ทำให้ยุ่งเหยิง)
Stephen

คำตอบ:


3

JavaScript (ES6), 194 176 169 163 ไบต์

บันทึกบางไบต์ด้วย @Luke และ @Arnauld

s=>(p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',[...s].every(i=>i=='L'?d--:i>'Q'?d++:i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:0)?'':t[p]||'Out of mat')

Ungolfed:

s=>(
  p=35,
  d=3,
  t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',
  [...s].every(i=>i=='L'?d--:
                  i<'Q'?d++:
                  i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:
                  0
              )?'':
               t[p]||'Out of mat'
)

f=
s=>(p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',[...s].every(i=>i=='L'?d--:i>'Q'?d++:i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:0)?'':t[p]||'Out of mat')

console.log(f('FFG')); //P
console.log(f('FRFRFG')); //Out of mat
console.log(f('RRFFG')); //Out of mat
console.log(f('FFFRFFLFG')); //X
console.log(f('FFFRFFLF')); //(space)
console.log(f('FFFRRFFFG')); //(space)
console.log(f('RRRRRLFFFLFFRFRFGFFRRGRFF')); //L
console.log(f('FFFFFRRFG')); //Out of mat


1
คุณสามารถบันทึกได้ 3 ไบต์โดยแทนที่falseด้วย!1
Luke

ขอบคุณ @Luke ฉันสามารถบันทึกจำนวนไบต์ได้จริงโดยลบการทดสอบ "G" ทั้งหมด หากไม่ใช่ "L", "R" หรือ "F" จะถือว่าเป็น "G" (ยกเว้นว่า "G" หายไป) ทั้งสองวิธีeveryวิธีจัดการมัน
Rick Hitchcock

นี่เป็นวิธีแก้ปัญหาสำหรับ 165 ไบต์:(s,p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11')=>[...s].every(i=>i=='L'?d--:i=='R'?d++:i=='F'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:1:0)?'':t[p]||'Out of mat'
ลุค

ไม่แน่ใจว่าจะทำให้ฉันถึง 165 bytes (?) แต่ฉันไม่ต้องการตัวแปรแยกต่างหากสำหรับ[1,8,-1,-8]อาร์เรย์ขอบคุณ!
Rick Hitchcock

โอ๊ะโอต้องมีการผิดพลาดคือ 171 ฉันยังลบช่องว่างที่คุณไม่ต้องการซึ่งยังอยู่ในคำตอบปัจจุบัน (เป็นช่องว่างสุดท้าย)
ลุค


2

Python 3 , 226 231 241 ไบต์

แก้ไขที่สอง; ควรทำงานตอนนี้ อีกครั้งการเพิ่มประสิทธิภาพมากมายที่ต้องทำ

n=input();s="0ERLBIXN00OAQYCTG00FWHPDZS000KVUMJ000000 00000";d=1;c=40;i=0;w=[-1,-9,1,9]
while n[i]!="G"and c>=0:
 if n[i]=="F":c+=w[d]
 else:d=[d+[-1,3][d<0],-~d%4][n[i]=="R"]
 i+=1
print(["Out of mat",s[c]][c in range(len(s))and s[c]!="0"])

ลองออนไลน์!


0

ภาษา Wolfram / Mathematica, 300 Bytes

p=Re[(1-7I)#[[1]]]&;d=Drop;t=Throw;s=Switch;s[#,0,"Out of mat",_,StringPart["000 0000KVUMJ0FWHPDZSOAQYCTGERLBIXN",p@#]]&@Catch@Fold[If[MemberQ[d[d[Range[4,35],{2,5}],{7}],p@#],#,t@0]&@(s[#2,"F",#+{#[[2]],0},"R",#{1,-I},"L",#{1,I},_,t[#]]&)[#1,#2]&,{4,I},If[StringFreeQ["G"]@#,{"G"},Characters@#]&@#]&

Ungolfed:

p = Re[(1 - 7 I) #[[1]]] &;
d = Drop;
t = Throw;
s = Switch;
s[#,
    0, "Out of mat",
    _, StringPart["000 0000KVUMJ0FWHPDZSOAQYCTGERLBIXN", p@#]] &@
  Catch@
  Fold[
    If[MemberQ[d[d[Range[4, 35], {2, 5}], {7}], p@#], #, 
        t@0] &@(s[#2, "F", # + {#[[2]], 0}, "R", # {1, -I}, 
          "L", # {1, I}, _, t[#]] &)[#1, #2] &,
    {4, I},
    If[StringFreeQ["G"]@#, {"G"}, Characters@#] &@#] &
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.