استوری پوینت


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

گلابی، یک مدیر فنی منظم و علاقه‌مند به بهینه‌سازی مدیریت تسک‌هاست. او همواره به دنبال روش‌هایی است تا کارها را به شکل بهتر سازماندهی کند و زمان تیمش را به صورت موثرتری مدیریت نماید.

برای مقایسه پیچیدگی تسک‌ها، از واحدی به نام «استوری پوینت» استفاده می‌شود. هرچه استوری پوینت یک تسک بیشتر باشد، آن تسک پیچیده‌تر یا پرریسک‌تر خواهد بود.

برای ساده‌تر شدن تخمین تعداد استوری پوینت‌های یک تسک فنی، معمولاً از اعداد دنباله فیبوناچی استفاده می‌شود. این دنباله با اعداد ۱ و ۲ شروع شده و هر عدد برابر مجموع دو عدد قبلی است. به این ترتیب دنباله به صورت ۱، ۲، ۳، ۵، ۸، ۱۳، ۲۱ و... ادامه می‌یابد. استفاده از این دنباله به دلیل افزایش تدریجی و منطقی آن، در تخمین پیچیدگی تسک‌ها بسیار کارآمد است.

گلابی در جلسات برنامه‌ریزی تیم فنی، درباره تعداد استوری پوینت هر تسک تصمیم‌گیری می‌کند. او می‌داند که برای برگزاری یک مسابقه برنامه‌نویسی، nn استوری پوینت نیاز است و هدفش این است که این مقدار را به کمترین تعداد تسک ممکن تقسیم کند، به طوری که تعداد استوری پوینت هر تسک یکی از اعداد دنباله فیبوناچی باشد. گلابی امیدوار است با این روش برنامه‌ریزی ساده‌تر و کارآمدتری انجام دهد.

ورودی🔗

در تنها خط ورودی، عدد صحیح nn داده می‌شود که تعداد استوری پوینت‌های مورد نیاز برای مسابقه برنامه‌نویسی را مشخص می‌کند.

1n1091 \le n \le 10^9

خروجی🔗

در تنها خط خروجی، کمترین تعداد تسک‌های ممکن را چاپ کنید.

مثال‌ها🔗

ورودی نمونه ۱🔗

4
Plain text

خروجی نمونه ۱🔗

2
Plain text

عدد 44 در دنباله فیبوناچی نیست، اما می‌توان آن را به دو تسک 33 و 11 تقسیم کرد که هر دو جزو دنباله فیبوناچی هستند.

ورودی نمونه ۲🔗

20
Plain text

خروجی نمونه ۲🔗

3
Plain text

عدد 2020 را می‌توان به سه تسک 1313، 55 و 22 تقسیم کرد که همگی در دنباله فیبوناچی قرار دارند.

اشتباهات متداول
چک کردن شرایط ورودی مسئله

نیازی نیست چک کنید شرایط گفته شده در ورودی برقرار است یا نه. توضیحات محدودیت‌ها فقط برای آگاهی شما درباره‌ی تست‌ها و محدودیت‌های مسئله است و قطعاً در ورودی‌های داده شده به برنامه‌ی شما رعایت می‌شوند. پس نیازی نیست بنویسید:

if 1 <= n <= 100:
    # answer of problem
else:
    # print('invalid input')
Python
ابتدا همه‌ی ورودی را گرفتن و در نهایت همه‌ی خروجی را چاپ کردن

شما می‌توانید لابه‌لای دریافت ورودی، خروجی دهید. پس نیازی نیست ابتدا همه‌ی ورودی‌ها را دریافت کنید و در نهایت همه‌ی خروجی‌ها را چاپ کنید. مخصوصاً برای سوالاتی که باید به چندین سوال پاسخ دهید، می‌توانید دو قسمت ورودی و خروجی را کاملاً مستقل در نظر بگیرید و مطمئن باشید تداخلی پیش نمی‌آید.

چاپ کردن موارد اضافه برای دریافت ورودی

