দ্বীপ গল্ফ # 1: বৃত্তাকার


43

এটি দ্বীপ গল্ফ চ্যালেঞ্জের সিরিজের মধ্যে প্রথম। পরবর্তী প্রতিযোগিতা

এএসসিআইআই-আর্টে একটি দ্বীপ দেওয়া, এটি অবরুদ্ধ করার জন্য একটি সর্বোত্তম পথ আউটপুট করুন।

ইনপুট

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

...........
...##......
..#####....
..#######..
.#########.
...#######.
...#####.#.
....####...
...........

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

....
.#..
..#.
....

আউটপুট

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

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

.ooooo.....
o..##.oo...
o.#####.o..
o.#######o.
o#########o
ooo#######o
..o#####.#o
..oo####..o
....oooooo.

একটি প্রদক্ষিণের দৈর্ঘ্য নিম্নরূপে গণনা করা হয়: পথে প্রতিটি সংলগ্ন টাইলসের জন্য, যদি তারা অনুভূমিকভাবে বা উল্লম্বভাবে সংযুক্ত থাকে তবে 1 যুক্ত করুন; যদি তারা তির্যকভাবে সংযুক্ত থাকে তবে √2 যুক্ত করুন। উপরের পাথের দৈর্ঘ্য 22 + 7√2 (31.9 ডলার)।

একটি সংক্ষিপ্ত পরিবাহী হ'ল সংক্ষিপ্ততম দৈর্ঘ্য সহ একটি পরিবাহী স্থান। আপনার শর্তটি সন্তুষ্ট করে এমন কোনও একটি পথ আপনার প্রোগ্রামকে আউটপুট করা উচিত। বেশিরভাগ দ্বীপপুঞ্জের জন্য একাধিক সম্ভাব্য সমাধান থাকবে। উপরের দ্বীপের জন্য এখানে একটি সমাধান রয়েছে যার দৈর্ঘ্য 10 + 13-22 (≈ 28.4) রয়েছে:

...oo......
..o##oo....
.o#####oo..
.o#######o.
o#########o
.o.#######o
..o#####.#o
...o####.o.
....ooooo..

বিস্তারিত

আপনার সমাধানটি একটি সম্পূর্ণ প্রোগ্রাম বা কোনও ফাংশন হতে পারে । কোনও ডিফল্ট ইনপুট এবং আউটপুট পদ্ধতি গ্রহণযোগ্য।

আপনার ইনপুট এবং আউটপুট একাধিক স্ট্রিং বা স্ট্রিংয়ের তালিকা হতে পারে। যদি আপনার ভাষাতে একক-অক্ষরযুক্ত স্ট্রিং থেকে আলাদা আলাদা আলাদা অক্ষর থাকে তবে আপনি আগের বাক্যে "স্ট্রিং" এর জন্য "অক্ষরের তালিকা" প্রতিস্থাপন করতে পারেন। আপনার ভাষার যদি গ্রিডের উচ্চতা এবং / অথবা প্রস্থের ইনপুট দরকার হয় তবে আপনি এটি করতে পারেন। আপনার আউটপুটে (allyচ্ছিকভাবে) একক ট্রেলিং নিউলাইন থাকতে পারে। উপরে উল্লিখিত হিসাবে, আপনি জায়গায় তিনটি স্বতন্ত্র অক্ষর ব্যবহার করতে পারেন #.o(আপনি কোন অক্ষর ব্যবহার করছেন তা দয়া করে আপনার জমা দেওয়ার ক্ষেত্রে উল্লেখ করুন)।

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

উ: দ্বীপপুঞ্জের অনন্য সংক্ষিপ্ত পরিসর নিয়ে:

...
.#.
...

.o.
o#o
.o.

......
.####.
......

.oooo.
o####o
.oooo.

......
......
..##..
...#..
......
......

......
..oo..
.o##o.
..o#o.
...o..
......

.......
.#####.
...#...
...#...
.#####.
.......

.ooooo.
o#####o
o..#..o
o..#..o
o#####o
.ooooo.

.......
...#...
...#...
.#####.
...#...
...#...
.......

...o...
..o#o..
.o.#.o.
o#####o
.o.#.o.
..o#o..
...o...

.......
.#####.
.##..#.
..#..#.
.......

.ooooo.
o#####o
o##..#o
.o#..#o
..oooo.

