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