برنامه نویسی

ظهور کد 2024 – روز 21: معمای صفحه کلید

Summarize this content to 400 words in Persian Lang

روز 21: معمای صفحه کلید

GitHub Repo – راه حل

چالش امروز سخت بود و 2 روز طول کشید تا کمی زمان برای حل و همچنین درک کامل منطق داشته باشم. چیزی که من در این سال پیدا کردم این است که در درک اهداف دستورالعمل ها دچار مشکل شده ام.

امیدوارم مثل خودم چیزی از این چالش و راه حل یاد گرفته باشید. من هر سال که در Advent of Code شرکت می‌کنم، چیزهای زیادی یاد می‌گیرم، به همین دلیل است که دوست دارم زبان‌های مختلف را امتحان کنم یا خودم را از منطقه راحتم بیرون برانم. من به ظهور کد بیشتر به عنوان یک فرصت یادگیری / توسعه فکر می کنم که در آن توسعه دهندگان باید دانش و ایده های خود را به اشتراک بگذارند، نه اینکه آن را صرفاً به عنوان یک رقابت در نظر بگیرند.

یک ضربه دیگر در پایتون امروز و من از راه حل راضی هستم. چیزی که امروز یاد گرفتم این بود؛ کلاس های تغییرناپذیر با استفاده از @dataclass(frozen=True) حاشیه نویسی روی الف class اعلامیه

