object B{
def main(a: Array[String]):Unit={
val v=false
val (m,l,k,r,n)=(()=>print("\033[H\033[2J\n"),a(0)toInt,a(1)toInt,scala.util.Random,print _)
val e=Seq.fill(k, l)(v)
m()
(0 to (l*k)/2-(l*k+1)%2).foldLeft(e){(q,_)=>
val a=q.zipWithIndex.map(r => r._1.zipWithIndex.filter(c=>
if(((r._2 % 2) + c._2)%2==0)!c._1 else v)).zipWithIndex.filter(_._1.length > 0)
val f=r.nextInt(a.length)
val s=r.nextInt(a(f)._1.length)
val i=(a(f)._2,a(f)._1(s)._2)
Thread.sleep(1000)
m()
val b=q.updated(i._1, q(i._1).updated(i._2, !v))
b.zipWithIndex.map{r=>
r._1.zipWithIndex.map(c=>if(c._1)n("X")else if(((r._2 % 2)+c._2)%2==0)n("O")else n("_"))
n("\n")
}
b
}
}
}
কিভাবে এটা কাজ করে
অ্যালগরিদম প্রথমটি 2D সিকোয়েন্সটি ভুয়া মান সহ পূরণ করে। এটি নির্ধারিত করে যে কমান্ড লাইনটি যুক্ত আর্গুমেন্টের উপর ভিত্তি করে কতগুলি পুনরাবৃত্তি (খোলা বাক্স) বিদ্যমান It এটি উপরের সীমা হিসাবে এই মানটির সাথে একটি ভাঁজ তৈরি করে। ভাঁজের পূর্ণসংখ্যার মানটি অ্যালগরিদমকে কতগুলি পুনরাবৃত্তির জন্য চালানো উচিত তা গণনা করার উপায় হিসাবে কেবল স্পষ্টভাবে ব্যবহৃত হয়। পূর্বে তৈরি ভরাট ক্রমটি হ'ল ভাঁজটির জন্য শুরুক্রম। এটি তাদের Cooresponding indecies সহ মিথ্যা মানগুলির একটি নতুন 2D ক্রম উত্পন্ন করতে ব্যবহৃত হয়।
উদাহরণ স্বরূপ,
[[false, true],
[true, false],
[true, true]]
পরিণত হবে
[[(false, 0)], [(false, 1)]]
নোট করুন যে সমস্ত তালিকার সম্পূর্ণ সত্য (0 দৈর্ঘ্য রয়েছে) ফলাফল তালিকা থেকে বাদ দেওয়া হয়েছে। এরপরে অ্যালগরিদম এই তালিকাটি নেয় এবং বহিরাগতের তালিকায় একটি এলোমেলো তালিকা চয়ন করে। এলোমেলো তালিকাটি আমরা বেছে নিলাম এলোমেলো সারি হিসাবে বেছে নেওয়া হয়েছে। সেই এলোমেলো সারি থেকে, আমরা আবার একটি এলোমেলো সংখ্যা, একটি কলাম সূচক পাই। একবার আমরা এই দুটি এলোমেলো সূচকগুলি খুঁজে পেলে আমরা 1000 মাইল সেকেন্ডের জন্য যে থ্রেডটি রেখেছি তা ঘুমাই।
আমরা ঘুমানোর পরে, আমরা পর্দা সাফ করি এবং আমাদের তৈরি true
এলোমেলিক সূচকগুলিতে আপডেট হওয়া একটি মান সহ একটি নতুন বোর্ড তৈরি করি।
এটি সঠিকভাবে মুদ্রণ করতে, আমরা map
মানচিত্রের সূচী সহ এটি ব্যবহার করি এবং জিপ করি যাতে আমাদের প্রসঙ্গে। আমরা কিনা আমরা একটি মুদ্রণ উচিত ক্রম সত্য মান ব্যবহার X
বা পারেন একটি O
বা _
। পরবর্তীটি চয়ন করতে, আমরা সূচক মানটি আমাদের গাইড হিসাবে ব্যবহার করি।
আকর্ষণীয় বিষয়গুলি লক্ষ্য করুন
এটি কোনও O
বা একটি মুদ্রণ করা উচিত কিনা তা নির্ধারণের জন্য _
, শর্তসাপেক্ষ ((r._2 % 2) + c._2) % 2 == 0
ব্যবহৃত হয়। r._2
বর্তমান সারি সূচকে c._2
উল্লেখ করে বর্তমান কলামটি বোঝায়। যদি কোনও একটি বিজোড় সারিতে থাকে, r._2 % 2
তবে 1 হবে, সুতরাং c._2
শর্তাধীন এক এক করে অফসেট করুন । এটি নিশ্চিত করে যে বিজোড় সারিগুলিতে কলামগুলি ইচ্ছামত 1 দ্বারা সরানো হয়েছে।
স্ট্রিংটি মুদ্রণ করা "\033[H\033[2J\n"
, আমি পড়ে থাকা কিছু স্ট্যাকওভারফ্লো উত্তর অনুসারে, স্ক্রিনটি সাফ করে। এটি টার্মিনালে বাইট লিখছে এবং এমন কিছু মজার স্টাফ করছে যা আমি সত্যিই বুঝতে পারি না। তবে আমি এটি সম্পর্কে সবচেয়ে সহজ উপায় বলে মনে করেছি। যদিও এটি ইন্টেলিজ আইডিইএর কনসোল এমুলেটরটিতে কাজ করে না। আপনাকে এটি নিয়মিত টার্মিনাল ব্যবহার করে চালাতে হবে।
এই কোডটি প্রথম দেখলে এটি দেখতে অন্য একটি সমীকরণ দেখতে অদ্ভুত মনে হতে পারে (l * k) / 2 - (l * k + 1) % 2
। প্রথমত, চলক নামগুলি ডিমেস্টাইফাই করা যাক। l
প্রোগ্রামটিতে পাস করা প্রথম যুক্তিগুলিকে k
বোঝায় যখন দ্বিতীয়টি বোঝায়। এটি অনুবাদ করতে (first * second) / 2 - (first * second + 1) % 2
,। এই সমীকরণের লক্ষ্যটি হল সমস্ত এক্স এর ক্রম পেতে প্রয়োজনীয় পরিমাণে পুনরাবৃত্তির পরিমাণ নিয়ে আসা। আমি প্রথমবার এটি করেছি, আমি ঠিক তা (first * second) / 2
বোধগম্য করেছিলাম । n
প্রতিটি সাবলিস্টে প্রতিটি উপাদানগুলির জন্য , n / 2
বুদবুদগুলি আমরা পপ করতে পারি। যাইহোক, ইনপুটগুলির সাথে ডিল করার সময় এটি বিরতি দেয়(11 13)
। আমাদের দুটি সংখ্যার গুণাগুণ গণনা করতে হবে, এমনকি যদি এটি এমনকি হয় এমনকি এটি বিজোড় করে তোলে এবং এমনকি এটি বিজোড় হয়, এবং তারপরে এটি 2 দিয়ে মোডটি নেয় তবে এটি কাজ করে কারণ সারি এবং কলামগুলি বিজোড় হয় যাতে একটি কম পুনরাবৃত্তির প্রয়োজন হয় চূড়ান্ত ফলাফল পেতে।
map
এর পরিবর্তে ব্যবহার করা হয় forEach
কারণ এতে কম অক্ষর রয়েছে।
যে জিনিসগুলি সম্ভবত উন্নত করা যেতে পারে
এই সমাধানটি সম্পর্কে সত্যই আমাকে বাগডোগুলি হ'ল ঘন ঘন ব্যবহার zipWithIndex
। এটি এতগুলি চরিত্র গ্রহণ করছে। আমি এটি তৈরি করার চেষ্টা করেছি যাতে আমি নিজের একটি চরিত্রের ফাংশনটি সংজ্ঞায়িত করতে পারি যা কেবলমাত্র zipWithIndex
মানটি দিয়ে দেওয়া হবে But তবে এটি প্রমাণিত হয়েছে যে স্কালা একটি বেনাম ফাংশনটিকে টাইপ পরামিতি রাখতে দেয় না। আমি ব্যবহার না করে যা করছি তা করার সম্ভবত অন্য কোনও উপায় আছে zipWithIndex
তবে আমি এটি করার কোনও চতুর উপায় সম্পর্কে খুব বেশি ভাবি না।
বর্তমানে কোডটি দুটি পাসে চলে। প্রথমটি একটি নতুন বোর্ড তৈরি করে যখন দ্বিতীয় পাসটি প্রিন্ট করে। আমি মনে করি যে যদি এই দুটি পাসকে এক পাসে একত্রিত করা হয় তবে এটি কয়েকটা বাইট সংরক্ষণ করতে পারে।
এটি আমি প্রথম কোড গল্ফ করেছি তাই আমি নিশ্চিত যে উন্নতির জন্য অনেক জায়গা আছে। আমি যতটা সম্ভব বাইটের জন্য অনুকূলিত হওয়ার আগে কোডটি দেখতে চাইলে এটি এখানে।
1
এবং0
পরিবর্তেO
এবংX
?