แปลง Brainfuck เป็น MarioLANG


28

MarioLANGเป็นภาษาโปรแกรมสองมิติที่ซอร์สโค้ดคล้ายกับระดับ Super Mario Bros. นอกจากนี้ชุดคำสั่งของมันจะคล้ายกับbrainfuck 's ซึ่งหมายความว่า MarioLANG นั้นเป็นสมอง 2 มิติที่ตัวชี้คำสั่งเคลื่อนไหวเหมือนมาริโอ ดังนั้นเมื่อฉันเขียนการยื่น MarioLANGสำหรับแบบทดสอบภาษาโปรแกรมฉันเริ่มต้นด้วยการแปลง Brainfuck "Hello, World!" โปรแกรมเพื่อ MarioLANG ฉันสังเกตเห็นว่าสิ่งนี้เป็นไปได้ด้วยกระบวนการที่เป็นระบบดังนั้นลองเขียนคอมไพเลอร์ Brainfuck-to-MarioLANG กัน!

หมายเหตุ: MarioLANG สเปคไม่ได้เป็นที่ชัดเจนอย่างสิ้นเชิงดังนั้นฉันสมมติว่าการตีความของการดำเนินงานทับทิม

ฉันจะอธิบายกระบวนการด้วยโปรแกรม Brainfuck ต่อไปนี้:

++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.

มันพิมพ์Hello!และขึ้นบรรทัดใหม่ต่อท้าย

  1. แปลง<และ>เป็น(และ)ตามลำดับ:

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    
  2. เพิ่มพื้นสำหรับมาริโอเพื่อเดินบน:

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    ========================================================================
    
  3. ตอนนี้ปัญหาคือ MarioLANG ไม่ได้มีลูปเช่นและ[ ]แต่เราต้องใช้ลิฟต์และคำแนะนำเพื่อให้มาริโอเดินวนเป็นวงกลม ครั้งแรกที่เราเข้ามาแทนที่[ด้วยและเปลี่ยนไปที่พื้น> "และเรายังแทนที่]ด้วย[!และเปลี่ยนพื้นเพื่อ=#:

    ++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
    =="======"===============================#===#============================
    
  4. "และ#สามารถสร้างลิฟท์ (เริ่มต้นจาก#ตอนจบที่") ดังนั้นตอนนี้สิ่งที่เราต้องการจะเสริมชั้นสำหรับมาริโอที่จะเดินกลับมาที่ การเริ่มต้นด้วย!และสิ้นสุดด้วย<:

    ++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
    =="======"===============================#===#============================
             !                               <    
             #==============================="    
      !                                          <
      #=========================================="
    

    โปรดทราบว่าทุกบรรทัดต้องมีอย่างน้อยที่สุดตราบวนลูปล้อมรอบที่ใหญ่ที่สุดเนื่องจากล่ามไม่สามารถเชื่อมต่อลิฟท์สิ้นสุดในบรรทัดที่สั้นกว่าได้ ดังนั้นเราจึงขีดเส้นกลางด้วยช่องว่าง

และนั่นคือมัน เรามีโปรแกรม MarioLANG ที่ทำงานได้อย่างสมบูรณ์และเทียบเท่า

ความท้าทาย

ให้โปรแกรม Brainfuck ที่ถูกต้องใช้ขั้นตอนข้างต้นเพื่อรวบรวมเป็นโปรแกรม MarioLANG

,.+-<>[]คุณอาจจะคิดว่ามีตัวอักษรคำสั่งเท่านั้นในการป้อนข้อมูลคือตัวละครที่ไม่มียกเว้น

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

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์ หากคุณไม่พิมพ์ผลลัพธ์ไปที่ STDOUT ก็ควรจะเป็นสตริงที่คั่นด้วยบรรทัดใหม่

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

กรณีทดสอบ

กรณีทดสอบมีการจัดรูปแบบดังนี้: บรรทัดแรกคือโปรแกรม Brainfuck (อินพุตของคุณ) จากนั้นมีบรรทัดว่างและทุกอย่างจนกระทั่งบรรทัดว่างถัดไปเป็นผลลัพธ์ที่คาดหวังใน MarioLANG ตัวอย่างเหล่านี้ใช้พื้นที่ที่มีเบาะรองน้อยที่สุด หรือคุณอาจรองแต่ละบรรทัดด้วยช่องว่างตามความกว้างของบรรทัดแรกของผลลัพธ์

