یک مستطیل را یک مستطیل ایکس-پُر مینامیم اگر تمام کاراکتر داخل این مستطیل X
باشد. توجه کنید کاراکتر X
بزرگ است!
یک مستطیل را یک مستطیل نقطه-پُر مینامیم اگر تمام کاراکتر داخل این مستطیل .
باشد.
امین از شما میخواهد یک مستطیل را با ۹ مستطیل پر کند.
او میخواهد این ۹ مستطیل به صورت شطرنجی(یکی در میان) ایکس-پُر و نقطه-پُر باشند و مستطیل بالا سمت چپ ایکس-پُر باشد. به عکس زیر توجه کنید:
برای بهتر متوجه شدن خواستهی امین، به مثالها توجه کنید.
ورودی تنها شامل یک خط است که در آن دو عدد طبیعی و با فاصله از هم آمده است.
خروجی یک جدول ، مطابق با الگو خواسته شده، چاپ کنید.
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
وضعیت هر سطر از این شکل دو حالت کلی دارد، سعی کنید از این دو حالت برای چاپ کل جدول استفاده کنید.
رشته وضعیت سطر اول و آخر جدول را نمایش میدهد. رشته وضعیت سطر میانی جدول را نمایش میدهد.
شبه کد حل سوال را میتوانید مشاهده کنید:
امین یک جدول دارد که هر خانهی آن یکی از کاراکترهای .
، /
، \
یا _
است. هر کاراکتر از این جدول نشان دهنده وضعیت یک خانه (یا همان مربع واحد) متناظر آن در صفحه است. این جدول در نهایت، یک خط شکسته را نمایش میدهد.
کاراکتر .
نشان میدهد هیچ قسمتی از خط شکسته در مربع واحد متناظر با این خانه وجود ندارد:
کاراکتر _
نشان میدهد خط شکسته حاوی ضلع پایینی مربع واحد متناظر با این خانه از جدول است:
کاراکتر /
نشان میدهد خط شکسته حاوی قطر فرعی مربع واحد متناظر با این خانه از جدول است:
کاراکتر \
نشان میدهد خط شکسته حاوی قطر اصلی مربع واحد متناظر با این خانه از جدول است:
تضمین میشود شکل بدست آمده یک خط شکسته پیوسته است که سمت چپ صفحه را به سمت راست صفحه متصل میکند؛ در واقع صفحه را به دو قسمت بالایی و پایینی تقسیم میکند.
امین میخواهد مساحت قسمت پایین ایجاد شده توسط این خط شکسته را محاسبه کند. به او کمک کنید تا این کار را انجام دهد.
در سطر اول ورودی یک عدد طبیعی آمده که نشان دهنده تعداد مثالهایی است که داده میشود.
برای هر مثال در سطر اول دو عدد طبیعی و با فاصله از هم آمده که نشان دهنده ابعاد جدول است.
در سطر بعدی در هر سطر دقیقاً کاراکتر آمده که هر کدام از این کاراکترها برابر .
، /
، \
یا _
خواهد بود.
تضمین میشود ورودی داده شده جدول یک خط شکسته پیوسته است که از سمت چپ جدول شروع شده و به سمت راست جدول ختم میشود و در هر ستون دقیقا یک کاراکتر غیر .
دارد.
تضمین میشود اندازه جدولهای این مثال از بیشتر نخواهد بود.
خروجی برنامه شما سطر دارد که در سطر ام آن مساحت زیر نمودار شکل ام را با دقت ۳ رقم بعد از اعشار چاپ کنید.
شکل مربوط به خط شکسته اول
شکل مربوط به خط شکسته سوم
شکل مربوط به خط شکسته داده شده
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
اگر مساحت ایجاد شده توسط خط شکسته را برای یک ستون محاسبه کنید میتوانید پاسخ مسئله را بدست آورید. (چرا؟)
با توجه به کاراکتری که در هر ستون وجود دارد؛ باید مساحت یک ذوزنقه یا مستطیل را محاسبه کنیم.
شبه کد حل سوال را میتوانید مشاهده کنید:
بهروز نعل اسبش را توی مزرعه گم کرده و میخواهد آن را پیدا کند. از آنجایی که بهروز ذهن پیچیدهای دارد و دوست دارد از هر چیزی یک مسئله بسازد، میخواهد بداند نعل اسب چند تا جای مختلف میتواند قرار داشته باشد. مزرعه به شکل یک جدول هست که در هر کدام از خانههایش یا علوفه قرار دارد یا خالی میباشد.
پای اسب بهروز کمی عجیب و غریب است و نعل اسبش شکل یک مربع ۳ ۳ که دو خانه مجاور ضلعی از محیط آن به همراه مرکزش برداشته شده است. در شکل زیر حالت کلی نعل اسب را میبینیم که با خانههای سیاه مشخص شده است(دقت کنید که ممکن است مکان نعل اسب دورانها و تقارنهایی از شکل زیر نیز باشد).
میدانیم نعل اسب بهروز در بین علوفهها پنهان شده و تعدادی علوفه که به شکل بالا باشند، میتوانند یک نعل اسب را در خود جای دهند. حال به بهروز کمک کنید تا تعداد مکانهای مختلف نعل اسب را پیدا کند.
در سطر اول ورودی دو عدد و آمدهاند که به ترتیب تعداد سطرها و ستونهای مزرعه ما را نشان میدهند.
در امین سطر از سطر بعدی یک رشته به طول متشکل از حروف .
و *
آمده است. حرف .
نشاندهنده خانه خالی و حرف *
نشاندهنده علوفه است.
در تنها سطر خروجی، پاسخ مسئله را چاپ کنید.
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
سعی کنید تمامی دورانها و تقارنهای شکل نعل اسب را در نظر بگیرید و جداگانه هرکدام را در شکل بشمارید. از این نکته استفاده کنید که در مجموع ۸ شکل مختلف برای شمارش داریم.
نکته درخور توجه در حل مسئله این است که در محیط هر مربع ۳ * ۳ یا دقیقا یک نعل اسب وجود دارد و یا هیچ نعل اسبی موجود نیست. همچنین هر نعل اسب نیز در محیط دقیقا یک مربع ۳ * ۳ قرار دارد.
بنابراین برای شمارش نعل اسبها خوب است که بر روی مربعهای ۳ * ۳ حرکت کنیم و به ازای هر کدام از آنها چک کنیم که آیا نعل اسبی در خود دارند یا نه.
برای حرکت روی مربعهای ۳ * ۳، هر مربع را با خانه وسط آن متناظر میکنیم. بدین صورت با دیدن همه خانههایی که در محیط مستطیلمان نیست، همه مربعهای ۳ * ۳ موجود را دیدهایم.
حال به ازای هر خانهای که مرکز یک مربع است، اگر در هشت خانه واقع در محیط مربع، دقیقا دو خانه وجود داشته باشند که خالی باشند و آن دو خانه هم مجاور ضلعی باشند، این مربع ۳ * ۳ دارای یک نعل اسب میباشد.
همچنین برای راحتتر چک کردن اینکه دو خانه مجاور ضلعی هستند یا نه، میتوانید از مجموع قدر مطلق تفاضل شماره سطر و ستون آن دو استفاده کنید؛ این دو خانه مجاور ضلعی هستند اگر و تنها اگر مجموع گفته شده برابر یک باشد.
امین یک متن حاوی کلمه دارد و میخواهد آنها را مرتب کند برای این کار یک عدد صحیح انتخاب کرده و میخواهد آن را در سطرهایی که ظرفیت حداکثر کاراکتر دارند، بنویسد.
برای نوشتن این کلمات به ترتیب داده شده آنها را یادداشت میکنیم. از کلمه اول شروع کرده و آن را در ابتدای سطر اول مینویسیم. از آن به بعد برای هر کلمه اگر تونستیم آن را با حفظ یک فاصله (یک کاراکتر space یا ' '
) از کلمه قبل در همان سطر بنویسیم (با توجه به ظرفیت آن سطر) این کار را انجام میدهیم و در غیر این صورت کلمه در ابتدای سطر بعدی نوشته خواهد شد و این روند ادامه پیدا میکند.
میخواهیم اشکالاتی که در کوچک یا بزرگ بودن حروف وجود دارد را برطرف کنیم. یعنی همه حروف نوشته شده باید کوچک باشند به جز حرف اولِ کلمهی اول جملات. میدانیم که جملات با کلماتی ختم میشوند که در انتهای آنها .
، ؟
یا !
داشته باشند.
حال میخواهیم همه این سطرها را جاستیفای کنیم! یعنی تعداد تقریباً مساوی فاصله بین کلمات هر سطر قرار دهیم تا کلمهی آخر هر سطر به انتهای آن سطر برسد.
اگر یک کلمه در یک سطر باشد آن را در ابتدای سطر مینویسیم و بقیه سطر را با کاراکتر space پرکنیم.
در غیر این صورت فرض کنید کلمه در یک سطر داشته باشیم. میخواهیم در بین فاصله ایجاد شده توسط این کلمه تعدادی کاراکتر space قرار دهیم به طوری که اختلاف تعداد spaceهای موجود در این فواصل حداکثر برابر یک باشد، همچنین کلمه آخر به انتهای سطر رسیده باشد.
به عبارت دیگر برای هر سطر عددی مانند وجود دارد که فاصله بین کلمات آن سطر همگی یا باشد.
فرض کنید برای اینکار باید از فاصلهها اسپیس، و تا تا اسپیس داشته باشند، میخواهیم تا از فواصل تایی بین کلمات ابتدایی سطر باشد و تا از فواصل تایی بین کلمات انتهایی سطر باشد.
در نهایت تعداد کاراکترهای چاپ شده در هر سطر باید دقیقاً باشد. با احتساب فاصلهها (یا همان spaceها)
در ورودی به شما مثال داده میشود.
در هر مثال در سطر اول عدد و عدد داده میشود و در سطر دوم کلمه با فاصله از هم داده میشود.
هر کلمه رشته حداکثر ۲۰ کاراکتری است که از حروف کوچک و بزرگ انگلیسی تشکیل شده است، به انتهای برخی از کلمات حداکثر یکی از کاراکترهای .
یا ؟
یا !
یا,
چسبیده است.
تضمین میشود آخرین کلمه با یکی از کاراکترهای .
یا ؟
یا !
ختم میشود.
تضمین میشود مقدار از طول بزرگترین کلمه داده شده در هر مثال کمتر نخواهد بود.
خروجی خواسته شده در مسئله را مطابق مثالها چاپ کنید. برای نشان دادن ابتدا و انتهای خطوط از کارکتر |
مطابق با مثالها استفاده کنید.
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
در ابتدا حروف انگلیسی بزرگ در تمام کلمات را به حروف کوچک تبدیل کنیم.
سپس حرف اول کلمه اول متن و حرف اول (در صورت وجود) بعد از هر کاراکتر .
، !
یا ؟
را به بزرگ تغییر میدهیم.
در واقع آغاز یک جمله را از پایان جمله قبلی تشخیض میدهیم.
بعد از درست کردن کوچک یا بزرگ بودن کلمات مطابق با الگوریتم گفته شده در سوال کلمات را در خطوط مختلف میریزیم.
حال برای هر خط مطابق با الگوریتم بیان شده در سوال تعدادی فاصله بین کلمات قرار میدهیم تا به رشته مطلوب دست پیدا کنیم.
فرض کنید کلمات در یک تست داده شده باشد.
حال فرض کنید میخواهیم برای یک خط دستور justify
را پیاده سازی کنیم. اکنون فرض کنید
کلمات یک خط باشد.
عرفان به تازگی با مسابقه QFC آشنا شده و تصمیم گرفته امسال در این رقابت شرکت کند؛ از شانس خوب او با آمدن کرونا، این مسابقه به صورت آنلاین برگزار میشود و عرفان که با مسئول برگزاری این مسابقه دوست است میخواهد با کمک او بیشترین سود را از این مسابقه ببرد. نحوه برگزاری مسابقه به شرح زیر است:
درون مسابقه دقیقا ۱۰ سوال قرار دارد و شرکتکنندگان ۳۰۰ دقیقه وقت دارند تا سوالات را حل کنند. بعد از اتمام مسابقه هر شرکتکننده تعدادی سوال را حل میکند (این تعداد میتواند صفر باشد) و به ازای هر سوال حل شده، تعداد ارسالهای اشتباه و زمان حل سوال توسط آن فرد را داریم.
شرکتکنندگان به ترتیب اولویت زیر، رتبهبندی میشوند:
همچنین در پایان مسابقه به افراد، طبق قوانین زیر دلار پرداخت میشود.
در صورت برابری در سه مورد آخر، باز هم مسئول مسابقه وظیفه دارد برنده را مشخص کند و طبیعتا در صورت امکان عرفان را انتخاب میکند. یعنی در صورتی که چند نفر، همزمان یک سوال را به عنوان نفر اول حل کنند، مسئول مسابقه میتواند جایزه را به عرفان دهد.
حال عرفان قبل از شروع مسابقه، سوالات را از مسئول مسابقه گرفته و به ازای هر سوال میداند اگر بخواهد کد آن را بزند چند دقیقه طول میکشد و در مجموع چند ارسال اشتباه خواهد داشت. ممکن است عرفان هرگز نتواند کد آن سوال را بزند!
همچنین عرفان به ازای هر فرد، میداند که چه سوالاتی حل میکند و زمان و تعداد پاسخهای فرستاده شده توسط آن فرد را دارد. توجه کنید برای این که تقلب کردن عرفان مشخص نشود، او باید همیشه کد بزند، مگر این که دیگر نتواند سوالی را حل کند! همچنین عرفان نمیتواند بعد از دقیقه ۳۰۰ هیچ کدی ارسال کند.
حال عرفان از شما میخواهد تا به او بگویید از بین همه حالاتی که برای ترتیب حل سوالات توسط او وجود دارد، حداکثر چه مقداری پول میتواند به دست بیاورد.
در خط اول ورودی تعداد شرکتکنندهها، ، میآید. تضمین میشود مضرب ۱۰ است.
سپس در خط بعدی اطلاعات شرکتکردن همه شرکتکنندهها به جز عرفان میآید. در هر خط وضعیت حل هر سوال توسط آن فرد میآید که با ,
از هم جدا شده است. یعنی به ازای هر سوال، اگر توسط آن فرد حل نشده بود، -
و در غیر این صورت دو عدد و به ترتیب میآید که نشاندهنده زمان حل آن سوال توسط آن فرد و تعداد ارسالهای اشتباه اوست.
سپس در خط آخر، اطلاعات حل سوالات توسط عرفان میآید. اگر عرفان نمیتوانست آن سوال را حل کند، -
و در غیر این صورت به ترتیب، زمان مورد نیاز برای زدن کد آن سوال و تعداد پاسخهای نادرست او میآید.
در یک خط حداکثر پولی که عرفان میتواند به دست آورد را چاپ کنید.
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
اولا که حالات مختلفی که عرفان میتواند، سوالات را حل کند حداکثر است، بنابراین میتوانیم به ازای هر حالت، بررسی کنیم که چند دلار پول میگیرد.
حال سعی میکنیم که به ازای یک حالت بررسی کنیم عرفان چند دلار پول میگیرد. برای این کار دو کلاس Contestant
و Problem
تعریف میکنیم و سعی میکنیم با کمک آنها کد سوال را بزنیم.
اولین کاری که باید برای حل سوال بکنید این است که یک تابع بنویسید که با گرفتن دو شی از نوع Contestant
تشخیص دهد که کدام رتبه بهتری کسب میکند. برای این کار پیشنهاد میکنیم بخش رتبهبندی را با دقت بخوانید و سپس موارد گفته شده را پیادهسازی کنید.
اولا که کلاس Contestant
باید ویژگیهای زیر را داشته باشد:
Problem
هاخود Problem
هم ویژگیهای زیر را دارد.
حال میتوان با خواندن رشتههای ورودی اشیا لازم برای شرکتکننده را ساخت. سپس میتوانید از روی قوانین گفته شده به راحتی تابعی بنویسید که دو شرکتکننده را با هم مقایسه کند.
میتوانید یک نمونه پیادهسازی در زبان C++
را ازینجا ببینید.
امیرمحمد به دلیل اوضاع فعلی، در خانه مانده و حوصلهاش سر رفته است. او میخواهد برای ایجاد سرگرمی و مفید بودن، سیستمی طراحی کند که مانند یک دیتابیس عمل میکند.
هر دیتابیس شامل چند جدول است که از طریق اسم هر جدول، میتوان به آن دسترسی داشت. خود هر جدول شامل چند سطر و چند ستون است؛ به طوری که هر ستون یک عنوان و یک جنس دارد که میتواند رشته یا عدد باشد و محتواهای آن ستون حتما باید از آن جنس باشند.
امیرمحمد میخواهد برای سیستمش، بخش مدیریت کاربر نیز بگذارد به اینصورت که دو سطح دسترسی editor
و viewer
وجود داشته باشد. کاربر با سطح دسترسی editor
میتواند تمام دستورات را انجام دهد ولی کاربر با دسترسی viewer
تنها میتواند دستورات print
و search
را انجام دهد (در ادامه تعریف این دو دستور آمده است) و اگر درخواست انجام دستور دیگری به غیر از این ۲ نوع دستور را داشت، باید عبارت access denied
را چاپ شود.
در ادامه دستورات موجود در این سیستم را میبینید:
این دستور به این معناست که یک کاربر جدید با نام کاربری username
و سطح دسترسی گفته شده، به سیستم اضافه شود. username
یک رشته شامل حروف کوچک انگلیسی میباشد و تضمین میشود که هیچ دو کاربری، نام کاربری یکسان ندارند. تضمین میشود در هر کوئری کاربری که درخواست میدهد، حتما وجود داشته باشد.
برای ایجاد و یا حذف یک جدول به ترتیب از دستورهای زیر استفاده میشود:
که به ترتیب بیانگر این میباشد که کاربر با نام کاربری username
درخواست اضافهکردن و یا حذف یک جدول با نام table_name
را داده است.
همچنین در ابتدا هر جدول که تعریف میشود، هیچ سطر و ستونی وجود ندارد و در ادامه میتوان به آن، سطر و ستون اضافه کرد.
برای اضافه کردن ستون به سمت راست جدول، از دستور زیر استفاده میشود:
که بیانگر این میباشد کاربر با نام کاربری username
به ترتیب، درخواستی برای ایجاد یک ستون با نام column_name
در جدول table_name
کرده و جنس آن ستون هم در کلمه پنجم مشخص میشود؛ هنگامی که یک ستون اضافه میشود، در صورتی از جنس عدد باشد، سطرهای این ستون با مقدار ۰ و در غیراینصورت با رشته null
پر میشوند. (توجه کنید که منظور از رشتهی null
، یک رشتهی به طول ۴ میباشد و نه رشتهی تهی!)
همچنین تضمین میشود در این فرآیند، هیچوقت دو ستون همنام باهم در یک جدول وجود ندارند و همزمان هیچ دو جدولی نام یکسان نیز ندارند.
دستور بعدی، برای حذف کردن یک ستون از جدول میباشد:
که بیانگر این است کاربر با نام کاربری username
درخواست حذف ستون با نام column_name
در جدول با نام table_name
را داده است.
کاربر با نام کاربری username
برای اضافه کردن یک سطر به آخر جدول با نام table_name
از دستور زیر استفاده میکند (در هنگام استفاده از این کوئری تضمین میشود حداقل یک ستون در جدول وجود دارد):
توجه کنید که وقتی یک سطر اضافه میشود، در ستونهایی که از جنس عدد باشند، مقدار ۰ و در باقی ستونها رشته null
گذاشته میشود.(توجه کنید که منظور از رشتهی null
، یک رشتهی به طول ۴ میباشد و نه رشتهی تهی!)
همچنین کاربر با نام کاربری username
در جدول table_name
برای حذف کردن یک ردیف که از بالا به پایین، امین سطر میباشد، از دستور زیر استفاده میکند:
کاربر با نام کاربری username
برای تغییر مقدار خانه واقع در سطر ام و ستون با نام column_name
در جدول table_name
به مقدار value
از دستور زیر استفاده میکند:
توجه کنید که اگر این ستون از جنس عدد باشد، value
عدد است و در غیراینصورت یک رشته از حروف کوچک انگلیسی است.
این سیستم قابلیت این را دارد که بتوان چند ستون از یک جدول را مشخص کرد و جدول را بر اساس ستونهای مشخص شده، به ترتیب اولویت مرتب کرد و در نهایت چاپ کرد.
برای اینکار اگر کاربر با نام کاربری username
بخواهد جدول با نام table_name
را بر اساس ستونهای با نامهای col_1
، col_2
،...، col_k
مرتب کند و سپس جدول را خروجی دهد، از دستور زیر استفاده میکند:
در این دستور، شما باید ردیفهای جدول را به ترتیب بر اساس ستونهای col_1
، col_2
،...،col_k
به ترتیب صعودی مرتب کنید. یعنی ابتدا برحسب ستون col_1
مرتب کنید، سپس ردیفهایی که مقدارشان در ستون col_1
برابر بود، بر اساس مقدارشان در ستون col_2
مرتب کنید و... . همچنین در نهایت اگر دو سطر تمامی مقادیرشان در این ستون یکسان بود، بر اساس زمان اضافه شدن سطرها به جدول مرتبشان کنید (یا به عبارتی دیگر بر اساس اندیس سطرها در جدول اولیه).
در نظر داشته باشید که ترتیب ردیفها در جدول اصلی عوض نمیشود، و با این درخواست صرفا باید جدول مرتب شده بر اساس اولویتها خروجی داده شود.
توجه کنید که اگر یک ستون از جنس رشته باشد، مقادیر آن بر اساس ترتیب کتابخانهای به صورت صعودی مرتب میشوند و در غیر این صورت بر حسب مقدار عددی مرتب میشوند.
کاربر با نام کاربری username
برای خروجی دادن کل جدول table_name
از دستور زیر استفاده میکند: (توجه کنید که در این دستور، سطرهای جدول باید به ترتیب زمان اضافه شدن به جدول، چاپ شوند و نیازی به مرتبسازی نیست)
این سیستم، قابلیت جستوجو بر حسب یک پارامتر خاص نیز دارد. به این صورت که کاربر با نام کاربری username
درخواست میدهد تا تمامی سطرهای جدول table_name
، که مقدار آنها در ستون با نام column_name
دقیقا برابر با value
است، چاپ شوند (توجه کنید که تمامی عناصر آن سطر باید چاپ شوند). برای اینکار از دستور زیر استفاده میکند: (در این دستور، سطرهای جدول باید به ترتیب زمان اضافه شدن به جدول، چاپ شوند)
همچنین اگر این ستون از جنس عدد باشد، value
یک عدد است و اگر جنس این ستون رشته باشد، value
یک رشته است.
تضمین میشود که تنها از دستورات بالا داده میشود و هنگامی که درخواستی داده میشود، تمامی ستونها و جدولهایی که در آن دستور قید شدهاند، وجود دارند و همچنین هیچ دو جدول و هیچ دو ستونی با نام یکسان همزمان وجود ندارند.
در نهایت پس از پایان عملیاتها، در خط آخر ورودی عبارت done
میآید.
پیشنهاد میشود حتما به ورودی نمونه و پاسخ آن دقت کنید.
ورودی شامل تعدادی خط میباشد، که در هر خط، یکی از دستوراتی که در بالا تعریف شدهاند، آمده است.
همچنین در نهایت، در خط آخر ورودی، عبارت done
میآید که برای تشخیص تمام شدن ورودیها میباشد.
تضمین میشود مجموع کاراکترهای ورودی حداکثر میباشد.
همچنین تمامی رشتهها، شامل حروف کوچک انگلیسی میباشند و هیچکدام از اسمهای جدولها، ستونها و... شامل فاصله (space) نمیباشد.
تمامی دستورات معتبر میباشند یعنی اگر اسم جدول یا ستون یا... در یکی از دستورات آورده شود، تضمین میشود حتما آن جدول، ستون یا... وجود دارد.
خانههایی از جدول که از جنس عدد باشند، در بازهی میباشند و همچنین طول رشتهها کمتر مساوی ۵۰ میباشد.
به ازای هر دستور مربوط به print
و search
، جدول را مطابق با دستور داده شده خروجی دهید.
توجه کنید که در خروجی، نام ستونها را نباید چاپ کنید و همچنین هر سطر در یک خط چاپ شود و در هر خط بین مقادیر دو ستون متوالی باید دقیقا یک فاصله (space) باشد.
برای درک بهتر، به مثالهای نمونه توجه کنید.
در ابتدا هنگامی که کاربر sajad
درخواست ساخت جدول میدهد، access denied
چاپ میشود.
در دستورات print
و search
که در ادامه آمدهاند، به ترتیب خروجیهای زیر چاپ میشوند:
در این قسمت راهنماییهای سوال، به مرور اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
برای پیادهسازی راحتتر و اصولیتر این سوال، باید سعی کنید از ساختار شیگرایی استفاده کنید.
برای این منظور، میتوانید یک کلاس داشته باشید که در آن مدیریت جدولها (نگهداری لیست جدولها و حذف و اضافه کردن جدول) انجام شود. همچنین برای هر جدول میتوانید یک کلاس داشته باشید که اطلاعات جدول از قبیل نام ستونها و جنس آنها، محتوای درون هر ردیف یا ستون و... را نگهداری کند.
همچنین برای هر کدام از درخواستهای سوال که مربوط به ایجاد تغییرات در جدول و یا چاپ و جستوجو میباشد، یک تابع تعریف کنید که بتواند آن کار را انجام دهد.
یکی دیگر از بخشهای این سوال که چالش برانگیز است، این است که چگونه ورودی را بخوانیم و تشخیص دهیم که کدام دستور را باید انجام دهیم و اینکه آیا کاربری که کار مورد نظر را میخواهد بکند، دسترسی کافی دارد یا نه (برای تشخیص اینکه access denied
چاپ کنیم یا کار مورد نظر را انجام دهیم).
در هر مرحله، هر خط را ورودی میگیریم و سپس کلمههای آن را بر حسب کاراکتر فاصله (space) از هم جدا میکنیم. برای اینکار میتوانیم خودمان یک تابع بنویسیم که یک رشته ورودی بگیرد و یک آرایه از رشتهها خروجی بدهد و یا همچنین میتوانیم از تابع split استفاده کنیم که در اکثر زبانها وجود دارد.
برای مثال اگر رشتهی world is good
را به آن بدهید و بخواهید بر اساس فاصله جدا کنید، خروجی یک آرایه شامل ۳ عضو world
، is
و good
میباشد.
ابتدا برای چک کردن اینکه درخواست معتبر میباشد یا نه، عضو آخر آرایه را میگیرید (عضو آخر، دقیقا همان username
میباشد) و اگر عضو اول آرایه، برابر print
یا search
نبود، باید چک کنید که username
مورد نظر دسترسی editor
دارد یا نه.
همچنین برای انجام بقیه دستورها هم مشابه بالا میتوانید کار کنید، یعنی با استفاده از دستورهای شرطی (if)، ابتدا برحسب عضو اول آرایه، حالت بندی کنید، سپس دستورهایی که ممکن است کلمه اولشان یکسان باشد را برحسب کلمه دوم یا... مقایسه کنید. به این صورت به سادگی میتوانید دستورهای مختلف را از هم جدا کنید.
در بخش راهنمایی، میخواهیم به نحوه پیاده سازی دستور چاپ کردن جدول بپردازیم.
هنگامی که هر خط ورودی را بر اساس فاصله (space) جدا کنید، در صورتی که کلمه اول برابر با print
باشد، باید جدول را چاپ کنید، اما دو نوع دستور مختلف وجود دارد برای اینکار.
در صورتی که کلمهی سوم برابر با *
باشد، باید تمامی جدول را خروجی دهید و در غیراینصورت باید جدول را به نوع دیگر خروجی دهید. یعنی بر اساس اولویت مرتب سازی کنید.
فرض کنید اولویت اول برحسب ستون col_1
، اولویت دوم برحسب ستون col_2
و در نهایت اولویت ام برحسب ستون col_k
باشد.
میتوانید با استفاده از نوشتن یک تابع compare اینکار را انجام دهید. کار این تابع به این صورت میباشد که دو عنصر میگیرد و سپس خروجیاش این است که عنصر اول بزرگتر است یا عنصر دوم بزرگتر است یا هر دو عنصر مساوی میباشند. شما میتوانید با استفاده از یک حلقه، به ترتیب این دو عنصر را برحسب اولویتها مقایسه کنید.
همچنین روش دوم برای اینکار، این است که ابتدا همهی سطرها را بر حسب اولویت ام مرتب کنید. سپس همهی سطرها را بر حسب اولویت ام مرتب کنید و در نهایت بر حسب اولویت اول مرتب کنید.
توجه کنید که در هر کدام از این دو روش، مرتبسازیای که انجام میدهید، باید stable باشد، یعنی اگر در یکی از مراحل، سطری اندیس و سطر دیگری اندیس داشته باشد ()، در مرحلهی بعد پس از مرتب سازی، در صورتی که این دو سطر در تمامی اولویتها باهم برابر باشند، باز هم سطری که در مرحلهی پیش اندیس داشت، پیش از سطر دیگری آمده باشد. یعنی ترتیب سطرهای برابر عوض نشوند.