- محدودیت زمان: ۱ ثانیه
- محدودیت حافظه: ۲۵۶ مگابایت
رشته <x>
را یک «تگ باز» تعریف میکنیم هر گاه در آن x
یک رشته متشکل از حروف الفبای کوچک و یا بزرگ لاتین به طول دلخواه باشد. هر تگ باز به یک «تگ بسته» به شکل </x>
منتهی میشود که x
همان رشته است.
تگها را میتوان در یکدیگر تودرتو کرد: در چنین شرایطی یک جفت تگ باز و بسته درون یک جفت دیگر قرار میگیرد.
بیایید تعریفی استقرایی برای مفهومی به نام «متن XML» ارائه دهیم:
- رشته تهی یک متن XML محسوب میشود.
- چنانچه
s
یک متن XML باشد آنگاه<a>s</a>
نیز یک متن XML است هر گاهa
یک رشته متشکل از حروف الفبای کوچک و یا بزرگ لاتین به طول دلخواه باشد. - اگر
s
وt
دو متن XML باشند آنگاهst
که متن حاصل از الحاق آنها است نیز یک متن XML است.
یک متن را «معتبر» میخوانیم چنانچه منحصراً با استفاده از قوانین فوق ساخته شده باشد.
همچنین یک متن در صورتی «معتبر کثیف» است که حاوی کاراکترهای فاصله خالی (+) اضافی باشد اما پس از حذف این کاراکترهای اضافی از تعریف متن XML پیروی کند. عمل حذف همه این کاراکترهای فاصله خالی «تمیزسازی» نامیده میشود.
به شما آدرس فایلی حاوی یک متن معتبر کثیف داده میشود و کار شما این است که:
- آن را فقط تمیز کنید (minify).
یا
- علاوه بر اینکه آن را تمیز میکنید آن را به شکل «مرتب» نیز درآورید (prettify).
متنی «مرتب» است که در آن
- هر تگ (باز یا بسته) در یک خط جدا قرار میگیرد.
- قبل از تگ
$2h$ فاصله خالی پرینت شود که در آن$h$ عمق تودرتو بودن تگ است.
در نهایت نتیجه را میبایست در آدرس خروجی که به شما داده میشود ذخیره کنید.
در خط اول ورودی آدرس فایل ورودی و در خط دوم آدرس فایل خروجی میآید. ممکن است آدرسها شامل کاراکتر فاصله باشند. همچنین این امکان وجود دارد که فایل ورودی موجود نباشد و یا همه پوشههای پدر فایل خروجی موجود نباشند.
در خط سوم دستور میآید که فقط دستورات جدول زیر معتبر است.
دستور | عملکرد |
---|---|
minify | محتوای فایل ورودی را فقط «تمیز» کنید. |
prettify | محتوای فایل ورودی را «تمیز» و «مرتب» کنید. |
فایل ورودی حاوی متنی معتبر است که ممکن است کثیف باشد. تضمین میشود که تعداد کاراکترهای موجود در فایل ورودی از
متن پس از اعمال دستور درخواستی باید در آدرسی که در ورودی داده شده است ذخیره شود.
با این حال در صورتی که هر کدام از خطاهای زیر اتفاق افتاد با استفاده از دستور cerr
پیام مربوط به آن را در خروجی ترمینال چاپ کنید و اجرای برنامه را به پایان برسانید.
اولویت | علت خطا | پیام خطا |
---|---|---|
۱ | مشکلی در خواندن فایل ورودی وجود دارد. | Input file opening failed! |
۲ | مشکلی در دستیابی به مسیر فایل خروجی وجود دارد. | Output file opening failed! |
۲ | دستوری که داده شده است معتبر نیست. | Invalid command! |
برای عمل تمیزسازی تابعی به شکل زیر اعلان کنید.
void minify (ifstream& fin, ofstream& fout);
برای اعمال تمیزسازی و مرتبسازی بهصورت همزمان تابعی به شکل زیر اعلان کنید.
void prettify (ifstream& fin, ofstream& fout);
رسیدگی به فایلهای ورودی و خروجی (شامل باز و بسته کردن فایلها) میبایست خارج از بدنه توابع فوق و داخل تابع main
انجام شود.
tests/in/1.xml
tests/out/1.xml
prettify
که در آن فایل tests/in/1.xml
به شکل زیر است:
<a><b><c></c><d></d></b></a>
تنها خروجی برنامه فایل tests/out/1.xml
است که به شکل زیر میباشد:
<a>
<b>
<c>
</c>
<d>
</d>
</b>
</a>
in.xml
out.xml
minify
که در آن فایل in.xml
محتویات زیر را دارد:
<Aa>
< b>
</b ><d>
<c> </ c>
</d></Aa>
تنها خروجی برنامه فایل out.xml
است که به شکل زیر میباشد:
<Aa><b></b><d><c></c></d></Aa>
input.xml
outputs/output.xml
prettify
که در آن پوشهای با آدرس outputs
وجود ندارد.
با توجه به اینکه پوشه پدر فایل خروجی موجود نیست خطای ۲ در خروجی ترمینال چاپ میشود:
Output file opening failed!