الگوریتمی - مقسوم‌علیه‌های دردسرساز


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

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

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

به ازای تمام iiهایی که 1in1\le i \le n است، مقسوم‌علیه‌های ii را می‌نویسیم. حال استاد از شاگردان می‌خواد تا تعداد کل‌ اعداد نوشته شده و جمع آن اعداد را به دست آورد.

به خنگویچ کمک کنید تا جواب سوالش را پیدا کند (بلکه کمتر احساس نادانی کند).

ورودی🔗

در تنها سطر ورودی عدد nn آمده است که نشان‌دهنده‌ی تعداد مجموعه‌های نوشته شده بر روی تخته است. 1n5 000 1 \le n \le 5\ 000

خروجی🔗

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

مثال🔗

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

3
Plain text

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

5 8
Plain text

مجموعه‌های نوشته شده بر روی تخته عبارت است از {۱} به ازای عدد ۱، {۲ ،۱} به ازای عدد ۲ و {۳ ،۱} به ازای عدد سه. در نتیجه ۵ عدد روی تخته نوشته شده است که مجموع آن‌ها برابر ۸ می‌باشد.

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

7
Plain text

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

16 41
Plain text

الگوریتمی - هیچ‌وقت مغرور نشو!


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

خنگویچ بعد از حل سوال قبل (که آن هم با کمک شما بود) خیلی به خودش مغرور شد و احساس کرد خفن‌ترین آدم روی زمین است.

شدت خود‌ خفن‌پنداری خنگویچ آن‌قدر بالا رفت که خواست جلوی شاگرد اول کلاسشان خودی نشان دهد و روی او را کم کند! به همین دلیل، او پیش فنویچ (شاگرد اول کلاس) رفت و گفت هر سوالی می‌خواهی بده تا برایت حل کنم. فنویچ هم که بیدی نبود که با این بادها بلرزد، در جا تعدادی گراف درخت روی کاغذ کشید و به خنگویچ گفت که اگر می‌توانی عدد رنگی یالی همه‌ی این گراف‌ها را به دست بیاور. خنگویچ هم که از کرده‌ی خود پشیمان بود، پیش شما آمد و کمک خواست تا از آبروریزی او جلوگیری شود. به او کمک کنید تا آبرویش حفظ شود (باشد که دیگر عمل زشت خویش را تکرار نکند).

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

درخت نیز گراف همبند بدون دور است.

ورودی🔗

در سطر اول ورودی عدد nn آمده است که نمایانگر تعداد رئوس درخت است.

در iiامین سطر از n1n - 1 سطر بعدی دو عدد viv_i و uiu_i آمده‌اند که شماره رئوس دو سر یال iiام را نشان می‌دهند. 1n200 000 1 \le n \le 200\ 000 1vi,uin 1 \le v_i, u_i \le n تضمین می‌شود گراف ورودی درخت است.

خروجی🔗

در تنها سطر خروجی عدد یالی رنگی گراف ورودی را چاپ کنید.

مثال🔗

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

1
Plain text

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

0
Plain text

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

3
1 2
2 3
Plain text

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

2
Plain text

پایگاه‌ داده - بیپ‌تونز


کد شما باید روی MySQL قابل اجرا باشد.

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

در حال حاضر این پایگاه‌داده شامل دو جدول خواننده و آهنگ است.

هر خواننده دارای اسم، ایمیل، شماره حساب و میزان بالانس است. میزان بالانس پولی است که باید به خواننده در ازای فروش آهنگ‌هایش پرداخت کنیم.(در واقع بدهی ما به خواننده در این فیلد ذخیره می‌شود.)

جدول با نام singer دارای Schema ای به شکل زیر است: ‍‍‍

اسم ستون نوع تعریف ملاحظات
namename varcharvarchar اسم خواننده primarykeyprimary key
emailemail varcharvarchar ایمیل خواننده
account_numberaccount\_number varcharvarchar شماره حساب خواننده
balancebalance intint طلب خواننده از ما

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

جدول با نام song دارای Schema ای به شکل زیر است:

اسم ستون نوع تعریف ملاحظات
idid intint ای‌دی رکورد primarykeyprimary key
namename varcharvarchar نام‌ آهنگ
singersinger varcharvarchar نام خواننده
producerproducer varcharvarchar نام‌ آهنگساز
albumalbum varcharvarchar آلبوم آهنگ
total_selltotal\_sell intint مجموع فروش آهنگ
‍‍

مطلوبات🔗

کوئری‌های sql خواسته‌شده از شما موارد زیر است: (توجه کنید که هر کوئری نمره‌ای جداگانه دارد و اگر کوئری یک قسمت را نتوانستید بزنید، کوئری‌هایی که حل کردید را بفرستید و قسمت آن کوئری را خالی بگذارید.)

  1. کوئری بنویسید که اسم تمام خواننده‌هایی که به آنها بدهکار نیستیم(بالانسشان صفر است) به ما بدهد.
  2. همانطور که می‌بینید جدولی برای آهنگسازان موجود نیست، این جدول را بسازید. این جدول تنها باید شامل یک ستون به اسم name باشد که نوع آن varchar با طول ۲۰ باشد و primary key این جدول هم باید همین ستون باشد. همچنین اسم این جدول producer می‌باشد. سپس تمامی آهنگساز‌هایی که در جدول آهنگ اسمشان ذکر شده‌است را به جدول آهنگسازها اضافه کنید. (چنانچه از چند کوئری برای این بخش استفاده می‌کنید، حتما در انتهای کوئری‌ها از ; استفاده کنید)
  3. کوئری بنویسید که از بین تمام خواننده‌ها، خواننده ای را پیدا کند که رتبه دوم بیشترین فروش را در کارهایش با آهنگسازی به نام ‍‍dr.dre داشته است و اسم و مقدار فروش آهنگ‌هایش با این آهنگساز به نام را برگردانید.

روش پیاده‌سازی🔗

در یک فایل با نام code.sql کد خود را قرار دهید و آن را فشرده (zip ) کنید و در سایت بارگذاری نمایید. کد شما باید به صورت زیر باشد(نام فایل zip مهم نیست).