খ। একাধিক সম্ভাব্য সমাধান সহ একটি দ্বীপের উদাহরণ:

........
....##..
...####.
..###...
.#####..
.#####..
..##....
........

সম্ভাব্য আউটপুট:

....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##oo..
..oo....

....oo..
...o##o.
..o####o
.o###.o.
o#####o.
o#####o.
.o##.o..
..ooo...

....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##oo..
..oo....

....oo..
...o##o.
..o####o
.o###..o
o#####.o
o#####o.
.o##.o..
..ooo...

সি একটি সারকথা মত বৃহৎ পরীক্ষা ক্ষেত্রে


এটি : প্রতিটি ভাষার মধ্যে সংক্ষিপ্ততম কোড জিততে পারে।


1
তৃতীয় পরীক্ষার মামলার সংক্ষিপ্ততম অবরুদ্ধকরণটি কনওয়ের গেম অফ লাইফের 'রুটি' প্যাটার্ন!
কমরেড স্পার্কলপনি

উত্তর:


18

ম্যাথমেটিকা ​​(সংস্করণ 9), 165 বাইট

ConvexHullMeshগ্রেগ মার্টিন যে চমৎকার, সংক্ষিপ্ত ফাংশনটি ব্যবহার করেছিলেন তা কেবল গণিত 10 সংস্করণে প্রবর্তিত হয়েছিল, তাই আমি ভেবেছিলাম আমার প্রাচীন গাণিতিক সংস্করণ 9 ব্যবহার করে এটি ব্যতীত চেষ্টা করবো, যদিও আমি এটি সামান্য খাটো করে নিতে পেরেছি, যদিও! এটা একটা ফাংশন যা লাগে এবং স্ট্রিং একটি তালিকা ফেরৎ এর (সঙ্গে ., #এবং oচিহ্ন হিসাবে)।

""<>#&/@("o"MorphologicalTransform[MorphologicalComponents[#,Method->"ConvexHull"],Max[#(1-#[[2,2]])CrossMatrix@1]&]+"#"#/.{0->"."})&[Characters@#/.{"."->0,"#"->1}]&

ব্যাখ্যা:

  • প্রথমে Characters@# /. {"."->0, "#"->1}ইনপুটটিকে 0এস এবং 1এস এর ম্যাট্রিক্সে রূপান্তরিত করে ।
  • "o"MorphologicalTransform[MorphologicalComponents[#,Method->"ConvexHull"],Max[#(1-#[[2,2]])CrossMatrix@1]&]+"#"#তারপরে ম্যাথমেটিকার শক্তিশালী (তবে অত্যন্ত বাইট-ভারী…) চিত্র প্রসেসিং ক্ষমতা ব্যবহার করে প্রথমে দ্বীপের উত্তল হোলটি পূরণ করুন (এটির আকারটি যা আপনি যদি তার চারপাশে স্ট্রিংয়ের টুকরো প্রসারিত করেন তবে) এবং তার সীমানাটি নিয়ে যান। এরপরে আমরা এই ম্যাট্রিক্সকে স্ট্রিং দ্বারা গুণিত "o"করতে 0s এবং "o"s এর একটি ম্যাট্রিক্স পেতে পারি (প্রকার সম্পর্কে ম্যাথামেটিকার চিত্তাকর্ষক অভিযোজনযোগ্যতার জন্য ধন্যবাদ), এবং "#"এটি দ্বীপের ম্যাট্রিক্সের বারের সাথে যুক্ত করব।
  • অবশেষে, ""<>#& /@ (... /. {0->"."})এই ম্যাট্রিক্স সক্রিয় "o", এস "#"এস এবং 0একটি ম্যাট্রিক্স মধ্যে গুলি "o"এস, "#"এস এবং "."s, এবং একটি স্ট্রিং মধ্যে প্রতিটি সারির যোগদান করে।

আমরা উদাহরণস্বরূপ বি এ এটি পরীক্ষা করি , আমরা আউটপুট পাই

{"....oo..",
 "...o##o.",
 "..o####o",
 ".o###..o",
 "o#####o.",
 "o#####o.",
 ".o##oo..",
 "..oo...."}

[সম্পাদনা করুন, গ্রেগ মার্টিনকে ধন্যবাদ:] যদি আমাদের স্ট্রিংয়ের তালিকার পরিবর্তে অক্ষরের অ্যারে ব্যবহারের অনুমতি দেওয়া হয় তবে আমরা এটিকে 144 বাইটে ছাঁটাই করতে পারি:

"o"MorphologicalTransform[MorphologicalComponents[#,Method->"ConvexHull"],Max[#(1-#[[2,2]])CrossMatrix@1]&]+"#"#/.{0->"."}&[#/.{"."->0,"#"->1}]&

1
সুন্দরভাবে সম্পন্ন! আমি কখনই জানতাম না MorphologicalComponents[#, Method->"ConvexHull"] :) আপনি ইনপুটটি ইতিমধ্যে অক্ষরগুলিতে বিভক্ত হয়ে আছে তা ধরে রেখে এবং আরও 2 ডি অক্ষরের অক্ষর ফিরে দিয়ে আপনি আরও বেশি বাইট সংরক্ষণ করতে পারেন।
গ্রেগ মার্টিন

@ গ্রেগমার্টিন, আমি MorphologicalComponentsআজকের আগ পর্যন্ত এর ব্যবহার সম্পর্কে জানতাম না !
কোনও গাছ নয়

গাণিতিক নবজাতক এখানে: আমি কিভাবে এই ফাংশন কল করা উচিত? আমি চেষ্টা করেছি f[{"...",".#.","..."}]এবং কিছু ত্রুটি পেয়েছি।
DLosc

@ ডিএলকাস, ফাংশনটি পুরো জিনিস, কেবল নয় f। (ভাল, কঠোরভাবে এটি সেমিকোলনের পরে স্টাফ বলছি)) ফাংশনটি কল করতে, পুরো জিনিসটি একটি গাণিতিক উইন্ডোতে টাইপ করুন, তারপরে [, আপনার ইনপুট এবং ], যাতে এটি দেখতে কিছুটা f@m_:=m(1-m[[2,2]]) . . . #/.{"."->0,"#"->1}]&[{"...", ".#.", "..."}](স্পেসের জন্য সংক্ষিপ্ত) হওয়া উচিত ।
একটি গাছ নয়

@ ডিএলকস ওয়েল, কারণ কোডটি নষ্ট হয়ে গেছে। আমি মনে করি আমি এখনই এটি স্থির করেছি, যদিও! (সেখানে কী ঘটেছে সে সম্পর্কে আমার কোনও ধারণা নেই; দুঃখিত ...)
একটি গাছ নয়

11

(তবে নোটাত্রির সমাধানটি উত্সাহিত করুন , এটি আরও ভাল!)

গণিত, 168 বাইট

(x_~n~y_:=Min[Norm[x-#]&/@y];i=#;p=i~Position~#&;t=p["#"|"."]~Select~#&;(i~Part~##="o")&@@@t[#~n~t[ConvexHullMesh[Join[s=p@"#",#+{.1,.1}&/@s]]~RegionMember~#&]==1&];i)&

খাঁটি ফাংশন একটি 2D অ্যারে অক্ষরের ইনপুট হিসাবে গ্রহণ করে এবং 2D অক্ষরের অক্ষর প্রদান করে। সহজেই পঠনযোগ্য সংস্করণ:

1  (x_~n~y_ := Min[Norm[x - #] & /@ y];
2  i = #; p = i~Position~# &; 
3  t = p["#" | "."]~Select~# &;
4  (i~Part~## = "o") & @@@ 
5    t[#~n~
6      t[ConvexHullMesh[
7        Join[s = p@"#", # + {.1, .1} & /@ s]]
8      ~RegionMember~# &] == 1 &];
9  i) &

লাইন 1 এমন একটি ফাংশন সংজ্ঞায়িত nকরে xযা বিমানের বিন্দু এবং yঅন্যান্য পয়েন্টগুলির একটি সেটের মধ্যে (সবচেয়ে ছোট) দূরত্ব তৈরি করে । লাইন 2 iতড়িৎটিকে ইনপুটটিতে আরম্ভ করে , উভয়ই পরে কার্পিংয়ের অস্পষ্টতাকে সমাধান করতে এবং পরিণতিতে আউটপুট উত্পাদন করতে এটি পরিবর্তন করতে সক্ষম হয়; লাইন 2 এছাড়াও একটি ফাংশন সংজ্ঞায়িত করে pযা এর ইনপুটটির সমস্ত উপস্থিতির সমন্বয়গুলি প্রদান করে i

লাইন 3-এ, p["#" | "."]ইনপুট মানচিত্র থেকে প্রতিটি একক স্থানাঙ্ককে উপস্থাপন করে (যেহেতু এর সমস্ত অক্ষর হয় "#"বা হয় "."), তবে tএমন একটি ফাংশন যা কেবলমাত্র স্থানাঙ্কগুলি নির্বাচন করে যা একটি অনির্ধারিত সম্পত্তি সন্তুষ্ট করে। লাইন 4 এ, চরিত্রটির i~Part~## = "o"একগুচ্ছ এন্ট্রি পরিবর্তন iকরতে চলেছে "o"; এই অক্ষরগুলি 5-8 লাইনের স্টাফ অনুযায়ী সম্ভাব্য স্থানাঙ্কগুলির সেট থেকে নির্বাচন করা হবে। এবং লাইন 9 কেবল উত্তরটি গণনা করা মাত্র ফেরত দেয়।

ঠিক আছে, অবকাঠামো শেষ, এখন আসল গণনা। ConvexHullMeshসেটগুলি পয়েন্টের উত্তল হলের গণনার জন্য ম্যাথামেটিকার অন্তর্নির্মিত (সেই বিন্দুগুলির মধ্যে ক্ষুদ্রতম উত্তল বহুভুজ)। নৈতিকভাবে বলতে গেলে, এই দ্বীপটির কোভ এবং ফিজর্ডগুলি (যা s = p@"#") এটি "পূরণ" করা উচিত , তাদেরকে আমাদের সিক্রিমনেজেশন থেকে বাদ দিতে rule ConvexHullMeshসেই বিন্দুগুলির সেটটি যখন একটি লাইনে থাকে তখন একটি সমস্যা আছে thank (আপনাকে ধন্যবাদ, পরীক্ষার ক্ষেত্রে # 2), যা আমরা sline. লাইনে নিজেই একটি সামান্য অফসেট সংস্করণ যুক্ত করে সমাধান করি This এই আউটপুটটি একটি বহুভুজ, সুতরাং লাইন 7 -9 (t[...~RegionMember~# &]) সেই বহুভুজের পূর্ণসংখ্যা সমন্বয় সহ পয়েন্টগুলির একটি তালিকা তৈরি করে। অবশেষে, লাইন 5 এবং 9 তম লাইনটির সমাপ্তি বিন্দুর এই সেট থেকে ঠিক 1 (সুতরাং 0 নয়) দূরত্বে থাকা সমস্ত পয়েন্ট গণনা করুন; সে সেটটি চলাচলকারী পথে পরিণত হয়।

নীচে ওপি'র লিঙ্কে বড় পরীক্ষার কেসটির আউটপুট দেওয়া আছে। উপরের বাম দিকে লক্ষ্য করুন, কখন পশ্চিম দিকে বনাম দক্ষিণ-পশ্চিমের ইঙ্গিতটি দেওয়া যায় তা অস্বীকার করে যে এটি দুটি উপদ্বীপের মধ্যে 2াল -২/৩ এর একটি অদৃশ্য রেখা ছায়া দিচ্ছে (রেখার অংশটি উত্তল হলের সীমানার অংশ বলেছে)।

........................
.............o..........
...........oo#ooooooo...
..........o#.#.##...#o..
........oo.#.#.###.##o..
.......o..########.##o..
.....oo...############o.
...oo#....############o.
..o#.###.##############o
.o##.##################o
.o####################o.
.o.##################.o.
.o##################..o.
.o..################..o.
o###################..o.
o#####################o.
o.##################.o..
o####################o..
o#...##############.o...
o##...#############o....
o#.....###....#oooo.....
.oooooo#ooooooo.........
.......o................

ম্যাথমেটিকা ​​সাধারণত স্ট্রিংগুলিকে 1 ডি বর্ণচিহ্ন হিসাবে উপস্থাপন করে? যদি তা না হয় তবে তার পরিবর্তে আপনাকে 1D টি অ্যারের স্ট্রিং নেওয়া / ফিরিয়ে দিতে হবে। (এছাড়াও, ব্যাখ্যার অপেক্ষায়
রয়েছি

গাণিতিকের একটি স্ট্রিং ডেটা টাইপ থাকে তবে মনে হয় যে এই সাইটের উদ্দেশ্যগুলির জন্য অক্ষরের একটি অ্যারেও বৈধ PP হ্যাঁ, দুর্ভাগ্যক্রমে, ম্যাথমেটিকা ​​অ-মুক্ত এবং এইভাবে অনেকের কাছে এটি অ্যাক্সেসযোগ্য নয় :(
গ্রেগ মার্টিন

1
@ গ্রেগমার্টিন আমি সর্বদা স্যান্ডবক্স.ওপেন.ওলফ্রামক্লাউড.কম
ovs

বর্তমান sensক্যমত্য বলছে যে একক-অক্ষরযুক্ত স্ট্রিংয়ের তালিকা স্ট্রিংয়ের জায়গায় ব্যবহার করা যাবে না। আমি যতদূর বলতে পারি, গাণিতিকের "চরিত্রগুলি" পাইথনের মতোই কেবল একক-চরিত্রের স্ট্রিং। জাভার মতো ভাষায় পরিস্থিতি আলাদা, যার আলাদা charধরন রয়েছে; সেই ক্ষেত্রে, একটি charঅ্যারের একটি স্ট্রিং স্থানে ব্যবহার করা যেতে পারে।
DLosc

1
আমি এটি কীভাবে পড়লাম তা এখানে: মূল উত্সাহিত উত্তরটি 2014 সালে পোস্ট করা হয়েছিল I পূর্ববর্তী উত্তরের অস্পষ্টতাটি স্পষ্ট করার প্রয়াস হিসাবে আমি যে উত্তরটি যুক্ত করেছি তা 2016 সালে পোস্ট করা হয়েছিল। সুতরাং আমি নতুন উত্তরে নেতিবাচক স্কোরটি পড়ি কারণ লোকেরা বলেছিল, "না, আমরা পুরানো উত্তরটি বোঝাতে চাই না যে সিঙ্গল-চর স্ট্রিংগুলির তালিকা ঠিক আছে।" তবে মেটা নির্বিশেষে, আমি এই প্রশ্নে একক-চর স্ট্রিংগুলির তালিকাটি অস্বীকার করছি (এবং আমি এটি প্রতিফলিত করার জন্য শব্দটি পরিষ্কার করেছি)।
DLosc

10

পাইথন 3, 779 বাইট (ট্যাবগুলি সহ অন্তর্ভুক্ত করা)

এটি পুরো প্রোগ্রাম। এটি স্টিডিন থেকে ইনপুট পড়ে এবং স্টাডাউটে প্রিন্ট করে। স্টিডিনকে অবশ্যই ইওএফ দিয়ে শেষ করতে হবে। উদাহরণটি বড় ইনপুট দিয়ে চালানো হয়: https://ideone.com/XIfYY0

import itertools,sys
L=list
C=itertools.count
d=L(map(L,filter(None,sys.stdin.read().split('\n'))))
X=len(d[0])
Y=len(d)
R=range
def P(r):return all(d[y][x]=='.'for x,y in r)
def S(f):
    for n in C(0):
        if P(f(n)):l=n
        else:break
    for n in C(l+1):
        if P(f(n)):return l,n
def f(V,a,*b):return L(eval('lambda '+a+':('+i+')',V)for i in b)
V=locals()
def D(n):
    y=min(n,Y-1);x=n-y
    while y>=0and x<X:yield(x,y);x+=1;y-=1
def E(n):
    x=max(0,n-Y);y=x+Y-n
    while y<Y and x<X:yield(x,y);x+=1;y+=1
F=f(V,'p','(p,y)for y in R(0,Y)','(x,p)for x in R(0,X)')+[D,E]
r=f(V,'x,y','x','y','x+y','x-y+Y')
B=L(map(S,F))
for x in R(0,X):
    for y in R(0,Y):
        z=L(zip(r,B))
        if all(g(x,y)in R(a,b+1)for g,(a,b)in z)and any(g(x,y)in e for g,e in z):d[y][x]='o'
print('\n'.join(''.join(x)for x in d))

ধারণাটি সহজ: এটি ক্ষুদ্রতম অষ্টভুজ সীমাকে গণনা করে এবং এমন সমস্ত ঘর আঁকতে থাকে যাগুলি সমস্ত গণিত সীমানার ভিতরে থাকে এবং কমপক্ষে একটি প্রান্তকে ছেদ করে।


1
আপনাকে সত্যই sys.stdinইনপুট হিসাবে ব্যবহার করার দরকার নেই । input(), মাল্টলাইন পেয়ে কাজটি করতে হবে এবং কম বাইট ব্যয় করতে হবে
ডেড পসসাম

2
প্রতিস্থাপন করতে সক্ষম হতে পারে R(0,x)সঙ্গেR(x)
ceilingcat

বিল্ট-ইন ব্যবহার না করার জন্য +1।
রবার্ট ফ্রেজার

1
নিস! আরও কিছু গল্ফিং টিপস: সংজ্ঞায়িত করার জন্য ল্যাম্বডাস ব্যবহার করে প্রতি 5 টি বাইট সংরক্ষণ করুন Pএবং f; L(generator expression)=> [generator expression]; F, rএবং Bএকবার মাত্র একবার ব্যবহার করা হবে বলে মনে হয় এবং এভাবে ইনলাইন করা যায়।
ডিএলসাস

8

জাভাস্ক্রিপ্ট (ES6), 369 343 বাইট

f=s=>(a=s.split`
`.map(s=>[...s]),m=Array(8),a.map((b,i)=>b.map((c,j)=>c>'#'||[i-j,i,j+i,j,j-i,-i,-i-j,-j].map((d,k)=>d>m[k]||(m[k]=d-1)))),[o,p,q,r,t,u,v,w]=m,g=(i,j,k,l,...p)=>i-k|j-l?a[i][j]=g(i+(k>i)-(k<i),j+(l>j)-(l<j),k,l,...p):1/p[0]?g(k,l,...p):'o',g(p,p-o,p,q-p,q-r,r,r-t,r,-u,t-u,-u,u-v,w-v,-w,o-w,-w,p,p-o),a.map(b=>b.join``).join`
`)

ব্যাখ্যা: স্ট্রিংটি একটি অক্ষর অ্যারেতে বিভক্ত হয় (অক্ষরের অ্যারে ইনপুট গ্রহণযোগ্য কিনা তা সম্পর্কে আমি অস্পষ্ট)। অ্যারেটি পুনরায় পুনরুক্ত করা হয় এবং সমস্ত স্থলভাগের অবস্থানগুলি অবস্থিত। সমীকরণ কর্তৃক প্রদত্ত সীমান্ত রেখা x - y = o, x = p, x + y = q, y = r, y - x = t, -x = u, -x - y = v, -y = wযেমন নির্ধারিত হয় যে সর্বাধিক সম্ভব প্যারামিটার নির্বাচিত লাইন অতিক্রম করিয়া যেখানে সব জমি মিথ্যা। এটি অষ্টভুজে দ্বীপটি ঘিরে রাখার প্রভাব ফেলে। অষ্টকোনার কোণগুলির স্থানাঙ্কগুলি প্যারামিটারগুলি থেকে সহজেই গণনা করা হয় এবং এর প্রান্তের কোষগুলি পূরণ করা হয় then অ্যারেটি আবার একটি স্ট্রিংয়ে যোগ হয়। অষ্টভুজটির যথেষ্ট কারণ নিম্নরূপ:

   /o#     /o#     /o#
 |/o #   |/o #   |/ o#
 *o###   * o #   *  o#
/|o #   /|o #   /| o#
 |o#     |o#     |o#

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


´ ... p´ কি করে?
রবার্ট ফ্রেজার

@ রবার্টফ্রেজার প্রযুক্তিগত নাম অ্যারে ডেস্ট্রাকচারিং। তবে এই ক্ষেত্রে এটি কেবলমাত্র rest of argumentsপ্যারামিটার হিসাবে কাজ করে ।
নিল

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

@ ব্রায়ানএমসিচাটন আপনি ঠিক বলেছেন, আমি স্প্রেড অপারেটর বলতে চাইছিলাম, তবে যেভাবেই হোক যুক্তি তালিকায় ধ্বংসাত্মক কাজ রয়েছে।
নিল

6

পাইথন 3.5, 224, 263, 234 218 বাইট

নেস্টেড ফাংশন থেকে মুক্তি পেয়ে ওয়ান-লাইনার তৈরি করে আরও 16 বাইট গল্ফ করে।

def h(s,k=0,i=0):w=s.find('\n')+1;x=s.find('X')-w;k=k or x;d=[1,w+1,w,w-1,-1,-w-1,-w,-w+1]*2;u=s[:k]+'o'+s[k+1:];return['X'>s[k]and i<8and(h(u,k+d[i+2],i+2)or h(u,k+d[i+1],i+1)or h(u,k+d[i],i))or'',s][s[k]>'X'and k==x]

29 বাইট বন্ধ গল্ফ:

def f(s):
 w=s.find('\n')+1;x=s.find('X')-w;d=[1,w+1,w,w-1,-1,-w-1,-w,-w+1]*2
 def h(s,k,i):u=s[:k]+'o'+s[k+1:];return['X'>s[k]and i<8and(h(u,k+d[i+2],i+2)or h(u,k+d[i+1],i+1)or h(u,k+d[i],i))or'',s][s[k]>'X'and k==x]
 return h(s,x,0)

ইনপুট একটি একক স্ট্রিং যা সমুদ্রের জন্য '~', জমির জন্য 'এক্স' এবং সীমানার জন্য 'ও' ব্যবহার করে। ('এক্স' ব্যবহার করা '==' এর পরিবর্তে '>' এর জন্য একটি বাইট সংরক্ষণ করে)

মন্তব্য সহ কম গল্ফ সংস্করণ:

def f(s):
    w=s.find('\n')+1                         # width of one row
    x=s.find('X')-w                          # starting point
    d=[1,w+1,w,w-1,-1,-w-1,-w,-w+1]*2        # delta to add to current index to move in 
                                             # the 8 directions: E, SE, S, SW, W, NW, 
                                             # N, NE. Make it long to avoid
                                             # lots of modulo operations in 
                                             #    the recursive calls

    def h(s,k,i):                            # s is the island string, k the current
                                             # position, i the direction index
        if s[k]>'X'and k==x:                 # if back at the begining,
            return s                         #   return the map

        elif 'X'>s[k] and i<8:               # if there is water here, and haven't
                                             #  looped around,
            u=s[:k]+'o'+s[k+1:]              #  make a new map with an 'o' in the 
                                             #  current spot

            r = h(u,k+d[i+2],i+2)            # try a 90 degree right turn
            if r: return r

            r = h(u,k+d[i+1],i+1)            # try a 45 degree turn
            if r: return r

            r= h(u,k+d[i],i)                 # try straight ahead
            if r: return r

        return ''                            # this path failed

    return h(s,x,0)

@ ডিএলকস ঠিক করা হয়েছে। (আমি কি পুরানো উত্তরটি মুছতে পারি?)
রুট টু

নিস! (হ্যাঁ, আপনার পুরানো উত্তরটি সরিয়ে দেওয়া উচিত - যদি কেউ এটি দেখতে চায় তবে তারা পোস্টটির পুনর্বিবেচনার ইতিহাসটি দেখতে পারেন))
DLosc

5

সি # 7 - 414 369 327 বাইট

সম্পাদনা : 1D looping যাও সুইচ কম্পিউটিং iএবং jফ্লাইটে যেতে

সম্পাদনা করুন : ইনপুট পদ্ধতিটি পরিবর্তিত হয়েছে, সন্ধানের টেবিল ধসে গেছে এবং ভালভাবে সংজ্ঞায়িত প্রাথমিক সীমানায় স্যুইচ হয়েছে ... এবং লুপের জন্য শেষ বাইরের ফাঁকা স্থান সরিয়েছে

using C=System.Console;class P{static void Main(){var D=C.In.ReadToEnd().Replace("\r","");int W=D.IndexOf('\n')+1,H=D.Length,z=H,k,q,c;int P()=>z%W*(k%3-1)+z/W*(k/3-1)+H;var B=new int[9];for(;z-->0;)for(k=9;k-->0&D[z]%7<1;)if(B[k]<=P())B[k]=P()+1;for(;++z<H;C.Write(q>9?'o':D[z]))for(q=k=9;k-->0;)q*=(c=P()-B[k])>0?0:c<0?1:2;}}

এটি অনলাইন চেষ্টা করুন

সম্পূর্ণ প্রোগ্রাম, মান মধ্যে ইনপুট লাগে, মান আউট এটা ছাপে, ব্যবহারসমূহ #, .এবং o। প্রতিটি কক্ষের জন্য, এটি একটি 'প্রোফাইল' গণনা করে (এটি 8 দিকের দূরত্ব (এটি সুবিধার জন্য একটি নবম গণনা করা বলে মনে হয়, তবে এটি সর্বদা হয় 0)) এবং এর প্রতিটিটির সর্বাধিক রেকর্ড করে then এটি পুরো মানচিত্রটি লিখে দেয় then আবার, এবং যে কোনও ঘর উভয় সীমানায় অবস্থিত এবং কোনওর বাইরে 'ও' দিয়ে প্রতিস্থাপন করে নিচে মন্তব্য কোডটি কীভাবে এটি সমস্ত কাজ করে তা ব্যাখ্যা করে।

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

দ্রষ্টব্য : আমার জীবনে একবারের জন্য আমি বর্তমান দশক থেকে কিছু ব্যবহার করছি এবং এই কোডটি সংকলনের জন্য সি # 7 প্রয়োজন। আপনার যদি সি # 7 না থাকে তবে একটি লাইন রয়েছে যা প্রতিস্থাপন করা দরকার যা স্পষ্টভাবে কোডে চিহ্নিত আছে।

ব্যবহার এবং আউটপুট উদাহরণ:

type t7.txt | IslandGolf1.exe

.........ooooooooooo....
........o....#......o...
.......o...#.#.##...#o..
......o....#.#.###.##.o.
.....o....########.##..o
....o.....############.o
...o.#....############.o
..o#.###.##############o
.o##.##################o
o.####################.o
o..##################..o
o.##################...o
o...################...o
o###################...o
o#####################.o
o.##################..o.
o####################o..
o#...##############.o...
o##...#############o....
o#.....###....#...o.....
.o.....#.........o......
..ooooooooooooooo.......

ফর্ম্যাট এবং মন্তব্য কোড:

using C=System.Console;

class P
{
    static void Main()
    {
        // \n 10
        // # 35
        // . 46
        // o 111


        var D=C.In.ReadToEnd().Replace("\r",""); // map

        int W=D.IndexOf('\n')+1, // width
            H=D.Length, // length
            z=H, // position in map (decomposed into i and j by and for P)
            k, // bound index
            q, // bound distance, and later cell condition (0 -> outside, 8 -> inside, >8 -> on boudary)
            c; // (free), comparison store

        // 'indexes' into a profile for the point z at index k
        // effectively {i=z%W,j=z/W,-i,-j,i+j,j-i,-i-j,i-j,0}[k] (inside order is a bit different) (0 const is always treated as 'inside bounds')
        // each non-zero-const entry describes the distance in one of the 8 directions: we want to maximise these to find the 'outer bounds'
        // the non-zero-const bounds describe 8 lines, together an octogen
        int P()=>z%W*(k%3-1)+z/W*(k/3-1)+H; // new C#7 local method syntax (if you don't have C#7, you can test this code with the line below instead)
        //k=0;System.Func<int>P=()=>z%W*(k%3-1)+z/W*(k/3-1)+H; // old lambda syntax (must pre-assign k to make static checker happy)

        var B=new int[9]; // our current bounds, each is initially null (must only call P() when on a #)
        // B[k] starts off a 0, P() has a +H term, and W+(H/W)<H for W >= 3, so B[k] is assigned the first time we compare it (H-i-j always > 0)

        for(;z-->0;) // for each cell
            for(k=9;k-->0& // for each bound
                D[z]%7<1;) // if this cell is #
                if(B[k]<=P())B[k]=P()+1; // update bound if necessary (add one so that we define the bound _outside_ the hashes)
        // z=-1
        for(;++z<H; // for each cell
                C.Write(q>9?'o':D[z])) // print the cell (if q > 9, then we are on the bounds, otherwise, spit out whatever we were before)
            // check we are not 'outside' any of the bounds, and that we are 'on' atleast one of them
            for(q=k=9;k-->0;) // for each bound
                q*=(c=P()-B[k])>0?0: // outside bound (q=0)    (??0 is cheaper than (int) or .Value)
                    c<0?1: // inside (preserve q)
                    2; // on bound (if q != 0, then q becomes > 9)
    }
}

বৃহত্তম অষ্টভুজ? না সবচেয়ে ছোট?
সার্জে বোরশ

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