Tôi muốn di chuyển nó, di chuyển nó


16

Vua Julian cần phải vượt qua rừng rậm, nhưng anh ta cảm thấy lười biếng. Anh ta muốn một máy tính để có thể tính toán một tuyến đường xuyên rừng cho anh ta.

Sử dụng STDIN lấy bản đồ rừng cho máy tính bẻ khóa. Nó sẽ theo định dạng sau:

01001E
010110
000P00
1100J1
S00111

Cách thức hoạt động của bản đồ rừng là:

0 là mặt đất mà Julian có thể di chuyển dọc.

1 là rừng rậm không thể vượt qua.

P là một khu vực có động vật ăn thịt trong đó, mà bạn phải tránh bằng mọi giá.

Jlà rừng rậm tương đối dày. Tay sai của Julian có thể vượt qua một trong số này trước khi mệt mỏi.

Slà nơi Julian bắt đầu. Nó có thể là bất cứ nơi nào trên bản đồ.

Elà nơi Julian muốn đi; điểm cuối của con đường. Nó cũng có thể ở bất cứ đâu trên bản đồ, giống như bất kỳ ô nào khác.

Mỗi nhân vật là một ô trên bản đồ. Ngắt dòng cho thấy một hàng gạch mới. Nếu STDIN trong ngôn ngữ của bạn không hỗ trợ ngắt dòng, ngắt dòng phải được thay thế bằng khoảng trắng để biểu thị một hàng mới.

Để di chuyển giữa các ô, bạn phải xuất một chuỗi bằng STDOUT có chứa các ký tự đặc biệt sau:

F - Ở đằng trước

B - Phía sau

L - Xoay Julian trái (90 độ ngược chiều kim đồng hồ)

R - Xoay Julian phải (90 độ theo chiều kim đồng hồ)

M- Minions phá hủy một Jô 1 gạch về phía trước từ Julian, nếu có một ô ( Mchỉ cần xóa hết ô, bạn vẫn phải di chuyển lên nó)

Một đầu ra có thể sẽ là:

RFFLFRFMFLFRFLFF

Mà giải quyết các bản đồ trên.

Ghi chú:

  • Nếu chương trình của bạn đưa ra một giải pháp tấn công kẻ săn mồi, trò chơi kết thúc.

  • Nếu bạn đánh vào khu rừng rậm, bạn chỉ cần quay trở lại nơi bạn ở trước khi bạn chạy vào khu rừng rậm rạp, đối mặt với cùng một cách. (Hướng về rừng rậm)

  • Julian bắt đầu hướng lên trên. (^ Theo cách đó ^)

  • Đầu ra không phải là giải pháp nhanh nhất FFFFBFBFBFBFBFFFgiống nhau. Tuy nhiên, việc đưa ra giải pháp nhanh nhất có thể mang lại phần thưởng cho số lượng -10% byte.

  • Nếu bản đồ không hợp lệ, STDOUT 'Bản đồ không hợp lệ.' (Điều đó bao gồm nếu bản đồ không thể giải quyết được)

  • Một bản đồ không thể có các hàng hoặc cột có độ dài khác nhau; Điều đó làm cho nó không hợp lệ.

Câu trả lời của bạn nên phần nào tuân theo định dạng này:

#Language name, *n* bytes

    code

Explanation (optional)

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


Ví dụ giải pháp của bạn có Julian đi thẳng vào một kẻ săn mồi. Một cái gì đó như RFFLFRFMFLFRFLFF nên hoạt động thay thế.
Emigna

@Emigna, Rất tiếc. Tôi bị lẫn lộn giữa rừng rậm và hang ổ của kẻ săn mồi ...
Tobsta

1
Liệu một Pgạch thực sự thêm một cái gì đó khác với một 1gạch? Tôi thực sự không thể tưởng tượng một giải pháp hợp lý đối xử với họ khác đi.