لطفاً از چاپ کردن موارد اضافه مثل please enter a number برای دریافت ورودی پرهیز کنید. برای مثال در زبان پایتون نباید بنویسید:

input('please enter:')
Python
چند فایلی کد زدن

برای زبان‌هایی مثل جاوا نباید در بالای کد شما آدرس پکیج داده شود. برای مثال در بالای کد خود نباید بنویسید:

package ir.quera.contest;
Java
استفاده از چند Scanner برای دریافت ورودی

در زبان جاوا، باید فقط یک شئ از جنس Scanner تعریف کنید و همه‌ی ورودی‌ها را با آن دریافت کنید.

نام فایل ارسالی در جاوا

در زبان جاوا، باید نام فایل ارسالی شما با نام کلاسی که تابع main در آن قرار دارد یکسان باشد، برای مثال اگر نام کلاس شما Question1 است، نام فایل ارسالی شما باید Question1.java باشد.

نحوه‌ی دریافت ورودی و چاپ کردن خروجی

برای آشنایی بیشتر برای نحوه‌ی دریافت ورودی و چاپ کردن خروجی این لینک را مطالعه کنید.

تراکنش‌های بهینه


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

در شهر شکرستان nn بانک وجود دارد. هر روز تعدادی تراکنش مالی میان بانک‌ها باید اتفاق بیافتد. گلابی که رئیس بانک مرکزی شکرستان است متوجه شده که مجموع تراکنش‌های بین بانک‌ها امکان دارد خیلی زیاد باشد برای همین دنبال کم کردن مجموع مبلغ آن‌ها است.

او تراکنش‌های مالی میان بانک‌ها در هر روز را می‌بیند و سعی می‌کند با کمترین مجموع مبلغ تراکنش، تراکنش مالی میان بانک‌ها را انجام بدهد.

به او کمک کنید که این کار را انجام دهد طوری که شرایط بالا رعایت شود. توجه کنید نیازی نیست تعداد تراکنش‌ها کمینه شود بلکه باید مجموع مبلغ کل تراکنش‌ها کمینه باشد.

ورودی🔗

در خط اول به ترتیب دو عدد nn و mm ورودی داده می‌شود که nn تعداد بانک‌های شهر شکرستان است و mm تعداد تراکنش‌های مالی میان بانک‌ها در آن روز است.

1n10001 \leq n \leq 1000 0m1050 \le m \le 10^5

در mm خط بعد در هر خط به ترتیب سه عدد uu و vv و ww داده می‌شود که نشان دهنده‌ی این است که در این تراکنش ww همت (هزار میلیارد تومان) از بانک uu به بانک vv باید انتقال داده شود.

1u,vn,uv1 \leq u, v \leq n, \quad u \neq v 1w109 1 \le w \le 10^9

خروجی🔗

در خط اول ورودی عدد kk که تعداد تراکنش برای انجام تراکنش‌های مالی میان بانک‌ها است را خروجی دهید.

0k1050 \leq k \leq 10^5

سپس در هرکدام از kk خط بعدی به ترتیب سه عدد uu و vv و ww را خروجی دهید. که نشان‌ دهنده‌ی این هستند که در این تراکنش ww همت (هزار میلیارد تومان) از بانک uu به بانک vv انتقال داده می‌شود.

1u,vn,uv1 \leq u, v \leq n, \quad u \neq v 1w10141 \leq w \leq 10^{14}

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

مثال‌ها🔗

ورودی نمونه ۱🔗

5 7
1 2 10
1 3 4
2 3 9
3 2 8
3 5 9
4 3 2
2 5 4
Plain text

خروجی نمونه ۱🔗

4
1 2 5
1 5 9
3 5 2
4 5 2
Plain text

ورودی نمونه ۲🔗

3 3
1 2 10
2 3 10
3 1 10
Plain text

خروجی نمونه ۲🔗

0
Plain text

ورودی نمونه ۳🔗

3 2
1 2 10
2 3 7
Plain text

خروجی نمونه ۳🔗

2
1 2 3
1 3 7
Plain text

مقایسه‌ی بزرگ


  • محدودیت زمان: ۳ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