>,++-.<

),++-.(
=======

,[.,]

,>.,[!
="===#
 !   <
 #==="

>>[-]<<[->>+<<]

))>-[!((>-))+(([!
=="==#=="=======#
  !  <  !       <
  #=="  #======="

++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.

++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
=="======"===============================#===#============================
         !                               <    
         #==============================="    
  !                                          <
  #=========================================="

[][[[][[]]][]][[]]

>[!>>>[!>>[![![!>[![!>>[![!
"=#"""=#""=#=#=#"=#=#""=#=#
! <  ! < ! <    ! <   ! <  
#="  #=" #="    #="   #="  
        !    <       !    <
        #===="       #===="
    !          <     
    #=========="     
   !                <
   #================"


>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>++>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>++++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++..------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]

))+++++++))++))++++))+++++++))+))++++))+))+++))+))+++++))+))++))+))++++++))++))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+))+))+))++++))+++++++))+))+++++))++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+++++++++++++++++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))+++++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))++))++++))+++++++))+))+++++))+++++++))+))+++++))+))+))+))++++))+))++))+))++++++))+))+++++))+++++++))+))++++))+))+))++))+++++))+))+++))+))++++))+))++))+))++++++))+))+++++))+++++++++++++++++++))++))++))+++))++))+))++))++++))+++++++))++))+++++))++++++++++))+))++))++++))+))++))+))++++++))++++++))+))+))+++++))+))++++++))++))+++++))+++++++))++))++++))+))++++++>(([!))>)++++++>-((++++++++++))[!((++..-------------------)>-(.))+([!)>-(+)[!)[!((>->->->->->->)++)[!(+++++++++++++++++++++++++++++)[!(++)[!(++++++++++++++)[!(+)[!(++)[!((>-).([!(([!
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================="===#=="======="================#=========================="========#="=====#==#=="="="="="="="=====#================================#=====#=================#====#=====#=="=====#===#
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         !   <          !                <                          !        < !     <                 !     <                                                                      !     <    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         #==="          #================"                          #========" #====="                 #====="                                                                      #====="    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                !                                                                       <            !                                        <                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                #======================================================================="            #========================================"                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   !                                                <                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   #================================================"                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 !                                                                    <                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 #===================================================================="                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               !                                                                           <                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               #==========================================================================="                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             !                                                                                   <             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             #==================================================================================="             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           !                                                                                                  <
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           #=================================================================================================="

คำตอบ:


5

CJam, 148 144 ไบต์

q"<>[""()>"er']/"[!"*_">!"1$|"\"#=":Cer:FF,[{SF,*L{'=t}/FI>(C#"['=-{_'##}{_CW</s}w],2*(:M'#tM('!tLM+ ;LW=34ctLW=('<tLW< ;L"S/=~:L;}fI]z~]{S-},N*

ลองใช้ออนไลน์ในล่าม CJam


1

Python, 707 ตัวอักษร

def b(c):
 c,l,o,x,j,m=list(c.replace(">",")").replace("<","(")),[list("="*len(c))],[],[],0,0
 for i,z in enumerate(c):
  i+=j
  if"["==z:
   c[i],l[0][i]=">",'"'
   x.append(i)
  if"]"==z:
   c[i],l[0][i]="[!","=#"
   c,l[0],m,d,b=list("".join(c)),list("".join(l[0])),max(m,len(x)),0,x.pop()
   for a in o:d+=b<a[0]and-~i>a[0]or b<a[1]and-~i>a[1]
   o.append((b,i+1,d))
   j+=1
 for q in o:
  d=q[2]*2+1
  while len(l)<=d+1:l.append(list(" "*len(c)))
  l[d][q[0]],l[d+1][q[0]],l[d][q[1]],l[d+1][q[1]]="!","#","<",'"'
  for i in range(q[0]+1,q[1]):l[d+1][i]="="
 g="\n".join(l.rstrip()for l in("".join(c)+"\n"+"\n".join("".join(f)for f in l)).split("\n"))
 while"\n\n"in g:g=g.replace("\n\n","\n")
 return g

อาจมีพื้นที่จำนวนมากที่ต้องตีกอล์ฟ ไม่สามารถใช้งานได้ในกรณีทดสอบล่าสุด

ตัวอย่างการใช้งาน:

>>> print b("++[>+++<-]>[<+++>-]<.")
=="=======#="=======#==
  !       < !       <
  #=======" #======="

ไม่มีบรรทัดในเอาต์พุตที่มีช่องว่างต่อท้าย


6
หากไม่ได้ผลก็ไม่ได้เป็นวิธีแก้ปัญหา (imo)
mınxomaτ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.