একটি আইসবার্গের উপরে আটকে থাকা বিজ্ঞানী সিলগুলি


17

ভূমিকা

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

ইনপুট বিবরণ

সিলের প্রোগ্রামটি এসটিডিআইএন, কমান্ড লাইন আর্গুমেন্ট বা ব্যবহারকারী ইনপুট ফাংশনগুলি (যেমন raw_input()) থেকে ইনপুট নেবে । এটি একটি ভেরিয়েবলের পূর্বনির্ধারণ করা যায় না (উদাঃ "এই প্রোগ্রামটি একটি ভেরিয়েবলের ইনপুট আশা করে x")।

ইনপুটটির প্রথম লাইনটি ফর্মটিতে দুটি কমা দ্বারা পৃথক পূর্ণসংখ্যা নিয়ে গঠিত

A,B

এটি অনুসরণ করে প্রতিটি অক্ষরের Bসমন্বয়ে লাইন Aথাকে। প্রতিটি লাইনে কেবল নিম্নলিখিত বর্ণের মধ্যে অক্ষর থাকতে পারে:

  • .: শীত, ঠান্ডা, মহাসাগর। মানচিত্রের সর্বদা এটি সীমানা হিসাবে থাকবে।
  • #: আইসবার্গের একটি অংশ।
  • a... z: একটি সিল যা আইসবার্গে বাবা সিল নয়।
  • D: আইসবার্গে বাবা সীল।
  • *: রেডিও ট্রান্সমিটার।

(মনে রাখবেন বাবা সীল সর্বদা একটি বড় Dহাতের সাথে চিহ্নিত dথাকে A একটি ছোট হাতের অক্ষরটি কেবল একটি নিয়মিত সিল)

আউটপুট বিবরণ

সিলগুলি কীভাবে চলতে পারে সে সম্পর্কে নিম্নলিখিত নিয়ম অনুসারে, রেডিও ট্রান্সমিটারে বাবা সীলকে কীভাবে স্থানান্তরিত করা উচিত সে বিষয়ে সীলগুলির জন্য নির্দেশাবলীর একটি তালিকা আউটপুট করুন।

  1. বিধি: সমস্ত সিলগুলি ( U), নীচে ( D), বাম ( L) এবং ডানদিকে ( R) উপরে উঠতে পারে । এগুলি তির্যকভাবে স্লাইড করতে পারে না।
  2. বিধি: চলার পরে, একটি সীল একই দিকে অগ্রসর হতে থাকবে যতক্ষণ না এটি অন্য সিলের সাথে সংঘর্ষ হয় বা সমুদ্রে পড়ে না যায়।
    1. যদি একটি সিল অন্য সিলের সাথে সংঘর্ষ হয়, তবে এটি চলাচল বন্ধ করবে। এটির সাথে যে সিলটি সংঘর্ষিত হয়েছিল তা সরবে না
    2. কোনও সীল যদি সমুদ্রে পড়ে তবে তা ডুবে যাবে এবং মানচিত্র থেকে অদৃশ্য হয়ে যাবে। এটি অন্য সীলগুলির জন্য একটি সংঘর্ষক হিসাবে কাজ করে না এবং এটি আবার সরানো যায় না।
  3. বিধি: দুটি সীল একই সাথে চলাচল করতে পারে না, অন্য একটি এখনও চলতে থাকা অবস্থায় একটিও সীল সরানো যায় না। পূর্ববর্তী সীলটি চলন্ত বন্ধ করার পরে কেবল পরবর্তী সীলটি সরানো যেতে পারে।
  4. বিধি: একাধিকবার সিল সরিয়ে নিয়ে যাওয়া বা ডুবে যাওয়া সিলগুলির সংখ্যা সম্পর্কে কোনও বিধিনিষেধ নেই।
  5. বিধি: একটি সঠিক সমাধানের সাথে রেডিও ট্রান্সমিটারে বাবা সীল শেষ হবে। বাবা সীল স্লাইডিংয়ের সময় কেবল ট্রান্সমিটারটি পাস করতে পারে না ।

আউটপুট বিভিন্ন আকারের প্রতিটি লাইন গঠিত হবে

A,B

কোথায় Aসীল (সরানো হয় Dবাবা সীল জন্য, a... zঅন্যদের জন্য), এবং Bদিক সীল সরাতে (হয় হয় U, D, L, অথবা R)। মনে রাখবেন যে আপনার সবচেয়ে সংক্ষিপ্ততম রুটটি খুঁজে পাওয়ার দরকার নেই। যে লক্ষ্যে বাবা সিল পায় কোনও রুটই একটি গ্রহণযোগ্য আউটপুট।