یک رشته‌ی باینری به نام ss داریم که فقط شامل کاراکترهای 0 و 1 است. هدف این است که به qq پرسش درباره این رشته پاسخ دهیم.

پرسش‌ها به دو نوع تقسیم می‌شوند:

  1. جستجوی زیررشته: در این حالت، یک رشته‌ی باینری tt داده می‌شود و باید بررسی کنیم آیا این رشته به عنوان زیررشته‌ای متوالی در ss ظاهر شده است یا خیر.
  2. تغییر کاراکتر: در این حالت، عدد صحیح kk داده می‌شود و باید کاراکتر kkام رشته ss را معکوس کنیم (یعنی 0 به 1 و 1 به 0 تبدیل شود).

ورودی🔗

در سطر اول ورودی، دو عدد صحیح و مثبت nn و qq داده می‌شود که به‌ترتیب طول رشته‌ی ss و تعداد پرسش‌ها را نشان می‌دهد.

1n,q1051 \leq n, q \leq 10^5

در سطر دوم ورودی، یک رشته از nn کاراکتر 0 یا 1 داده می‌شود که مقدار رشته‌ی ss را نشان می‌دهد.

در qq سطر بعدی، در هر سطر یکی از دو حالت زیر ورودی داده می‌شود.

  • t\text{? } t

که به‌جای tt رشته‌ی باینری داده می‌شود.

  • k\text{! } k

که به‌جای kk یک عدد صحیح داده می‌شود. 1t101 \leq |t| \leq 10 1kn1 \leq k \leq n

تضمین می‌شود حداقل یک پرسش از نوع اول داده شود.

خروجی🔗

برای هر پرسش از نوع ?? در صورت وجود رشته‌ی داده شده YES و در غیر این صورت NO چاپ کنید.

توجه کنید سیستم داوری نسبت به بزرگ و کوچک بودن حروف حساس است.

مثال‌ها🔗

ورودی نمونه ۱🔗

5 6
01010
? 111
? 010
? 000
! 3
? 111
? 110
Plain text

خروجی نمونه ۱🔗

NO
YES
NO
YES
YES
Plain text

ورودی نمونه ۲🔗

6 7
010110
? 01101
! 3
? 1111
! 4
? 01101
? 1
? 0
Plain text

خروجی نمونه ۲🔗

NO
YES
YES
YES
YES
Plain text

آینه‌ی مشترک


  • محدودیت زمان: ۲ ثانیه
  • محدودیت حافظه: ۵۱۲ مگابایت

دو کلمه‌ی ss و tt به‌صورت رشته داده شده است. زیرکلمه به معنای رشته‌ای است که از حذف تعدادی (شاید هیچ) حرف از یک کلمه به‌دست می‌آید. به‌عنوان مثال، از کلمه‌ی behpardakht می‌توان زیرکلمات bera یا hard را به‌عنوان زیرکلمه در نظر گرفت ولیpardeh زیرکلمه‌ی آن نیست.

یک کلمه آینه‌ای است اگر با برعکس کردن حروف آن، همان کلمه‌ی اولیه به‌دست آید. به‌عنوان مثال، کلمات level از نوع کلمات آینه‌ای هستند.

هدف ما این است که تعیین کنیم آیا با تغییر حداکثر kk حرف در کلمات ss و یا tt، می‌توان طول بزرگ‌ترین زیرکلمه‌ی مشترک بین ss و tt که آینه‌ای باشد را پیدا کرد. به عبارت دیگر، می‌خواهیم طول بیشینه‌ی زیرکلمه‌ای که هم در ss و هم در tt به‌عنوان زیررشته غیرمتوالی وجود داشته باشد و همچنین آینه‌ای باشد را تعیین کنیم، به شرطی که بتوانیم حداکثر kk حرف از هر دو کلمه را تغییر دهیم.

ورودی🔗

در سطر اول ورودی، عدد صحیح و مثبت kk آمده که تعداد تغییرات را نشان می‌دهد.

0k600 \leq k \leq 60

