حل معمای تست هوش انیشتین با #C

ساخت وبلاگ

کسانی که تاحالا معمای تست هوش انیشتین رو ندیدن یا نیاز دارن که یه یادآوری بشه ، گوگل کنید : معمای تست هوش انیشتین

چندسال پیش من این معما رو دیدم از اینکه یه تست هوش رو حل کنم به ذوق اومدم ولی برخلاف انتظارم دیدم که حل این معما چندان هم به هوش و ذکاوت بالا احتیاج نداره و بیشتر تنها به یه کاغذ و خودکار نیاز داره تا حالتهای مختلف روی هم بچینی و ببینی کدوم حالت با شرطهای موجود در معما همخوانی داره البته قبول دارم که اونهایی که اهل تمرکز نیستنتد احتمالا هرگز نمیتونن این معما رو حل کنن!

برهر حال اخیرا یه شب تصمیم گرفتم که این معما رو با سی شارپ انجامش بدم تا جواب رو کامپیوتر بهم بده ! ولی پس از شروع کار متوجه شدم که برنامه نویسی اون چندان هم راحت نیست!
البته اصل کد برنامه که بتونه حالتهای مختلف رو به ترتیب ایجاد کنه و با شرطهای معما بررسی کنه ، کار راحتی بود اما مشکل اینجاست که حالتهای موجود خیلی زیاده (طبق محاسبات من 5^5^5=2.98e17 ) که با پروسسور 2.2G سیستم من ظاهرا نزدیک یه سال طول میکشه تا جواب بدست بیاد

با حذف کردن دو اتاق از 5 اتاق موجود در معما ، میبینم که جواب بدست میاد و از کد برنامه نوشته شده مطمئن میشم ولی وقتی روم چهارم رو اضافه میکنم زمان زیادی میکشه و درحالت 5 اتاقه امکان رسیدن به جواب معما احتمالا چندین ماه طول میکشه!

هدف من از این کار (برنامه نویسی معمای انیشتین) در اصل ، آشنایی با الگوریتم های کدبندی و نحوه کاهش حالتهای اضافه هستش در واقع اگر ما بتونیم تعداد حالتها رو کمتر کنیم خیلی سریعتر به جواب میرسیم اما این قسمت از کدنویسی واقعا دشوار هست من چند مدل طرح کار کردم که حالتها رو کم میکنه ولی کد مشکل داشت و بعضی حالتهای ناخواسته هم حذف میشدن که عملا بدست آوردن جواب از بین میرفت.

بهترین حالت که کد نویسی اون به ظاهر ساده اما در عمل با اشکال همراه میشد ، حذف حالتهای تکراری هست در یکی از شرطهای معما گفته شده که در هر اتاق نوشیدنی و سیگار و ملیت و... افراد متفاوت از همدیگه هست برای همین در برنامه کد زیر نیازی به بررسی شرایط معما رو نداره و قبل از بررسی میتونیم به حالت بعدی بریم 00000 این کد رو مثلا کد نوشیدنی هر اتاق در نظر بگیرید که مثلا مال همه روی آب تنظیم شده(که چون با شرط اولیه معما سازگار نیست و باید از هم متفاوت باشن) مییایم یک واحد افزایش درنظر میگیریم تا به حالت بعدی برسیم و اونو بررسی کنیم و...

من برای اینکار متوجه شدم که بهتره برای کاهش حالتهای برنامه ، شرط تکراری نبودن رو قبل از بقیه شرطها درنظر بگیریم(چون در اکثر حالتها این شرط برقرار نیست) تا سریعا به حالتهای دیگه سویچ کنیم و همچنین متوجه شدم که بهتره که الویت تغییر وضعیت از سمت چپ کدها باشه یعنی کد بالا ابتدا به 01000 و سپس به 01100 و سپس به 01200 و بعد به 012100 و... حرکت میکنه و همونطور که میبینید همه حالتهای بالا با شرط اولیه (شرط تکراری نبودن) سازگار نیستند و بدون بررسی های بعدی حالت فعلی رو تغییر میدیم

نحوه تغییر حالت تکرار از سمت چپ بود (برای اینکه حالتها سریعتر عوض بشن به دلیل ارزش مکانی بالاتر رقمهای سمت چپ) اما تغییر حالت معما در سایر شرایط (درحالتی که شرط اولیه برقرار هست) از سمت راست هست (چون میخوایم یه واحد افزایش داشته باشیم و حالتی رو رد نکرده باشیم)

این کار باعث ایجاد اختلال در کدها میشه با وجود اینکه روال کد برنامه کاملا تمیز و مرتب نوشته شده و در حالت debug هم کارکرد صحیح برنامه تست شده اما هرگونه کدی رو که واسه حذف حالتهای تکراری معما ، دربرنامه قرار میدم ظاهرا بعضی حالتهای دیگه رو هم حذف میکنه که بررسی تمامی حالتها تموم میشن ولی جواب بدست نمیاد

احتمالا از توضیحاتم زیاد چیزی متوجه نشده باشین که خوب طبیعی هستش و نمیشه یه روال کدبندی نسبتا پیچیده رو تو دوتا سطر توضیح داد سوال من اینه که کسی تا حالا یه برنامه ای شبیه این نمونه رو کار کرده؟ میتونه روال حذف حالتهای تکراری رو با یه الگوریتم بهتر نشون بده ؟

این پروژه حداقل برای من میتونه کاربردی باشه البته اگه بشه از یه معادله صرفا حالتهای تکراری رو حذف کرد.

من اتاقها رو با مشخصاتشون (ملیت ، نوشیدنی ، سیگار ، حیوان ، رنگ) توی یه آرایه دوبعدی 5 در 5 قرار دادم و مستقیما نحوه تغییر حالتها روی این آرایه اعمال میشه و همونطور که گفتم در حالت سه اتاقه میتونیم به جواب برسیم (در واقع در حالت سه اتاقه من مقادیر صحیحی که بایستی در اتاقهای چهارم و پنجم قرار داده بشن رو به صورت دستی وارد میکنم و لذا با تغییر حالت های سه اتاق اول ، در نهایت جواب معادله بدست میاد) و در حالت اجرای خط به خط برنامه هم متوجه میشم که روال برنامه به درستی اجرا میشه و همونطور که گفتم فقط در زمانی که کدهای مربوط به حذف حالتهای تکراری (شرط اولیه معما) رو فعال میکنم مشکل دارم.

سوالم فقط در مورد نحوه کار روال حذف حالتهای تکراری هست از دوستانی که تجربه اینکار رو دارن. ممنون از حوصله شما!

یه سوال دیگه هم دارم اونم اینکه توی C#‎ امکانش هست که الویت اجرای کدها رو بیشتر کنیم تا برنامه من بتونه حداکثر ظرفیت سی پی یو رو بگیره ؟ مثلا نرم افزارهایی مثل IMTOO اکثرا میتونه بالای 90 درصد cpu رو به خودش اختصاص بده اما برنامه من معمولا کمتره و همینطور اینکه استفاده از هسته های دیگه cpu هم صرفا دست ویندوز هست ؟ یا میشه با برنامه سی شارپ اونا رو مدیریت کرد ؟

برنامه نویس...
ما را در سایت برنامه نویس دنبال می کنید

برچسب : نویسنده : محمد رضا جوادیان programers بازدید : 389 تاريخ : دوشنبه 17 خرداد 1395 ساعت: 6:38