動かしたい


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

上記のマップを解決します。

ノート:

  • プログラムが捕食者を襲うソリューションを出力する場合、ゲームオーバーです。

  • 通り抜けられないジャングルにぶつかると、密なジャングルに出会う前の場所に戻り、同じ方向に向かいます。(ジャングルに向かって)

  • ジュリアンは上向きになり始めます。(^そのように^)

  • 出力は最速の解決策になる必要があり、しないFFFFBFBFBFBFBFFF同じです。ただし、可能な限り高速のソリューションを出力すると、-10%のバイトカウントボーナスが得られます。

  • マップが無効な場合、STDOUT 'Invalid map。' (マップが解決できない場合を含む)

  • マップに異なる長さの行または列を含めることはできません。それが無効になります。

あなたの答えはこのフォーマットにいくらか従うべきです:

#Language name, *n* bytes

    code

Explanation (optional)

これはであるため、バイト単位の最短コードが優先されます。


ソリューションの例では、ジュリアンが捕食者に向かってまっすぐ歩きます。代わりにRFFLFRFMFLFRFLFFのようなものが動作するはずです。
エミグナ

@Emigna、おっと。私は厚いジャングルと捕食者の隠れ家との間で
混乱しました...-Tobsta

1
Pタイルは本当に異なる何かを追加1タイルを?それらを別の方法で扱うもっともらしいソリューションを本当に想像することはできません。

@ dan1111 Pタイルは、Julianがその上を移動すると殺します。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でこれを再試行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.