در سطر دوم ورودی، رشته‌ی ss از حروف کوچک انگلیسی داده می‌شود. در سطر سوم ورودی، رشته‌ی tt از حروف کوچک انگلیسی داده می‌شود.

1s,t301 \leq |s|, |t| \leq 30

خروجی🔗

در تنها سطر خروجی، طول بزرگ‌ترین زیررشته‌ی مشترک آینه‌ای را چاپ کنید.

مثال‌ها🔗

ورودی نمونه ۱🔗

3
quera
behpardakht
Plain text

خروجی نمونه ۱🔗

4
Plain text

می‌توانیم با 22 تغییر رشته‌ quera را به aurraتبدیل کنیم. همچنین با 11 تغییر می‌توانیم رشته behpardakht را به behparrakht تغییر دهیم. به این ترتیب در مجموع 2+1=32 + 1 = 3 تغییر انجام دادیم و بزرگ‌ترین زیررشته‌ی پالیندروم مشترک arra می‌شود.

ورودی نمونه ۲🔗

1
mississippis
sicilian
Plain text

خروجی نمونه ۲🔗

5
Plain text

می‌توانیم با 11 تغییر رشته‌ sicilian را به siciliasتبدیل کنیم. بزرگ‌ترین زیررشته‌ی پالیندروم مشترک siiis می‌شود.

شبیه‌ساز خودپرداز


شما باید یک سیستم شبیه‌سازی خودپرداز (ATM) طراحی کنید که بتواند تراکنش‌های مالی شامل ثبت‌نام کاربر، ورود به سیستم، برداشت، واریز و انتقال وجه [و استعلام موجودی] را پردازش کند. علاوه بر آن، سیستم باید قادر به مدیریت و ثبت گزارش و لاگ‌های مختلف باشد و امکان کوئری زدن روی این لاگ‌ها را فراهم کند.

در این سیستم، هر لاگ سه ویژگی سطح لاگ (level)، پیام (message) و زمان ایجاد (timestamp) دارد.

همچنین سه سطح لاگ قابل ثبت است. هرکدام از این نوع لاگ‌ها، در شرایطی قابل ثبت هستند و کاربردهای متفاوتی دارند.

سطوح لاگ‌ها🔗

  1. لاگ ERROR (خطا):

    • مواردی که به دلیل مشکل جدی یا ناموفق بودن عملیات رخ داده‌اند.
    • مثال: خطای insufficient funds یا invalid credentials.
  2. لاگ INFO (اطلاعات):

    • اطلاعات عمومی مربوط به رخدادهای موفق و معمولی سیستم.
    • مثال: موفقیت در login یا deposit.
  3. لاگ DEBUG (دیباگ):

    • اطلاعات دقیق‌تر و فنی برای ردیابی مشکلات یا رفتارهای سیستم.
    • مثال: session created یا amount updated.

نشست (Session)🔗

نشست (Session) در برنامه‌های کاربردی، به‌ویژه در سیستم‌های تحت وب به دوره‌ای از ارتباط فعال بین کاربر و سیستم گفته می‌شود که در آن اطلاعاتی موقت ذخیره و مدیریت می‌شود. نشست‌ها معمولاً برای شناسایی کاربران، حفظ وضعیت تعامل آن‌ها با سیستم، و مدیریت امنیت به کار می‌روند. هر نشست در این سیستم ویژگی‌های زیر را دارد:

  1. شناسه یکتا (Session ID):

    • یک نشست با یک شناسه یکتا مشخص می‌شود. در سیستم ما Session ID به‌صورت یک شمارنده افزایشی (شروع از ۱) تولید می‌شود.
  2. مدت اعتبار (Expiration):

    • نشست‌ها موقتی هستند و تا زمانی معتبرند که کاربر با سیستم تعامل داشته باشد یا زمان انقضای مشخص‌شده به پایان نرسد.
    • در این سیستم، اگر از زمان ورود بیش از ۱۰ دقیقه (۶۰۰ ثانیه) گذشته باشد، نشست منقضی می‌شود.
    • زمان انقضای هر نشست تنها در هنگام اجرای دستورات بررسی می‌شود.
  3. در این سیستم، هر کاربر تنها دارای یک نشست فعال است.

