Animate Adve the Adventurer


12

ความท้าทาย

งานของคุณคือสร้างภาพเคลื่อนไหวนักผจญภัยที่เคลื่อนไหวผ่านเขาวงกตที่น่าขนลุก (เช่นฮาโลวีน) โฆษณาคือ; แม้ว่าเขาจะเป็นตัวละครที่คล่องแคล่วดังนั้นเขาจึงไม่คิดที่จะเป็นตัวแทนของตัวละครอื่น

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

อินพุต

รูปแบบที่สมเหตุสมผลเช่นสตริงที่มีตัวคั่นหรืออาร์เรย์สตริง คุณสามารถสมมติว่าการป้อนข้อมูลจะเป็นแผนที่มากกว่า 3 * 3 ที่มีเพียงเส้นทางเดียวที่เป็นไปได้ ปัจจุบันมีเพียงตัวอักษรจะเป็นและ#

เอาท์พุต

เฟรม

ตัวอย่างเขาวงกต ( โอเค ... เขาวงกต )

นี่คือแผนที่ที่ไม่มีโฆษณา เฟรมแรกและเฟรมสุดท้ายคือแผนที่เปล่า (แผนที่นี้คือ 9x15):

### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

ที่แน่นอนเอาท์พุทสำหรับการนี้สามารถพบได้ที่นี่ (37 เฟรม)

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


แถวแรกและแถวสุดท้ายจะมีเซลล์ว่างหนึ่งเซลล์เสมอหรือไม่ จะมีเส้นทางเดียวที่เป็นไปได้เสมอ (ไม่มีแฉก) หรือไม่
Luis Mendo

@ LuisMendo ใช่แล้วและมี "เส้นทางเดียวเท่านั้นที่เป็นไปได้"
Daniel

1
ทางเข้าจะอยู่ด้านบนเสมอหรือไม่
เลมอนที่ถูกทำลายได้

@ ทำลายแตงโมใช่แล้วทางออกจะอยู่ด้านล่าง
แดเนียล

4
ชื่อจริงของเขาคือเดฟ แต่เขาทั้งหมดสับสน
mbomb007

คำตอบ:


4

Perl, 84 ไบต์

ขอบคุณ@Ton Hospel ที่พาฉันไปยังทิศทางที่ถูกต้องเพื่อออกรอบ 30 ไบต์!

Bytecount มีรหัสและ-0pแฟล็ก82 ไบต์

/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  

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

นำเขาวงกตเป็นอินพุตเป็นเอาต์พุตเฟรมที่จำเป็นทั้งหมดสำหรับ Adve เพื่อออกไปจากมัน โปรดทราบว่า Adve เป็นแบบ&a เนื่องจากไม่ใช่อันหลัง utf8 (และ perl ไม่ได้ใช้ utf8 โดยค่าเริ่มต้น) เรียกใช้ด้วย-0pEธง:

perl -0pE '/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  ' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

สำหรับดวงตาฉันยังสร้างภาพยนตร์แอนิเมชั่นที่ยาวกว่านี้เล็กน้อย แต่จะล้างขั้วระหว่างแต่ละการพิมพ์และการนอนหลับ 0.15 วินาทีดังนั้นมันจะดูเหมือนว่า Adve กำลังเคลื่อนไหวจริง ๆ :

perl -0nE 'system(clear);/.*/;say y/A/ /r;select($,,$,,$,,0.15);s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:say"\e[H",y/A&/  /r' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

ฉันคิดว่ามันเป็นอัลกอริธึมที่ดีที่สุด แต่ก็ยังสามารถเล่นกอล์ฟลงได้มากกว่า 20 ไบต์ ...
Ton Hospel

@TonHospel ถึง 9 ไบต์จนถึงตอนนี้ (ฉันลบออกไป$s="@+"ฉันไม่เคยรู้มาก่อนว่า@+จะมีการเปลี่ยนแปลงหากมีregex ที่ประสบความสำเร็จเกิดขึ้นและredoแทนที่จะwhileบันทึกไว้หนึ่งหรือสองไบต์) คำใบ้เกี่ยวกับวิธีการเล่นกอล์ฟให้มากขึ้น? ฉันเดาว่าฉันต้องกำจัดพวกy///มันออกไปหรือทำให้s///สั้นกว่านั้น ... แต่ก็ไม่ทางใดก็ไม่รู้
Dada

@ TonHospel (แต่ถ้าคุณทำงานในการแก้ปัญหาและต้องการโพสต์อย่าถือเพราะมันเป็นอัลกอริทึมหรือสิ่งเดียวกันฉันจะไม่คิดเลย;))
Dada

ตัวแปร regex เป็นอย่างไรและไม่ได้เก็บไว้ในลูปนั้นบอบบางเพียงใด y///ดีตั้งแต่ที่คุณต้องการสิ่งที่จะแสดงทิศทาง ( แต่สังเกตเห็นว่าคุณได้รับการเลือกที่ด้านข้าง) แต่การปรับปรุงหลักจะมาจากการรวมแทน
Ton Hospel

@TonHospel อันที่จริงฉันควรจะได้เห็นมัน แต่ผมพยายามที่ยากเกินไปที่จะรวมs/ &/&A/และs/& /A&/ร่วมกัน (และที่อยู่ถัดจากกัน) เพื่อดูว่าผู้ที่ไม่ได้ regex ที่ฉันต้องการที่จะรวม! ขอบคุณมาก! (และขอขอบคุณที่แจ้งให้ฉันทราบวิธีการตีกอล์ฟ!)
Dada

3

JavaScript (ES6), 137

(บันทึก 1 ไบต์ขอบคุณ @ETHproductions)

m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`
`)||[...r,m]

น้อย golfed

m=>{
  d = o = 1+m.search`\n`; // offset to next row and starting direction
  p = m.search` `-o; // starting position, 1 row above the first
  for( r=[m]; // r is the output array, start with empty maze
       // try moving in 3 directions (no back)
       // if no empty cell found, we have exit the maze
       [d,o/d,-o/d].some(q => 1/m[d=q,q+=p]? p=q : 0);
       r.push(q.join``) // add current frame
     )
     q=[...m], q[p] = 0; // build frame, '0' used to mark Adve position
  return [...r,m] // add last frame with maze empty again
}

ทดสอบ

F=
m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`\n`)||[...r,m]

function go() {
  var i=I.value,r=F(i),
      frame=x=>(x=r.shift())&&(O.textContent=x,setTimeout(frame,100))
  frame()
}

go()
#I { width:10em; height: 19em; font-size:10px}
#O { white-space:pre; font-family: monospace; font-size:10px; vertical-align: top; padding: 4px}
<table><tr><td>
<textarea id=I>### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###
</textarea><button onclick='go()'>go</button></td><td id=O></td></tr></table>


เอ่อโง่ฉันขอบคุณ @ETHproductions
edc65

การทำงานที่ดี. ฉันอาจจะสิ้นสุดประมาณ 160 bytes
ETHproductions
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.