-- Section1
   your first query here
-- Section2
   your second query here
-- Section3
   your third query here
Plain text

لینوکس - دانلود سریال


شما به تماشای سریال علاقه‌ی زیادی دارید و علاوه بر این علاقه یک گیک هم هستید! برای همین دوست دارید که سریال‌هایتان را به شکل خودکار بوسیله تورنت دانلود کنید.

شما در یک موتور جستجوی تورنت نام سریال مورد نظرتان را جستجو کرده و نتایج آن را در تعدادی فایل متنی در فولدری با آدرس مشخصی (مثلا path/to/src) ذخیره کرده‌اید. نمونه‌ای از یک فایل نتیجه جستجو:

Attack On Titan S03E20 720p WEB x264-URANiME[eztv]    6/17/2019    394 MB    114    37    
Attack On Titan S03E20 WEB x264-URANiME    Yesterday    172 MB    76    3    
Attack On Titan S03E18 1080p WEB x264-URANiME    6/5/2019    1 GB    46    3    
Attack On Titan S03E17 720p WEB x264-URANiME[eztv]    5/27/2019    555 MB    41    10    
Attack On Titan S02E20 WEB x264-URANiME[eztv]    6/17/2019    171 MB    40    7    
Attack on Titan (2013) Season 2 S02 (1080p BluRay x265 HEVC 10bit AAC 5 1 ImE)    5/23/2019    9.4 GB    29    10    
[Golumpa] Attack on Titan S3 - 15 (Shingeki no Kyojin S3) [FuniDub 720p x264 AAC] [C3FCE679]    6/10/2019    416 MB    26    3    
Attack on Titan (2013) Season 1 S01 (1080p BluRay x265 HEVC 10bit AAC 5 1 ImE) REPACK    5/27/2019    15.4 GB    24    24    
Attack On Titan S03E18 WEB x264-URANiME    6/3/2019    200 MB    23    3    
Attack On Titan S03E16 720p WEB x264-URANiME[eztv]    5/20/2019    522 MB    23    3    
[Golumpa] Attack on Titan S3 - 15 (Shingeki no Kyojin S3) [FuniDub 1080p x264 AAC] [FB26B600]    6/10/2019    1.3 GB    21    4    
Attack On Titan S03E19 WEB x264-URANiME    Today    196 MB    20    0    
Attack On Titan S03E14 720p WEB x264-URANiME[eztv]    5/6/2019    545 MB    19    2        
Plain text

هر خط در هر فایل نتیجه‌ی جستجو از درایه‌هایی که بوسیله tab جدا شده‌اند تشکیل شده‌است. درایه اول نام تورنت (torrent name) و درایه دوم تاریخ اضافه شدن آن (added time) و درایه سوم حجم این فایل (size) است که با فرمت MB و GB مشخص شده‌است. درایه چهارم تعداد مشارکت‌کنندگان کامل (seeds) و درایه‌ آخر تعداد مشارکت‌کنندگان نیمه (leechs) است. (برای اطلاعات بیشتر: یک فایل در تورنت توسط اشخاص به شکل peer-to-peer برای دانلود ارائه می‌شود، seeds تعداد مشارکت‌کنندگان آنلاین فعلی است که فایل را به طور کامل دانلود کرده‌اند و leechs تعداد مشارکت‌کنندگان آنلاین فعلی است که خود در حال دانلود فایل هستند و تا آنجا که تا اکنون دانلود کرده‌اند را می‌توانند برای بقیه آپلود کنند)

توجه: در متن بالا کاراکتر tab به درستی نمایش داده نشده‌است، برای مشاهده نمونه درست اینجا را ببینید.

شما باید اسکریپتی بنویسید که فایل‌های نتیجه جستجو را از آدرس مشخصی (مثلا path/to/src) بخواند و نتایج را بر اساس قسمت دسته‌بندی کند و سپس به ازای هر قسمت در هر فصل در آدرس مشخص (مثلا اگر آدرس فولدر نتیجه path/to/dst باشد) path/to/dst/x/y نتایج جستجو برای آن قسمت را مرتب شده بر اساس اولویت‌هایی که جلوتر گفته ‌خواهد شد بریزد.

یک قسمت با regex روبرو شناخته می‌شود: [Ss]\d+[Ee]\d+ و دو عدد مچ شده می‌توانند با ۰ شروع شوند و همه بیانگر یک قسمت در فصل هستند. مثلا همه S03E2 و S3e002 و s03e2 یک قسمت هستند. نتیجه‌ی یک جستجو برای یک قسمت است اگر و تنها اگر این regex به شکل کلمه در torrent name آن ظاهر شده باشد (تضمین می‌شود که حداکثر یکبار به عنوان کلمه در آن ظاهر خواهد شد). بنابراین serial s3e03 x264 تطابق دارد و serial S03E03ks x265 تطابق ندارد.

نکته: کلمه دنباله‌ای متوالی از حروف و ارقام انگلیسی و underline است که آن را نمی‌توان از دو طرف ادامه داد.

حال هر نتیجه‌ی جستجو که با regex گفته شده تطابق داشت را اگر در فصل x و قسمت y باشد باید torrent name ش را در فایل path/to/dst/x/y اضافه کنید.

در یک فایل path/to/dst/x/y ، torrent name های نتیجه باید با اولویت های زیر مرتب شده باشند. یعنی ابتدا اولویت اول، سپس اولویت دوم و سپس اولویت سوم.

  1. بر اساس 2×seeds+leechs2 \times seeds + leechs از بزرگ به کوچک
  2. بر اساس size از کوچک به بزرگ
  3. بر اساس torrent name به شکل lexicography (مقایسه معمول رشته‌ها) از کوچک به بزرگ

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

bash magic.sh path/to/src path/to/dst
Plain text

در فولدر path/to/src تنها فایل‌های متنی قرار دارند، به عنوان نمونه:

src
├── f1
├── file2
└── note.txt
Plain text

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

dst
├── 2
  └── 19
└── 3
  ├── 1
  └── 2
Plain text

