การจำลองรถพัง


9

บทนำ

ฉันมีรถ ASCII บางคันที่มีความเร็วและทิศทาง ความเร็วของพวกเขาถูกแทนด้วยจำนวนของพวกเขา หากรถอยู่ในสถานะ<>หยุดทำงาน ตัวอย่างเช่น:

<>
1>
2>
3>

หลังจากนั้นหนึ่งวินาทีฉันได้

<>
 1>
  2>
   3>

หลังจากนั้นสองฉันได้รับ

<>
  1>
    2>
      3>

หากรถสองคันอยู่ใกล้เกินไปพวกเขาก็ชนกัน

1> <1
1> <2

หลังจากวินาทีนี้จะกลายเป็น

 ###
 ##

หากรถสองคันตัดกันพวกเขาจะกลายเป็นแฮชแท็ก

หากรถคันใดคันหนึ่งเร็วพอที่จะ 'กระโดด' เหนือรถคันอื่นมันจะไม่ส่งผลให้รถชนกัน

3><1   2><1   4><>

กลายเป็น

 <13>   ###     <>4>

หากรถออกนอกหน้าจอมันจะหายไป (นอกเสียจากว่ามีข้อขัดข้อง) ไม่มีทางที่รถจะออกนอกหน้าจอได้

 <11>
<1  1>
1    1>
      1>

ท้าทาย

ขึ้นอยู่กับฟิสิกส์ของรถยนต์ที่กำหนดคุณต้องสร้างโปรแกรมที่สามารถตั้งเวลาหนึ่งวินาทีในอนาคต อินพุตจะเป็นรถยนต์ที่มีช่องว่างและความเร็วสูงสุด 5 (การจับคู่ regex (<[1-5]|[1-5]>|<>| )+) การจำลองจะเกิดขึ้นในหนึ่งบรรทัดอย่างไรก็ตามบรรทัดนั้นไม่มีขนาดคงที่

กรณีทดสอบ

<> 1> 2> 3> 4> 5>
<>  1>  2>  3>  4>  5>

1><1   1> <1   1>  <1
 ##     ###     1><1

2><2   2> <2   2>  <2   2>   <2   2>    <2
<22>    ###      ##       ###       2><2

<22>  <1 3>   <2
    ###     ##

<><>     1><>     2><>     3><>     4><>     5><>
<><>      ###       ##       ###      <>4>     <> 5>

<><1 <2 <3 <4 <5
###<2<3<4<5

เกณฑ์การให้คะแนน

นี่คือ ดังนั้นรหัสที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ!


1
<22> <1 3> <2 2 ### ## 2 ไม่ควรอยู่ที่นั่น - มีปัญหาอื่น ๆ เกี่ยวกับผลลัพธ์
DanielIndie

1
ฉันขอแนะนำให้เพิ่ม "<> <1 <2 <3 <4 <5" "### <2 <3 <4 <5" ไปยัง testcase - กรณีที่เกิดความเสียหาย แต่รถยนต์อื่น ๆ "แตะ" แต่ไม่ใช่ส่วนหนึ่ง ของมัน
DanielIndie

@DanielIndie นั่นเป็นสิ่งที่น่าสนใจ ฉันไปข้างหน้าและแก้ไขความท้าทาย
Arnauld

มันใช้เวลาพอสมควรที่จะรู้ว่า<>ค่าเฉลี่ยของความเร็ว 0
l4m2

ขออภัย! ฉันเสริมว่าหลังจากเขียนทุกอย่างแล้วฉันก็ลืมอธิบาย
นาธานวู้ด

คำตอบ:


3

JavaScript (ES6), 140 ไบต์

s=>[...s.replace(/\S./g,([a,b],i)=>r[r[i+=+b?-b:~~a]=r[i]?C:a,++i]=r[i]?C:b,r=[],C='#')&&r].map((c,i)=>c?r[i-1]==C|r[i+1]==C?C:c:' ').join``

ลองออนไลน์!

แสดงความคิดเห็น

