একটি দাবাবোর্ড এড়ানো


23

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

কার্য

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

ইনপুট / আউটপুট

আপনি যেকোন যুক্তিসঙ্গত ফর্ম্যাটে ইনপুট নিতে পারেন এবং আপনি যে কোনও ফর্ম্যাটটিতে যা পছন্দ করেন তা আউটপুটও করতে পারেন। আপনার ইনপুট এবং আউটপুট অবশ্যই স্ব-সামঞ্জস্যপূর্ণ হতে হবে। যদি একাধিক টুকরা একই সংখ্যক চলরে গন্তব্যে পৌঁছে দিতে পারে তবে আপনাকে অবশ্যই সর্বনিম্ন পরিমাণে পেতে পারে এমন সমস্ত টুকরো আউটপুট করতে হবে। চারটি টুকরো এর কোনওটি যদি শেষ পর্যন্ত না তৈরি করতে পারে তবে যতক্ষণ না এটি অন্য সমস্ত সম্ভাব্য আউটপুট থেকে স্বতন্ত্র থাকে ততক্ষণ আপনি কিছু আউটপুট করতে পারেন। এর মধ্যে কিছুই আউটপুট বা ত্রুটি নিক্ষেপ অন্তর্ভুক্ত থাকতে পারে।

পরীক্ষার মামলা

একটি বর্গক্ষেত্র প্রারম্ভিক বিন্দু এবং একটি বৃত্ত সমাপ্তি বিন্দু নির্দেশ করে।


পরীক্ষা 1

বিশপ


পরীক্ষা 2

নাইট


পরীক্ষা 3

রাজা


পরীক্ষা 4

দাড়কাক


পরীক্ষা 5

কিং, নাইট


পরীক্ষা 6

না


খুশী হলাম। আমি এটি পছন্দ করি তবে একটি "স্বেচ্ছাসেবী আকারের এবং আকারের দাবাবোর্ড" একটি একক সত্তা না? উদাহরণস্বরূপ 2 এবং 6 এর সাথে কীভাবে খাপ খায় তা দেখতে পাচ্ছি না কারণ দেখে মনে হচ্ছে এগুলি দুটি পৃথক বোর্ড যার মধ্যে কেবল নাইটেরই লাফিয়ে উঠতে পারে। আমি কি কিছু মিস করছি?
এলপেড্রো

2
@ এলপিড্রো তারা এখনও একটি একক বোর্ড, এটি কেবল একটি ধারাবাহিক বোর্ড নয়। যথেচ্ছ আকারের অংশটি হ'ল বোর্ডগুলি অবিচ্ছিন্ন হতে পারে।
গম উইজার্ড

উদাহরণস্বরূপ 3, এটি "রাজা, রানী" হওয়া উচিত নয়?
ক্রিটসি লিথোস

ধন্যবাদ @ উষ্ণ। প্রশ্ন থেকে স্পষ্ট ছিল তা নিশ্চিত নই তবে আমি এখন বুঝতে পারি।
এলপেড্রো

2
@ ক্রিতিক্সিলিথোস জিনিসগুলি আকর্ষণীয় রাখতে কোনও রানী বা বন্ধক নেই।
গম উইজার্ড

উত্তর:


8

হাস্কেল , 447 439 437 432 বাইট

