ইতিহাস
আমার সংস্থা কোম্পানির মধ্যে প্রত্যেককে একটি সাপ্তাহিক নিউজলেটার পাঠায়। এই নিউজলেটারগুলিতে অন্তর্ভুক্ত একটি ধাঁধা, সাথে কোম্পানির মধ্যে যারা চিৎকার করেছে তাদের সাথে সর্বশেষ ইমেল করা / সর্বশেষ সপ্তাহের ধাঁধাটির সমাধান সরবরাহ করেছিল। এই ধাঁধাগুলির বেশিরভাগই একেবারে তুচ্ছ এবং কোনও প্রযুক্তি সংস্থার পক্ষে সত্যই নিখুঁত, তবে কয়েক মাস আগে একটি ছিল, যা আমার দৃষ্টি আকর্ষণ করেছিল।
আসল ধাঁধা:
নীচে আকার দেওয়া:
আপনার 1 থেকে 16 পর্যন্ত প্রাকৃতিক সংখ্যা রয়েছে them এগুলি সমস্তকে এই আকারে ফিট করুন, যাতে সমস্ত সংলগ্ন সারি এবং একযোগে কলামগুলি 29 এর সমষ্টি হতে পারে।
উদাহরণস্বরূপ, এই ধাঁধার ক্ষেত্রে এরকম একটি সমাধান (যা আমি নিউজলেটারে জমা দেওয়া "ক্যানোনিকাল" সমাধান) ছিল:
যাইহোক, এটি সমাধান করার সময়, আমি কিছু বরং আকর্ষণীয় তথ্য পেয়েছি:
- এটির চেয়ে উল্লেখযোগ্যভাবে আরও কয়েকটি সমাধান রয়েছে; আসলে 9,368 টি সমাধান রয়েছে।
- আপনি যদি নিয়মটি প্রসারিত করেন তবে কেবল সারি এবং কলামগুলি একে অপরের সমান হতে হবে, অগত্যা 29 নয়, আপনি 33,608 সমাধান পান:
- 27 এর যোগফলের জন্য 4,440 টি সমাধান।
- 28 এর যোগফলের জন্য 7,400 টি সমাধান।
- 29 এর যোগফলের জন্য 9,368 টি সমাধান।
- 30 এর যোগফলের জন্য 6,096 সমাধান।
- 31 এর যোগফলের জন্য 5,104 সমাধান।
- 32 টির যোগফলের জন্য 1,200 সমাধান।
সুতরাং আমি এবং আমার সহকর্মীরা (যদিও বেশিরভাগই কেবল আমার ব্যবস্থাপক, যেহেতু তিনি "সাধারণ উদ্দেশ্য" প্রোগ্রামিং দক্ষতার সাথে আমার চেয়ে একমাত্র অন্য ব্যক্তি ছিলেন) বেশিরভাগ মাস ধরে চলেছিল — আমাদের অন্য আসল কাজ ছিল- সম্পর্কিত বাধ্যবাধকতাগুলিতে আমাদের উপস্থিত থাকতে হয়েছিল — এমন একটি প্রোগ্রাম লেখার চেষ্টা করার জন্য যা দ্রুততম উপায়ে প্রতিটি একক সমাধান খুঁজে পাবে।
মূল পরিসংখ্যান
সমস্যাটি সমাধান করার জন্য আমি প্রথম প্রথম প্রোগ্রামটি এলোমেলো সমাধানগুলি বারবার পরীক্ষা করে দেখেছি এবং যখন সমাধান পেয়েছি তখন থামে stopped আপনি যদি এই সমস্যাটির উপর গাণিতিক বিশ্লেষণ করেন তবে আপনি সম্ভবত ইতিমধ্যে জানেন যে এটি কাজ করা উচিত হয়নি; তবে কোনওভাবে আমি ভাগ্যবান হয়ে উঠলাম, এবং একক সমাধান (আমি উপরে যে পোস্ট করেছি) তা আবিষ্কার করতে প্রোগ্রামটি কেবল এক মিনিট সময় নিয়েছিল। প্রোগ্রামটির পুনরাবৃত্তিগুলি প্রায়শই 10 বা 20 মিনিটের বেশি সময় নেয়, সুতরাং স্পষ্টতই এটি সমস্যার কোনও কঠোর সমাধান ছিল না।
আমি একটি পুনরাবৃত্ত সমাধানে স্যুইচ করেছি যা ধাঁধার প্রতিটি সম্ভাব্য ক্রমটি দিয়ে পুনরাবৃত্তি করে এবং যোগ না করে এমন পরিমাণগুলি মুছে ফেলে একবারে প্রচুর সমাধান বাতিল করে দেয়। IE যদি প্রথম সারি / কলামটি আমি ইতিমধ্যে তুলনা করছিলাম তবে আমি সেই শাখাটি তত্ক্ষণাত বন্ধ করে দিতে পারি, জেনেও যে ধাঁধাতে অনুমতিপ্রাপ্ত অন্য কিছুই তা পরিবর্তন করে না।
এই অ্যালগরিদমটি ব্যবহার করে, আমি প্রথম "যথাযথ" সাফল্য পেয়েছি: প্রোগ্রামটি প্রায় 5 মিনিটের মধ্যে সমস্ত 33,608 সমাধান তৈরি করতে এবং থুতু দিতে পারে।
আমার ম্যানেজারের একটি ভিন্ন পদ্ধতি ছিল: একমাত্র সম্ভাব্য সমাধানগুলির পরিমাণ 27, 28, 29, 30, 31 বা 32 এর পরিমাণ ছিল বলে আমার কাজের ভিত্তিতে জেনে তিনি একাধিক থ্রেডযুক্ত সমাধান লিখেছিলেন যা কেবলমাত্র সেই নির্দিষ্ট মানের জন্যই সম্ভাব্য পরিমাণগুলি পরীক্ষা করে checked তিনি তার প্রোগ্রামটি মাত্র 2 মিনিটে চালাতে সক্ষম হন। সুতরাং আমি আবার পুনরাবৃত্তি; আমি সমস্ত সম্ভাব্য 3/4 ডিজিটের অঙ্কগুলি (প্রোগ্রামের শুরুতে; এটি মোট রানটাইমের মধ্যে গণনা করা) হ্যাশ করেছি এবং এর চেয়ে পূর্বের সম্পন্ন সারির ভিত্তিতে অবশিষ্ট মানটি সন্ধান করার জন্য একটি সারির "আংশিক যোগফল" ব্যবহার করেছি সমস্ত অবশিষ্ট মান পরীক্ষা করে, এবং সময়টি 72 সেকেন্ডে নামিয়ে আনে। তারপরে কিছু মাল্টি-থ্রেডিং যুক্তি দিয়ে আমি এটিকে 40 সেকেন্ডে নামিয়ে আনলাম। আমার ম্যানেজার প্রোগ্রামটি বাড়িতে নিয়ে গিয়েছিল, প্রোগ্রামটি কীভাবে চালিত হয়েছিল সে সম্পর্কে কিছু অপ্টিমাইজেশন করেছে এবং তার সেকেন্ডে 12 সেকেন্ড নেমে গেছে। আমি সারি এবং কলামগুলির মূল্যায়নটি পুনরায় সাজিয়েছি,
এক মাস পরে আমাদের উভয়ই আমাদের প্রোগ্রামগুলি পেয়েছিলাম আমার পরিচালকের জন্য 0.15 সেকেন্ড এবং আমার জন্য 0.33 সেকেন্ড got আমি দাবি করে শেষ করেছি যে আমার প্রোগ্রামটি যদিও দ্রুত ছিল, যেহেতু আমার পরিচালকের প্রোগ্রামটি এটি খুঁজে পেয়েছিল সমস্ত সমাধান পেয়েছিল তখনও সেগুলি কোনও পাঠ্য ফাইলে মুদ্রণ করছিল না। যদি সে তার যুক্তিতে এই যুক্তি যুক্ত করে, তবে এটি প্রায় 0.4-0.5 সেকেন্ডের বেশি সময় নেয়।
আমরা তখন থেকে আমাদের আন্তঃব্যক্তিক চ্যালেঞ্জকে টিকে থাকতে দিয়েছি, তবে অবশ্যই, প্রশ্নটি রয়ে গেছে: পারে এই প্রোগ্রাম দ্রুত তৈরি করা?
আমি আপনাকে বলছি যে চ্যালেঞ্জ এটি।
আপনার চ্যালেঞ্জ
আমরা যে প্যারামিটারগুলির অধীনে কাজ করেছি সেগুলি "29 এর যোগফল" নিয়মটি শিথিল করে "সমস্ত সারি / কলামের সমতুল্য সমান" হতে হবে এবং আমি আপনাকেও এই নিয়মটি সেট করতে যাচ্ছি। তাই চ্যালেঞ্জটি হ'ল: একটি প্রোগ্রাম লিখুন যা খুব কম সময়ে সম্ভব এই ধাঁধার সমস্ত সমাধান খুঁজে পায় (এবং প্রিন্টগুলি!)। আমি জমা দেওয়া সমাধানগুলিতে সিলিং সেট করতে যাচ্ছি: যদি প্রোগ্রামটি তুলনামূলকভাবে শালীন কম্পিউটারে (<8 বছর বয়সী) 10 সেকেন্ডের বেশি সময় নেয়, তবে এটি সম্ভবত গণনা করা খুব ধীর হবে।
এছাড়াও, ধাঁধাটির জন্য আমার কাছে কয়েকটি বোনাস রয়েছে:
- আপনি কী সমাধানটিকে সাধারণীকরণ করতে পারেন যাতে এটি 16 টি সংখ্যার কোনও সেটের জন্যই কার্যকর হয়
int[1,16]
? টাইমিং স্কোরটি মূল প্রম্পট নম্বর সেটের ভিত্তিতে মূল্যায়ন করা হবে, তবে এই কোডপথের মধ্য দিয়ে গেছে passed (-10%) - আপনি কী কোডটি এমনভাবে লিখতে পারেন যাতে এটি নিখুঁতভাবে পরিচালনা করে এবং সদৃশ সংখ্যার সাথে সমাধান করে? এটি যতটা সহজ বলে মনে হচ্ছে তত সহজ নয়! "দৃষ্টিগোচরভাবে অভিন্ন" সমাধানগুলি ফলাফল সেটে অনন্য হওয়া উচিত। (-5%)
- আপনি কি নেতিবাচক সংখ্যাগুলি পরিচালনা করতে পারবেন? (-5%)
আপনি এমন একটি সমাধান তৈরি করার চেষ্টা করতে পারেন যা ভাসমান-পয়েন্ট নম্বরগুলি পরিচালনা করে তবে অবশ্যই, যদি এটি পুরোপুরি ব্যর্থ হয় তবে হতবাক হবেন না। আপনি যদি একটি শক্তিশালী সমাধান খুঁজে পান তবে, এটি একটি বিশাল বোনাসের মূল্য হতে পারে!
সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে, "আবর্তন" অনন্য সমাধান হিসাবে বিবেচিত হয়। সুতরাং একটি সমাধান যা কেবলমাত্র একটি পৃথক সমাধানের আবর্তন তার নিজের সমাধান হিসাবে গণ্য হয়।
আমি আমার কম্পিউটারে যে আইডিইগুলি কাজ করছি তা হ'ল জাভা এবং সি ++। আমি অন্যান্য ভাষাগুলির উত্তর গ্রহণ করতে পারি, তবে আপনার কোডটির জন্য আমি একটি সহজ সেটআপ রানটাইম পরিবেশ পেতে পারি তার লিঙ্ক সরবরাহ করতেও পারে।