دستورهای مجاز🔗

  1. register <user> <password> <role> <timestamp>
  2. login <user> <password> <timestamp>
  3. logout <session> <timestamp>
  4. withdraw <session> <amount> <timestamp>
  5. deposit <session> <amount> <timestamp>
  6. transfer <session> <target_user> <amount> <timestamp>
  7. log <level> <starttime> <finishtime> <timestamp>

هر یک از این دستورات، در واقع شبیه‌سازی انجام آنها در واقعیت است. در ادامه، عملکرد هر دستور را به طور کامل شرح می‌دهیم.

ثبت‌نام
register <user> <password> <role> <timestamp>
Plain text

این دستور کاربر جدیدی را با اطلاعات زیر ثبت می‌کند:

  • <user>: نام کاربری.
  • <password>: رمز عبور.
  • <role>: نقش کاربر که می‌تواند "admin" یا "user" باشد.
  • <timestamp>: زمان ثبت‌نام به فرمت yyyy/MM/dd:HH:mm:ss.

نام کاربری به ازای هر کاربر منحصر به فرد است. همچنین موجودی اولیه تمام کاربرانی که ثبت‌نام می‌کنند، در ابتدا صفر می‌باشد. اگر کاربر قبلاً ثبت شده باشد، لاگ خطای "user already registered" از نوع ERROR ثبت شود و اطلاعات آن کاربر در سیستم ثبت نشود. در غیر این‌صورت، لاگ اطلاعات "user registered successfully" از نوع INFO ثبت شود.

ورود به حساب
login <user> <password> <timestamp>
Plain text

کاربر با نام کاربری و رمز عبور معتبر وارد سیستم می‌شود:

  • اگر نام کاربری یا رمز عبور نادرست باشد، لاگ خطای "invalid credentials" با نوع ERROR ثبت کنید.
  • اگر کاربر قبلاً وارد شده باشد، لاگ اطلاعات "already logged in" با نوع INFO ثبت کنید. سپس در صورتی که از نشست (session) قبلی بیش از ۱۰ دقیقه زمان گذشته باشد، یک نشست جدید برای آن کاربر ایجاد و نشست قبلی حذف شود. در غیر این صورت، تغییری در سیستم ایجاد نخواهد شد و کاربر وارد حسابش می‌شود.
  • در صورتی که هیچ یک از شرایط بالا برقرار نبود، یک نشست جدید ساخته شده، کاربر وارد حساب می‌شود و یک لاگ INFO با پیام "user logged in successfully" ثبت می‌شود.

مکانیزم تولید session ID:برای هر ورود موفق، یک شناسه یکتا (session ID) به کاربر اختصاص داده می‌شود. این شناسه در واقع یک شمارنده افزایشی با شروع از ۱ است و به ازای هر ورود کاربران، یکی افزایش پیدا می‌کند.

خروج از حساب
logout <session ID> <timestamp>
Plain text

این دستور کاربر را از سیستم خارج می‌کند و session مربوط به او را از حافظه حذف می‌کند:

  • اگر شناسه نشست معتبر نباشد یا منقضی شده باشد، لاگ "session expired or invalid" با نوع ERROR ثبت می‌شود.
  • در غیر این صورت لاگ INFO با پیام "user logged out" ثبت شود.
برداشت وجه
withdraw <session ID> <amount> <timestamp>
Plain text

این دستور به کاربر اجازه برداشت مبلغ مشخصی به اندازه amoumt از حساب را می‌دهد:

  • <session>: شناسه نشست کاربر.
  • <amount>: مبلغ برداشت.
  • <timestamp>: زمان درخواست.

