شما به تماشای سریال علاقهی زیادی دارید و علاوه بر این علاقه یک گیک هم هستید! برای همین دوست دارید که سریالهایتان را به شکل خودکار بوسیله تورنت دانلود کنید.
شما در یک موتور جستجوی تورنت نام سریال مورد نظرتان را جستجو کرده و نتایج آن را در تعدادی فایل متنی در فولدری با آدرس مشخصی (مثلا `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
```
هر خط در هر فایل نتیجهی جستجو از درایههایی که بوسیله tab جدا شدهاند تشکیل شدهاست. درایه اول نام تورنت (torrent name) و درایه دوم تاریخ اضافه شدن آن (added time) و درایه سوم حجم این فایل (size) است که با فرمت MB و GB مشخص شدهاست. درایه چهارم تعداد مشارکتکنندگان کامل (seeds) و درایه آخر تعداد مشارکتکنندگان نیمه (leechs) است. (برای اطلاعات بیشتر: یک فایل در تورنت توسط اشخاص به شکل peer-to-peer برای دانلود ارائه میشود، seeds تعداد مشارکتکنندگان آنلاین فعلی است که فایل را به طور کامل دانلود کردهاند و leechs تعداد مشارکتکنندگان آنلاین فعلی است که خود در حال دانلود فایل هستند و تا آنجا که تا اکنون دانلود کردهاند را میتوانند برای بقیه آپلود کنند)
**توجه**: در متن بالا کاراکتر tab به درستی نمایش داده نشدهاست، برای مشاهده نمونه درست [اینجا](https://quera.ir/qbox/view/yzKfzurmQ9/log.txt) را ببینید.
شما باید اسکریپتی بنویسید که فایلهای نتیجه جستجو را از آدرس مشخصی (مثلا `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 \times seeds + leechs$ از بزرگ به کوچک
2. بر اساس size از کوچک به بزرگ
3. بر اساس torrent name به شکل lexicography (مقایسه معمول رشتهها) از کوچک به بزرگ
شما باید این کار را در اسکریپت `Bash` به نام `magic.sh` انجام دهید که به شکل زیر فراخوانی میشود.
bash magic.sh path/to/src path/to/dst
در فولدر `path/to/src` تنها فایلهای متنی قرار دارند، به عنوان نمونه:
```
src
├── f1
├── file2
└── note.txt
```
و شما باید خروجی را به شکل گفته شده مانند ساختار زیر در فایلها بریزید:
```
dst
├── 2
└── 19
└── 3
├── 1
└── 2
```
به عنوان نمونه، اگر ورودی مثال نتیجهی جستجوی بالا باشد، در فایل مربوط به قسمت ۲۰ فصل ۳ سریال خروجی به شکل زیر است:
```
Attack On Titan S03E20 720p WEB x264-URANiME[eztv]
Attack On Titan S03E20 WEB x264-URANiME
```
# نکات
+ پوشه مقصد ممکن است قبل از اجرای اسکریپت وجود نداشته باشد. در این صورت اسکریپت شما باید پوشه مقصد را بسازد.
+ نام فایلهایی که کپی میشوند نباید تغییر کند.
+ میتوانید فرض کنید ابزارهای زیر بر روی سیستم نصب است. تقریبا تمام ابزارهای رایج گنو در یک توزیع لینوکس نصب هستند، اگر سوالی در مورد وجود ابزار خاصی داشتید سوال بپرسید!
```
cut awk grep sort paste sed xargs tr expr eval seq tee printf echo print cd mkdir ls find ..
```
+ یک فایل Zip شامل اسکریپت `magic.sh` را آپلود کنید.
+ اگر از سیستم عامل mac استفاده میکنید دقت کنید که برخی ابزارها با ابزارهای gnu در لینوکس متفاوت است و عملکردشان ممکن است متفاوت باشد. کد شما باید در لینوکس به درستی کار کند. برای حل این مشکل میتوانید ابزارهای gnu را در مک بریزید و یا سرور مجازی به شکل ساعتی تهیه کنید و کد خود را در آنجا تست کنید.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.