aku suka untuk terus bergerak

16

Raja Julian perlu melewati hutan, tetapi dia merasa malas. Dia ingin komputer dapat menghitung rute melalui hutan untuknya.

Menggunakan STDIN, dapatkan peta hutan untuk diretas oleh komputer. Ini akan mengikuti format berikut:

01001E
010110
000P00
1100J1
S00111

Cara peta hutan bekerja adalah:

0 adalah dasar yang bisa diikuti oleh Julian.

1 adalah hutan lebat yang tidak bisa dilewati.

P adalah area dengan predator di dalamnya, yang harus Anda hindari dengan cara apa pun.

Jadalah hutan yang relatif tebal. Antek-antek Julian dapat menerobos salah satu dari ini sebelum melelahkan.

SDi sinilah Julian memulai. Itu bisa di mana saja di peta.

Eadalah tempat Julian ingin pergi; ujung jalan. Itu juga bisa di mana saja di peta, sama seperti ubin lainnya.

Setiap karakter adalah ubin di peta. Jeda baris menunjukkan baris ubin baru. Jika STDIN dalam bahasa Anda tidak mendukung jeda baris, jeda baris harus diganti dengan spasi untuk menandakan baris baru.

Untuk berpindah di antara ubin, Anda harus mengeluarkan string menggunakan STDOUT yang berisi karakter khusus berikut:

F - Maju

B - Mundur

L - Putar Julian ke kiri (90 derajat berlawanan arah jarum jam)

R - Putar Julian ke kanan (90 derajat searah jarum jam)

M- Minion menghancurkan Jubin 1 ubin ke depan dari Julian, jika ada satu (M hanya membersihkan ubin, Anda masih harus pindah ke sana)

Output yang mungkin adalah:

RFFLFRFMFLFRFLFF

Yang memecahkan peta di atas.

Catatan:

  • Jika program Anda menghasilkan solusi yang mengenai predator, goyangkan.

  • Jika Anda menabrak hutan yang tidak dapat dilewati, Anda hanya bangkit kembali ke tempat Anda berada sebelum Anda berlari ke hutan lebat, menghadap ke arah yang sama. (Menuju hutan)

  • Julian mulai menghadap ke atas. (^ Lewat sana ^)

  • Output tidak harus menjadi solusi tercepat, FFFdan FBFBFBFBFBFFFsama. Namun, menghasilkan solusi tercepat mungkin memberikan bonus hitungan byte -10%.

  • Jika peta tidak valid, STDOUT 'Peta tidak valid.' (Itu termasuk jika peta tidak dapat dipecahkan)

  • Peta tidak dapat memiliki baris atau kolom dengan panjang yang berbeda; yang membuatnya tidak valid.

Jawaban Anda agaknya harus mengikuti format ini:

#Language name, *n* bytes

    code

Explanation (optional)

Ini adalah , jadi kode terpendek dalam byte menang.

Tobsta
sumber
Contoh solusi Anda membuat Julian berjalan langsung ke predator. Sesuatu seperti RFFLFRFMFLFRFLFF seharusnya bekerja sebagai gantinya.
Emigna
@Emigna, Ups. Saya terlibat antara hutan lebat dan sarang predator ...
Tobsta
1
Apakah Pubin benar-benar menambahkan sesuatu yang berbeda dari 1ubin? Saya tidak bisa membayangkan solusi masuk akal yang memperlakukan mereka secara berbeda.
@ dan1111 Ubin P membunuh Julian saat dia melakukan perjalanan. 1 ubin Julian tidak bisa melewati, tetapi jika Julian memukulnya dia tidak mati, dia hanya bangkit kembali.
Tobsta
1
@ Dobsta, ya, saya mengerti. Tetapi apakah itu membuat perbedaan? Sepertinya solusi yang berhasil hanya akan menghindari 1 dan P ubin.

Jawaban:

1

Groovy, 656 byte

Itu terlalu lama ...

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

Output untuk labirin:

RFFLFRFMFLFRFLFF

Tidak Terkumpul:

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"

Saya akan mencoba ini lagi dengan python segera untuk melihat apakah saya dapat mempersingkat lebih lanjut.

J Atkin
sumber