برای آشنایی با قالب صورت سوال در Quera اینجا را مشاهده کنید و برای آشنایی با نحوه‌ی کار با ورودی و خروجی استاندارد (stdin و stdout) در زبان‌های مختلف، اینجا را ببینید.

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

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


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

شما در یک موتور جستجوی تورنت نام سریال مورد نظرتان را جستجو کرده و نتایج آن را در تعدادی فایل متنی در فولدری با آدرس مشخصی (مثلا 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 را در مک بریزید و یا سرور مجازی به شکل ساعتی تهیه کنید و کد خود را در آنجا تست کنید.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.