به عنوان نمونه، اگر ورودی مثال نتیجه‌ی جستجوی بالا باشد، در فایل مربوط به قسمت ۲۰ فصل ۳ سریال خروجی به شکل زیر است:

Attack On Titan S03E20 720p WEB x264-URANiME[eztv]
Attack On Titan S03E20 WEB x264-URANiME
Plain text

نکات🔗

  • پوشه مقصد ممکن است قبل از اجرای اسکریپت وجود نداشته باشد. در این صورت اسکریپت شما باید پوشه مقصد را بسازد.
  • نام فایل‌هایی که کپی می‌شوند نباید تغییر کند.
  • می‌توانید فرض کنید ابزارهای زیر بر روی سیستم نصب است. تقریبا تمام ابزارهای رایج گنو در یک توزیع لینوکس نصب هستند، اگر سوالی در مورد وجود ابزار خاصی داشتید سوال بپرسید!
    cut awk grep sort paste sed xargs tr expr eval seq tee printf echo print cd mkdir ls find ..
    Plain text
  • یک فایل Zip شامل اسکریپت magic.sh را آپلود کنید.
  • اگر از سیستم عامل mac استفاده می‌کنید دقت کنید که برخی ابزارها با ابزارهای gnu در لینوکس متفاوت است و عملکردشان ممکن است متفاوت باشد. کد شما باید در لینوکس به درستی کار کند. برای حل این مشکل می‌توانید ابزارهای gnu را در مک بریزید و یا سرور مجازی به شکل ساعتی تهیه کنید و کد خود را در آنجا تست کنید.

پروژه‌ای - رنگ‌آمیزی مکعب - جاوا


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

فایل Source را دانلود کرده و کلاس Cube را ببینید.

مکعب‌هایی به شکل ماتریس‌های سه بعدی از نوع int داریم که می‌خواهیم آن‌ها را رنگ‌آمیزی کنیم. به این صورت که درایه‌هایی که در 6 وجه مکعب قرار می‌گیرند، رنگ شوند (مقدارشان برابر با 1 شود) و سایر درایه‌ها بی‌رنگ باشند (مقدارشان برابر با 0 باشد).

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

نکته:

  • ابعاد مکعب مورد نظر ممکن است متفاوت باشد. در واقع ممکن است مکعب مستطیل باشد.

به تصویر زیر نگاه کنید: مکعب شکل بالا یک آرایه سه‎بعدی 6666*6*6 است. هر یک از مکعب‎های کوچک، در واقع یک درایه از آرایه ورودی هستند که ممکن است در ابتدا هر مقداری داشته باشد. شما باید درایه‎ها (خانه‎ها)یی که در 6 وجه بیرونی مکعب اصلی هستند را برابر با 1 کنید و سایر درایه‎ها را 0 کنید.

آنچه باید آپلود کنید🔗

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل Cube.java را ببینیم.

پروژه‌ای - رنگ‌آمیزی مکعب - پایتون


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

مکعبی به شکل لیست تو در تو سه بعدی داریم که می‌خواهیم آن‌ را رنگ‌آمیزی کنیم. به این صورت که درایه‌هایی که در 6 وجه مکعب قرار می‌گیرند، رنگ شوند (مقدارشان برابر با 1 شود) و سایر درایه‌ها بی‌رنگ باشند (مقدارشان برابر با 0 باشد).

تابع coloring را در cube.py مطابق با توضیحات داده‌شده پیاده‌سازی کنید.

برای مثال:

def coloring(ls):
    # your code here


matrix = [
            [
                [5, 5, 5],
                [5, 5, 5],
                [5, 5, 5]
            ],
            [
                [5, 5, 5],
                [5, 5, 5],
                [5, 5, 5]
            ],
            [
                [5, 5, 5],
                [5, 5, 5],
                [5, 5, 5]
            ]
        ]

coloring(matrix)

for i in range(len(matrix)):
    print("{}th layer:".format(i+1))
    for j in matrix[i]:
        for k in j:
            print(k, end=' ')
        print()
Python

خروجی کد بالا باید به این شکل باشد:

1th layer:
1 1 1 
1 1 1 
1 1 1 
2th layer:
1 1 1 
1 0 1 
1 1 1 
3th layer:
1 1 1 
1 1 1 
1 1 1 
Python

*توجه: * اضلاع مکعب ممکن است با هم برابر نباشند.

آنچه باید آپلود کنید🔗

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل cube.py را ببینیم.

پروژه‌ای - واحد حفاظت و امنیت - جاوا


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

فایل Source را دانلود کرده و کلاس Security را ببینید. در این کلاس سه متد وجود دارد که مطابق با توضیحات داده‌شده باید آن‌ها را پیاده‎سازی کنید:

متد encrypt🔗

یک رشته به عنوان ورودی این متد داده می‌شود و معادل رمزنگاری‌شده آن در خروجی برگردانده می‌شود.

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

  • رشته یونیفرم رشته‎ای است که تمام کاراکتر‌هایش با هم یکسان باشند. مانند c یا aa یا ccc
  • وزن یک کاراکتر برابر است با کد عددی آن کاراکتر منهای عدد 96. مثلا کد کاراکتر a برابر 97 و وزن آن برابر با 9796=197-96=1 است.
  • ابتدا رشته به زیررشته‌های یونیفورمش تقسیم می‌شود و سپس مقدار رمزنگاری شده رشته اصلی، از به هم چسباندن مقدار رمزنگاری شده رشته‌های یونیفورم به دست می‌آید.
  • با در کنار هم قرار دادن وزن تمام زیر‌رشته‎های یونیفرمِ یک رشته، یک عبارت عددی به دست می‌آید که همان معادل رمز‌نگاری‌شده رشته ورودی است.
  • برای مثال مقدار رمزنگاری رشته یونیفورم cccc که تشکیل شده از چهار زیررشته یونیفرم c و cc و ccc و cccc است و مقدار رمزنگاری هر یک از این زیررشته‎ها، برابر با مجموع وزن کاراکترهایشان است که به ترتیب می‌شود 3 و 6 و 9 و 12 و در نهایت خواهیم داشت 36912.

    مثال🔗

