لینک‌های مفید برای شرکت در مسابقه:

راه‌حل‌ها و راهنمایی‌های نهایی اضافه شدند.
این راهنمایی‌ها را می‌توانید در انتهای سوالات مشاهده کنید.
. می‌توانید سوالات خود را از قسمت "سوال بپرسید" مطرح کنید.

هارمه کناب


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

حسنی برای این که در تابستان وقتش را تلف نکند به کسب و کار روی آورده و به تازگی بانکی به نام کناب تاسیس کرده است.
از آن‌جایی که دوست دارد شما نیز عضو کناب باشید به شما یک پروژه داده و خواسته تا همراه‌بانکی بنویسید که درخواست‌های زیر را اجرا کند.

1 ip:username
Plain text

این درخواست یعنی کاربری با نام‌ کاربری username و آی‌پی ip به همراه‌بانک وصل شد و در صورتی که username معتبر نباشد باید عبارت ‍‍‍invalid username را چاپ کنید.
به یک نام‌ کاربری معتبر می‌گوییم اگر فقط از حروف کوچک و بزرگ انگلیسی و اعداد تشکیل شده باشد.
برای مثال 1aAB2 معتبر است ولی ab*2 معتبر نیست.

2 ip:username:money
Plain text

این درخواست یعنی کاربری با آی‌پی ip به حسابی با نام‌ کاربری username به اندازه money پول ریخته‌ است. در واقع باید از حساب ip به اندازه money کم کنید و به حساب username اضافه کنید.

3 ip
Plain text

با داده شدن این درخواست مقدار پول داخل حساب فرد با آی‌پی ip را نمایش دهید.

(دقت کنید که پول هر فرد می‌تواند منفی هم بشود و هرکس در ابتدا ۰ واحد پول دارد)

ورودی🔗

در اولین خط ورودی عدد qq که بیانگر تعداد درخواست‌ها است به شما داده می‌شود و در qq خط بعد، در هر خط یک در‌خواست داده می‌شود.

در هر درخواست ابتدا type داده می‌شود که برابر یکی از اعداد ۱ یا ۲ یا ۳ است و اگر typetype برابر با ۱ باشد در ادامه دو رشته ip و username به شما داده می‌شود که توسط کاراکتر : از هم جدا شده‌اند. اگر typetype مساوی ۲ باشد سه رشته ip و username و money داده می‌شود که با : از هم جدا شده‌اند و اگر هم typetype مساوی ۳ باشد رشته ip داده می‌شود.

0q,money100 0000 \le q,money \le 100\ 000

طول username و ip حداکثر ۱۵ است.

تضمین می‌شود که:

  • یک کاربر دوبار به همراه بانک وصل نمی‌شود و آی‌پی و نام‌ کاربری هیچ دو فردی یکسان نیست.
  • در صورتی که نام کاربری معتبر نباشد تنها ممکن است کاراکترهای _ یا * یا # یا $ در آن به کار رفته باشد.
  • همه‌ی ورودی‌های نوع ۲ و ۳ معتبر هستند؛ یعنی کاربری با آی‌پی یا نام کاربری مشخص شده‌، وجود دارد.
  • همه ipها به صورت ۴ عدد بین ۰ تا ۲۵۵ هستند که با نقطه از هم جدا شده‌اند.
  • حداکثر پولی که یک نفر می‌تواند داشته باشد 10910^9 است.

خروجی🔗

برای هر درخواست نوع ۱ در صورتی که username معتبر نیست باید عبارت invalid username را چاپ کنید و برای هر درخواست نوع ۳ باید مقدار پول حساب فرد خواسته شده را چاپ کنید. (پاسخ هر درخواست را در یک خط جدید چاپ کنید.)

مثال🔗

ورودی نمونه🔗

9
1 46.51.16.72:SmsS
1 192.168.10.13:#hacker$user
1 131.41.61.213:faeila
2 46.51.16.72:faeila:1000
3 46.51.16.72
3 131.41.61.213
2 131.41.61.213:SmsS:500
3 46.51.16.72
3 131.41.61.213
Plain text

خروجی نمونه🔗

invalid username
-1000
1000
-500
500
Plain text

توضیحات:

  • نام کاربری #hacker$user معتبر نیست برای همین باید invalid username خروجی بدهید.

  • از حساب SmsS هزار واحد پول کم می‌شود و به حساب faeila اضافه می‌شود و حالا SmsS منفی هزار و faeila هزار واحد پول دارد.

  • از حساب faeila پانصد واحد کم می‌شود و حالا پانصد واحد پول دارد و SmsS منفی پانصد.


راهنمایی ۱

برای پیاده‌سازی تمیز این سوال می‌توانید از Regex یا عبارت باقاعده و Associative array یا آرایه انجمنی استفاده کنید.
می‌توانید این لینک را نیز برای پیدا کردن Associative array در زبان مورد نظرتان استفاده کنید.

راهنمایی ۲

سعید کنید Associative array‌ای بسازید که هر کاربر که اضافه شد، بتوان با استفاده از نام‌کاربری هر فرد، آی‌پی آن فرد را پیدا کرد.

راهنمایی ۳

حالا Associative array دیگری بسازید که با استفاده از آی‌پی هر فرد بتوان موجودی حساب آن فرد را پیدا کرد و یا تغییر داد.

راه حل

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

فرض کنید sender_ip برابر آی‌پی فردی است که پول واریز می‌کند و receiver_user برابر نام کاربری فردی است که پول دریافت می‌کند. می‌خواهیم دو مقدار receiver_money را که برابر پول حساب دریافت کننده است و همچنین sender_user و sender_money که نام کاربری و پول حساب واریز کننده است را پیدا کنیم.

و دو Associative array به نام‌های get_user و get_money داریم که با اولی می‌توان با دادن آی‌پی فرد نام کاربری آن را به دست آورد و با استفاده از دومی، با دادن نام کاربری فرد، مقدار پول حسابش را به دست آورد.

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

ip = input ip address
user = input username
if user is valid :
    add {user, 0} to get_money
    add {ip, user} to get_user
Plain text

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

sender_ip = sender ip address
receiver_user = receiver username

sender_user = get username from get_user
reassign value of (money of sender_user) in get_money by specific value
reassign value of (money of receiver_user) in get_money by specific value
Plain text
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.