나는 움직이는 것이 좋아


16

줄리안 왕은 정글을 빠져 나가야하지만 게으른 느낌입니다. 그는 컴퓨터가 정글을 통과하는 경로를 계산할 수 있기를 원합니다.

STDIN을 사용하면 컴퓨터가 깨질 정글의지도를 얻을 수 있습니다. 다음 형식을 따릅니다.

01001E
010110
000P00
1100J1
S00111

정글 맵이 작동하는 방식은 다음과 같습니다.

0 줄리안이 움직일 수있는 땅입니다.

1 울창한 밀림입니다.

P 포식자가있는 지역이므로 모든 비용을 피해야합니다.

J상대적으로 두꺼운 정글입니다. 줄리안의 미니언은 피곤하기 전에 이들 중 하나를 뚫을 수 있습니다.

S줄리안이 시작되는 곳입니다. 지도의 어느 곳에 나있을 수 있습니다.

E줄리안이 가고 싶은 곳입니다. 경로의 끝. 다른 타일과 마찬가지로지도의 어느 위치 에나있을 수 있습니다.

모든 캐릭터는지도의 타일입니다. 줄 바꿈은 새로운 타일 행을 나타냅니다. 해당 언어의 STDIN이 줄 바꿈을 지원하지 않으면 줄 바꿈을 공백으로 바꿔야 새 행을 나타냅니다.

타일 ​​사이를 이동하려면 다음 특수 문자를 포함하는 STDOUT을 사용하여 문자열을 출력해야합니다.

F -앞으로

B -뒤로

L -Julian을 왼쪽으로 회전 (시계 반대 방향으로 90도)

R -줄리안을 오른쪽으로 회전 (시계 방향으로 90도)

M-미니언 J은 줄리안에서 타일 1을 타일 1 개 앞으로 파괴합니다.M 타일을 지 웁니다. 타일로 이동해야합니다.

가능한 출력은 다음과 같습니다.

RFFLFRFMFLFRFLFF

위의지도를 해결합니다.

노트:

  • 프로그램이 포식자를 때리는 솔루션을 출력하면 게임 오버입니다.

  • 지나칠 수없는 정글에 부딪히면 밀집한 정글에 닿기 전의 위치로 똑같은 방향으로 튀어 오릅니다. (정글쪽으로)

  • 줄리안은 위를 향하게됩니다. (^ 그렇게 ^)

  • 출력은 가장 빠른 해결책을해야하지 않습니다 FFFFBFBFBFBFBFFF동일합니다. 그러나 가장 빠른 솔루션을 출력하면 바이트 수가 -10 % 증가합니다.

  • 맵이 유효하지 않으면 STDOUT '잘못된 맵'입니다. (지도를 해결할 수없는 경우 포함)

  • 지도는 길이가 다른 행이나 열을 가질 수 없습니다. 그것은 그것을 무효로 만듭니다.

답은 다음 형식을 따라야합니다.

#Language name, *n* bytes

    code

Explanation (optional)

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


귀하의 솔루션 예제에서 Julian은 포식자로 곧장 걸어갑니다. RFFLFRFMFLFRFLFF와 같은 것이 대신 작동해야합니다.
Emigna

@Emigna, 죄송합니다. 나는 두꺼운 정글과 포식자의 은신처가 섞여있었습니다.
Tobsta

1
P타일이 실제로 타일과 다른 것을 추가 합니까 1? 나는 그것들을 다르게 취급하는 그럴듯한 해결책을 실제로 상상할 수 없다.

@ dan1111 P 타일은 줄리안이 그것을 지나갈 때 죽인다. 줄리안 1 타일은 통과 할 수 없지만 줄리안이 맞으면 죽지 않고 그냥 튕 깁니다.
Tobsta

1
@Tobsta, 예, 이해합니다. 그러나 그것이 차이를 만드는가? 성공적인 솔루션은 1 및 P 타일을 피하는 것 같습니다.

답변:


1

그루비, 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"

파이썬에서 다시 시도하여 더 짧게 할 수 있는지 확인하겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.