t=[1,2]
p=[(+),(-)]
f=filter
a=abs
(#)=elem
x?y=[min x y..max x y]
f&g=(\x->g x>>=f)
(b!1)(c,r)=f(#b)[(c!d,r#s)|(!)<-p,(#)<-p,d<-t,s<-t,d/=s]
(b!2)(c,r)=f(\(d,s)->(c==d&&all(#b)[(c,z)|z<-r?s])||r==s&&all(#b)[(z,r)|z<-c?d])b
(b!3)(c,r)=f(\(d,s)->a(c-d)==a(r-s)&&all(#b)(zip(c?d)$r?s))b
(b!4)(c,r)=f(\(d,s)->a(c-d)<2&&a(r-s)<2)b
(b%p)n s=[s]>>=foldr(&)(:[])(replicate n$b!p)
g b s e=head$f(not.null)[[p|p<-[1..4],e#(b%p)n s]|n<-[0..]]

g <board> <start> <end>যেখানে <board> :: [(Int, Int)], <start> :: (Int, Int)এবং ব্যবহার করে কল করুন <end> :: (Int, Int)1নাইটের 2জন্য রুকের জন্য একটি তালিকা উপস্থিত করে ,3 জন্য, বিশপ এবং 4কিংয়ের জন্য থাকা । যদি কোনও সমাধান না পাওয়া যায় তবে এটি ধারাবাহিকভাবে স্ট্যাকটিকে উপচে ফেলে (যে কোনও ত্রুটি নিক্ষেপ করা হিসাবে গণনা করা হচ্ছে, তাই না?)

মোনাডাস-এ এলএইএইচএর অধ্যায়গুলি থেকে নেওয়া অনুপ্রেরণা (%)কেবল একটি সাধারণীকরণ এবং গল্ফযুক্ত inMany, (&)সমতুল্য (Control.Monad.<=<)। অন্য সব কিছুই কম বেশি বা স্ব-ব্যাখ্যামূলক হওয়া উচিত।

এটি সম্ভবত আরও অনেক গল্ফ করা যেতে পারে তবে আমি আপাতত যথেষ্ট মজা পেয়েছি।

Ungolfed:

data Piece = Knight | Rook | Bishop | King deriving (Show)
type Place = (Int, Int)
type Board = [Place]

x `to` y = [min x y..max x y]

f <=< g = (\x -> g x >>= f)

moves
    :: Board    -- available spaces
    -> Piece    -- type of piece
    -> Place    -- starting place
    -> [Place]  -- places available in one move
moves b Knight (c,r) =
    filter (`elem` b) [(c!d, r#s) |
                       (!) <- [(+),(-)], (#) <- [(+),(-)],
                       d <- [1,2], s <- [1,2], d/=s]
moves b Rook   (c,r) =
    filter (\(d,s) -> (c == d && all (`elem` b) [(c,z) | z <- r `to` s])
                    || r == s && all (`elem` b) [(z,r) | z <- c `to` d]) b
moves b Bishop (c,r) =
    filter (\(d,s) -> abs(c-d) == abs(r-s)
                && all (`elem` b) (zip (c `to` d) (r `to` s))) b
moves b King   (c,r) =
    filter (\(d,s) -> abs(c-d) <= 1 && abs(r-s) <= 1) b

canGoIn
    :: Board    -- available spaces
    -> Piece    -- type of piece
    -> Int      -- number of moves
    -> Place    -- starting place
    -> [Place]  -- places available in the specified number of moves
canGoIn b p n s =
    return s >>= foldr (<=<) return (replicate n (moves b p))

quickestPieces
    :: Board    -- available spaces
    -> Place    -- starting place
    -> Place    -- ending place
    -> [Piece]  -- quickest pieces
quickestPieces b s e =
        head $ filter (not.null)
            [[p | p <- [Knight, Rook, Bishop, King], elem e (canGoIn b p n s)] |
                n<-[0..]]

ফাংশনাল প্রোগ্রামিংয়ের দুর্দান্ত ব্যবহার!
গম উইজার্ড

5

গণিত, 326 325 বাইট

বাইট সঞ্চয় দেখানোর জন্য মাস্টার x224 কে ধন্যবাদ!

f[g_,w_,x_]:=(c={{1,1},{-1,1}};s=c.c/2;e=#<->#2&@@@#&;j=Join;h=FindShortestPath;t=#~Tuples~2&;a@d_:=e@Select[t@g,#-#2&@@#==d&];y@k=j@@(a/@j[s,c]);y@n=j@@(a/@{{1,2},{2,1},{-2,1},{-1,2}});v=Flatten[e@t@#&/@ConnectedComponents@a@#&/@#]&;y@r=v@s;y@b=v@c;Pick[p={b,k,n,r},z=Length[h[y@#,w,x]/.h@__->0]&/@p,Min[z~Complement~{0}]]);

fতিনটি আর্গুমেন্ট গ্রহণ করে একটি ফাংশন সংজ্ঞায়িত করা হয় : gবোর্ডের প্রতিনিধিত্বকারী অর্ডারযুক্ত জোড়গুলির তালিকা wএবং xশুরুর এবং শেষের স্কোয়ারগুলি উপস্থাপন করে অর্ডার করা জোড়গুলির তালিকা। আউটপুট হ'ল {b, k, n, r}(যথাক্রমে বিশপ, কিং, নাইট এবং দালাল প্রতিনিধিত্ব করে) এর উপসেট যা দুটি স্কোয়ারের মধ্যে ন্যূনতম-চলনীয় পথ রয়েছে। উদাহরণস্বরূপ, তৃতীয় পরীক্ষার কেসটি চাওয়া হয় f[{{0, 0}, {1, 1}, {1, 2}, {0, 3}}, {0, 0}, {0, 3}]এবং ফিরে আসে{k} ; গত দুই পরীক্ষার বিষয় আসতে {k, n}এবং {}যথাক্রমে।

কৌশলটি হ'ল বোর্ডের স্কোয়ারগুলি একটি গ্রাফের শীর্ষে অনুবাদ করা, যেখানে প্রতিটি পিসের চাল দ্বারা প্রান্তগুলি নির্ধারিত হয় এবং তারপরে অন্তর্নির্মিত গ্রাফ রুটিন ব্যবহার করা হয়।

কোডটির আরও ব্যবহারকারী-বান্ধব সংস্করণ:

 1  f[g_, w_, x_] := ( c = {{1, 1}, {-1, 1}}; s = c.c/2;
 2    e = # <-> #2 & @@@ # &; j = Join; h = FindShortestPath; t = #~Tuples~2 &; 
 3    a@d_ := e@Select[t@g, # - #2 & @@ # == d &]; 
 4    y@k = j @@ (a /@ j[s, c]); 
 5    y@n = j @@ (a /@ {{1, 2}, {2, 1}, {-2, 1}, {-1, 2}}); 
 6    v = Flatten[e@t@# & /@
 7         ConnectedComponents@a@# & /@ #] &;
 8    y@r = v@s; y@b = v@c; 
 9    Pick[p = {b, k, n, r}, 
10      z = Length[h[y@#, w, x] /. h@__ -> 0] & /@ p, 
11      Min[z~Complement~{0}]]
12  );

লাইন 3-তে, Select[g~Tuples~2, # - #2 & @@ # == dসমস্ত অর্ডিকৃত জোড়গুলি মিলিয়ে খুঁজে নিন যার পার্থক্য ভেক্টর d; eতারপরে এ জাতীয় প্রতিটি আদেশযুক্ত জুটিকে একটি অনির্দেশিত গ্রাফ প্রান্তে রূপান্তর করে। সুতরাং aএকটি ফাংশন যা একটি নির্দিষ্ট ভেক্টর দ্বারা পৃথক যে সমস্ত অনুভূমিকের মধ্যে প্রান্ত তৈরি করে।

অর্থাৎ সংজ্ঞায়িত করতে যথেষ্ট লাইন 4 এবং 5, রাজার গ্রাফে y@k(যা ভেক্টর দ্বারা উত্পন্ন প্রান্ত ইউনিয়ন লাগে {1, 1}, {-1, 1}, {0, 1}, এবং {-1, 0}) এবং নাইট এর গ্রাফ y@n(যা সঙ্গে একই কাজ করে {1, 2}, {2, 1}, {-2, 1}, এবং {-1, 2})।

লাইন ConnectedComponents@a@#In-এ, এই প্রতিবেশী গ্রাফগুলির মধ্যে একটি নেয় এবং তার সংযুক্ত উপাদানগুলি আবিষ্কার করে; এটি প্রদত্ত দিকের সমস্ত লাইন বিভাগের বিভাজনকে গোষ্ঠীবদ্ধ করার সাথে মিলে যায় (যাতে কোনও দালাল বা বিশপ তাদের মধ্য দিয়ে একের পর এক চলতে না পারে)। তারপরে e@t@#line লাইনে একই সংযুক্ত উপাদানটিতে প্রতিটি জোড় বিভাজনের মধ্যে প্রান্ত স্থাপন করা হয়েছে, যা পরে Flattenএকক গ্রাফে রূপান্তরিত হয়। সুতরাং 6 থেকে 8 এর মধ্যে লাইনগুলি রুকের গ্রাফ y@rএবং বিশপের গ্রাফটি সংজ্ঞায়িত করে y@b

পরিশেষে, 9 থেকে 11 পর্যন্ত রেখাগুলি {b, k, n, r}দুটি টার্গেটের শীর্ষকোষের মধ্যে সংক্ষিপ্ততম পথের ফলন দেয়। FindShortestPathকোনও ত্রুটি নিক্ষেপ করবে এবং গ্রাফের মধ্যে যদি কোনও টার্গেট ভারটেক্স উপস্থিত না হয় (তবে কোন প্রান্তটি এটি থেকে প্রবাহিত না হলে ঘটবে), তাই আমরা পরিবর্তে সেই ক্ষেত্রে h@__ -> 0ফিরে আসব use 0এবং বৈধ প্রান্তের মধ্যে কোনও পাথের অভাব দৈর্ঘ্যের একটি তালিকা ফেরত দেয় 0, তাই Min[z~Complement~{0}]উপরের খারাপ ক্ষেত্রে উপেক্ষা করে প্রকৃতপক্ষে থাকা সবচেয়ে ছোট পাথের দৈর্ঘ্য গণনা করে।


ফাংশন নামে ডাবল চ জন্য কোন কারণ? নাকি এটি গণিতের সীমা?
মাস্টারএক্স 244

ওহ, হাহা, না এটি আমার পক্ষ থেকে একটি মানসিক সীমা :) fএই সেশনে আমার ইতিমধ্যে ছিল, তবে জমা দেওয়ার আগে আমার এটি পরিবর্তন করা উচিত ছিল!
গ্রেগ মার্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.