ورودی

abcccdd
Plain text

خروجی

1236948
Plain text

توضیح🔗

کلیه زیررشته‌های یونیفرم حاصل از رشته ورودی و وزن آن‌ها در ادامه لیست شده:

وزن زیررشته یونیفرم
1 a
2 b
369 ccc
48 dd

که با در کنار هم قرار دادن وزن آن‌ها، به عبارت 1236948 می‌رسیم.

متد isSocialAccountInfo🔗

این متد یک رشته به عنوان پارامتر ورودی دریافت کرده و در خروجی مشخص می‌کند که آیا این رشته حاوی آدرس مربوط به یک اکانت شبکه اجتماعی هست یا نه. در زمان استخدام، واحد حفاظت و امنیت، آدرس کلیه اکانت‌های عمومی (public) افراد را پرسیده و به شکل زیر در اسناد ذخیره کرده است:

[Social Network Name]:www.[domain]/[Account Name]

برای مثال آدرس اکانت توییتر علی به این صورت ذخیره شده است:

Twitter:www.twitter.com/javalover1990

نکات

  1. اسم شبکه اجتماعی همواره با حرف بزرگ انگلیسی شروع می‌شود.
  2. دامنه فقط شامل حروف کوچک انگلیسی و عدد و کاراکتر . است.
  3. آدرس اکانت شامل حرف یا عدد یا علامت زیرخط (_) است.
  4. اگر بخش [Account Name] یا [domain] خالی باشد، خروجی این متد باید false باشد.

    مثال🔗

ورودی

Instagram:www.instagram.com/javafan
Plain text

خروجی

true
Plain text

متد secure🔗

حال با استفاده از دو متد قبلی، می‌خواهیم اطلاعات مورد نظر را رمزنگاری کنیم. به این صورت که:

  1. با استفاده از متد isSocialAccountInfo بخش‌هایی که مربوط به اطلاعات حساب‌های کاربری است را پیدا کنید.
  2. با استفاده از متد encrypt بخش Account Name را رمزنگاری کنید.

    مثال🔗

ورودی

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

FirstName:Ali, LastName:Alavi, BirthDate:1990/02/02 Gender:male Instagram:www.instagram.com/aalavi Degree:Master Twitter:www.twiter.com/alaviii imdb:www.imdb.com/alavi
Plain text

خروجی

FirstName:Ali, LastName:Alavi, BirthDate:1990/02/02 Gender:male Instagram:www.instagram.com/12121229 Degree:Master Twitter:www.twiter.com/11212291827 imdb:www.imdb.com/alavi
Plain text

آنچه باید آپلود کنید:🔗

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل Security.java را ببینیم.

پروژه‌ای - واحد حفاظت و امنیت - پایتون


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

فایل source را دانلود کرده و کلاس Security را ببینید. در این کلاس سه متد وجود دارد که مطابق با توضیحات داده‌شده باید آن‌ها را پیاده‎سازی کنید:

متد encrypt(self, s)🔗

یک رشته به عنوان ورودی این متد داده می‌شود و معادل رمزنگاری‌شده آن در خروجی برگردانده می‌شود.

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

  • ابتدا رشته به زیررشته‌های یونیفورمش تقسیم می‌شود و سپس مقدار رمزنگاری شده رشته اصلی از به هم چسباندن مقدار رمزنگاری شده رشته‌های یونیفورم به دست می‌آید.
  • با در کنار هم قرار دادن وزن تمام زیر‌رشته‎های یونیفرمِ یک رشته، یک عبارت عددی به دست می‌آید که همان معادل رمز‌نگاری‌شده رشته ورودی است.
  • رشته یونیفرم رشته‎ای است که تمام کاراکتر‌هایش با هم یکسان باشند. مانند c یا aa یا ccc
  • برای یک رشته یونیفورم مقدار رمزنگاری این گونه به دست می‌آید که به ازای هر کاراکتر مقدار رشته‌ای ضرب وزن آن کاراکتر در تعداد کاراکترهایی که قبلش آمده به علاوه یک را به انتهای جواب اضافه می‌کنیم. (این کار را از اول رشته ضروع می‌کنیم و تا آخر آن طی می‌کنیم.)
  • برای مثال مقدار رمزنگاری رشته یونیفورم cccc برابر یا 36912 است.
  • وزن یک کاراکتر برابر است با کد عددی آن کاراکتر منهای عدد 96. مثلا کد کاراکتر a برابر 97 و وزن آن برابر با 9796=197-96=1 است.

    مثال🔗

ورودی

abcccdd
Plain text

خروجی

1236948
Plain text

توضیح🔗

کلیه زیررشته‌های یونیفرم حاصل از رشته ورودی و وزن آن‌ها در ادامه لیست شده:

وزن زیررشته یونیفرم
1 a
2 b
369 ccc
48 dd

که با در کنار هم قرار دادن وزن آن‌ها، به عبارت 1236948 می‌رسیم.

متد is_social_account_info(self, param)🔗

این متد یک رشته به عنوان پارامتر ورودی دریافت کرده و در خروجی مشخص می‌کند که آیا این رشته حاوی آدرس مربوط به یک اکانت شبکه اجتماعی هست یا نه. در زمان استخدام، واحد حفاظت و امنیت، آدرس کلیه اکانت‌های عمومی (public) افراد را پرسیده و به شکل زیر در اسناد ذخیره کرده است:

[Social Network Name]:www.[domain]/[Account Name]

برای مثال آدرس اکانت توییتر علی به این صورت ذخیره شده است:

Twitter:www.twitter.com/javalover1990

نکات

  1. اسم شبکه اجتماعی همواره با حرف بزرگ انگلیسی شروع می‌شود.
  2. دامنه فقط شامل حروف کوچک انگلیسی و عدد و کاراکتر . است.
  3. آدرس اکانت شامل حرف یا عدد یا علامت زیرخط (_) است.

    مثال🔗

ورودی

Instagram:www.instagram.com/javafan
Plain text

خروجی

True
Plain text