উদাহরণ ইনপুট এবং আউটপুট

ইনপুট:

25,5
.........................
.#######################.
.####D#############*k###.
.#######################.
.........................

আউটপুট:

D,R

ইনপুট:

9,7
.........
.a#####b.
.#####d#.
.##l*###.
.###m#p#.
.#D#.#c#.
.........

আউটপুট (অনেকের মধ্যে একটি সম্ভাব্য আউটপুট):

m,R
b,L
D,U
D,R
D,D
D,L

ইনপুট:

26,5
..........................
.###..................###.
.l*##########v#########D#.
.###..................###.
..........................

আউটপুট (অনেকের মধ্যে একটি সম্ভাব্য আউটপুট):

v,D
D,L

আপনার যদি অন্য কোনও প্রশ্ন থাকে তবে দয়া করে মন্তব্যে জিজ্ঞাসা করুন।


সমস্ত ইনপুটগুলির একটি কার্যকর সমাধান হবে? যদি তা না হয় তবে আউটপুট / আচরণ কী হবে?
জিওবিটস 12'15

@ জিওবিটস সমস্ত ইনপুটগুলির একটি বৈধ সমাধান হবে। সমাধান ব্যতীত ইনপুটগুলি অবৈধ হিসাবে বিবেচিত হয় এবং আপনার প্রোগ্রামটি সেগুলি দিয়ে যা কিছু করতে পারে।
12:38

ব্যতিক্রম ছুঁড়ে দিয়ে প্রোগ্রামটি শেষ করা কি জায়েজ?
ডিএলসাস

2
যদি কোনও নন-বাবা সীল রেডিও ট্রান্সমিটারটিতে আঘাত করে তবে কী ঘটবে? এটি বন্ধ হবে, বা এটি মাধ্যমে সরানো হবে?
রেটো কোড়াদি

