Skip to content

Latest commit

 

History

History
156 lines (106 loc) · 6.13 KB

prettify-it.md

File metadata and controls

156 lines (106 loc) · 6.13 KB
  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

رشته <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 محتوای فایل ورودی را «تمیز» و «مرتب» کنید.

فایل ورودی حاوی متنی معتبر است که ممکن است کثیف باشد. تضمین می‌شود که تعداد کاراکترهای موجود در فایل ورودی از $10^4$ تجاوز نمی‌کند.

خروجی

متن پس از اعمال دستور درخواستی باید در آدرسی که در ورودی داده شده است ذخیره شود.

با این حال در صورتی که هر کدام از خطاهای زیر اتفاق افتاد با استفاده از دستور 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!