متد secure(self, info)🔗

حال با استفاده از دو متد قبلی، می‌خواهیم اطلاعات مورد نظر را رمزنگاری کنیم. به این صورت که:

  1. با استفاده از متد is_social_account_info بخش‌هایی که مربوط به اطلاعات حساب‌های کاربری است را پیدا کنید.
  2. با استفاده از متد encrypt بخش Account Name را رمزنگاری کنید.

    مثال🔗

ورودی

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

FirstName:Ali, LastName:Alavi, BirthDate:1990/02/02 Gender:male Instagram:www.instagram.com/aalavi Degree:Master Twitter:www.twiter.com/alaviii imdb:www.imdb.com/alavi
Plain text

خروجی

FirstName:Ali, LastName:Alavi, BirthDate:1990/02/02 Gender:male Instagram:www.instagram.com/12121229 Degree:Master Twitter:www.twiter.com/11212291827 imdb:www.imdb.com/alavi
Plain text

آنچه باید آپلود کنید:🔗

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل security.py را ببینیم.

پروژه‌ای - چیراکسی؟ - جاوا


در این سوال برای ساده‌تر کردن مدیریت خطاها و مرتب کردن استثناها می‌خواهیم تمام خطاهایی که رخ می‌دهد را با یک قرارداد واحد در کلاسی به نام ExceptionProxy ذخیره کنیم. برای این کار به ازای هر خطایی که رخ می‌دهد یک شی از کلاس ExceptionProxy می‌سازیم که دارای دو خصوصیت است. این خصوصیات عبارتند از ( e یک شی از کلاس ExceptionProxy است):

  • متن استثنای رخ داده. (تبدیل‌شده استثنا به رشته): e.msg
  • تابعی که باعث ایجاد استثنا شده: e.function

فایل Solution.java را دانلود کرده و محتوای آن را ببینید. از شما می‌خواهیم متد transformException() را پیاده‌سازی کنید. این متد یک لیست از توابع ورودی می‌گیرد. سپس هر کدام از توابع را صدا می‌کند (توابع بدون آرگومان هستند) و استثناهایی که رخ می‌دهد را با قرارداد بالا به شی‌ای از ExceptionProxy تبدیل کرده و در نهایت لیست خطاهای تبدیل‌شده را به همان ترتیب توابع بر می‌گرداند. دقت کنید که اگر تابعی بدون خطا اجرا شد باید یک شی ExceptionProxy ساخته و مقدار msg آن را با "OK!"مقداردهی کنید.

مثال🔗

با اجرای متد main در کلاس Solution خروجی زیر باید در کنسول چاپ شود:

msg: / by zero
function: Devide[1/0]
msg: OK!
function: Devide[1/1]
Plain text

آنچه باید آپلود کنید:🔗

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل Solution.java را ببینیم.

پروژه‌ای - چیراکسی؟ - پایتون


در این سوال برای ساده‌تر کردن مدیریت خطاها و مرتب کردن استثنا‌ها می‌خواهیم تمام خطاهایی که رخ می‌دهد را با یک قرار داد واحد در کلاسی به نام ExceptionProxy ذخیره کنیم.

برای این کار به ازای هر خطایی که رخ می‌دهد یک شی از کلاس ExceptionProxy می‌سازیم که دارای دو خصوصیت است.

این خصوصیات عبارتند از (e یک شی از کلاس ExceptionProxy است):

  • متن استثنای رخ داده‌. (تبدیل شده‌ی استثنا به رشته): e.msg
  • تابع‌ای که باعث ایجاد استثنا شده: ‍e.function

از شما می‌خواهیم تابع‌ای به نام transform_exceptions() بنویسید که یک لیست از توابع ورودی می‌گیرد. سپس هر کدام از توابع را صدا می‌کند (توابع بدون آرگومان هستند) و استثناهایی که رخ می‌دهد را با قرار داد بالا به شی‌ای از ExceptionProxy تبدیل کرده و در نهایت لیست خطا‌های تبدیل شده را به همان ترتیب توابع برمی‌گرداند. دقت کنید که اگر تابع‌ای بدون خطا اجرا شد باید یک شی ExceptionProxy ساخته و مقدار msg آنرا با "ok!" مقدار دهی کنید.

کلاس ExceptionProxy و تابع transform_exceptions() خود را در فایل solution.py تعریف کرده و سپس زیپ و ارسال کنید.

به مثال زیر دقت کنید:

class ExceptionProxy(Exception):
    # define your class here

def transform_exceptions(func_ls):
    # implement your function here

def f():
    1/0

def g():
    pass

tr_ls = transform_exceptions([f, g])

for tr in tr_ls:
    print("msg: " + tr.msg + "\nfunction name: " + tr.function.__name__)
Python

خروجی کد بالا باید به شکل زیر باشد.

msg: division by zero
function name: f
msg: ok!
function name: g
Plain text

برای ارسال پاسخ یک فایل Zip آپلود کنید که شامل فایل solution.py است و چیزهای مورد نظر سوال در آن قرار دارد.

پروژه‌ای - تردکاری - جاوا


در کارت گرافیک برای بالا بردن سرعت، پردازش بخش‌های مختلف به صورت موازی انجام می‌شود. این پردازش‌ها را می‌توان به شکل یک درخت نشان داد. در این سوال به پردازش درختی از توابع می‌پردازیم. به شما یک درخت دودویی از توابع به شکل زیر داده می شود. درخت دودویی هر یال جهت‌دار به این معناست که تابعی که یال از آن خارج شده باید قبل از تابعی که یال به آن وارد شده محاسبه شود. (یا می‌توان گفت تابع دوم برای انجام محاسباتش نیاز به خروجی تابع اول دارد). توابع در سه لیست fs و gs و hs از طریق کلاس Functions به شما داده می‌شوند (برای مثال، f[0] همان f1f1 است). در ضمن توجه داشته باشید که تمام توابع بدون آرگومان ورودی هستند.

فایل Source را دانلود کرده و محتوای آن را ببینید و متد solve را مطابق با توضیحات زیر پیاده‌سازی کنید.

