علی یک برنامهی C++ نوشتهاست که یک عدد صحیح (int
) را از ورودی میخواند و آنرا به حروف (انگلیسی) در خروجی مینویسد.
در راستای جذب مشتری، علی میخواهد این برنامه را در دو نسخهی «demo» و «کامل» (یا اصطلاحاً full) به بازار عرضه کند! در نسخهی «demo» (که رایگان عرضه میشود) برنامه فقط
برای ورودهای مثبت و حداکثر دو رقمی کار میکند. اما در نسخهی «کامل» (که قیمت آن ۱۰۰هزار تومن است!) برنامه نهتنها برای تمام ورودیها کار میکند، بلکه قابلیت خواندن
بهحروف و نوشتن به عدد (و تعدادی امکانات جانبی مشابه) را نیز دارد!
برای دریافت این برنامه شما به علی یک ایمیل میزنید و درصورتی که نسخه «کامل» را بخواهید مبلغ خواستهشده را به حساب بانکی علی واریز کرده و شماره فیش واریزی
را نیز در ایمیلتان ذکر میکنید. در پاسخ به درخواست شما، علی یکی از فایلهای demo.exe
یا full.exe
را (بسته به اینکه پول ریختهاید یا نه) برای شما میفرستد.
از آنجا که علی دائماً در تلاش برای ارتقا و بهبود برنامه است (مثلاً تلاش برای نوشتن به زبانهای فرانسه و روسی در خروجی)، تنها یک فایل مبدأ (source code) بهنام ali.cpp
دارد که در یکی از خطوط اولیه آن یک پارامتر قابل تغییر وجود دارد. هر بار که مشتری یک نسخه از برنامه را از علی میخواهد، علی ابتدا برحسب نوع نسخه
درخواست شده (demo یا full) پارامتر کدش را تنظیم میکند و سپس کدش را کامپایل کرده، فایل exe خروجی کامپایلرش را برای مشتری میفرستد.
می دانیم مشتریها علی، ممکنست ذاتاً آدمهای شروری باشند، اما بین همدیگر رودربایستی دارند! بهعبارت دقیقتر یک مشتری ممکنست فایل demo.exe
را
از علی بگیرد و خودش (با معلومات شخصی خودش) سعی کند از روی بیتها و دستورهای اسمبلی demo.exe
آن را به چیزی شبیه full.exe
تبدیل کند. اما کسی که full.exe
را
از علی میخرد، هرگز آن فایل را به دیگران نمیدهد.
با این وصف برای علی دو راهکار ارائه دهید که بتواند تنها با تغییر یک پارامتر (در اوایل فایل ali.cpp
) نسخه فایل خروجی (demo یا full) را تعیین کند.
دو راهکار خود برای پیادهسازی آن پارامتر را از نظر «امنیت» (اینکه مشتریان بیچشم و رو آن را Crack نکنند. یعنی مثلاً نسخه demo را بخرند و خودشان آن را به full تبدیل کنند)، از نظر «سرعت اجرا» و از نظر «راحتی خود علی برای اِعمال تغییرات آتی» مقایسه کنید.