ฉันชอบที่จะย้ายมันย้ายมัน


16

กษัตริย์จูเลียนต้องผ่านป่า แต่เขารู้สึกขี้เกียจ เขาต้องการให้คอมพิวเตอร์คำนวณเส้นทางผ่านป่าให้เขาได้

การใช้ STDIN รับแผนที่ของป่าเพื่อให้คอมพิวเตอร์ร้าว มันจะเป็นไปตามรูปแบบต่อไปนี้:

01001E
010110
000P00
1100J1
S00111

วิธีการทำงานของแผนที่ป่าคือ:

0 เป็นพื้นดินที่จูเลียนสามารถเคลื่อนย้ายไปตาม

1 เป็นป่าทึบที่ไม่สามารถใช้ได้

P เป็นพื้นที่ที่มีผู้ล่าอยู่ในนั้นคุณต้องหลีกเลี่ยงค่าใช้จ่ายทั้งหมด

Jเป็นป่าค่อนข้างหนา สมุนของจูเลียนสามารถผ่านหนึ่งในเหล่านี้ก่อนที่จะเหนื่อย

Sจูเลียนเริ่มต้นที่ไหน สามารถอยู่ที่ใดก็ได้บนแผนที่

Eจูเลียนต้องการไปที่ไหน จุดสิ้นสุดของเส้นทาง นอกจากนี้ยังสามารถไปได้ทุกที่บนแผนที่เช่นเดียวกับไทล์อื่น ๆ

ตัวละครทุกตัวเป็นกระเบื้องบนแผนที่ ตัวแบ่งบรรทัดระบุแถวใหม่ของไทล์ หาก STDIN ในภาษาของคุณไม่รองรับการขึ้นบรรทัดใหม่การขึ้นบรรทัดใหม่จะต้องถูกแทนที่ด้วยช่องว่างเพื่อแสดงว่าแถวใหม่

หากต้องการย้ายระหว่างไทล์คุณต้องส่งออกสตริงโดยใช้ STDOUT ที่มีอักขระพิเศษดังต่อไปนี้:

F - ส่งต่อ

B - ย้อนกลับ

L - หมุน Julian ไปทางซ้าย (90 องศาทวนเข็มนาฬิกา)

R - หมุน Julian ไปทางขวา (ตามเข็มนาฬิกา 90 องศา)

M- ลูกน้องจะทำลายJไพ่ 1 ใบที่อยู่ข้างหน้าจาก Julian ถ้ามีอยู่ (มีMเพียงแค่เคลียร์ไพ่คุณยังคงต้องย้ายไปอยู่)

ผลลัพธ์ที่เป็นไปได้คือ:

RFFLFRFMFLFRFLFF

ซึ่งแก้แผนที่ด้านบน

หมายเหตุ:

  • หากโปรแกรมของคุณแสดงผลโซลูชันที่เข้าถึงผู้ล่าให้ลองเล่นเกม

  • หากคุณโดนป่าที่ไม่สามารถผ่านได้คุณเพียงแค่ย้อนกลับไปยังที่ที่คุณอยู่ก่อนที่คุณจะวิ่งเข้าไปในป่าทึบและหันหน้าไปทางเดียวกัน (สู่ป่า)

  • จูเลียนเริ่มหันขึ้นด้านบน (^ วิธีนั้น ^)

  • ผลลัพธ์ไม่จำเป็นต้องเป็นทางออกที่เร็วที่สุดFFFและFBFBFBFBFBFFFเหมือนกัน อย่างไรก็ตามการส่งออกทางออกที่เร็วที่สุดที่เป็นไปได้จะให้โบนัสนับ -10%

  • หากแผนที่ไม่ถูกต้อง STDOUT 'แผนที่ไม่ถูกต้อง' (ซึ่งรวมถึงหากแผนที่ไม่สามารถแก้ไขได้)

  • แผนที่ไม่สามารถมีแถวหรือคอลัมน์ที่มีความยาวต่างกันได้ ที่ทำให้มันไม่ถูกต้อง

คำตอบของคุณควรเป็นไปตามรูปแบบนี้:

#Language name, *n* bytes

    code

Explanation (optional)

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ


ตัวอย่างโซลูชันของคุณทำให้จูเลียนเดินเข้าไปหานักล่า บางอย่างเช่น RFFLFRFMFLFRFLFF ควรทำงานแทน
Emigna

@Emigna โอ๊ะโอ ผมได้รับการผสมขึ้นระหว่างป่าหนาและถ้ำของนักล่า ...
Tobsta

1
ไทPล์เพิ่มสิ่งที่แตกต่างจาก1ไทล์จริงๆหรือ ฉันไม่สามารถจินตนาการถึงวิธีแก้ปัญหาที่น่าเชื่อถือได้

@ dan1111 ไทล์พีสังหารจูเลียนเมื่อเขาเดินทางข้ามมัน 1 กระเบื้องจูเลียนผ่านไม่ได้ แต่ถ้าจูเลียนกระทบมันเขาก็ไม่ตายเขาแค่ตีกลับ
Tobsta

1
@Tobsta ใช่ฉันเข้าใจ แต่นั่นสร้างความแตกต่างได้หรือไม่? ดูเหมือนว่าการแก้ปัญหาที่ประสบความสำเร็จจะหลีกเลี่ยง 1 และ P tile

คำตอบ:


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"

ฉันจะลองอีกครั้งในไพ ธ อนเร็ว ๆ นี้เพื่อดูว่าฉันสามารถย่อให้สั้นลงได้อีกหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.