পলি নিমো সন্ধান করছে!


11

ওহ না! নেমো, আমাদের ছোট ক্লাউন ফিশ এই এএসসিআইআই সমুদ্রে হারিয়ে গেছে এবং তার বাবা মার্লিন তাকে সন্ধান করার চেষ্টা করছেন।

আপনার কাজটি হল মার্লিনকে নিমোতে নিরাপদে পাওয়া। তবে সাবধান, আমাদের theিলে !ালা ব্রুসকে খাওয়ানো আছে, তাই তাকে যেকোন মূল্যে এড়ানো ভাল!

বিস্তারিত

আপনাকে কেবলমাত্র ছোট হাতের বর্ণমালা সমেত একটি আয়তক্ষেত্রাকার ASCII সমুদ্র গ্রিড দেওয়া হবে a-z। এই মহাসাগর থাকবে nemo, marlinএবং bruceএটা ভিতরে একটি ক্রমাগত polyomino আকারে, সবসময় polyomino প্রথম কলামে শীর্ষ সবচেয়ে কক্ষ থেকে শুরু। সুতরাং উদাহরণস্বরূপ, সমস্ত সম্ভাব্য টেট্রোমিনোগুলির মধ্যে, বৈধগুলি নীচের স্নিপেটে তালিকাভুক্ত

তবে এর মতো ফর্মগুলি অবৈধ এবং ইনপুটটিতে উপস্থিত হবে না:

omen

ne
mo

nem
o

o
m
en

nem
 o

n
eo
m

অবশেষে, আপনার কাজটি হ'ল marlinপলিওমিনো টাইল থেকে nemoপলিমিনো টাইলের কোনও পথ খুঁজে পাওয়া তা নিশ্চিত করে নিন যে আপনার পথের কোনও সেল bruceপলিওমিনো টাইল সংলগ্ন নয় । আপনার আউটপুট সব বর্ণমালার যা অংশ নয় প্রতিস্থাপন করা উচিত marlinটালি, nemoতাদের উভয় (স্থান সহ) ছোট হাতের ছাড়া অন্য মুদ্রণযোগ্য হওয়া ASCII ব্যাপ্তি থেকে একটি অক্ষর দিয়ে সংযোগ টালি এবং পাথ a-z

উদাহরণ

যদি ইনপুট সাগর নিম্নলিখিত হিসাবে থাকে:

oxknvvolacycxg
xmliuzsxpdzkpw
warukpyhcldlgu
tucpzymenmoyhk
qnvtbsalyfrlyn
cicjrucejhiaeb
bzqfnfwqtrzqbp
ywvjanjdtzcoyh
xsjeyemojwtyhi
mcefvugvqabqtt
oihfadeihvzakk
pjuicqduvnwscv

(3 টি পলিওমিনো সত্তার সাথে:

...n..........
.mli..........
.ar...........
..............
....b.........
....ruce......
..............
.....n........
.....emo......
..............
..............
..............

)

তারপরে একটি বৈধ সমাধান দেখতে পাওয়া যাবে:

...n..........
.mli..........
.ar...........
.u............
.n............
.i............
.z............
.wvjan........
.....emo......
..............
..............
..............

স্নিপেটের নীচে আরও কয়েকটি উদাহরণ রয়েছে:

মন্তব্য

  • গ্রিড সবসময় একটি নিখুঁত আয়তক্ষেত্র হতে পারে এবং শুধুমাত্র একটি polyomino টালি উপস্থিত থাকবে nemo, marlinএবং bruce
  • আপনার পথটি টাইলের bruceযে কোনও ঘরের 4 টি সংলগ্ন (উপরে, নীচে, বাম এবং ডান) কোষের মধ্য দিয়ে যেতে হবে না bruce
  • এটা সবসময় নিশ্চিত করা হয় যে সেখান থেকে কমপক্ষে একটি বৈধ পথ হবে marlinথেকে nemo
  • এখানে সবচেয়ে ছোট পাথের প্রয়োজন নেই, তাই বাদাম যান!
  • যদিও আপনাকে সবচেয়ে ছোটতম পথটি খুঁজে পেতে হবে না, তবে পথের কোনও ঘর (মার্লিন বা নিমো সহ পাথ) পথের অন্য দুটি কোষের সাথে সংলগ্ন হতে পারে না।
  • পথটি marlinবা nemoটাইলগুলির মধ্য দিয়ে যাওয়া উচিত নয় , কারণ এটি কোনও দিক বাছাই করার ক্ষেত্রে ছোট্ট মাছগুলিকে বিভ্রান্ত করে।
  • যথারীতি আপনি STDIN (বা নিকটতম সমতুল্য), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন প্যারামিটারের মাধ্যমে ইনপুট নিয়ে এবং STDOUT (বা নিকটতম সমতুল্য), রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে আউটপুট উত্পাদন করে কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন।
  • যদি মাল্টি-লাইন ইনপুটটি সম্ভব না হয় তবে আপনি ধরে নিতে পারেন যে গ্রিডটি |পরিবর্তে অক্ষরটির সাথে যুক্ত হয়েছে \n। আপনি গ্রিড সারিগুলির একটি অ্যারে হিসাবে ইনপুটটিও নিতে পারেন।

