我喜欢移动它


16

朱利安国王需要穿越丛林,但他感到很懒。他希望计算机能够为他计算出穿越丛林的路线。

使用STDIN获取丛林图,以便计算机破解。它将采用以下格式:

01001E
010110
000P00
1100J1
S00111

丛林地图的工作方式是:

0 朱利安可以前进的基础。

1 是密不可通的丛林。

P 是一个有捕食者的区域,您必须不惜一切代价避免。

J是比较厚的丛林。朱利安的奴才可以在劳累之前突破其中之一。

S是朱利安的起点。它可以在地图上的任何地方。

E朱利安想去的地方;路径的尽头。就像任何其他图块一样,它也可以位于地图上的任何位置。

每个角色都是地图上的一块瓷砖。换行符指示新的图块行。如果使用您的语言的STDIN不支持换行符,则必须用空格替换换行符以表示新行。

要在图块之间移动,必须使用STDOUT输出包含以下特殊字符的字符串:

F -转发

B -向后

L -向左旋转朱利安(逆时针旋转90度)

R -向右旋转朱利安(顺时针旋转90度)

M-奴才J从朱利安(Julian)处摧毁一块瓷砖,如果有M一块(如果清除了瓷砖,您仍然必须移动到该瓷砖上)

可能的输出为:

RFFLFRFMFLFRFLFF

解决了上面的地图。

笔记:

  • 如果您的程序输出的解决方案会打击掠食者,请结束游戏。

  • 如果碰到了无法逾越的丛林,您会以相同的方式弹回到茂密的丛林之前的位置。(走向丛林)

  • 朱利安开始朝上。(^那样^)

  • 输出不一定是最快的解决方案,FFF并且FBFBFBFBFBFFF相同。但是,输出最快的解决方案可获得-10%的字节数奖励。

  • 如果地图无效,则STDOUT'无效地图'。(这包括地图是否无法解决)

  • 地图不能有不同长度的行或列;使其无效。

您的答案应遵循以下格式:

#Language name, *n* bytes

    code

Explanation (optional)

这是,因此以字节为单位的最短代码获胜。


您的解决方案示例中,朱利安(Julian)直奔捕食者。像RFFLFRFMFLFRFLFF之类的东西应该可以代替。
Emigna

@Emigna,糟糕。我混在茂密的丛林和捕食者的巢穴之间……
Tobsta

1
P贴是否真的添加了与1磁贴不同的东西?我真的无法想象有一个可行的解决方案可以对它们进行不同的处理。

@ dan1111当P瓷砖经过Julian时,它会杀死他。朱利安(Julian)无法通过1格,但是如果朱利安(Julian)击中它,他不会死,他只会反弹。
Tobsta 2015年

1
@Tobsta,是的,我了解。但这有区别吗?似乎任何成功的解决方案都只会避免使用1和P切片。

Answers:


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中再次尝试,看看是否可以进一步缩短它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.