معمای گورخر یک معمای منطقی مشهور است که در آن پنج خانه وجود دارد و هر خانه به رنگ متفاوتی رنگ شده است. در این خانهها افراد متفاوتی زندگی میکنند: ملیتشان با هم فرق دارد، حیوان خانگی متفاوتی نگه میدارند، نوشیدنی متفاوتی مینوشند و سرگرمی متفاوتی دارند.
برای اینکه بتوانید این معما را حل کنید، ۱۵ گزاره در اختیار شما قرار میگیرد که راهحل را توصیف میکنند. با این حال، فقط با کنار هم گذاشتن اطلاعات همهی این گزارهها میتوانید راهحل معما را پیدا کنید.
معمای گورخر یک مسئلهی ارضای محدودیت (CSP) است. در چنین مسئلهای، مجموعهای از مقادیر ممکن دارید و مجموعهای از محدودیتها که تعیین میکنند کدام مقادیر معتبرند. سودوکو هم نمونهی شناختهشدهی دیگری از همین نوع مسئله است.
وظیفهی شما این است که معمای گورخر را حل کنید تا پاسخ این دو پرسش را پیدا کنید:
۱۵ گزارهی زیر همه درستاند:
علاوه بر این، هر یک از این پنج خانه رنگ متفاوتی دارد و ساکنانشان ملیتهای متفاوت دارند، حیوان خانگی متفاوتی دارند، نوشیدنی متفاوتی مینوشند و به سرگرمیهای متفاوتی مشغولاند.
۲۴ میلیارد (۵!⁵ = ۲۴٬۸۸۳٬۲۰۰٬۰۰۰) راهحل ممکن وجود دارد، پس سعی کنید تا جای ممکن راهحلهای بیشتری را حذف کنید.
تابعی به اسم SolvePuzzle تعریف کنید که راهحلی شامل دو رشته برمیگرداند؛ مقادیر این دو رشته پاسخهای پرسشهای معمای گورخر هستند: «چه کسی آب مینوشد؟» و «چه کسی گورخر دارد؟». هر پاسخ یکی از ملیتهای ساکنان خواهد بود: Englishman، Spaniard، Ukrainian، Norwegian یا Japanese.
بدیهی است که اگر نگاهی به برنامهی آزمون بیندازید تا راهحل مورد انتظار را ببینید، میتوانید بهسادگی یک تابع یکخطی بنویسید. اما هدف این است که الگوریتمی بسازید که از واقعیتها و محدودیتهای دادهشدهی معما استفاده کند و آن دو پاسخ درست را تعیین کند.
در Exercism ثبتنام کنید تا Go را همراه با 34 مفهوم165 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.
۸ روش متفاوت برای یافتن پاسخ معمای گورخر از میان ۲۴ میلیارد راهحل ممکن را بررسی کنید؛ از جمله کنار گذاشتن جایگشتهای نامعتبر به محض امکان، الگوریتم AC-3، یک راهحل بسیار کوتاه مبتنی بر منطق و حتی یک الگوریتم ژنتیک!