شما باید این درخت را به ترتیب زیر پردازش کنید:

  • با چهار ترد با نام‎های 1 و 2 و 3 و 4: با ترد iiام، fifi پردازش شود.
  • با دو ترد با نام‎های 1 و 2: با ترد iiام، gigi پردازش شود.
  • با یک ترد با نام 1: با ترد iiام، hihi پردازش شود.

دقت کنید که محاسبات هر مرحله (هر طبقه درخت) باید به صورت همزمان انجام شود. (برای مثال f1f1 و f2f2 باید همزمان محاسبه شوند).

مثال🔗

با اجرای متد main از کلاس Main خروجی زیر یکی خروجی‎های صحیح محتمل است.

F1 by 1 - F4 by 4 - F2 by 2 - F3 by 3 - G1 by 1 - G2 by 2 - H1 by 1 - 
Plain text

توجه داشته باشید که تمامی Fها قبل از Gها و تمامی Gها قبل از Hها چاپ می‎شود.

آنچه باید آپلود کنید.🔗

یک فایل zip که وقتی آن را باز می‌کنیم، فقط فایل ThreadSolution.java را ببینیم.

پروژه‌ای - تردکاری - پایتون


در کارت گرافیک برای بالا بردن سرعت پردازش بخش‌های مختلف به صورت موازی انجام می‌شود. این پردازش‌ها را می‌توان به شکل یک درخت نشان داد. در این سوال به پردازش درختی از توابع می‌پردازیم. به شما یک درخت دودویی از توابع به شکل زیر داده می‌شود. هر یال جهت‌دار به این معناست که تابع‌ای که یال از آن خارج شده باید قبل از تابع‌ای که یال به آن وارد شده محاسبه شود. (یا می‌توان گفت تابع دوم برای انجام محاسبتش نیاز به خروجی تابع اول دارد). توابع در سه لیست f و g و h در فایل functions.py قرار دارند.(برای مثال f[0] همان f1f_1​ است.) (همه‌ی توابع بدون آرگومان هستند برای مثال f[0]() تابع f1f_1​ را صدا می‌کند.)

شما باید با ۴ ترد به نام‌های 1 و 2 و 3 و 4 این درخت را به ترتیب زیر محاسبه کنید.

  • ابتدا با ترد iiام، fif_i​ محاسبه شود.
  • سپس با ترد iiام، gig_i محاسبه شود.
  • و در نهایت با ترد iiام، hih_i محاسبه شود.
  • دقت کنید که تردهایی که توابع هر طبقه را اجرا می‌کنند می‌توانند یکسان نداشته باشند و صرفا نام‌شان 1 و 2 و ‍3 و ‍4 باشد.

دقت کنید که محاسبات هر مرحله (طبقه‌ی درخت) باید به‌ صورت همزمان انجام شود. (برای مثال f1f_1​ و f2f_2​ باید همزمان محاسبه شوند)

از شما می‌خواهیم برای سریع‌تر شدن اجرا توابع را به ترتیب ذکر شده (با کمک تردها) صدا کنید.

کد خود را در تابع‌ای به نام solve در solution.py بنویسید و زیپ و ارسال کنید.

پروژه‌ای - رصد مشتریان - جاوا


یک شرکت فراهم‌کننده سرویس اینترنت (ISP- Internet Service Provider) دو سال است که شروع به کار کرده و در این مدت برای جذب مشتری بیشتر، صرفا سرویس نامحدود اینترنت و با قیمت مناسب ارایه داده است. این شرکت در این دو سال، میزان و نحوه مصرف هر یک مشتریان خود را با دقت رصد کرده است و حالا که بازار را در دست گرفته و ارایه سرویس نامحدود دیگر برایش مقرون به‎صرفه نیست، قصد دارد متناسب با نیازهای مشتریانش، تعدادی سرویس محدود تعریف کرده و به آن‎ها پیشنهاد دهد. اولین قدم برای این کار، دسته‎بندی کاربران بر اساس فاکتورهای مختلف است و شما هم به همین دلیل استخدام شده‎اید.

فایل Source را دانلود کرده و محتوای آن را ببینید. اطلاعات مربوط به میزان مصرف هر مشتری در تاریخ‎های مختلف در شی‎ای از نوع TrafficUsage ذخیره شده است و توسط متد loadAll در کلاس TrafficUsageDao در قالب یک لیست در اختیار شما قرار می‎گیرد. هر رکورد از این لیست، دارای اطلاعات زیر است:

  • user: کاربر
  • internal: مشخص می‌کند که اینترنت مصرفی داخلی بوده یا خارجی
  • nightly: مشخص می‌کند اینترنت مصرفی مربوط به حجم روزانه بوده یا شبانه
  • date: تاریخ مصرف حجم اینترنت
    • یک رشته با فرمت yy/MM/dd است (مانند 97/08/25).
  • usage: میزان مصرف اینترنت بر حسب مگابایت

در کلاس TrafficUsageService قرار است به کمک این داده‎ها، اطلاعات زیر استخراج شده و در دسته‎بندی مشتریان مورد استفاده قرار بگیرد:

  1. عاشقان رسانه‎های اجتماعی (متد socialMediaLovers):
    • مشتریانی که در طول ماه مورد نظر از سال مورد نظر، مجموع مصرف آن‎ها از اینترنت خارجی، از مصرف اینترنت خارجی حداقل 90% سایر کاربران فعال در آن ماه بیشتر باشد.
      • مثلا اگر علی در تیر 97 به میزان 50 گیگ اینترنت خارجی مصرف کرده اما حداقل 90% سایر کاربران، هر کدام در تیر 97 مصرفشان از اینترنت خارجی کمتر از 50 گیگ بوده، علی از عاشقان رسانه‌های اجتماعی در تیر 97 بوده است.
      • منظور از کاربر فعال در یک بازه زمانی خاص، کاربری است که حداقل یک رکورد TrafficUsage در آن ماه و به نام آن کاربر ثبت شده باشد.
  2. مشتریان عشق دانلود (متد downloadLovers):
    • مشتریانی که در طول ماه مورد نظر از سال مورد نظر، مجموع مصرف آن‌ها از اینترنت شبانه، بیش از مجموع مصرف آن‎ها از اینترنت روزانه باشد. *نکته*:
  • در هر یک از دو سرویس مورد نظر، به هر دلیلی اگر کاربری پیدا نشود، باید یک لیست خالی برگردانده شود (خروجی متد null نباشد).

