Mô phỏng xe đâm


9

Giới thiệu

Tôi có một số xe ASCII có vận tốc và hướng. Vận tốc của chúng được thể hiện bằng số lượng của chúng. Nếu một chiếc xe là <>nó đã dừng lại. Ví dụ:

<>
1>
2>
3>

Sau một giây, tôi nhận được

<>
 1>
  2>
   3>

Sau hai, tôi nhận được

<>
  1>
    2>
      3>

Nếu hai chiếc xe quá gần, họ gặp nạn.

1> <1
1> <2

Sau một giây, điều này trở thành

 ###
 ##

Nếu hai chiếc xe giao nhau, chúng sẽ trở thành hashtag.

Nếu một chiếc xe đủ nhanh để 'nhảy' so với chiếc xe kia, nó sẽ không gây ra tai nạn.

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

trở thành

 <13>   ###     <>4>

Nếu một chiếc xe rời khỏi màn hình, nó sẽ biến mất (trừ khi có một vụ tai nạn). Không có cách nào để một chiếc xe đi ra khỏi màn hình.

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

Thử thách

Dựa trên vật lý ô tô đã cho, bạn phải tạo một chương trình có thể bước một giây trong tương lai. Đầu vào sẽ là những chiếc xe có không gian và vận tốc tối đa là 5 (phù hợp với regex (<[1-5]|[1-5]>|<>| )+). Việc mô phỏng sẽ diễn ra trên một dòng, tuy nhiên dòng đó không có kích thước cố định.

Các trường hợp thử nghiệm

<> 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

Chấm điểm

Đây là , vì vậy mã có số byte nhỏ nhất sẽ thắng!


1
<22> <1 3> <2 2 ### ## 2 không nên ở đó - có những vấn đề khác với kết quả đầu ra
DanielIndie

1
tôi sẽ đề nghị thêm "<> <1 <2 <3 <4 <5" "### <2 <3 <4 <5" vào thùng thử nghiệm - trường hợp đã xảy ra tình huống nhưng những chiếc xe khác "chạm" nhưng không phải là một phần của nó
DanielIndie

@DanielIndie Đó là một điều thú vị. Tôi đã đi trước và chỉnh sửa các thách thức.
Arnauld

Tôi mất một thời gian để biết <>có nghĩa là một trong những vận tốc 0
l4m2

Lấy làm tiếc! Tôi nói thêm rằng sau khi viết mọi thứ nên tôi quên giải thích nó.
Nathan Wood

Câu trả lời:


3

JavaScript (ES6), 140 byte

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``

Hãy thử trực tuyến!

Đã bình luận

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 byte

254 đến 259 vì tôi đã thêm trường hợp kiểm tra không có trong các bản thử nghiệm làm phức tạp công cụ tìm regex kết quả của tôi

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)

Hãy thử trực tuyến!


0

Võng mạc , 178 byte

^\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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

^\d([^>])
 $1

Xử lý trường hợp một chiếc xe di chuyển bên trái.

T`5-1`d`<.

Tạm thời bổ sung các chữ số của xe ô tô di chuyển sang trái.

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

Đặt mỗi chiếc xe trên dòng riêng của nó ( $.`* $&¶) và thêm một số thụt lề tùy thuộc vào tốc độ của chiếc xe; những chiếc xe chuyển động bên trái có được tốc độ bổ sung, trong khi những chiếc xe không chuyển động nhận được nhiều hơn 5 tốc độ.

T`d`5-1`<.

Hủy bỏ các chữ số xe di chuyển trái.

m`^.{0,5}

Di chuyển tất cả các xe 5 sang trái. Điều này sửa chữa thụt lề cho tất cả các xe.

G`.

Xóa tất cả các xe đã di chuyển khỏi bên trái.

N^$`
$.&

Sắp xếp những chiếc xe còn lại theo thứ tự ngang ngược.

{

Lặp lại các giai đoạn còn lại cho đến khi tất cả các xe đã được xử lý.

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

Miễn là chiếc xe tiếp theo không gặp sự cố, hãy thêm nó vào kết quả.

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

Thêm một chiếc xe bị đâm vào kết quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.