s =>                      // given the input string s
  [ ...s.replace(         // search in s ...
    /\S./g,               //   ... all substrings consisting of 2 non-whitespace characters
    ([a, b], i) =>        //   let a be the 1st character, b the 2nd one and i the position
      r[                  //   update r[]:
        r[i +=            //     apply the car velocity to i:
          +b ? -b         //       if b is a digit, then move b cells backwards
                  : ~~a   //       else: use a to move forwards (or don't move at all)
        ] = r[i] ? C : a, //     if r[i] is set, overwrite it with '#'; otherwise, insert a
        ++i               //     increment i for the 2nd character
      ] = r[i] ? C : b,   //     if r[i] is set, overwrite it with '#'; otherwise, insert b
      r = [],             //   initialize r[] to an empty array
      C = '#'             //   define C as the 'crash' character
  ) && r ]                // end of replace(); return a fully iterable copy of r[]
  .map((c, i) =>          // for each entry c at position i in this array:
    c ?                   //   if c is defined:
      r[i - 1] == C |     //     if either the previous
      r[i + 1] == C ?     //     or the next cell is '#' (in the original array):
        C                 //       replace the current cell with '#'
      :                   //     else:
        c                 //       let c unchanged
    :                     //   else:
      ' '                 //     insert a space
  ).join``                // end of map(); join the result

0

JavaScript (Node.js)ขนาด 259 ไบต์

254 ถึง 259 เพราะฉันเพิ่มกรณีทดสอบซึ่งไม่ได้อยู่ใน testcases ที่ซับซ้อน Finder ผลลัพธ์ของฉัน regex

s=>{
c=[]
n=[S=""]
s.replace(/<?\d>?|<>/g,([d,D],i)=>d>0?g(i+ +d,d)+g(i-~d,D):g(i-~~D,d)+g(i-~~D+1,D))
for(i of n)S+=i||" "
return S.replace(/1?[2-9]*1?/g,(d,i)=>d>"1".repeat(l=d.length)?"#".repeat(l):c.slice(i,i+l).join``)}
g=(x,p)=>x<0||(n[x]=-~n[x],c[x]=p)

ลองออนไลน์!


0

เรติน่า 178 ไบต์

^\d([^>])
 $1
T`5-1`d`<.
 *(<(\d)|((\d)>|<>))
$2* $#3*5* $4* $.`* $&¶
T`d`5-1`<.
m`^.{0,5}

G`.
N^$`
$.&
{+m`\A( *)  (.*)¶\1(..?)$
$1$3$2
m`^\A( *)( *)..(.*)¶\1(..?)$
$1##$.2*#$3

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

^\d([^>])
 $1

จัดการกรณีของรถที่เคลื่อนที่ออกทางด้านซ้าย

T`5-1`d`<.

เติมเต็มตัวเลขของรถยนต์ที่เคลื่อนที่ไปทางซ้ายชั่วคราว

 *(<(\d)|((\d)>|<>))
$2* $#3*5* $4* $.`* $&¶

ใส่รถแต่ละคันในสายของตนเอง ( $.`* $&¶) และเพิ่มการเยื้องบางส่วนขึ้นอยู่กับความเร็วของรถ รถที่เคลื่อนที่ด้านซ้ายจะได้รับความเร็วที่สมบูรณ์ขณะที่รถที่ไม่เคลื่อนที่จะได้ความเร็วมากกว่า 5

T`d`5-1`<.

ยกเลิกการติดตั้งตัวเลขรถยนต์ที่เคลื่อนไหวทางซ้าย

m`^.{0,5}

ย้ายรถยนต์ทั้งหมด 5 คันไปทางซ้าย วิธีนี้จะแก้ไขการเยื้องสำหรับรถยนต์ทุกคัน

G`.

ลบรถยนต์ทั้งหมดที่ย้ายออกจากด้านซ้าย

N^$`
$.&

เรียงลำดับรถยนต์ที่เหลือตามลำดับแนวนอนย้อนกลับ

{

ทำซ้ำขั้นตอนที่เหลือจนกว่ารถยนต์ทั้งหมดจะได้รับการประมวลผล

+m`\A( *)  (.*)¶\1(..?)$
$1$3$2

ตราบใดที่รถคันต่อไปไม่ผิดพลาดให้เพิ่มเข้าไปในผลลัพธ์

m`^\A( *)( *)..(.*)¶\1(..?)$
$1##$.2*#$3

เพิ่มรถกระแทกเข้ากับผลลัพธ์

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