@ dan1111 Gạch P giết chết Julian khi anh ta đi qua nó. Julian 1 gạch không thể đi qua, nhưng nếu Julian đánh nó thì anh ta không chết, anh ta chỉ bị trả lại.
Tobsta

1
@Tobsta, vâng, tôi hiểu. Nhưng điều đó có làm nên sự khác biệt? Có vẻ như bất kỳ giải pháp thành công nào cũng chỉ cần tránh gạch 1 và P.

Câu trả lời:


1

Groovy, 656 byte

Điều đó quá dài ...

i={println"Invalid map."
System.exit(1)}
m=[]
q=System.in.newReader()
r=q.readLine()
while(r!=''){m<<r
r=q.readLine()}
o=m[0].size()
m.each{if(it.size()!=o)i()}
f=[0]*4
m.eachWithIndex{l,n->s=l.indexOf('S')
e=l.indexOf('E')
if(s!=-1){f[0]=s;f[1]=n}
if(e!=-1){f[2]=e;f[3]=n}}
v=[]
t={x,y,d->if(d.contains([x,y])|y>=m.size()|x>=o|x<0|y<0)return
a=m[y][x]
def p=d+[[x,y]]
if(a=='E')v=p
if(a=='J'|a=='0'|a=='S'){t(x-1,y,p)
t(x+1,y,p)
t(x,y+1,p)
t(x,y-1,p)}}
t(f[0],f[1],[])
if(!v)i()
o=0
p=''
v.inject{t,s->
c=m[s[1]][s[0]]
k=[t[0]-s[0],t[1]-s[1]]
z=[[0,1]:0,[1,0]:1,[0,-1]:2,[-1,0]:3][k]
p+=((((o-z)==0)?'':(z>0?'R':'L'))+(c=='J'?'M':'')+'F')
o=z
s}
println p

Đầu ra cho mê cung:

RFFLFRFMFLFRFLFF

Ung dung:

invalid = {
    println "Invalid map."
    System.exit(1)
}
map = """01001E
010110
000P00
1110J1
S00111""".split('\n')

//map = [""]// TODO remove this, this is type checking only
//map.remove(0)
//reader = System.in.newReader()
//line = reader.readLine()
//while (line != '') {
//    map << line.replace('P','1')
//    line = reader.readLine()
//}

size = map[0].size()
map.each {if(it.size() != size) invalid()}

startAndEnd = [0,0,0,0]
map.eachWithIndex {it, idx -> s=it.indexOf('S');e=it.indexOf('E');
    if(s!=-1){ startAndEnd[0]=s; startAndEnd[1]=idx}
    if(e!=-1){ startAndEnd[2]=e; startAndEnd[3]=idx}}

def validPath = []

testMove = {x, y, visited ->// visited is an array of x y pairs that we have already visited in this tree
    if (visited.contains([x,y]) || y>=map.size() || x>=size || x<0 || y<0)
        return;

    def valueAtPos = map[y][x]
    def newPath = visited + [[x,y]]

    if (valueAtPos == 'E') validPath = newPath
    if ((valueAtPos == 'J' || valueAtPos == '0' || valueAtPos == 'S') && !validPath) {
        testMove(x-1, y, newPath)
        testMove(x+1, y, newPath)
        testMove(x, y+1, newPath)
        testMove(x, y-1, newPath)
    }
}
if (!validPath) invalid()
testMove(startAndEnd[0],startAndEnd[1], [])

println validPath

orintation = 0
path = ''
validPath.inject {first, second ->
    def chr = map[second[1]][second[0]]
    def sub = [first[0]-second[0],first[1]-second[1]]
    println "acc:$first, second:$second"
    def newOrin = [[0,1]:0, [1,0]:1, [0,-1]:2, [-1,0]:3][sub]
    path += ((((orintation - newOrin)==0)?'':(newOrin>0?'R':'L')) + (chr=='J'?'M':'') + 'F')
    orintation = newOrin
    second
}
println "path: $path"

Tôi sẽ thử lại điều này trong python sớm để xem liệu tôi có thể rút ngắn nó thêm nữa không.

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.