Я люблю двигать телом


16

Королю Джулиану нужно пройти через джунгли, но ему лень. Он хочет, чтобы компьютер мог рассчитать для него маршрут через джунгли.

Используя STDIN, получите карту джунглей для компьютера. Это будет следовать в следующем формате:

01001E
010110
000P00
1100J1
S00111

Карта джунглей работает так:

0 Земля, на которой Джулиан может двигаться.

1 это густые непроходимые джунгли.

P это область с хищниками, которую вы должны избегать любой ценой.

Jэто относительно густые джунгли. Миньоны Джулиана могут прорваться через одного из них, прежде чем утомить.

Sэто то, где Джулиан начинает Это может быть где угодно на карте.

Eгде Джулиан хочет пойти; конец пути. Он также может быть где угодно на карте, как и любая другая плитка.

Каждый персонаж является плиткой на карте. Разрывы строк указывают на новый ряд плиток. Если STDIN на вашем языке не поддерживает разрывы строк, разрыв строки должен быть заменен пробелом для обозначения новой строки.

Чтобы перемещаться между плитками, вы должны вывести строку, используя STDOUT, содержащую следующие специальные символы:

F - Вперед

B - назад

L - Поверните Джулиана влево (на 90 градусов против часовой стрелки)

R - Поверните Джулиан вправо (на 90 градусов по часовой стрелке)

M- Миньоны уничтожают Jплитку на 1 плитку вперед от Джулиана, если она есть ( Mпросто убирает плитку, вам все равно придется перейти на нее)

Возможный результат будет:

RFFLFRFMFLFRFLFF

Что решает карту выше.

Примечания:

  • Если ваша программа выводит решение, которое поражает хищников, игра окончена.

  • Если вы попадаете в непроходимые джунгли, вы просто отскакиваете туда, где были, прежде чем наткнуться на густые джунгли, обращенные таким же образом. (К джунглям)

  • Джулиан начинает смотреть вверх. (^ Таким образом, ^)

  • Вывод не должен быть самым быстрым решением, FFFи он FBFBFBFBFBFFFодинаковый. Однако вывод самого быстрого решения дает бонус -10%.

  • Если карта недействительна, STDOUT «Неверная карта». (Это включает, если карта неразрешима)

  • Карта не может иметь строки или столбцы различной длины; это делает его недействительным.

Ваш ответ должен в некоторой степени соответствовать следующему формату:

#Language name, *n* bytes

    code

Explanation (optional)

Это , поэтому выигрывает самый короткий код в байтах.


В вашем примере решения Джулиан идет прямо в хищника. Вместо этого должно работать что-то вроде RFFLFRFMFLFRFLFF.
Эминья

@ Emigna, упс. Я
запутался

1
PДействительно ли плитка добавляет что-то отличное от1 плитки? Я не могу себе представить правдоподобное решение, которое относится к ним по-другому.

@ dan1111 Плитка P убивает Джулиана, когда он путешествует по ней. 1 тайл Джулиан не может пройти, но если Джулиан попадет в него, он не умрет, он просто отскочит назад.
Тобста

1
@ Тобста, да, я понимаю. Но это имеет значение? Кажется, что любое успешное решение будет просто избегать 1 и P плиток.

Ответы:


1

Groovy, 656 байт

Это было слишком долго ...

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

Выход для лабиринта:

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"

Я скоро попробую это снова в python, чтобы посмотреть, смогу ли я сократить его дальше.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.