Taşımayı seviyorum Taşımayı seviyorum


16

Kral Julian'ın ormanı geçmesi gerekiyor, ama tembel hissediyor. Bir bilgisayarın onun için ormanda bir rota hesaplayabilmesini istiyor.

STDIN kullanarak bilgisayarın çatlaması için ormanın bir haritasını alın. Aşağıdaki biçimi izleyecektir:

01001E
010110
000P00
1100J1
S00111

Orman haritasının çalışma şekli:

0 Julian'ın hareket edebileceği bir yer.

1 yoğun geçilmez orman.

P içinde yırtıcıların bulunduğu bir alandır.

Jnispeten kalın bir ormandır. Julian'ın köleleri yorulmadan bunlardan birini kırabilir.

SJulian'ın başladığı yer. Haritanın herhangi bir yerinde olabilir.

EJulian'ın gitmek istediği yer; yolun sonu. Ayrıca haritadaki herhangi bir yerde, diğer herhangi bir kutucuk gibi olabilir.

Her karakter haritadaki bir kutucuktur. Satır sonları yeni bir döşemeyi belirtir. Dilinizde STDIN satır sonlarını desteklemiyorsa, satır sonunu yeni bir satır belirtmek için boşlukla değiştirmek gerekir.

Döşemeler arasında hareket etmek için, aşağıdaki özel karakterleri içeren STDOUT'u kullanarak bir dize çıkarmanız gerekir:

F - İleri

B - Geriye

L - Julian'ı sola döndür (saat yönünün tersine 90 derece)

R - Julian'ı sağa döndür (saat yönünde 90 derece)

M- Minyonlar JJulian'dan bir karo 1 karo yok eder , eğer bir tane varsa ( Msadece karoyu temizler, hala üzerine hareket etmelisin)

Olası bir çıktı:

RFFLFRFMFLFRFLFF

Yukarıdaki haritayı çözer.

Notlar:

  • Programınız yırtıcılara çarpan bir çözüm çıkarırsa oyun biter.

  • Geçilmez ormana vurursanız, aynı ormana bakan yoğun ormana girmeden önce bulunduğunuz yere geri dönersiniz. (Ormana doğru)

  • Julian yukarı bakmaya başlar. (^ Bu şekilde ^)

  • Çıktının en hızlı çözüm olması gerekmez FFFve FBFBFBFBFBFFFaynıdır. Bununla birlikte, mümkün olan en hızlı çözümün çıktısı% -10 bayt sayımı bonusu verir.

  • Bir harita geçersizse, STDOUT 'Geçersiz harita'. (Haritanın çözülemez olup olmadığı da buna dahildir)

  • Bir harita farklı uzunluklarda satırlara veya sütunlara sahip olamaz; geçersiz kılar.

Cevabınız şu biçimi bir şekilde izlemelidir:

#Language name, *n* bytes

    code

Explanation (optional)

Bu , bu nedenle bayttaki en kısa kod kazanır.


Çözüm örneğiniz, Julian'ın bir avcıya doğru yürüdüğünü gösteriyor. Bunun yerine RFFLFRFMFLFRFLFF gibi bir şey çalışmalıdır.
Emigna

@Emigna, Hata! Kalın orman ve bir yırtıcı hayvan ini arasında karıştı ...
Tobsta

1
Bir Pkaro gerçekten bir karodan farklı bir şey ekliyor 1mu? Onlara farklı davranan makul bir çözüm düşünemiyorum.

@ dan1111 P çini, Julian'ın üzerinden geçerken öldürür. Julian'ın 1 döşemesi geçemez, ancak Julian vurursa ölmez, sadece geri döner.
Tobsta

1
@ Tobsta, evet, anlıyorum. Ama bu bir fark yaratıyor mu? Başarılı bir çözüm sadece 1 ve P fayanslarından kaçınacak gibi görünüyor.

Yanıtlar:


1

Groovy, 656 bayt

Bu çok uzundu ...

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

Labirent için çıktı:

RFFLFRFMFLFRFLFF

Ungolfed:

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"

Bunu daha da kısaltabileceğimi görmek için yakında python'da tekrar deneyeceğim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.