قوانین:

  • اگر نشست منقضی شده باشد (حداقل ۱۰ دقیقه از ورود گذشته باشد)، لاگ "session expired" با نوع ERROR ثبت شود.
    • محاسبه انقضا: از اختلاف زمانی بین <timestamp> اجرای دستور و زمان ورود (login) استفاده کنید. سیستم باید از فرمت زمانی yyyy/MM/dd:HH:mm:ss استفاده کند.
  • اگر موجودی کافی نباشد، لاگ"insufficient funds" با نوع ERROR ثبت می‌شود.
  • در صورت برداشت موفقیت‌آمیز، لاگ INFO با پیام "amount withdrawn successfully" ثبت شود.
واریز وجه
deposit <session ID> <amount> <timestamp>
Plain text

مبلغ مشخصی را به حساب کاربر اضافه می‌کند.

  • اگر نشست منقضی شده باشد، لاگ "session expired" با نوع ERROR ثبت شود.
  • در غیر این صورت لاگ INFO با پیام "amount deposited successfully" ثبت شود.
انتقال
transfer <session ID> <target_user> <amount> <timestamp>
Plain text

این دستور به کاربران اجازه می‌دهد مبلغی را از حساب خود به حساب کاربر دیگری انتقال دهند:

  • <session>: شناسه نشست کاربر فرستنده.
  • <target_user>: نام کاربری دریافت‌کننده.
  • <amount>: مبلغ انتقال.
  • <timestamp>: زمان درخواست.

قوانین:

  1. اگر نشست منقضی شده باشد، لاگ "session expired" با نوع ERROR ثبت شود.
  2. اگر کاربر دریافت‌کننده ثبت نشده باشد، لاگ "target user not found" با نوع ERROR ثبت کنید.
  3. اگر موجودی کافی نباشد، خطای "insufficient funds" با نوع ERROR ثبت کنید.
  4. شرایط بالا، از اول به آخر بررسی شوند و در صورتی که تناقضی در هر یک از شرایط به وجود بیاید، ادامه روند متوقف شود.
  5. در صورت انتقال موفقیت‌آمیز، لاگ INFO با پیام "amount transferred successfully" ثبت شود.
بررسی لاگ‌ها
log <level> [<t1>] [<t2>] <timestamp>
Plain text

این دستور برای کوئری زدن روی لاگ‌های سیستم استفاده می‌شود:

  • <level>: سطح لاگ که می‌تواند error، info یا debug باشد.
  • <t1> و <t2>: بازه زمانی که لاگ‌ها باید در آن جستجو شوند. این پارامترها اختیاری هستند؛ اگر t1 و t2 ارائه نشود، همه لاگ‌های موجود با سطح مشخص‌شده بدون توجه به زمان بازگردانده شوند.
  • <timestamp>: زمان ارسال درخواست برای اجرای دستور log است.
  • بلافاصله پس از اجرای دستور، یک لاگ get log [level] [t1] [t2] [timestamp] با نوع DEBUG در سیستم ثبت و در کنسول چاپ شود.

خروجی:

  1. خروجی شامل تمام لاگ‌هایی است که:
    • سطح لاگ آن‌ها برابر با <level> است.
    • زمان ثبت لاگ در بازه [<t1>, <t2>] قرار دارد.
  2. فرمت چاپ لاگ‌ها در کنسول به صورت زیر است:
    <timestamp> <level> <message>
    Plain text
  3. اگر لاگی پیدا نشود، خروجی "no logs found" در کنسول چاپ شود.

نکات قابل توجه🔗

  1. پس از انجام هر نوع عملیات، لاگ آن در سیستم ثبت می‌شود. همچنین پس از ثبت لاگ، خروجی آن با فرمت

    [log-type] log-message
    Plain text

    در کنسول چاپ می‌شود.

  2. هر دستور، یک پارامتر <timestamp> با فرمت زمانی yyyy/MM/dd:HH:mm:ss دارد که نشان می‌دهد آن دستور در چه زمانی اجرا شده است. از این زمان باید در دستور log برای فیلتر کردن لاگ‌ها استفاده کنید.

  3. دستورات نامعتبر:

    • همه دستورات با حروف کوچک وارد می‌شوند.
    • اگر دستور داده‌شده فرمت اشتباهی داشته باشد یا آرگومان‌های کافی نداشته باشد، سیستم باید به صورت داخلی آن را نادیده بگیرد.
  4. ورودی تضمین‌شده:

    • ورودی‌ها به ترتیب زمانی داده می‌شوند، بنابراین نیازی به بررسی ترتیب زمان‌ها نیست.
    • هیچ دو اتفاقی به طور همزمان رخ نمی‌دهد.
  5. برای گرفتن امتیاز کامل، به کوچکی یا بزرگی حروف در خروجی دقت کنید.

  6. در صورتی که هر یک از بخش‌های مسئله را به درستی پیاده‌سازی کردید، امتیاز آن را مستقل از سایر بخش‌ها خواهید گرفت. (البته، دقت کنید برای دریافت امتیاز عملیات withdraw، ابتدا باید عملیات deposit به درستی پیاده‌سازی شود.)