এটি কোড গল্ফ তাই বাইটের মধ্যে সংক্ষিপ্ত এন্ট্রি জিতল।


পথটি কি মার্লিন (বা নিমো) দিয়ে যেতে পারে? উপরোক্ত সমাধানটি এখনও বৈধ হতে পারে যদি kউপরের lমার্লিনটি দৃশ্যমান হত? (মার্লিনে এন থেকে
নিমোতে

@ কেস্যাব আমি এর আগে মার্লিনকে বিভ্রান্ত করার মতো কোনও কথা বলব না :)
অপটিমাইজার

উত্তর:


4

মতলব 560

সমস্ত অপ্রয়োজনীয় স্পেস, সমস্ত সেমিকোলন এবং সমস্ত মন্তব্য মুছে ফেলার সময় 560 বাইট আরও বেশি গল্ফ করা যেতে পারে তবে আমি এখনই ক্লান্ত হয়ে পড়েছি (সম্ভবত আগামীকাল ...) সবাইকে শুভরাত্রি।

PS: আমি ধরে নিয়েছি যে পথটির অবশ্যই 4 টি পাড়া ('+') সংযুক্তি থাকতে হবে।

function c(A)
Z = [0,1,0;1,1,1;0,1,0];
Br = q('bruce');
Bn = conv2(Br,ones(3),'s')>0;
Ne = q('nemo');
Ma = q('marlin');
%construct path marlin to nemo
U=Ma>0;M=A*Inf;
M(U)=0;
for k=1:2*sum(size(A))%upper bound for path length
    %expand
    V=imdilate(U,Z);
    V(Bn)=0;
    M(V-U==1)=k;
    U=V;
    %disp(M)
end
%go back from nemo to marlin
Pr=reshape(1:numel(A),size(A));
[i,j]=find(Ne);
m=M(i(1),j(1));%value
P=A*0;%path image
P(i(1),j(1))=1;
for k=m:-1:1
    %find neighbour of (i(1),j(1)) with value m-1
    U=imdilate(P,Z);
    F = M==k;
    G = F&U;
    mask = Pr == min(Pr(F & U));
    P(mask)=1; 
end
A(~P & ~Ma & ~Ne)='.';
disp(A)



    function M = q(s)%find string in matrix, A ascii, M mask
        M = A*0;
        m=numel(s);
        N = M+1;%all neighbours
        for k=1:m;
            M(A==s(k) & N)=k;%only set the ones that were in the neighbourhood of last
            L=M==k;
            N=imdilate(L,Z);
        end
        for k=m:-1:2
            %set all that are not neighbour to next higher highest to zero
            L=M==k;
            N=imdilate(L,Z);
            M(M==k-1 & ~N)=0;
        end
    end


end

কলিং ফাংশন: (নতুন লাইনের প্রয়োজন নেই)

c(['oxknvvolacycxg',
'xmliuzsxpdzkpw',
'warukpyhcldlgu',
'tucpzymenmoyhk',
'qnvtbsalyfrlyn',
'cicjrucejhiaeb',
'bzqfnfwqtrzqbp',
'ywvjanjdtzcoyh',
'xsjeyemojwtyhi',
'mcefvugvqabqtt',
'oihfadeihvzakk',
'pjuicqduvnwscv']);

আউটপুট:

...n..........
.mli..........
.ar...........
..c...........
..v...........
..c...........
..q...........
..vjan........
.....emo......
..............
..............
..............

কিভাবে এটা কাজ করে

নাম তোলা হচ্ছে

প্রথম অংশটি নামগুলি বের করা হয় যেমন nemoফাংশন দ্বারা সম্পন্ন হয় q()। 0 হিসাবে ফাংশন প্রথম চিহ্ন সবকিছু, যেমন নামের তারপর occurences প্রথম চিঠি 1, তারপর দ্বিতীয় হিসাবে চিঠি 2যদি একটি 1আশেপাশে, তারপর তৃতীয় ইত্যাদি। এর পরে nemoকেবল এক হতে হবে 4। এটি থেকে আমরা পিছনে চলে যাই যতক্ষণ না আমরা 1আবার খুঁজে পেলাম এবং তারপরে অন্য সমস্ত সংখ্যা যেটি এর চেয়ে বেশি ছিল মুছুন, তাই আমরা অক্ষরগুলি nemoমুখোশযুক্ত একটি দুর্দান্ত মুখোশ ফিরে পাই । আমরা তিনটি নামের জন্য এটি করি এবং তারপরে কোনও পথ খুঁজে বের করতে এগিয়ে যেতে পারি।