با اجرای متد main در کلاس Main، خروجی زیر مورد انتظار است:

socialMediaLovers:
a100
downloadLovers:
a100
a101
a102
Plain text

آنچه باید آپلود کنید:🔗

یک فایل زیپ شامل بسته‌ی com.rahnema.isp.service.impl است. به صورتی که وقتی فایل زیپ را باز می‌کنیم، دقیقا شاخه‌ی com را ببینیم که درون آن شاخه‌ی rahnema و درون آن شاخه‌ی isp و درون آن شاخه service و درون آن شاخه impl قرار دارد. در داخل شاخه‌ی impl فقط و فقط فایل TrafficUsageServiceImpl.java وجود دارد.

پروژه‌ای - رصد مشتریان - پایتون


یک شرکت فراهم‌کننده سرویس اینترنت (ISP- Internet Service Provider) دو سال است که شروع به کار کرده و در این مدت برای جذب مشتری بیشتر، صرفا سرویس نامحدود اینترنت و با قیمت مناسب ارایه داده است. این شرکت در این دو سال، میزان و نحوه مصرف هر یک مشتریان خود را با دقت رصد کرده است و حالا که بازار را در دست گرفته و ارایه سرویس نامحدود دیگر برایش مقرون به‎صرفه نیست، قصد دارد متناسب با نیازهای مشتریانش، تعدادی سرویس محدود تعریف کرده و به آن‎ها پیشنهاد دهد. اولین قدم برای این کار، دسته‎بندی کاربران بر اساس فاکتورهای مختلف است و شما هم به همین دلیل استخدام شده‎اید.

فایل Source را دانلود کرده و محتوای آن را ببینید. اطلاعات مربوط به میزان مصرف هر مشتری در تاریخ‎های مختلف در شی‎ای از نوع TrafficUsage ذخیره شده است و توسط متد load_all در کلاس TrafficUsageDao در قالب یک لیست در اختیار شما قرار می‎گیرد. هر رکورد از این لیست، دارای اطلاعات زیر است:

  • user: کاربر
  • internal: مشخص می‌کند که اینترنت مصرفی داخلی بوده یا خارجی
  • nightly: مشخص می‌کند اینترنت مصرفی مربوط به حجم روزانه بوده یا شبانه
  • date: تاریخ مصرف حجم اینترنت
    • یک رشته با فرمت yy/MM/dd است (مانند 97/08/25).
  • usage: میزان مصرف اینترنت بر حسب مگابایت

در کلاس TrafficUsageService قرار است به کمک این داده‎ها، اطلاعات زیر استخراج شده و در دسته‎بندی مشتریان مورد استفاده قرار بگیرد:

  1. عاشقان رسانه‎های اجتماعی (متد social_media_lovers):
    • مشتریانی که در طول ماه مورد نظر از سال مورد نظر، مجموع مصرف آن‎ها از اینترنت خارجی، از مصرف اینترنت خارجی حداقل 90% سایر کاربران فعال در آن ماه بیشتر باشد.
      • مثلا اگر علی در تیر 97 به میزان 50 گیگ اینترنت خارجی مصرف کرده اما حداقل 90% سایر کاربران، هر کدام در تیر 97 مصرفشان از اینترنت خارجی کمتر از 50 گیگ بوده، علی از عاشقان رسانه‌های اجتماعی در تیر 97 بوده است.
      • منظور از کاربر فعال در یک بازه زمانی خاص، کاربری است که حداقل یک رکورد TrafficUsage در آن ماه و به نام آن کاربر ثبت شده باشد.
  2. مشتریان عشق دانلود (متد download_lovers):
    • مشتریانی که در طول ماه مورد نظر از سال مورد نظر، مجموع مصرف آن‌ها از اینترنت شبانه، بیش از مجموع مصرف آن‎ها از اینترنت روزانه باشد. *نکته*:
  • در هر یک از دو سرویس مورد نظر، به هر دلیلی اگر کاربری پیدا نشود، باید یک لیست خالی برگردانده شود (خروجی متد None نباشد).

با اجرای ماژول main ، خروجی زیر مورد انتظار است:

social media lovers:
a100
download lovers:
a100
a101
a102
Plain text

آنچه باید آپلود کنید:🔗

یک فایل زیپ آپلود کنید که در ریشه آن یک فایل وجود داشته باشد و آن هم service.py باشد.

فرانت‌‌اند - صفحه‌ی پاسخگو


در این سوال قصد داریم یک صفحه‌ی پاسخگو‌ طراحی کنیم. با تغییر اندازه‌ی عرض این صفحه، رنگ پس زمینه‌ی آن تغییر می‌کند. صفحه‌ی مورد نظر به شکل زیر خواهد بود:

Responsive Page

جزئیات🔗

ویژگی background-color برای body:

  • در صورتی که عرض صفحه کمتر از ۶۰۰ پیکسل است،‌ باید #F00 باشد.
  • در صورتی که عرض صفحه بین ۶۰۰ تا ۹۰۰ پیکسل (شامل خود ۶۰۰ و ۹۰۰) است، باید #FF0‌باشد.
  • در صورتی که عرض صفحه بیشتر از ۹۰۰ پیکسل است، باید #0F0 باشد.

تغییرات لازم را در فایل responsive.html و در صورت نیاز فایل‌ .css مورد نظر خود انجام دهید.

نکات🔗

  • فرض کنید سیستم به اینترنت متصل نیست، بنابراین از ارجاع به فایل‌های موجود در وب (CDN ها) خودداری کنید.
  • پروژه را با ساختار زیر ارسال کنید.
    [your-zip-file-name].zip
    ├── responsive.html
    └── your .css files (Optional)
    Plain text