ورودی🔗

سطر اول ورودی شامل یک عدد صحیح و مثبت nn است که تعداد سطرهای ورودی را نشان می‌دهد. 1n10001≤n≤1000 در nn سطر بعدی، هر سطر شامل یکی از دستورهای بالا است.

خروجی🔗

خروجی‌های خواسته شده برای هر دستور را به ترتیب چاپ کنید.

مثال‌ها🔗

ورودی نمونه ۱🔗

10
register user1 pass1 user 2025/01/08:09:00:00
register user2 pass2 user 2025/01/08:09:01:00
login user1 pass1 2025/01/08:09:02:00
deposit 1 300 2025/01/08:09:03:00
withdraw 1 500 2025/01/08:09:04:00
transfer 1 user3 100 2025/01/08:09:05:00
logout 1 2025/01/08:09:06:00
login user1 wrongpass 2025/01/08:09:07:00
login user2 pass2 2025/01/08:09:08:00
log error 2025/01/08:09:00:00 2025/01/08:09:10:00 2025/01/08:09:09:00
Plain text

خروجی نمونه ۱🔗

[INFO] user registered successfully
[INFO] user registered successfully
[INFO] user logged in successfully
[INFO] amount deposited successfully
[ERROR] insufficient funds
[ERROR] target user not found
[INFO] user logged out
[ERROR] invalid credentials
[INFO] user logged in successfully
2025/01/08:09:04:00 ERROR insufficient funds
2025/01/08:09:05:00 ERROR target user not found
2025/01/08:09:07:00 ERROR invalid credentials
[DEBUG] get log error 2025/01/08:09:00:00 2025/01/08:09:10:00
Plain text

ورودی نمونه ۲🔗

10
register user1 password1 user 2025/01/08:10:00:00
register user2 password2 user 2025/01/08:10:01:00
register admin1 adminpass admin 2025/01/08:10:02:00
login user1 password1 2025/01/08:10:03:00
deposit 1 500 2025/01/08:10:04:00
withdraw 1 100 2025/01/08:10:05:00
transfer 1 user2 200 2025/01/08:10:06:00
logout 1 2025/01/08:10:07:00
login user2 password2 2025/01/08:10:08:00
log info 2025/01/08:10:00:00 2025/01/08:10:10:00 2025/01/08:10:09:00
Plain text

خروجی نمونه ۲🔗

[INFO] user registered successfully
[INFO] user registered successfully
[INFO] user registered successfully
[INFO] user logged in successfully
[INFO] amount deposited successfully
[INFO] amount withdrawn successfully
[INFO] amount transferred successfully
[INFO] user logged out
[INFO] user logged in successfully
2025/01/08:10:00:00 INFO user registered successfully
2025/01/08:10:01:00 INFO user registered successfully
2025/01/08:10:02:00 INFO user registered successfully
2025/01/08:10:03:00 INFO user logged in successfully
2025/01/08:10:04:00 INFO amount deposited successfully
2025/01/08:10:05:00 INFO amount withdrawn successfully
2025/01/08:10:06:00 INFO amount transferred successfully
2025/01/08:10:07:00 INFO user logged out
2025/01/08:10:08:00 INFO user logged in successfully
[DEBUG] get log info 2025/01/08:10:00:00 2025/01/08:10:10:00
Plain text