অটোপাইলট মোড


10

উপরের বাম কোণে শুরু হওয়া একটি হেলিকপ্টার মাটির দিকে নামছে (একটি 2 ডি স্পেসে, এই প্রশ্নের উদ্দেশ্যে)। এটিতে একটি অটোপাইলট মোড এবং একটি ম্যানুয়াল মোড রয়েছে।

অটোপাইলট মোড নীচের মতো আচরণ করে:

  • যদি সরাসরি নীচের স্থানটি বিনামূল্যে থাকে তবে এটিতে নামুন।
  • অন্যথায় এলোমেলোভাবে পুরোপুরি বাম বা ডানদিকে সরান। (এটি এই পদ্ধতিতে একাধিক পদক্ষেপ সরিয়ে নিতে পারে))

এবং এটি এই দুটি পদক্ষেপ পুনরাবৃত্তি করে যতক্ষণ না এটি মাটিতে না পড়ে its ম্যানুয়াল মোডটি আরও স্মার্ট এবং এটি মাটির দিকে সর্বোত্তম পথটি খুঁজে পাবে, যদিও এর জন্য উপরের দিকে অগ্রসর হওয়া বা কিছু দক্ষ কৌশলের প্রয়োজন।

আপনার কাজ যদি নির্ধারণ করা হয়

  1. স্বয়ংচালিত প্রদত্ত দৃশ্যে পাস করবে,
  2. স্বয়ংচালিত প্রদত্ত পরিস্থিতিতে ব্যর্থ হতে পারে,
  3. স্ব-পাইলট ব্যর্থ হবে, তবে ম্যানুয়াল মোডটি পাস হবে, বা
  4. উভয় মোড ব্যর্থ হবে (মাটিতে কোনও বৈধ পথ নেই)।

ইনপুট

  • ফ্রি এবং ব্লকড স্পেস উপস্থাপনের জন্য দুটি পৃথক অক্ষর ব্যবহার করে, 1 ডি বা 2 ডি খালি খালি অ্যারে হিসাবে দৃশ্য দেওয়া হয়েছে। বিরামচিহ্ন .চ্ছিক।
  • Ptionচ্ছিক: অ্যারের মাত্রা

আউটপুট

চারটি পূর্বনির্ধারিত অক্ষরের একটি যা ইঙ্গিত করে যে কোনটি ঘটনা ঘটেছে।

নমুনা তথ্য

ইনপুটটিতে 0 (খালি) এবং 1 (অবরুদ্ধ) ব্যবহার করা হচ্ছে, আউটপুটে 1 2 3 4 (উপরে নম্বর হিসাবে)

0 0 0 0
0 1 0 0
0 0 0 1
1 1 0 0

আউটপুট: 1

0 0 1 0
1 0 0 1
0 0 0 0
0 1 1 0
0 0 0 1

আউটপুট: 2(হেলিকপ্টারটি চতুর্থ সারিতে 1 টির মুখোমুখি হবে, এবং অটোপাইলট মোডে থাকলে এটি 5 নং সারির শেষে নিজেই ফাঁদে যাবে)

0 0 0 1 0
0 1 1 0 0
0 1 0 0 0
0 0 0 1 0
1 1 1 1 0

আউটপুট: 3(এটির জন্য উপরের দিকে অগ্রসর হওয়া প্রয়োজন, সুতরাং স্বয়ংচালিত ব্যর্থ হয়)

1 0 0
0 0 0

আউটপুট: 4

0 0 0 0 1
1 1 1 0 0
1 0 0 1 0
0 1 0 0 0
0 0 1 1 1

আউটপুট: 4


@ মার্টিনবাটনার সম্পন্ন পার্শ্ব-নোট হিসাবে, আপনি কি মানুষকে স্যান্ডবক্সে পোস্ট করা বা সরাসরি পোস্ট করতে এবং তাদের ত্রুটিগুলি সংশোধন করতে পছন্দ করেন? দ্বিতীয় বিকল্পটি সহজ, সুতরাং যদি না কিছু উত্সাহ না থাকে তবে আমি কেন বিকল্পটি অনুসরণ করব তা ভাবতে পারি না।
ভূত_স_ই_কোড