فرانت‌اند - نمودار ساده


می‌خواهیم با استفاده از جاوااسکریپت خالص (بدون استفاده از کتابخانه‌ها) بر اساس داده‌های یک API، یک نمودار ساده مطابق با شکل زیر رسم کنیم.

نمودار ساده

این داده‌ها باید به صورت یک نمودار میله‌ای ساده نمایش داده شوند. برای هر داده، عنوان، توضیحات، رنگ و مقدار (ارتفاع میله) در API داده می‌شود. با رفتن نشانگر موس روی هرکدام از میله‌ها، آن میله فعال می‌شود (رنگ آن تغییر می‌کند و اطلاعات مربوط به آن در سمت راست نمودار نمایش داده می‌شود). همچنین با فشردن کلیدهای راست و چپ صفحه‌کلید، میله‌ی فعال تغییر می‌کند. در شکل زیر مثالی از نحوه‌ی عملکرد نمودار را مشاهده می‌کنید:

عملکرد نمودار

پروژه اولیه🔗

پروژه اولیه را از اینجا دانلود کنید. ساختار فایل‌های این پروژه به صورت زیر است:

simple-chart
├── chart.css
├── chart.html
└── data.json
Plain text

جزئیات🔗

باید به محض باز شدن صفحه، داده‌ها را از data.json (با متد GET) دریافت کنید و نمودار را طبق جزئیات زیر نمایش دهید. کدهای جاوااسکریپت خود را در فایل chart.js بنویسید (این فایل را ایجاد کنید). می‌توانید در صورت نیاز مواردی به chart.css نیز اضافه کنید. اما مجاز به تغییر فایل HTML نیستید.

هریک از داده‌ها شامل یک عنوان (title)، توضیحات (description)، مقدار (value) و رنگ (color) است. پاسخ API به شکل زیر است:

{
  "labels": {
    "x": "Country",
    "y": "Population"
  },
  "items": [
    {
      "title": "South Africa",
      "description": "South Africa is a country ...",
      "color": "#253b6e",
      "value": 58065097
    },
    {
      "title": "Italy",
      "description": "Italy, a European country with a ...",
      "color": "#1891ac",
      "value": 59216525
    },
    ...
  ]
}
JSON

مقدار (value) همواره یک عدد صحیح است. رنگ‌ها نیز به صورت hex هستند.

کارهایی که پس از دریافت داده‌ها باید انجام دهید:

۱. تنظیم برچسب محورها🔗

باید متن برچسب محور افقی و عمودی را بر اساس مقدار labels تنظیم کنید. مثلاً در شکل بالا، متن‌های Population و Country به عنوان برچسب قرار گرفته‌اند.

۲. رسم نمودار🔗

داده‌ها ابتدا باید بر اساس مقدار از زیاد به کم مرتب شوند و سپس به ترتیب و به صورت مستطیل‌های رنگی داخل عنصر .chart نمایش داده شوند.

  • عرض همه‌ی میله‌ها یکسان است و کل عرض نمودار (عنصر .chart) را می‌پوشانند.
  • ارتفاع میله‌ها باید متناسب با مقدار (value) باشد و ارتفاع برای داده با بزرگترین مقدار باید به اندازه‌ی ۹۰٪ ارتفاع نمودار (عنصر .chart) باشد.
  • رنگ هر میله باید بر اساس رنگ‌های گرفته‌شده از API تنظیم شود.

۳. میله‌ی فعال🔗

در هر لحظه باید یکی از میله‌ها فعال باشد (به رنگ #fd5f00 نمایش داده شود).

  • در ابتدا میله‌ی اول فعال است.
  • با رفتن نشانگر موس روی هر میله، آن میله فعال می‌شود.
  • با فشردن کلیدهای راست و چپ صفحه‌کلید، میله‌ی فعال تغییر می‌کند. توجه کنید که فعال شدن میله‌ها به صورت حلقوی است. یعنی در صورتی که میله‌ی انتهایی سمت راست فعال باشد، با فشردن کلید راست میله‌ی انتهایی سمت چپ فعال می‌شود و در صورتی که میله‌ی انتهایی سمت چپ فعال باشد، با فشردن کلید چپ میله‌ی انتهایی سمت راست فعال می‌شود.
  • داده‌های مربوط به میله‌ی فعال (عنوان، توضیحات و مقدار) باید در سمت راست نمودار نمایش داده شود. هر ۳ رقم مقدار (value) باید با ویرگول (,) از هم جدا شوند (مطابق شکل).

نکات🔗

  • فرض کنید سیستم به اینترنت متصل نیست، بنابراین از ارجاع به فایل‌های موجود در وب (CDN ها) خودداری کنید.
  • امکان استفاده از کتابخانه‌های جاوااسکریپت (مانند jQuery) وجود ندارد. کدهای خود را باید تنها با استفاده از امکانات جاوااسکریپت پیاده‌سازی کنید. هنگام داوری، کدهای جاوااسکریپت به جز chart.js حذف می‌شوند و بررسی می‌شود که حجم فایل chart.js کمتر از ۸ کیلوبایت باشد.
  • هنگام داوری، ابعاد و حاشیه‌ی عنصر .chart و همچنین محتوای data.json مقادیر متفاوتی نسبت به پروژه‌ی اولیه خواهند داشت. بنابراین کد شما نباید به این مقادیر خاص وابسته باشد.
  • در صورتی که فایل chart.html را به صورت عادی با مرورگر باز کنید، ممکن است هنگام ارسال درخواست برای دریافت data.json با خطای Cross Origin از طرف مرورگر مواجه شوید. در این صورت به جای باز کردن مستقیم فایل HTML با مرورگر، پوشه پروژه را با یک وب‌سرور (مثلاً python -m http.server) serve کنید.
  • پروژه را با ساختار زیر ارسال کنید. تغییر تنها در مواردی که با * مشخص شده مجاز است و ارسال سایر فایل‌ها الزامی نیست.
    [your-zip-file-name].zip
    ├── chart.css   *
    ├── chart.html
    ├── chart.js    *
    └── data.json
    Plain text