من ایجاد کردم Location کلاس به‌عنوان یک کلاس کمکی برای پیمایش و به‌روزرسانی مختصات (مثل کاری که قبلاً با آن انجام دادم Point کلاس در برخی از راه حل های C#.

به‌عنوان کسی که از پس‌زمینه‌ی قوی تایپ‌شده C# / .Net می‌آید، سعی کردم انواعی را به کد خود اضافه کنم تا به من کمک کند در طول این مشکل پیچیده با چه چیزی کار می‌کردم. من همچنین در هنگام نوشتن TypeScript به انجام این کار عادت دارم، بنابراین تقریباً طبیعت دوم است.

مشکل امروز

**قسمت اول **مشکل ناوبری و کنترل چندین ربات برای ارسال دستورالعمل ها به ربات بعدی برای وارد کردن کدهای روی صفحه کلید عددی را معرفی می کند.

قسمت دوم با افزایش پیچیدگی از طریق زنجیره‌ای از ربات‌ها و صفحه‌کلیدهای جهت‌دار، بر روی مشکل ایجاد می‌کند و ماهیت نمایی وابستگی‌های چند سطحی را نشان می‌دهد.

قدم زدن

همانطور که ما قبلاً طرح‌بندی جهت‌ها و صفحه کلید را می‌دانیم، می‌توانیم فرهنگ لغت همه نقشه‌برداری‌های مکان و جهت‌هایی را بسازیم که آنها می‌توانند در آنها حرکت کنند.

کش (کش و moves_cache)

حافظه پنهان: کوتاهترین دنباله های محاسبه شده قبلی را ذخیره می کند تا از محاسبات اضافی جلوگیری کند و عملکرد را بهبود بخشد.

moves_cache: همه دنباله های حرکت معتبر بین هر دو دکمه روی صفحه کلید را ذخیره می کند و برای جستجوی سریع از قبل محاسبه شده است.

محاسبه کوتاهترین طول (shorttest_length)

به صورت بازگشتی کوتاهترین دنباله فشار دکمه را برای تایپ یک کد مشخص محاسبه می کند.

زنجیره چند سطحی صفحه کلید را با تکرار در سطوح (cur_depth) تا حد (depth_limit) انجام می دهد.

*جابجایی بین موقعیت ها (حرکت_بین_موقعیت ها)*

تمام توالی های معتبر حرکات بین دو دکمه روی صفحه کلید را محاسبه می کند و اطمینان حاصل می کند که روبات ها این کار را نمی کنند. وحشت با اشاره به موقعیت های نامعتبر (شکاف ها).

راه اندازی کش (create_cache_moves)

توالی حرکت معتبر را برای همه جفت‌های دکمه روی صفحه کلیدهای عددی و جهت‌دار از قبل محاسبه می‌کند و در محاسبه زمان اجرا صرفه‌جویی می‌کند.

توابع حل، سپس از طریق ورودی حلقه پیچیدگی آن را با ضرب طول دنباله در قسمت عددی کد محاسبه می‌کنند و سپس پیچیدگی‌های همه کدها را بر اساس الزامات پازل خلاصه می‌کنند.

جایگشت

جایگشت ها چه می کنند؟

تابع جایگشت در پایتون (از ماژول itertools) تمام ترتیبات ممکن مرتب شده مجموعه ای از آیتم ها را تولید می کند.

به عنوان مثال:

from itertools import permutations

items = [‘a’, ‘b’, ‘c’] list(permutations(items))

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تولید خواهد کرد:

[(‘a’, ‘b’, ‘c’), (‘a’, ‘c’, ‘b’), (‘b’, ‘a’, ‘c’), (‘b’, ‘c’, ‘a’), (‘c’, ‘a’, ‘b’), (‘c’, ‘b’, ‘a’)]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر جایگشت یک دنباله منحصر به فرد است که شامل تمام موارد موجود در مجموعه اصلی است، اما به ترتیب متفاوت.

چرا استفاده کنید permutations و نه combinations?

جایگشت ها:

تمام ترتیبات ممکن سفارش داده شده از مجموعه ای از اقلام را ایجاد می کند.ترتیب اقلام مهم است.

در حالی که، ترکیبات:

تمام انتخاب های نامرتب ممکن از مجموعه ای از آیتم ها را ایجاد می کند.

ترتیب اقلام مهم نیست.

چرا نظم در این سناریو مهم است؟

ناوبری صفحه کلید: موقعیت ربات روی صفحه کلید پس از هر حرکت تغییر می کند، بنابراین ترتیب انجام حرکات مستقیماً بر نتیجه تأثیر می گذارد.

بررسی حرکات معتبر: این تابع اعتبار موقعیت های میانی را در طول ناوبری بررسی می کند. تغییر ترتیب حرکات ممکن است منجر به یک مسیر نامعتبر شود.

چه زمانی ترکیب ها به جای آن مفید خواهند بود؟

ترکیب‌ها می‌توانند در سناریوهایی مفید باشند که ترتیب حرکت‌ها مهم نیست یا زیرمجموعه‌ای از حرکات یا دکمه‌ها را بدون توجه به ترتیب آنها انتخاب می‌کنید.

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

سخت‌ترین بخش پازل فکر کردن به روشی خوب و تمیز برای پیگیری عمق (ابتدای) دستورالعمل‌های ربات بود – برای من کمی زمان گرفت تا بتوانم تمام توجه خود را به آن معطوف کنم.

روز 21: معمای صفحه کلید

GitHub Repo – راه حل

چالش امروز سخت بود و 2 روز طول کشید تا کمی زمان برای حل و همچنین درک کامل منطق داشته باشم. چیزی که من در این سال پیدا کردم این است که در درک اهداف دستورالعمل ها دچار مشکل شده ام.

امیدوارم مثل خودم چیزی از این چالش و راه حل یاد گرفته باشید. من هر سال که در Advent of Code شرکت می‌کنم، چیزهای زیادی یاد می‌گیرم، به همین دلیل است که دوست دارم زبان‌های مختلف را امتحان کنم یا خودم را از منطقه راحتم بیرون برانم. من به ظهور کد بیشتر به عنوان یک فرصت یادگیری / توسعه فکر می کنم که در آن توسعه دهندگان باید دانش و ایده های خود را به اشتراک بگذارند، نه اینکه آن را صرفاً به عنوان یک رقابت در نظر بگیرند.

یک ضربه دیگر در پایتون امروز و من از راه حل راضی هستم. چیزی که امروز یاد گرفتم این بود؛ کلاس های تغییرناپذیر با استفاده از @dataclass(frozen=True) حاشیه نویسی روی الف class اعلامیه

من ایجاد کردم Location کلاس به‌عنوان یک کلاس کمکی برای پیمایش و به‌روزرسانی مختصات (مثل کاری که قبلاً با آن انجام دادم Point کلاس در برخی از راه حل های C#.

به‌عنوان کسی که از پس‌زمینه‌ی قوی تایپ‌شده C# / .Net می‌آید، سعی کردم انواعی را به کد خود اضافه کنم تا به من کمک کند در طول این مشکل پیچیده با چه چیزی کار می‌کردم. من همچنین در هنگام نوشتن TypeScript به انجام این کار عادت دارم، بنابراین تقریباً طبیعت دوم است.

مشکل امروز

**قسمت اول **مشکل ناوبری و کنترل چندین ربات برای ارسال دستورالعمل ها به ربات بعدی برای وارد کردن کدهای روی صفحه کلید عددی را معرفی می کند.

قسمت دوم با افزایش پیچیدگی از طریق زنجیره‌ای از ربات‌ها و صفحه‌کلیدهای جهت‌دار، بر روی مشکل ایجاد می‌کند و ماهیت نمایی وابستگی‌های چند سطحی را نشان می‌دهد.

قدم زدن

همانطور که ما قبلاً طرح‌بندی جهت‌ها و صفحه کلید را می‌دانیم، می‌توانیم فرهنگ لغت همه نقشه‌برداری‌های مکان و جهت‌هایی را بسازیم که آنها می‌توانند در آنها حرکت کنند.

کش (کش و moves_cache)

حافظه پنهان: کوتاهترین دنباله های محاسبه شده قبلی را ذخیره می کند تا از محاسبات اضافی جلوگیری کند و عملکرد را بهبود بخشد.

moves_cache: همه دنباله های حرکت معتبر بین هر دو دکمه روی صفحه کلید را ذخیره می کند و برای جستجوی سریع از قبل محاسبه شده است.

محاسبه کوتاهترین طول (shorttest_length)

به صورت بازگشتی کوتاهترین دنباله فشار دکمه را برای تایپ یک کد مشخص محاسبه می کند.

زنجیره چند سطحی صفحه کلید را با تکرار در سطوح (cur_depth) تا حد (depth_limit) انجام می دهد.

*جابجایی بین موقعیت ها (حرکت_بین_موقعیت ها)
*

تمام توالی های معتبر حرکات بین دو دکمه روی صفحه کلید را محاسبه می کند و اطمینان حاصل می کند که روبات ها این کار را نمی کنند. وحشت با اشاره به موقعیت های نامعتبر (شکاف ها).

راه اندازی کش (create_cache_moves)

توالی حرکت معتبر را برای همه جفت‌های دکمه روی صفحه کلیدهای عددی و جهت‌دار از قبل محاسبه می‌کند و در محاسبه زمان اجرا صرفه‌جویی می‌کند.

توابع حل، سپس از طریق ورودی حلقه پیچیدگی آن را با ضرب طول دنباله در قسمت عددی کد محاسبه می‌کنند و سپس پیچیدگی‌های همه کدها را بر اساس الزامات پازل خلاصه می‌کنند.

جایگشت

جایگشت ها چه می کنند؟

تابع جایگشت در پایتون (از ماژول itertools) تمام ترتیبات ممکن مرتب شده مجموعه ای از آیتم ها را تولید می کند.

به عنوان مثال:

from itertools import permutations

items = ['a', 'b', 'c']
list(permutations(items))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این تولید خواهد کرد:

[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر جایگشت یک دنباله منحصر به فرد است که شامل تمام موارد موجود در مجموعه اصلی است، اما به ترتیب متفاوت.

چرا استفاده کنید permutations و نه combinations?

جایگشت ها:

تمام ترتیبات ممکن سفارش داده شده از مجموعه ای از اقلام را ایجاد می کند.
ترتیب اقلام مهم است.

در حالی که،
ترکیبات:

تمام انتخاب های نامرتب ممکن از مجموعه ای از آیتم ها را ایجاد می کند.

ترتیب اقلام مهم نیست.

چرا نظم در این سناریو مهم است؟

ناوبری صفحه کلید: موقعیت ربات روی صفحه کلید پس از هر حرکت تغییر می کند، بنابراین ترتیب انجام حرکات مستقیماً بر نتیجه تأثیر می گذارد.

بررسی حرکات معتبر: این تابع اعتبار موقعیت های میانی را در طول ناوبری بررسی می کند. تغییر ترتیب حرکات ممکن است منجر به یک مسیر نامعتبر شود.

چه زمانی ترکیب ها به جای آن مفید خواهند بود؟

ترکیب‌ها می‌توانند در سناریوهایی مفید باشند که ترتیب حرکت‌ها مهم نیست یا زیرمجموعه‌ای از حرکات یا دکمه‌ها را بدون توجه به ترتیب آنها انتخاب می‌کنید.

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

سخت‌ترین بخش پازل فکر کردن به روشی خوب و تمیز برای پیگیری عمق (ابتدای) دستورالعمل‌های ربات بود – برای من کمی زمان گرفت تا بتوانم تمام توجه خود را به آن معطوف کنم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا