مجتبی کامیابی
مجتبی کامیابی
خواندن ۴ دقیقه·۶ سال پیش

گوگل فوبار .... مرحله اول

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

پیشنهاد می‌کنم اگه اون رو نخوندید اول اون رو از اینجا بخونید.

درخواست سوال
درخواست سوال


خب بعد از تایپ کلمه request اولین سوال برام اومد و یه تایمر پایین سمت چپ صفحه اومد و شروع شد به کم شدن. کلا 72 ساعت وقت داشتم تا سوال رو حل کنم. متاسفانه تا تایمر رو دیدم گرخیدم :)) و یادم رفت از سوال اول عکس بگیرم عکسی هم که بالا می‌بینید در واقع عکس از سوال دومه :)


صورت سوال به این صورت بود که متن رمزشده ای رو باید رمزگشایی می‌کردم. به عنوان تست هم دو تا جمله زیر رو برای ورودی و خروجی داده بود و باید از روش می‌فهمیدم که با چه الگویی داره رمزگشایی انجام می‌شه.

Input 1: &quotwrw blf hvv ozhg mrtsg'h vkrhlwv?&quot Output 1: &quotdid you see last night's episode?&quot Input 2: &quotYvzs! I xzm'g yvorvev Lzmxv olhg srh qly zg gsv xlolmb!!&quot Output 2: &quotYeah! I can't believe Lance lost his job at the colony!!&quot

خب چیزی که مشخصه اینه که طول رشته های ورودی و خروجی یکسانه این یعنی اینکه احتمالا با رمزگشایی ساده‌ای طرف هستیم و طبیعتا مرحله اول نباید اونقدر سخت باشه :)) یخورده خیالم راحت شد. بعد چون می‌خواستم سریع مساله رو حل کنم و مثلا بگم خیلی خفنم :) یادم افتاد که این سوال شبیه به یکی از سوالای سایت pythonchallenge عه.

این سوال رو میشد زجر کشید و با درست کردن یه dictionary بزرگ حل کرد :) و هم زجر کمتری کشید و از maketrans زبان پایتون استفاده کرد.چون حس کردم این سوال همون سواله سریع کدش رو با زبان پایتون زدم ولی حواسم به این نبود که تمام کاراکترهای انگلیسی توی این دو تا test-case نیست (مثلا حرف a یا حرف c توی ورودی ها نیومده و معلوم نیست خروجی باید چی باشه) و احتمالش هست که کد مشکل داشته باشه. به هرحال کد رو submit کردم و همون‌طور که حدس می‌زدم fail شد. اونجا بود که فهمیدم عجله کار شیطونه :)) البته برای submit نهایی ظاهرا 2 بار فرصت هست و من یکبارش رو از دست دادم :(

اینجا بود که یکم فکر کردم و الگو رو که فکر کنم شما همون اول فهمیدید چیه پیدا کردم :)) همونطور که معلومه به جز حروف انگلیسی بقیه کاراکترها بدون تغییر باقی موندند (مثلا ! و یا ؟ و یا ') یه چیز دیگه هم اینه که حروف بزرگ انگلیسی هم بدون تغییر باقی موندند. اما برای حروف کوچک انگلیسی اتفاق دیگه‌ای میفته. انگار یه آینه گذاشتیم وسط حروف الفبای انگلیسی و هر حرفی میشه قرینه اش اونور آینه مثلا a میشه z یا b میشه y و ...

پس یعنی اگه ورودی رو حروف الفبای انگلیسی بدیم خروجی میشه همونا منتهی برعکسشون:

&quotabcdefghijklmnopqrstuvwxyz&quot ==========> &quotzyxwvutsrqponmlkjihgfedcba&quot


خب استنباطی که کرده‌بودم رو با test-case های داده‌شده تست کردم و دیدم ظاهرا این حرفی که زدم درسته ... خوشحال و شادان رفتم کدش رو زدم و نتیجه‌اش شد این:

def answer(s): result = &quot&quot for char in s: if char.islower(): mirrored = ord(&quotz&quot)- (ord(char)-ord(&quota&quot)) result += chr(mirrored) else: result += char return result

برای واردکردن کد هم دو تا گزینه داشتم زبان پایتون و جاوا :) که طبیعتا پایتون رو انتخاب کردم و داخل تابع answer رو پر کردم که در بالا می‌بینید. توی کد گفتم که اگر کاراکتر حرف کوچک بود (char.islower) اون‌وقت مقدار آینه اون کاراکتر رو حساب‌کن و result رو که رشته نهایی است باهاش جمع‌کن اگر نه که فقط همون کاراکتر رو باهاش جمع کن و در نهایت مقدار result رو برگردون.

خب کد رو submit کردم و accept شد :)) مرحله اول به همین سادگی به پایان رسید. هر مرحله تعدادی سوال داره که مرحله اول فقط یکی داشت. تایمر اون پایین ناپدید شد و من مجددا احساس آرامش کردم :))) دوباره باید request میدادم تا وارد مرحله دوم بشم. یه خرگوش باحال هم توی صفحه اومد و بهم تبریک گفت و بازهم یادم رفت ازش عکس بگیرم :) واسه همین این عکسو از اینترنت کش‌رفتم. کد باحالی زده بودن براش حرکت هم میکرد که خب توی عکس نشون داده نمیشه :))

پایان مرحله اول
پایان مرحله اول

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

به نظرتون کدی که زدم چطوره؟ چطوری میشه بهترش کرد؟ راه حل کوتاه‌تری سراغ دارید؟

منتظر نظرات و پیشنهادات شما هستم :))

فعلا ;)


این داستان هنوز ادامه دارد ... :))

فوبارگوگلمسابقهمرموزپنهان
یه INFJ که برنامه نویسه ... عاشق بازیه. بعضی اوقات پیانو میزنه و البته کمی هم ورزش میکنه :)
شاید از این پست‌ها خوشتان بیاید