Lubię to ruszać, to ruszać

16

Król Julian musi przedostać się przez dżunglę, ale jest leniwy. Chce, żeby komputer mógł dla niego obliczyć trasę przez dżunglę.

Korzystając ze STDIN, uzyskaj mapę dżungli do złamania komputera. Będzie on miał następujący format:

01001E
010110
000P00
1100J1
S00111

Sposób działania mapy dżungli to:

0 jest ziemia, że ​​Julian może się poruszać.

1 jest gęstą nieprzejezdną dżunglą.

P jest obszarem z drapieżnikami, którego należy unikać za wszelką cenę.

Jjest stosunkowo gęstą dżunglą. Stwory Juliana mogą przedrzeć się przez jeden z nich przed zmęczeniem.

Stam zaczyna się Julian. Może być w dowolnym miejscu na mapie.

Etam, gdzie Julian chce iść; koniec ścieżki. Może być również w dowolnym miejscu na mapie, tak jak każdy inny kafelek.

Każda postać jest kafelkiem na mapie. Podziały linii wskazują nowy rząd płytek. Jeśli STDIN w Twoim języku nie obsługuje podziałów wierszy, podział wiersza musi zostać zastąpiony spacją, aby oznaczać nowy wiersz.

Aby poruszać się między kafelkami, musisz wyprowadzić ciąg za pomocą STDOUT zawierającego następujące znaki specjalne:

F - Naprzód

B - Do tyłu

L - Obróć Juliana w lewo (90 stopni w lewo)

R - Obróć Juliana w prawo (90 stopni w prawo)

M- Stwory niszczą Jkafelek o 1 płytkę naprzód od Juliana, jeśli taki istnieje ( Mwystarczy go wyczyścić, nadal trzeba się na niego przenieść)

Możliwym wyjściem byłoby:

RFFLFRFMFLFRFLFF

Który rozwiązuje mapę powyżej.

Uwagi:

  • Jeśli Twój program wyświetli rozwiązanie, które uderza w drapieżniki, gra się kończy.

  • Jeśli trafisz w nieprzejezdną dżunglę, po prostu odbij się z powrotem do miejsca, w którym byłeś, zanim wpadłeś w gęstą dżunglę, twarzą w tę samą stronę. (W stronę dżungli)

  • Julian zaczyna być skierowany do góry. (^ W ten sposób ^)

  • Dane wyjściowe nie muszą być najszybszym rozwiązaniem FFFi FBFBFBFBFBFFFsą takie same. Jednak uzyskanie najszybszego możliwego rozwiązania daje premię w wysokości -10% liczby bajtów.

  • Jeśli mapa jest nieprawidłowa, STDOUT „Nieprawidłowa mapa”. (Dotyczy to także sytuacji, gdy mapa jest nierozwiązywalna)

  • Mapa nie może mieć wierszy ani kolumn o różnych długościach; to czyni to nieważnym.

Twoja odpowiedź powinna być nieco zgodna z tym formatem:

#Language name, *n* bytes

    code

Explanation (optional)

To jest , więc wygrywa najkrótszy kod w bajtach.

Tobsta
źródło
W przykładzie rozwiązania Julian wchodzi prosto w drapieżnika. Zamiast tego powinno działać coś takiego jak RFFLFRFMFLFRFLFF.
Emigna,
@Emigna, Ups. Zmieszałem się między gęstą dżunglą a legowiskiem drapieżnika ...
Tobsta,
1
Czy Pkafelek naprawdę dodaje coś innego niż 1kafelek? Nie mogę sobie wyobrazić wiarygodnego rozwiązania, które traktuje je inaczej.
@ dan1111 Kafelek P zabija Juliana, gdy się nad nim podróżuje. Julian nie może przejść 1 płytki, ale jeśli Julian go trafi, nie umiera, po prostu odbija się.
Tobsta,
1
@Tobsta, tak, rozumiem. Ale czy to robi różnicę? Wygląda na to, że każde udane rozwiązanie po prostu uniknęłoby płytek 1 i P.

Odpowiedzi:

1

Groovy, 656 bajtów

To było za długo ...

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

Wyjście dla labiryntu:

RFFLFRFMFLFRFLFF

Nie golfowany:

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"

Niedługo spróbuję tego ponownie w Pythonie, aby sprawdzić, czy mogę go bardziej skrócić.

J Atkin
źródło