Мені подобається рухати, рухати його


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
@Tobsta, так, я розумію. Але чи має це значення? Здається, що будь-яке вдале рішення просто уникне плиток 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

Безголівки:

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.