আমি মজা পাই এটা সরাতে সরাতে


16

কিং জুলিয়ানকে জঙ্গলের মধ্য দিয়ে যাওয়া দরকার, তবে তিনি অলস বোধ করছেন। তিনি চান একটি কম্পিউটার তার জন্য জঙ্গলের মধ্য দিয়ে কোনও রুট গণনা করতে সক্ষম হোক।

STDIN ব্যবহার করে কম্পিউটারটি ক্র্যাক করার জন্য জঙ্গলের মানচিত্র পান get এটি নিম্নলিখিত ফর্ম্যাটটি অনুসরণ করবে:

01001E
010110
000P00
1100J1
S00111

জঙ্গলের মানচিত্র যেভাবে কাজ করে তা হল:

0 জুলিয়ান পাশাপাশি যেতে পারে যে স্থল।

1 ঘন দুর্গম জঙ্গল।

P এটি হ'ল শিকারীদের নিয়ে এমন একটি অঞ্চল, যা আপনাকে অবশ্যই কোনও মূল্যে এড়ানো উচিত।

Jতুলনামূলকভাবে ঘন জঙ্গল। ক্লান্তিকর হওয়ার আগে জুলিয়ানের মাইনগুলি এর মধ্যে একটির মধ্য দিয়ে যেতে পারে।

Sজুলিয়ান শুরু হয়। এটি মানচিত্রের যে কোনও জায়গায় হতে পারে।

Eজুলিয়ান যেখানে যেতে চায়; পথের শেষ। এটি অন্যান্য টাইলের মতো মানচিত্রে যে কোনও জায়গায় থাকতে পারে।

প্রতিটি চরিত্র মানচিত্রে একটি টাইল। লাইন ব্রেকগুলি টাইলগুলির একটি নতুন সারি নির্দেশ করে। যদি আপনার ভাষায় STDIN লাইন বিরতি সমর্থন করে না, একটি নতুন সারি চিহ্নিত করতে একটি স্থান দ্বারা লাইন ব্রেকটি প্রতিস্থাপন করতে হবে।

টাইলগুলির মধ্যে স্থানান্তরিত করতে, আপনাকে নিম্নলিখিত স্ট্রোল্ট ব্যবহার করে একটি স্ট্রিং আউটপুট করতে হবে:

F - ফরোয়ার্ড

B - পিছনে

L - জুলিয়ান বাম দিকে ঘোরান (90 ডিগ্রি অ্যান্টিલોকওয়্যার)

R - জুলিয়ান ডানদিকে ঘোরান (ঘড়ির কাঁটার দিকে 90 ডিগ্রি)

M- মিনিয়ানগুলি Jজুলিয়ান থেকে 1 টাইল এগিয়ে একটি টাইল ধ্বংস করে , যদি একটি থাকে ( Mকেবল টাইলটি সাফ করে দেয়, আপনাকে এখনও এটির দিকে যেতে হবে)

একটি সম্ভাব্য আউটপুট হবে:

RFFLFRFMFLFRFLFF

যা উপরের মানচিত্রটি সমাধান করে।

মন্তব্য:

  • যদি আপনার প্রোগ্রামটি এমন কোনও সমাধান আউটপুট করে যা শিকারীদের হিট করে, খেলা শেষ করে।

  • যদি আপনি দুর্গম জঙ্গলে আঘাত করেন তবে আপনি ঠিক একই জায়গায় মুখ করে ঘন জঙ্গলে দৌড়ানোর আগে আপনি যেখানে ছিলেন সেখানে ফিরে যান। (জঙ্গলের দিকে)

  • জুলিয়ান উপরের দিকে মুখ করে শুরু করে। (^ সেই পথে ^)

  • আউটপুট দ্রুত সমাধান হতে হবে না, FFFএবং FBFBFBFBFBFFFএকই। তবে, দ্রুততম সমাধানটি আউটপুট করা -10% বাইট গণনা বোনাস দেয়।

  • যদি কোনও মানচিত্র অবৈধ হয় তবে 'অবৈধ মানচিত্র' বন্ধ করুন। (এতে মানচিত্রটি অলসযোগ্য না হলে এতে অন্তর্ভুক্ত রয়েছে)

  • একটি মানচিত্রে বিভিন্ন দৈর্ঘ্যের সারি বা কলাম থাকতে পারে না; এটি এটিকে অবৈধ করে তোলে।

আপনার উত্তরটি কিছুটা এই ফর্ম্যাটটি অনুসরণ করবে:

#Language name, *n* bytes

    code

Explanation (optional)

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।


আপনার সমাধান উদাহরণটিতে জুলিয়ান সরাসরি শিকারীর মধ্যে চলেছে। আরএফএফএলএফআরএফএমএফএলএফআরএফএলএফএফ এর মতো কিছু কাজ করা উচিত।
এমিগানা

@ এমিগনা, ওফস আমি ঘন জঙ্গল এবং একটি শিকারীর
কান্ডের

1
একটি Pটাইল কি সত্যিই টাইল থেকে আলাদা কিছু যুক্ত করে 1? আমি সত্যিই এমন কোনও কলুষিত সমাধান কল্পনা করতে পারি না যা তাদের সাথে অন্যরকম আচরণ করে।

@ ড্যান 1111 পি টাইল জুলিয়ানকে ভ্রমণ করতে গিয়ে হত্যা করে। 1 টি টালি জুলিয়ান পেরিয়ে যেতে পারে না, তবে জুলিয়ান যদি আঘাত করে তবে সে মারা যায় না, সে কেবল পিছনে ফিরে আসে।
টোবস্টা

1
@ টবস্টা, হ্যাঁ, আমি বুঝতে পেরেছি। কিন্তু এটি একটি পার্থক্য আছে? দেখে মনে হচ্ছে যে কোনও সফল সমাধান কেবল 1 এবং পি টাইলগুলি এড়িয়ে যাবে।

উত্তর:


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

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"

আমি আরও শীঘ্রই এটি ছোট করতে পারি কিনা তাড়াতাড়ি অজগরটিতে আবার চেষ্টা করব again

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.