7
আমি ব্যক্তিগতভাবে স্যান্ডবক্সটি পছন্দ করি, কারণ লোকেরা চ্যালেঞ্জ নিয়ে কাজ শুরু করার আগে, এটি সম্ভাব্য ত্রুটিগুলি, লুফোলগুলি বা নিখোঁজ পরীক্ষার কেস সম্পর্কে চিন্তা করতে আরও সময় দেয়। যদি কেউ ত্রুটিযুক্ত চ্যালেঞ্জের প্রাথমিক উত্তর পোস্ট করে তবে আপনি বিদ্যমান উত্তরগুলিকে অবৈধ না করে চ্যালেঞ্জটি সত্যিই সমাধান করতে পারবেন না।
মার্টিন এন্ডার

এছাড়াও - ইনপুটগুলি কি সর্বদা অক্ষর, বা সেগুলি বুলিয়ান / পূর্ণসংখ্যা / ইত্যাদি হতে পারে? এবং আউটপুট - এটি পূর্ণসংখ্যা হতে পারে, বা এটি একটি চরিত্র হতে হবে?
চার্লস

উত্তর:


1

রুবি, 259

আমি এই সাথে খুব মজা ছিল। ধন্যবাদ! চ্যালেঞ্জ আকর্ষণীয় চ্যালেঞ্জ সহ দুর্দান্ত মজা হতে থাকে। এটি ধরে নেওয়া হয় যে প্রশ্নের "অক্ষরগুলি" পূর্ণসংখ্যা হতে পারে।

আমি মনে করি এখানে উন্নতির প্রধান বিষয়গুলি হ'ল:

  1. এর সৃষ্টি r
  2. তৃতীয় লাইনে ভয়াবহ ত্রৈমাসিক আপত্তি সম্ভবত আরও ভয়াবহ আকারে তৈরি করা যেতে পারে, তবে কিছুটা কাতালানো।
->a,h,w{f=->l,s=0,y=[0]{r=w-2<s%w ?w:1,1>s%w ?w:-1,w
v=(l ?r+[-w]:a[s+w]==0?[w]:r).map{|d|a[m=s+d]==0&&!y[m]?m:p}-q=[p]
a[s]>0?q:s/w>h-2?8:v[0]?v.map{|o|f[l,y[o]=o,y]}.flatten-q :r.any?{|i|a[s+i]<1}?p: !0}
g=f[p]
[8,g[0]&&g.all?,g.any?,f[8].any?,!p].index !p}

অবহেলিত (সামান্য পুরানো, তবে আসল কাছাকাছি):

# a is a one-dimensional array of 0s and 1s, h is height, w is width
->a,h,w{
  # f recursively walks the array and returns true/false/nil for each path.
  #    True means we can reach ground.
  #    False means we are stuck in a local minimum and cannot escape
  #    Nil means we reached a local dead-end and need to backtrack.
  # l: {true=>"manual", false=>"autopilot"}
  # s: the position index
  # y: an array of booleans - true-ish means we've visited that square before
  #         (this is to prevent infinite loops, esp in manual mode)
  f=->l,s=0,y=[0]{
    # d: all the legal deltas from s (maximally, that's [1,-1,w,-w], aka [LRDU])
    # r: but the right and left get tricky on the edges, so let's pre-calculate those
    #    we'll default to "down" if "left" or "right" are illegal
    r=[w-2<s%w ?w:1,1>s%w ?w:-1]
    # if manual, [LRDU]; if auto, and you can go down, [D]. else, [LR] 
    d=l ?r+[w,-w]:a[s+w]==0?[w]:r
    # v: the legal deltas that you can go to from s (that is, unvisited and unblocked)
    v=d.map{|d|a[m=s+d]==0&&!y[m]?m:p}-[p]


    a[s]>0 ? [p]     # if we're currently blocked, return [nil] (this is only the case when a[0]==1)
      : s/w>h-2 ? !p # if we're at the bottom, return true
        : v[0] ?     # if we have a place to go....
        v.map{|o|f[l,y[o]=o,y]}.flatten-[p] # recurse with each step.
                                            # y[o]=o is a neat trick to make y[o] truthy and return o
          : r.any?{|i|a[s+i]==0} ? # otherwise, we have nowhere to go. If we could visit left/right, but have already been there
            p                      #    this is not a dead-end - return nil to remove this path
            : !!p                  # If we have a true dead-end (auto-mode with a local minimum), false
  }
  # g is the auto flight
  g=f[p]
  # finally, choose the first "true" out of:
  # 0: always 8.  Cuz why not 8?
  # 1: there is at least one auto path, and all are truthy
  # 2: any auto path is truthy
  # 3: any manual path is truthy
  # 4: true
  [8,g[0]&&g.all?,g.any?,f[!p].any?,!p].index !p
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.