ماینسوییپر کامل تو ۲۴۷ بایت جاوااسکریپت
خلاصهٔ کاملتر
نویسنده تو این پست تعریف میکنه که چند سال پیش برای تفریح رفته سراغ code golf (یعنی نوشتن یه برنامه با کمترین تعداد کاراکتر ممکن) و ماینسوییپر رو تو یه شب با ۶۵۸ بایت پیاده کرده. چند هفته بعد رسونده به ۳۹۹ بایت و فکر کرده دیگه به دیوار خورده. تازگی موقع مرتب کردن هاردش دوباره کد رو پیدا کرده و همون لحظه یه راه کوتاهترش به ذهنش رسیده. بعدش با کسی به اسم DNEK تو دیسکورد همکاری کرده و بعد از چند ماه به ۲۴۷ بایت رسیدن.
کل کد فقط دو تا تابع داره: b که منطق بازی رو اداره میکنه و m که رابط کاربری و صفحه رو میسازه. جالبی ماجرا اینه که تو کد هیچ آرایهای نیست. چون تو جاوااسکریپت تابع هم یه شیءه، وضعیت بازی رو مستقیم روی خود همین دو تا تابع ذخیره کردن: b[t] صفحهٔ قابل دیدن رو نگه میداره و m[t] جای مینها رو. متغیر O هم تعداد خونههای امنِ بازنشدهست.
چیدن مینها و رسم صفحه همزمان و تو یه عبارت انجام میشه، با یه ترفند روی عملگر ??=:
x = b[t] ??= (O -= m[t] = Math.random() < .1, 1)اگه خونه هنوز مقدار نداشته باشه، با احتمال حدود ۱۰٪ مین میشه، اون مقدار از O کم میشه و کل عبارت آخرش 1 برمیگردونه. یعنی همون یه خط هم مینها رو میچینه، هم شمارش خونههای امن رو انجام میده، هم حالت اولیهٔ «بازنشده» رو ست میکنه.
تو خروجی HTML اصلاً تگ بسته وجود نداره، حتی یه / هم توش نیست. نویسنده میگه چون مرورگر اجازه نمیده تگ a داخل a یا p داخل p بیاد، خود پارسر تگ قبلی رو میبنده. برای شمردن مینهای همسایه هم بهجای دو تا حلقهٔ تودرتو، اختلاف اندیسها رو روی همون آرایهٔ تکبعدی حساب کردن:
[~9, ..."1172711", ~9].map(j => m[i -= j] ? ++e : i)یه ستون نامرئی سمت راست صفحه گذاشتن تا اندیسهای بیرون از محدوده خودبهخود بیضرر بشن، چون تو جاوااسکریپت اندیس نامعتبر undefined برمیگردونه که falsy هست. نویسنده میگه این حتماً کوچکترین ماینسوییپر ممکن نیست و اگه قابلیتها رو کم کنی خیلی کوچیکتر هم میشه، ولی نکتهٔ کار اینه که از ۶۵۸ به ۲۴۷ بایت رسیده بدون حذف هیچ قابلیت اصلی. به گفتهٔ خودش هیچوقت نمیشه ثابت کرد این کوتاهترین نسخهست، چون پیچیدگی کولموگروف محاسبهپذیر نیست.
نکات کلیدی:
- نسخهٔ نهایی ۲۴۷ بایته؛ اولش ۶۵۸ بایت بود، بعد ۳۹۹ و در آخر ۲۴۷.
- صفحه ۸×۸ ساخته میشه و هر خونه با احتمال حدود ۱۰٪ مین میشه.
- وضعیت بازی روی خود توابع b و m ذخیره میشه، بدون هیچ آرایهای.
- تو HTML خروجی هیچ تگ بستهای نیست؛ پارسر مرورگر خودش تگ a و p قبلی رو میبنده.
- بهجای دو تا رویداد جدا فقط از onmouseup و event.which استفاده شده؛ عوضش منوی راستکلیک بلاک نمیشه و باید دوبار راست کلیک کنی تا پرچم بذاری.




