Animate Adveker


12

Các thách thức

Nhiệm vụ của bạn là làm sinh động Hãy cho phép Nhà thám hiểm di chuyển qua một mê cung rùng rợn (tức là Halloween). Adve là một ; Tuy nhiên, anh ta là nhân vật chất lỏng, vì vậy anh ta không ngại bị đại diện bởi một nhân vật khác.

Để animate Adve, bạn in ra từng khung; một khung là bản đồ với vị trí hiện tại của anh ta trong đó. Adve di chuyển một không gian về phía trước mỗi lượt và không bao giờ quay lại. Anh ấy bắt đầu ở hàng đầu tiên và kết thúc ở cuối cùng.

Đầu vào

Bất kỳ định dạng hợp lý như một chuỗi với một dấu phân cách hoặc mảng chuỗi. Bạn có thể giả sử đầu vào sẽ là một bản đồ lớn hơn 3 * 3, chỉ chứa một đường dẫn có thể. Các nhân vật duy nhất có mặt sẽ là #.

Đầu ra

Khung.

Mê cung ví dụ ( ok ... mê cung )

Đây là một bản đồ mà không có Adve trong đó; khung đầu tiên và cuối cùng là bản đồ trống này (bản đồ này là 9x15):

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

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Đầu ra chính xác cho điều này có thể được tìm thấy ở đây (37 khung hình).

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!


Các hàng đầu tiên và cuối cùng sẽ luôn có một ô trống duy nhất? Sẽ luôn có một con đường duy nhất có thể (không có phân nhánh)?
Luis Mendo

@LuisMendo, vâng, và "chỉ có một con đường duy nhất"
Daniel

1
Lối vào sẽ luôn ở trên cùng?
Lemon phá hủy

@DeststallibleWateriwi, vâng, và lối ra sẽ ở dưới cùng.
Daniel

4
Tên thật của anh ấy là Dave, nhưng anh ấy đã bị xáo trộn.
mbomb007

Câu trả lời:


4

Perl, 84 byte

Cảm ơn @TonMedel đã hướng dẫn tôi đi đúng hướng để chơi gôn khoảng 30 byte!

Bytecount bao gồm 82 byte mã và -0pcờ.

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

Lưu ý rằng có hai khoảng trắng cuối cùng và không có dòng mới nào (nó sẽ không hoạt động khác).

Lấy mê cung làm đầu vào làm đầu ra tất cả các khung cần thiết để Adve thoát khỏi nó. Lưu ý rằng Adve là một &thay vì a , vì cái sau không phải là utf8 (và perl không sử dụng utf8 theo mặc định). Chạy nó với -0pEcờ:

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

Chỉ để mắt , tôi cũng đã tạo ra phiên bản hoạt hình này, dài hơn một chút, nhưng sẽ xóa thiết bị đầu cuối giữa mỗi bản in và ngủ 0,15 giây, vì vậy nó sẽ trông giống như Adve đang thực sự di chuyển:

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' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

Tôi nghĩ rằng đó là thuật toán tốt nhất nhưng nó vẫn có thể bị đánh bại hơn 20 byte ...
TonMedel

@TonHosp -9 byte cho đến nay (Tôi đã xóa $s="@+", tôi đã không nhận ra trước đó @+chỉ thay đổi nếu một regex thành công xảy ra. Và redothay vì whilelưu một hoặc hai byte). Bất kỳ gợi ý về làm thế nào để chơi golf nhiều hơn? Tôi đoán tôi phải loại bỏ những thứ y///đó bằng cách nào đó, hoặc s///rút ngắn lại ... nhưng dù bằng cách nào tôi cũng không biết làm thế nào.
Dada

@TonH rửa mặt (nhưng nếu bạn đã làm việc trên một giải pháp và muốn đăng nó, đừng giữ nó bởi vì đó là cùng một thuật toán hoặc một cái gì đó, tôi sẽ không bận tâm chút nào;))
Dada

Làm thế nào các biến regex được hoặc không được giữ trong các vòng lặp là rất tinh tế. Các y///là tốt vì bạn cần một cái gì đó để chỉ hướng (nhưng chú ý bạn có thể chọn mà bên) Nhưng sự cải thiện chính sẽ đến từ sự thay thế kết hợp
Tôn Hospel

@TonHosp Thật vậy, tôi đã nhìn thấy nó, nhưng tôi đã cố gắng hết sức để kết hợp s/ &/&A/s/& /A&/cùng nhau (và bên cạnh nhau) để thấy rằng đó không phải là regex tôi cần kết hợp! Cảm ơn rất nhiều! (Và cảm ơn vì đã cho tôi tìm hiểu cách chơi gôn!)
Dada

3

JavaScript (ES6), 137

(1 byte được lưu thx @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]

Ít chơi gôn

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
}

Kiểm tra

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>


Uh, tôi thật ngốc, cảm ơn @ETHproductions
edc65

Công việc tuyệt vời Tôi có thể đã kết thúc khoảng 160 byte
ETHproductions
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.