چند ماه پیش راجع به یه مسابقه مرموز :)) صحبت کردم و چون مطلب طولانی بود کلش رو نگفتم و تصمیم گرفتم هر مرحله رو توی یک مطلب جداگانه تهیه کنم.
پیشنهاد میکنم اگه اون رو نخوندید اول اون رو از اینجا بخونید.
خب بعد از تایپ کلمه request اولین سوال برام اومد و یه تایمر پایین سمت چپ صفحه اومد و شروع شد به کم شدن. کلا 72 ساعت وقت داشتم تا سوال رو حل کنم. متاسفانه تا تایمر رو دیدم گرخیدم :)) و یادم رفت از سوال اول عکس بگیرم عکسی هم که بالا میبینید در واقع عکس از سوال دومه :)
صورت سوال به این صورت بود که متن رمزشده ای رو باید رمزگشایی میکردم. به عنوان تست هم دو تا جمله زیر رو برای ورودی و خروجی داده بود و باید از روش میفهمیدم که با چه الگویی داره رمزگشایی انجام میشه.
Input 1: "wrw blf hvv ozhg mrtsg'h vkrhlwv?" Output 1: "did you see last night's episode?" Input 2: "Yvzs! I xzm'g yvorvev Lzmxv olhg srh qly zg gsv xlolmb!!" Output 2: "Yeah! I can't believe Lance lost his job at the colony!!"
خب چیزی که مشخصه اینه که طول رشته های ورودی و خروجی یکسانه این یعنی اینکه احتمالا با رمزگشایی سادهای طرف هستیم و طبیعتا مرحله اول نباید اونقدر سخت باشه :)) یخورده خیالم راحت شد. بعد چون میخواستم سریع مساله رو حل کنم و مثلا بگم خیلی خفنم :) یادم افتاد که این سوال شبیه به یکی از سوالای سایت pythonchallenge عه.
این سوال رو میشد زجر کشید و با درست کردن یه dictionary بزرگ حل کرد :) و هم زجر کمتری کشید و از maketrans زبان پایتون استفاده کرد.چون حس کردم این سوال همون سواله سریع کدش رو با زبان پایتون زدم ولی حواسم به این نبود که تمام کاراکترهای انگلیسی توی این دو تا test-case نیست (مثلا حرف a یا حرف c توی ورودی ها نیومده و معلوم نیست خروجی باید چی باشه) و احتمالش هست که کد مشکل داشته باشه. به هرحال کد رو submit کردم و همونطور که حدس میزدم fail شد. اونجا بود که فهمیدم عجله کار شیطونه :)) البته برای submit نهایی ظاهرا 2 بار فرصت هست و من یکبارش رو از دست دادم :(
اینجا بود که یکم فکر کردم و الگو رو که فکر کنم شما همون اول فهمیدید چیه پیدا کردم :)) همونطور که معلومه به جز حروف انگلیسی بقیه کاراکترها بدون تغییر باقی موندند (مثلا ! و یا ؟ و یا ') یه چیز دیگه هم اینه که حروف بزرگ انگلیسی هم بدون تغییر باقی موندند. اما برای حروف کوچک انگلیسی اتفاق دیگهای میفته. انگار یه آینه گذاشتیم وسط حروف الفبای انگلیسی و هر حرفی میشه قرینه اش اونور آینه مثلا a میشه z یا b میشه y و ...
پس یعنی اگه ورودی رو حروف الفبای انگلیسی بدیم خروجی میشه همونا منتهی برعکسشون:
"abcdefghijklmnopqrstuvwxyz" ==========> "zyxwvutsrqponmlkjihgfedcba"
خب استنباطی که کردهبودم رو با test-case های دادهشده تست کردم و دیدم ظاهرا این حرفی که زدم درسته ... خوشحال و شادان رفتم کدش رو زدم و نتیجهاش شد این:
def answer(s): result = "" for char in s: if char.islower(): mirrored = ord("z")- (ord(char)-ord("a")) result += chr(mirrored) else: result += char return result
برای واردکردن کد هم دو تا گزینه داشتم زبان پایتون و جاوا :) که طبیعتا پایتون رو انتخاب کردم و داخل تابع answer رو پر کردم که در بالا میبینید. توی کد گفتم که اگر کاراکتر حرف کوچک بود (char.islower) اونوقت مقدار آینه اون کاراکتر رو حسابکن و result رو که رشته نهایی است باهاش جمعکن اگر نه که فقط همون کاراکتر رو باهاش جمع کن و در نهایت مقدار result رو برگردون.
خب کد رو submit کردم و accept شد :)) مرحله اول به همین سادگی به پایان رسید. هر مرحله تعدادی سوال داره که مرحله اول فقط یکی داشت. تایمر اون پایین ناپدید شد و من مجددا احساس آرامش کردم :))) دوباره باید request میدادم تا وارد مرحله دوم بشم. یه خرگوش باحال هم توی صفحه اومد و بهم تبریک گفت و بازهم یادم رفت ازش عکس بگیرم :) واسه همین این عکسو از اینترنت کشرفتم. کد باحالی زده بودن براش حرکت هم میکرد که خب توی عکس نشون داده نمیشه :))
خب این از مرحله اول که متاسفانه زیاد عکس نداشت :)) چون مطلب طولانی میشه و ممکنه حوصله سربر بشه مراحل بعدی رو توی پست های جداگانه بعدی قرار میدم.
به نظرتون کدی که زدم چطوره؟ چطوری میشه بهترش کرد؟ راه حل کوتاهتری سراغ دارید؟
منتظر نظرات و پیشنهادات شما هستم :))
فعلا ;)
این داستان هنوز ادامه دارد ... :))