Skip to content

Commit 94e0644

Browse files
committed
Added problems of series 7
1 parent 4c45414 commit 94e0644

6 files changed

+655
-0
lines changed

problems/alis-phonebook.md

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
[_metadata_:id]:- "alis-phonebook"
2+
[_metadata_:title]:- "دفترچه تلفن علی"
3+
[_metadata_:level]:- "medium"
4+
[_metadata_:author]:- "علیرضا خادم دقیق"
5+
[_metadata_:series]:- "io-stream-and-exception-handling"
6+
7+
+ محدودیت زمان: ۱ ثانیه
8+
+ محدودیت حافظه: ۲۵۶ مگابایت
9+
10+
----------
11+
علی دو فایل متنی با پسوند `.txt` دارد که در یکی اسامی دوستانش (به نام `names.txt`) و در دیگری شماره تلفن آنها (به نام `phones.txt`) قرار گرفته است. علی که از این وضعیت خسته شده از شما می‌خواهد برنامه‌ای بنویسید که محتوای این دو فایل را به فرمت JSON مرتب‌شده در فایلی به اسم `result.json` ذخیره کند.
12+
13+
جهت آشنایی بیشتر با فرمت JSON [اینجا](https://www.w3schools.com/js/js_json_syntax.asp) را بخوانید.
14+
15+
برای هر شماره تلفن مراحل زیر را طی نمایید.
16+
17+
1. اگر شماره تلفن با `98+` شروع شود باید به فرم نرمال (شروع با `0`) تبدیل شود.
18+
2. پس از نرمال‌سازی اگر با `09` شروع شود و دارای ۱۱ رقم باشد یک شماره همراه معتبر نامیده می‌شود.
19+
3. چنانچه شماره معتبر بود به شکل نرمال در خروجی می‌آید و در غیر این صورت `null` در خروجی خواهد آمد.
20+
21+
هر تورفتگی فایل JSON شامل ۴ کاراکتر فاصله خالی است.
22+
23+
# محدودیت
24+
25+
استفاده از کتابخانه‌های آماده برای تولید فایل JSON ممنوع است.
26+
27+
# ورودی
28+
29+
ورودی در قالب دو فایل `names.txt` و `phones.txt` داده می‌شود که محتوای هر کدام پیش از این توضیح داده شد. تضمین می‌شود که فایل‌ها تهی نیستند و تعداد سطرهای هر فایل از $10^3$ تجاوز نمی‌کند. تعداد سطرهای دو فایل با هم برابر است.
30+
31+
# خروجی
32+
33+
چنانچه خطایی رخ نداد تنها خروجی برنامه فایل `result.json` است.
34+
35+
همچنین چنانچه هر گونه مشکلی در باز شدن و دسترسی به هر یک از سه فایل مذکور وجود داشت می‌بایست با استفاده از دستور `cerr` پیام `sth went wrong` نمایش داده شده و اجرای برنامه متوقف شود.
36+
37+
# مثال
38+
39+
## ورودی نمونه ۱
40+
41+
### فایل `names.txt`
42+
```
43+
ali
44+
mohammad
45+
maryam
46+
mostafa
47+
ahmad
48+
mahmood
49+
```
50+
51+
### فایل `phones.txt`
52+
```
53+
09319471827
54+
+989369341578
55+
+989309456785
56+
12893476
57+
123498712638947
58+
+987309456785
59+
```
60+
61+
## خروجی نمونه ۱
62+
63+
### فایل `result.json`
64+
```
65+
{
66+
"ali": "09319471827",
67+
"mohammad": "09369341578",
68+
"maryam": "09309456785",
69+
"mostafa": null,
70+
"ahmad": null,
71+
"mahmood": null
72+
}
73+
```
74+

problems/anonymous-format.md

+196
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
[_metadata_:id]:- "anonymous-format"
2+
[_metadata_:title]:- "فرمت ناشناس"
3+
[_metadata_:level]:- "hard"
4+
[_metadata_:author]:- "کاظم فرقانی"
5+
[_metadata_:series]:- "io-stream-and-exception-handling"
6+
7+
+ محدودیت زمان: ۱ ثانیه
8+
+ محدودیت حافظه: ۲۵۶ مگابایت
9+
10+
----------
11+
12+
علیرضا همیشه علاقه زیادی به بیوانفورماتیک
13+
([+](https://fa.wikipedia.org/wiki/%D8%A8%DB%8C%D9%88%D8%A7%D9%86%D9%81%D9%88%D8%B1%D9%85%D8%A7%D8%AA%DB%8C%DA%A9))
14+
داشت. او دوست داشت با داده‌های ژنتیکی کار کند و الگوریتم‌های پیچیده و متنوعی را برای تحلیل آنها طراحی کند. وقتی او فارغ‌التحصیل شد، توانست در یک شرکت معتبر بیوانفورماتیک شغلی پیدا کند. این شرکت به ساخت درخت‌های فیلوژنتیک
15+
([+](https://fa.wikipedia.org/wiki/%D8%AF%D8%B1%D8%AE%D8%AA_%D8%AA%D8%A8%D8%A7%D8%B1%D8%B2%D8%A7%DB%8C%DB%8C))
16+
برای مقایسه گونه‌های مختلف موجودات مشغول بود.
17+
18+
علیرضا روز اول کارش را با اشتیاق رفت. او مدیر پروژه‌اش را ملاقات کرد و مدیرش به او گفت که وظیفه‌اش چیست: علیرضا باید توالی‌های مربوط به گونه‌های مختلف را از پایگاه داده NCBI
19+
([+](https://fa.wikipedia.org/wiki/%D9%85%D8%B1%DA%A9%D8%B2_%D9%85%D9%84%DB%8C_%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA_%D8%B2%DB%8C%D8%B3%D8%AA%E2%80%8C%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C))
20+
دانلود کرده و آنها را با نرم‌افزار مخصوص شرکت تحلیل می‌کرد. علیرضا تصور می‌کرد که این کار ساده است. او قبلاً با NCBI کار کرده بود و می‌دانست که توالی‌های گونه‌ها را می‌توان به فرمت FASTA دانلود کرد. FASTA یک فرمت استاندارد برای نمایش توالی‌های دی‌ان‌ای
21+
([+](https://fa.wikipedia.org/wiki/%D8%AF%DB%8C%E2%80%8C%D8%A7%D9%86%E2%80%8C%D8%A7%DB%8C))
22+
یا پروتئین
23+
([+](https://fa.wikipedia.org/wiki/%D9%BE%D8%B1%D9%88%D8%AA%D8%A6%DB%8C%D9%86))
24+
است.
25+
26+
اما وقتی علیرضا نرم‌افزار را باز کرد، چشمانش از تعجب گرد شد! نرم‌افزار به‌جای FASTA فقط فرمت PHYLIP را قبول می‌کرد. PHYLIP یک فرمت دیگر برای نمایش توالی‌های دی‌ان‌ای یا پروتئین است، اما با ساختاری متفاوت. علیرضا هیچ‌گاه با PHYLIP کار نکرده بود و نمی‌دانست چگونه باید FASTA را به PHYLIP تبدیل کند.
27+
28+
او ابتدا سعی کرد در اینترنت جست‌وجو کند. چندین سایت و وبلاگ را پیدا کرد، اما هیچ‌کدام جواب مناسبی به او ندادند. بعضی از آنها نصب نرم‌افزارهای جانبی را پیشنهاد می‌کردند، که علیرضا اجازه نصب آنها را نداشت. بعضی دیگر کدهایی به زبان‌های پایتون یا پرل را نشان می‌دادند، که شرکت اجازه استفاده از آنها را نمی‌داد. علیرضا فقط می‌توانست با C++ برنامه‌نویسی کند.
29+
30+
علیرضا ناامید شد. او فکر کرد که شاید بهتر است از مدیر پروژه‌اش کمک بخواهد. اما نمی‌خواست روز اول کارش ناتوان به‌نظر برسد. او خودش می‌خواست مشکل را حل کند. او یادش افتاد که یک دوست قدیمی به نام حمیدرضا دارد. حمیدرضا با علیرضا در دانشگاه آشنا شده بود. علیرضا تصمیم گرفت به او پیام بدهد و بخواهد برایش یک برنامه C++ بنویسد که FASTA را به PHYLIP تبدیل کند.
31+
32+
علیرضا پیام خود را فرستاد و منتظر جواب دوستش ماند. او امیدوار بود که حمیدرضا بتواند به او کمک کند و شغل جدیدش را نجات دهد.
33+
34+
پاسخ حمیدرضا خیلی زود آمد:
35+
36+
«سلام علیرضا، چطوری؟ من خبر نداشتم که شغل جدیدی پیدا کرده‌ای. تبریک می‌گم. اما چرا از من کمک می‌خوای؟ تو خودت بیوانفورماتیک رو خوب بلدی. من اصلاً نمی‌دونم FASTA و PHYLIP چی هستن؟ اینا چه ربطی به C++ دارن؟»
37+
38+
علیرضا سعی کرد به ساده‌ترین شکل ممکن به حمیدرضا پاسخ دهد:
39+
40+
«سلام حمیدرضا، ممنون. من از تو کمک می‌خوام چون تو C++ رو خیلی خوب بلدی. FASTA و PHYLIP دو فرمت برای نمایش توالی‌های دی‌ان‌ای یا پروتئین هستن. دی‌ان‌ای و پروتئین مولکول‌هایی هستن که حامل اطلاعات ژنتیکی هستند. توالی یعنی ترتیب نوکلئوتیدها
41+
([+](https://fa.wikipedia.org/wiki/%D9%86%D9%88%DA%A9%D9%84%D8%A6%D9%88%D8%AA%DB%8C%D8%AF))
42+
در دی‌ان‌ای یا آمینواسیدها
43+
([+](https://fa.wikipedia.org/wiki/%D8%A2%D9%85%DB%8C%D9%86%D9%88_%D8%A7%D8%B3%DB%8C%D8%AF))
44+
در پروتئین. نوکلئوتیدها و آمینواسیدها با حروف الفبای لاتین نشان داده می‌شوند. برای مثال، توالی
45+
([+](https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D8%A7%D9%84%DB%8C_%D8%A7%D8%B3%DB%8C%D8%AF_%D9%86%D9%88%DA%A9%D9%84%D8%A6%DB%8C%DA%A9))
46+
یک دی‌ان‌ای ممکن است به شکل `ATCGGCTA` باشد و توالی یک پروتئین ممکن است به شکل `MGLWKR` باشد.
47+
48+
فرمت FASTA این‌طور است که در آن نام و اطلاعات اضافی مربوط به توالی با علامت `>` شروع می‌شود. نام توالی با مشاهده اولین کاراکتر فاصله پایان می‌یابد. بعد از آن، محتوای توالی در چند خط زیر آن می‌آید. برای مثال، فایل FASTA شامل دو توالی دی‌ان‌ای ممکن است به شکل زیر باشد:
49+
50+
```
51+
>Human insulin gene
52+
ATGCCCTGTGGATGCGCCTCCTGCCCCTGC
53+
TGGCGCTGCTGGCCCTCTGGGGACCTGAAC
54+
GACTACTAGCCTCATCAATACGACTAGATA
55+
GAGATCCGTACAGAGAG
56+
57+
>Rat insulin gene
58+
ATGCCAGTGTGGATGCACCACCATGCCATC
59+
AAGCAGGTCAAGGCCAACGACCCCTTGCAC
60+
ACGATTTATATATACCCCAGATACCCGTGG
61+
AGCGACTCCCCCCCACA
62+
```
63+
64+
65+
فرمت PHYLIP این‌طور است که اول یک خط شامل تعداد توالی‌ها و طول محتوای هر توالی می‌آید. بعد از آن، هر خط شامل نام و ۵۰ کاراکتر اول یک توالی است. نام توالی باید حداکثر ۱۰ کاراکتر باشد و سمت راست آن با فضای خالی پر شود. چنانچه نام توالی بیشتر از ۱۰ کاراکتر بود فقط ۱۰ کاراکتر اولش به‌عنوان نام آن در نظر گرفته می‌شود. سپس یک فاصله می‌آید و بعد ۵۰ کاراکتر اول محتوای توالی در بسته‌های ۱۰ کاراکتری پس از آن می‌آید. برای مثال، فایل PHYLIP متناظر با فایل FASTA بالا به شکل زیر است:
66+
67+
```
68+
2 107
69+
Human ATGCCCTGTG GATGCGCCTC CTGCCCCTGC TGGCGCTGCT GGCCCTCTGG
70+
Rat ATGCCAGTGT GGATGCACCA CCATGCCATC AAGCAGGTCA AGGCCAACGA
71+
72+
GGACCTGAAC GACTACTAGC CTCATCAATA CGACTAGATA GAGATCCGTA
73+
CAGAGAG
74+
75+
CCCCTTGCAC ACGATTTATA TATACCCCAG ATACCCGTGG AGCGACTCCC
76+
CCCCACA
77+
```
78+
79+
در ضمن همون‌طور که توی مثال بالا می‌بینی اگر توالی‌ها تعداد بیشتری کاراکتر داشتن متناظر هر توالی و به همون شکل و ترتیب در خطوط بعدی نوشته می‌شن.
80+
81+
حالا من می‌خوام یک برنامه C++ بنویسم که فایل FASTA را به PHYLIP تبدیل کنه. تو می‌تونی به من کمک کنی؟»
82+
83+
حمیدرضا گفت:
84+
85+
«آره، فکر کنم. دقیقاً بگو برنامه باید چکار بکنه؟»
86+
87+
علیرضا گفت:
88+
89+
«خیلی ممنون. خب، اول باید فایل FASTA ورودی رو باز کنی و تعداد و طول توالی‌ها رو پیدا کنی. بعد باید نام و محتوای هر توالی رو جداسازی و در متغیرهای مناسب ذخیره کنی. در نهایت باید نام و محتوای هر توالی رو با قالب مناسبی که در پیام قبل توضیح دادم در فایل PHYLIP خروجی بنویسی. آدرس فایل FASTA و آدرس فایل PHYLIP به‌ترتیب در خط اول و دوم ورودی به برنامه داده می‌شن.»
90+
91+
حمیدرضا که سرش شلوغ بود دوست نداشت دوستش را تنها بگذارد. او پاسخ داد:
92+
93+
«خب، سخت به‌نظر نمی‌رسه. چند نمونه فایل FASTA و فایل PHYLIP برای من بفرست و من شروع می‌کنم.»
94+
95+
علیرضا با اشتیاق و به‌سرعت فایل‌های نمونه را برای حمیدرضا فرستاد و منتظر ماند.
96+
97+
حالا ساعتی می‌گذرد که حمیدرضا شروع به نوشتن برنامه کرده است اما باگ‌های مختلف او را کلافه کرده است و دیگر فرصتی برای اتلاف وقت ندارد. از شما به‌عنوان یکی از دوستان خوب و ماهرش می‌خواهد این برنامه را بنویسید تا برای دوستش بفرستد و شغل او را نجات دهد. با توجه به اینکه تا همین لحظه سه نفر درگیر این کد نه‌چندان دشوار شده‌اند از شما می‌خواهیم خودتان این کد را بنویسید و آن را این‌قدر دست به دست نکنید!
98+
99+
# ورودی
100+
101+
در خط اول ورودی آدرس فایل FASTA (شامل پسوند آن) و در خط دوم ورودی آدرس فایل PHYLIP (شامل پسوند آن) می‌آید. این امکان وجود دارد که آدرس‌ها شامل کاراکتر فاصله باشند. همچنین فایل FASTA ورودی ممکن است موجود نباشد اما تضمین می‌شود که همه پوشه‌های پدر فایل PHYLIP موجود هستند.
102+
103+
# خروجی
104+
105+
تنها خروجی برنامه شما فایل PHYLIP است که باید در آدرسی که در ورودی داده شده است ذخیره شود.
106+
107+
با این حال در صورتی که هر کدام از خطاهای زیر رخ داد با استفاده از دستور `cerr` پیام مربوط به آن را در خروجی ترمینال چاپ کنید و اجرای برنامه را به پایان برسانید.
108+
109+
| اولویت | دلیل خطا | پیام خطا |
110+
| --- | --- | --- |
111+
| ۱ | فایل FASTA ورودی وجود ندارد. | FASTA file does not exist! |
112+
| ۲ | طول توالی‌ها یکسان نیست. | The sequences are not the same length! |
113+
114+
# مثال
115+
116+
جهت ساده‌سازی، مثال‌ها و نیز نمونه‌هایی که برای داوری استفاده می‌شوند به‌صورت مصنوعی تولید شده‌اند و یا به‌طور وسواس‌گونه‌ای از بین میلیون‌ها توالی انتخاب شده‌اند. پردازش توالی‌های بسیار طولانی و فایل‌های حجیم خارج از اهداف این سؤال است.
117+
118+
## ورودی نمونه ۱
119+
120+
```
121+
tests/in/1.fasta
122+
tests/out/1.phy
123+
```
124+
125+
که در آن فایل `tests/in/1.fasta` به شکل زیر است:
126+
127+
```
128+
>Snake Serpentes
129+
agctatcgacgccctagcgcctt
130+
agactcttccaaa
131+
gttaaacaaccgttt
132+
gatg
133+
134+
>Fish Vertebrata
135+
gcctcaaacc
136+
gatctttgactagctccaaatgcccatgc
137+
ttatactggcgtgact
138+
```
139+
140+
141+
## خروجی نمونه ۱
142+
143+
تنها خروجی برنامه فایل `tests/out/1.fasta` است که به شکل زیر می‌باشد:
144+
145+
```
146+
2 55
147+
Snake agctatcgac gccctagcgc cttagactct tccaaagtta aacaaccgtt
148+
Fish gcctcaaacc gatctttgac tagctccaaa tgcccatgct tatactggcg
149+
150+
tgatg
151+
152+
tgact
153+
```
154+
155+
## ورودی نمونه ۲
156+
157+
```
158+
organisms.fasta
159+
organisms.phy
160+
```
161+
162+
که در آن فایل `organisms.fasta` محتویات زیر را دارد:
163+
164+
```
165+
>Milesia
166+
MSPQRDRINAFYKDNPHPKGSRIVINREHLMIDRP
167+
DKLRMESKRSRAVV
168+
169+
>Parastratiosphecomyia
170+
DQYCADVAAEELMNALVNSTLLETRTTNQFLAVSS
171+
NLSVEH
172+
```
173+
174+
## خروجی نمونه ۲
175+
176+
با توجه اینکه طول توالی‌های موجود در فایل ورودی یکسان نیست خطای ۲ در خروجی ترمینال چاپ می‌شود:
177+
```
178+
The sequences are not the same length!
179+
```
180+
181+
## ورودی نمونه ۳
182+
183+
```
184+
db/viruses.fasta
185+
db/viruses.phy
186+
```
187+
188+
که در آن فایلی با آدرس `db/viruses.fasta` وجود ندارد.
189+
190+
## خروجی نمونه ۳
191+
192+
با توجه به اینکه فایل ورودی موجود نیست خطای ۱ در خروجی ترمینال چاپ می‌شود:
193+
```
194+
FASTA file does not exist!
195+
```
196+

0 commit comments

Comments
 (0)