سلام دوست عزیز😃👋
به «مسابقه استخدامی بهپرداخت ملت» خوش آمدی!
هرگونه ارتباط با سایر شرکتکنندگان و یا استفاده از ابزارهای تولید کد، مثل chatGPT
و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکتکنندگان مسابقه حذف میشوید.
لینکهای مفید برای شرکت در مسابقه:
سوالات و مشکلات خودتان را میتوانید از طریق قسمت «سوال بپرسید» با ما در میان بگذارید.
C++
یا Java
برای استخدام در بهپرداخت الزامی است.Pypy 3
بهجای Python 3.12
استفاده کنید.موفق باشید و بهتون خوش بگذره 😉✌
لیست سوالات را میتوانید از نوار سمت راست این صفحه مشاهده کنید.
شما باید یک سیستم شبیهسازی خودپرداز (ATM) طراحی کنید که بتواند تراکنشهای مالی شامل ثبتنام کاربر، ورود به سیستم، برداشت، واریز و انتقال وجه [و استعلام موجودی] را پردازش کند. علاوه بر آن، سیستم باید قادر به مدیریت و ثبت گزارش و لاگهای مختلف باشد و امکان کوئری زدن روی این لاگها را فراهم کند.
در این سیستم، هر لاگ سه ویژگی سطح لاگ (level
)، پیام (message
) و زمان ایجاد (timestamp
) دارد.
همچنین سه سطح لاگ قابل ثبت است. هرکدام از این نوع لاگها، در شرایطی قابل ثبت هستند و کاربردهای متفاوتی دارند.
لاگ ERROR
(خطا):
insufficient funds
یا invalid credentials
.لاگ INFO
(اطلاعات):
login
یا deposit
.لاگ DEBUG
(دیباگ):
session created
یا amount updated
.نشست (Session) در برنامههای کاربردی، بهویژه در سیستمهای تحت وب به دورهای از ارتباط فعال بین کاربر و سیستم گفته میشود که در آن اطلاعاتی موقت ذخیره و مدیریت میشود. نشستها معمولاً برای شناسایی کاربران، حفظ وضعیت تعامل آنها با سیستم، و مدیریت امنیت به کار میروند. هر نشست در این سیستم ویژگیهای زیر را دارد:
شناسه یکتا (Session ID
):
Session ID
بهصورت یک شمارنده افزایشی (شروع از ۱) تولید میشود.مدت اعتبار (Expiration
):
در این سیستم، هر کاربر تنها دارای یک نشست فعال است.
register <user> <password> <role> <timestamp>
login <user> <password> <timestamp>
logout <session> <timestamp>
withdraw <session> <amount> <timestamp>
deposit <session> <amount> <timestamp>
transfer <session> <target_user> <amount> <timestamp>
log <level> <starttime> <finishtime> <timestamp>
هر یک از این دستورات، در واقع شبیهسازی انجام آنها در واقعیت است. در ادامه، عملکرد هر دستور را به طور کامل شرح میدهیم.
این دستور کاربر جدیدی را با اطلاعات زیر ثبت میکند:
<user>
: نام کاربری.<password>
: رمز عبور.<role>
: نقش کاربر که میتواند "admin"
یا "user"
باشد.<timestamp>
: زمان ثبتنام به فرمت yyyy/MM/dd:HH:mm:ss
.نام کاربری به ازای هر کاربر منحصر به فرد است. همچنین موجودی اولیه تمام کاربرانی که ثبتنام میکنند، در ابتدا صفر میباشد.
اگر کاربر قبلاً ثبت شده باشد، لاگ خطای "user already registered"
از نوع ERROR
ثبت شود و اطلاعات آن کاربر در سیستم ثبت نشود. در غیر اینصورت، لاگ اطلاعات "user registered successfully"
از نوع INFO
ثبت شود.
کاربر با نام کاربری و رمز عبور معتبر وارد سیستم میشود:
"invalid credentials"
با نوع ERROR
ثبت کنید."already logged in"
با نوع INFO
ثبت کنید. سپس در صورتی که از نشست (session
) قبلی بیش از ۱۰ دقیقه زمان گذشته باشد، یک نشست جدید برای آن کاربر ایجاد و نشست قبلی حذف شود. در غیر این صورت، تغییری در سیستم ایجاد نخواهد شد و کاربر وارد حسابش میشود.INFO
با پیام "user logged in successfully"
ثبت میشود.مکانیزم تولید session ID
:برای هر ورود موفق، یک شناسه یکتا (session ID
) به کاربر اختصاص داده میشود. این شناسه در واقع یک شمارنده افزایشی با شروع از ۱ است و به ازای هر ورود کاربران، یکی افزایش پیدا میکند.
این دستور کاربر را از سیستم خارج میکند و session
مربوط به او را از حافظه حذف میکند:
"session expired or invalid"
با نوع ERROR
ثبت میشود.INFO
با پیام "user logged out"
ثبت شود.این دستور به کاربر اجازه برداشت مبلغ مشخصی به اندازه amoumt
از حساب را میدهد:
<session>
: شناسه نشست کاربر.<amount>
: مبلغ برداشت.<timestamp>
: زمان درخواست.قوانین:
"session expired"
با نوع ERROR
ثبت شود.<timestamp>
اجرای دستور و زمان ورود (login
) استفاده کنید. سیستم باید از فرمت زمانی yyyy/MM/dd:HH:mm:ss
استفاده کند."insufficient funds"
با نوع ERROR
ثبت میشود.INFO
با پیام "amount withdrawn successfully"
ثبت شود.مبلغ مشخصی را به حساب کاربر اضافه میکند.
"session expired"
با نوع ERROR
ثبت شود.INFO
با پیام "amount deposited successfully"
ثبت شود.این دستور به کاربران اجازه میدهد مبلغی را از حساب خود به حساب کاربر دیگری انتقال دهند:
<session>
: شناسه نشست کاربر فرستنده.<target_user>
: نام کاربری دریافتکننده.<amount>
: مبلغ انتقال.<timestamp>
: زمان درخواست.قوانین:
"session expired"
با نوع ERROR
ثبت شود. "target user not found"
با نوع ERROR
ثبت کنید."insufficient funds"
با نوع ERROR
ثبت کنید.INFO
با پیام "amount transferred successfully"
ثبت شود.این دستور برای کوئری زدن روی لاگهای سیستم استفاده میشود:
<level>
: سطح لاگ که میتواند error
، info
یا debug
باشد.<t1>
و <t2>
: بازه زمانی که لاگها باید در آن جستجو شوند. این پارامترها اختیاری هستند؛ اگر t1
و t2
ارائه نشود، همه لاگهای موجود با سطح مشخصشده بدون توجه به زمان بازگردانده شوند. <timestamp>
: زمان ارسال درخواست برای اجرای دستور log
است.get log [level] [t1] [t2] [timestamp]
با نوع DEBUG
در سیستم ثبت و در کنسول چاپ شود.خروجی:
<level>
است.[<t1>, <t2>]
قرار دارد."no logs found"
در کنسول چاپ شود.پس از انجام هر نوع عملیات، لاگ آن در سیستم ثبت میشود. همچنین پس از ثبت لاگ، خروجی آن با فرمت
در کنسول چاپ میشود.
هر دستور، یک پارامتر <timestamp>
با فرمت زمانی yyyy/MM/dd:HH:mm:ss
دارد که نشان میدهد آن دستور در چه زمانی اجرا شده است. از این زمان باید در دستور log
برای فیلتر کردن لاگها استفاده کنید.
دستورات نامعتبر:
ورودی تضمینشده:
برای گرفتن امتیاز کامل، به کوچکی یا بزرگی حروف در خروجی دقت کنید.
در صورتی که هر یک از بخشهای مسئله را به درستی پیادهسازی کردید، امتیاز آن را مستقل از سایر بخشها خواهید گرفت. (البته، دقت کنید برای دریافت امتیاز عملیات withdraw
، ابتدا باید عملیات deposit
به درستی پیادهسازی شود.)
سطر اول ورودی شامل یک عدد صحیح و مثبت است که تعداد سطرهای ورودی را نشان میدهد. در سطر بعدی، هر سطر شامل یکی از دستورهای بالا است.
خروجیهای خواسته شده برای هر دستور را به ترتیب چاپ کنید.