1
এটি আমার সমাধানকে অকার্যকর করে দেয়। :(
DLosc

উত্তর:


6

পাইথন 3, 520 বাইট

R=range
g=[list(input())for i in R(int(input().split(',')[1]))]
f=set(sum(g,[]))-set(".#*")
L=8
def P(p,g):
 if len(p)>L:return
 for s in f:
  c=sum(y.index(s)for y in g if s in y)
  if c<1:continue
  r,=[n for n in R(len(g))if s in g[n]]
  for d in R(4):
   m=p+s+",%s\n"%"LURD"[d];G=[y[:]for y in g];o="#";i,j=I,J=r,c
   while"#"==o:G[i][j]="#";G[I][J]=s;i,j=I,J;I,J=i+d%2*(d-2),j+(~d%-2&d-1);o=G[I][J]
   if"."==o:G[i][j]="#"
   if"D"==s:
    if"."==o:continue
    if"*"==o:print(m);1/0
   P(m,G)
while 1:P("",g);L+=4

লোকেরা চাইলে আমি আরও বিশদ ব্যাখ্যা করতে পারি, তবে মূলত এটি সম্ভাব্য পদক্ষেপের রাজ্য স্থানের পুনরাবৃত্তিমূলক গভীরতার সাথে একটি গভীরতার প্রথম অনুসন্ধান চালায়। যদি কোনও পদক্ষেপের ফলে বাবা সিলটি পড়ে যায় তবে তা অবিলম্বে প্রত্যাখ্যান করা হবে। যদি বাবা ট্রান্সমিটারের পাশে শেষ হয় তবে চালগুলির ক্রম মুদ্রণ করা হবে, এবং প্রোগ্রামটি শূন্যের সাথে বিভক্ত হয়ে প্রস্থান করতে বাধ্য হবে।

আমি if G!=g:8 টি অতিরিক্ত বাইটের জন্য দ্বিতীয়-শেষ লাইনের শুরুতে যোগ করে কোডটি উল্লেখযোগ্যভাবে দ্রুত চালিত করতে পারি - k,Lএটি প্রথম টেস্টের ক্ষেত্রে যেমন কোনও পরিবর্তন হয় না এমন পদক্ষেপগুলি প্রত্যাখ্যান করে ।

রানটাইমটি এক রান থেকে পরের দিকে লক্ষণীয়ভাবে পরিবর্তিত হয়, এমনকি একই ইনপুটটিও - স্পষ্টতই এই ফলাফলটির ফলস্বরূপ যে আমি setএকটি অপরিবর্তিত প্রকারের দ্বারা পুনরাবৃত্তি করে পরবর্তী সিলটি বেছে নিয়েছি । আমি দ্বিতীয় পরীক্ষার কেসটি 5 মিনিট 30 সেকেন্ডে টাইম করেছিলাম, যদিও প্রথমবারের মতো এটি প্রথম চালানো হয়নি বলে মনে হয় না। উপরে উল্লিখিত অনুকূলিতকরণের সাথে এটি 40 সেকেন্ডের মতো।


1
আকর্ষণীয়ভাবে পাইথন 2 এ এটি প্রতিবার একই আদেশ দেওয়া উচিত। আমি মনে করি যে তারা পাইথন 3 পরিবর্তিত করে একই জিনিসগুলির জন্য প্রতিটি চালকে এলোমেলোভাবে হ্যাশগুলি দেওয়ার জন্য নির্দিষ্ট শোষনগুলি এড়াতে পারে: "হ্যাশ র্যান্ডমাইজেশন ডিফল্টরূপে সক্ষম হয় the পাইথনহ্যাসিড পরিবেশটি পরিবর্তনশীল 0 এ হ্যাশ র্যান্ডমাইজেশন অক্ষম করতে সেট করুন the বস্তুটি দেখুন __ হ্যাশ __ () পদ্ধতি। "
ক্লাউডিয়ু

4

জাভাস্ক্রিপ্ট (ES6) 322 334 323

Edit2 স্নিপেট যোগ অ্যানিমেশন

বাগ ফিক্স সম্পাদনা করুন , '*' এর প্রাথমিক পিজিটন মনে রাখবেন, সুতরাং যখন সিলটি এটির উপরে সরে যায় এবং মুছে যায় তখনও আমি এটি খুঁজে পাই।

প্যারামিটার হিসাবে ইনপুট স্ট্রিং সহ একটি ফাংশন হিসাবে প্রয়োগ করা হয়েছে (সম্ভবত অবৈধ তবে কোনও স্পষ্টির জন্য অপেক্ষা করছেন)। পপআপ মাধ্যমে আউটপুট।
জাভাস্ক্রিপ্টে মাল্টলাইন স্ট্রিং ইনপুট নিয়ে সমস্যা হ'ল promptএটি এটিকে ভালভাবে পরিচালনা করে না।

অ্যালগরিদম হিসাবে: একটি বিএফএস, একটি অনুকূল সমাধান সন্ধান করা উচিত। আমি চলকটিতে গেমের স্থিতির একটি সারি রাখি l, চরিত্রের গ্রিডকে স্থিতি দেওয়া অবস্থা gএবং এখন পর্যন্ত চালক্রমগুলির ক্রম s। পাশাপাশি, kএকই গ্রিডটি বার বার অন্বেষণ করা এড়াতে এখানে ভেরিয়েবলের মধ্যে এখনও পর্যন্ত গ্রিডের সেট পাওয়া গেছে ।

মূল লুপটি হ'ল

  • একটি গেমের স্থিতি খুঁজে নিন
  • সমস্ত সম্ভাব্য পদক্ষেপ চেষ্টা করুন, প্রতিটি বৈধ পদক্ষেপের পরে স্থিতি সজ্জিত করুন (ফলস্বরূপ গ্রিড ইতিমধ্যে উপস্থিত নেই)
  • যদি সমাধান পাওয়া যায় তবে লুপ থেকে প্রস্থান করুন
F=s=>{
  o=~s.match(/\d+/),g=[...z=s.replace(/.*/,'')];
  for(l=[[g,'']],k=[];[g,s]=l.shift(),!g.some((c,p)=>
      c>'A'&&[-1,1,o,-o].some((d,j)=>{
        t=s+' '+[c,'LRUD'[j]];
        for(q=p;(u=g[q+d])<'.';)q+=d;
        return(c<'a'&z[q]=='*')||
        c>'D'|u>'.'&&!(
          f=[...g],u=='.'?0:f[q]=c,f[p]='#',
          k[h=f.map(v=>v>'D'?0:v)]||(k[h]=l.push([f,t]))
        )
      })
    ););
  alert(t)
}

ফায়ারফক্সে পরীক্ষার জন্য স্নিপেট চালান


1

সি ++, 628 বাইট

ভাল, এটি খুব সংক্ষিপ্ত পরিণত হয়নি:

#include <set>
#include <iostream>
using namespace std;struct R{string b,m;bool operator<(R r)const{return b<r.b;}};int w,h,t,j,k,z=1;char c,f;set<R> p,q;int m(R r,int x,int d,char a){for(j=x,c=r.b[x];(f=r.b[j+=d])==35;);if(c-68||f-46){r.b[x]=35;if(f-46)r.b[j-d]=c;r.m+=c;r.m+=44;r.m+=a;r.m+=10;if(c==68&j-d==t){cout<<r.m;z=0;}if(p.count(r)+q.count(r)==0){q.insert(r);}}}int main(){cin>>w>>c>>h>>c;R r;string l;for(;k++<h;){getline(cin,l);r.b+=l;}t=r.b.find(42);r.b[t]=35;q.insert(r);for(;z;){r=*q.begin();q.erase(q.begin());p.insert(r);for(k=0;z&&k<w*h;++k){if(r.b[k]>64){m(r,k,-1,76);m(r,k,1,82);m(r,k,-w,85);m(r,k,w,68);}}}}

আমি সি ++ পছন্দ করেছি কারণ আমি ডেটা স্ট্রাকচারগুলি ব্যবহার করতে চেয়েছিলাম ( set,string ) তবে এটি সহজাতভাবে বেশ ভার্জোজ ose সমাধানটি পারফরম্যান্সে যথাযথভাবে কার্যকর করে, একটি ম্যাকবুক প্রোতে 2 সেকেন্ডের মধ্যে 2 পরীক্ষাটি সমাধান করে, যদিও এটি রানটাইমটির জন্য অনুকূল নয়।

শ্বেত স্পেস এবং কিছু অন্যান্য দৈর্ঘ্যের হ্রাস দূর করতে শুরু করার আগে কোড:

#include <set>
#include <iostream>

using namespace std;

struct R {
    string b, m;
    bool operator<(R r) const {return b < r.b; }
};

int w, h, t;
set<R> p, q;
bool z = true;

void m(R r, int k, int d, char a) {
    int j = k;
    char s = r.b[k], f;
    for (; (f = r.b[j += d]) == 35;);
    if (s - 68 || f - 46) {
        r.b[k] = 35;
        if (f - 46) {
            r.b[j - d] = s;
        }
        r.m += s;
        r.m += 44;
        r.m += a;
        r.m += 10;
        if (s == 68 && j - d == t) {
            cout << r.m;
            z = false;
        }
        if (p.count(r) + q.count(r) == 0) {
            q.insert(r);
        }
    }
}

int main() {
    char c;
    cin >> w >> c >> h >> c;
    string b, l;
    int k;
    for (k = 0; k < h; ++k) {
        getline(cin, l);
        b += l;
    }

    t = b.find(42);
    b[t] = 35;

    R r;
    r.b = b;
    q.insert(r);

    for ( ; z; ) {
        r = *q.begin();
        q.erase(q.begin());
        p.insert(r);

        for (k = 0; z && k < w * h; ++k) {
            c = r.b[k];
            if (c > 64) {
                m(r, k, -1, 76);
                m(r, k, 1, 82);
                m(r, k, -w, 85);
                m(r, k, w, 68);
            }
        }
    }

    return 0;
}

অ্যালগরিদমের পিছনে মূল ধারণাটি দুটি সেট বজায় রাখা হয়:

  • q প্রক্রিয়াধীন মুলতুবি থাকা কনফিগারেশনের সেট।
  • p প্রক্রিয়াজাতকরণের কনফিগারেশনের সেট।

অ্যালগরিদম শুরুতে কনফিগারেশন দিয়ে শুরু হয় q। প্রতিটি পদক্ষেপে, একটি কনফিগারেশন থেকে পপ করা হয় q, এতে যুক্ত করা হয় p, সমস্ত সম্ভাব্য সীল চলন তৈরি করা হয়, এবং এর ফলে নতুন কনফিগারেশন intoোকানো হয়q

পরীক্ষা রান:

bash-3.2$ ./a.out <test1
D,R
bash-3.2$ time ./a.out <test2
p,U
c,U
p,R
c,L
m,L
b,L
a,L
D,U
b,L
D,R
D,D
D,L

real    0m2.267s
user    0m2.262s
sys 0m0.003s
bash-3.2$ ./a.out <test3
v,U
D,L
bash-3.2$

'কিউ' এর পরিবর্তে একটি সারি ব্যবহার করে আপনি কম সময়ে সংক্ষিপ্ত সমাধানগুলি খুঁজে পেতে পারেন (পরীক্ষার জন্য আমার সমাধান ২ টি পদক্ষেপ)।
edc65

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

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