পথ সন্ধান করছি

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

 2 1 1  0  1  2  3  4  5  6  7  8  9 10
 1 0 0  0  1  2  3  4  5  6  7  8  9 10
 1 0 0  1  2  3  4  5  6  7  8  9 10 11
 2 1 1  _  _  _  5  6  7  8  9 10 11 12
 3 2 2  _  _  _  _  _  _  9 10 11 12 13
 4 3 3  _  _  _  _  _  _ 10 11 12 13 14
 5 4 4  _  _  _  _  _  _ 11 12 13 14 15
 6 5 5  6  7  8  9 10 11 12 13 14 15 16
 7 6 6  7  8  9 10 11 12 13 14 15 16 17
 8 7 7  8  9 10 11 12 13 14 15 16 17 18
 9 8 8  9 10 11 12 13 14 15 16 17 18 19
10 9 9 10 11 12 13 14 15 16 17 18 19 20

এখন nemoপিক্সেল থেকে শুরু করুন এবং প্রতিটি পদক্ষেপে দূরত্বের কাউন্টারটি হ্রাস করুন এবং আমাদের পথে পরবর্তী নীচের দূরত্বের (সেই দূরত্বের মানচিত্র অনুসারে আমরা আগে গণনা করেছি) একটি প্রতিবেশী যুক্ত করুন।


3

পাইথন 2 - 658

সময় এবং স্মৃতি উভয়ই খুব অদক্ষ। নিদর্শনগুলি চিহ্নিত করার জন্য কাজটি পুনরাবৃত্ত ফাংশন এস এবং পথগুলি সন্ধান করার ফাংশনটি হ'ল সি, যা মূলত মারাত্মকভাবে অদক্ষ A * বাস্তবায়ন।

G=input().split('\n')
R=range
S=lambda g,x,y,s,B:[[(x,y)]+r for a,b in[(-1,0),(0,-1),(0,1),(1,0)]for r in S(g,x+a,y+b,s[1:],B)if B(x,y)and s[0]==g[y][x]]if s else[[]]
C=lambda l,N,B:[i for i in l if i[-1]in N]or C([i+[(i[-1][0]+c,i[-1][1]+d)]for i in l for c,d in [(-1,0),(0,-1),(0,1),(1,0)]if all(1<abs(i[-1][0]+c-a)or 1<abs(i[-1][1]+d-b)for a,b in B)],N,B)
X,Y=len(G[0]),len(G)
N,M,B=[filter(list,[S(G,s,t,e,lambda a,b:0<=a<X and 0<=b<Y and Y*(a-s)+b-t>=0)for s in R(X)for t in R(Y)])[0][0]for e in["nemo","marlin","bruce"]]
print'\n'.join(''.join(G[y][x]if(x,y)in N+M+min([C([[k]],N,B)[0]for k in M],key=lambda i:len(i))else'.'for x in R(X))for y in R(Y))

পরীক্ষার জন্য এটি (খুব সামান্য) কম গল্ফযুক্ত ব্যবহার করুন (যা প্রতিটি টাইলের পরিবর্তে একবারে পাথ গণনা করে)

G=input().split('\n')
R=range
S=lambda g,x,y,s,B:[[(x,y)]+r for a,b in[(-1,0),(0,-1),(0,1),(1,0)]for r in S(g,x+a,y+b,s[1:],B)if B(x,y)and s[0]==g[y][x]]if s else[[]]
C=lambda l,N,B:[i for i in l if i[-1]in N]or C([i+[(i[-1][0]+c,i[-1][1]+d)]for i in l for c,d in [(-1,0),(0,-1),(0,1),(1,0)]if all(1<abs(i[-1][0]+c-a)or 1<abs(i[-1][1]+d-b)for a,b in B)],N,B)
X,Y=len(G[0]),len(G)
N,M,B=[filter(list,[S(G,s,t,e,lambda a,b:0<=a<X and 0<=b<Y and Y*(a-s)+b-t>=0)for s in R(X)for t in R(Y)])[0][0]for e in["nemo","marlin","bruce"]]
s=N+M+min([C([[k]],N,B)[0]for k in M],key=lambda i:len(i))
print'\n'.join(''.join(G[y][x]if(x,y)in s else'.'for x in R(X))for y in R(Y))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.