سلام دوست من😃👋
به مسابقه Back-End بله کمپ ۶ خوش آمدید!
مسابقه به مدت ۳ ساعت ادامه خواهد داشت و در مجموع شامل ۳ سوال است.
سوالات به گونهای تنظیم شدهاند که با توجه به دانشی که دارید بتوانید بخشی از نمرۀ سوال را بگیرید. به عنوان مثال اگر نتوانید سوال ۲ را به طور کامل حل کنید، این امکان وجود دارد که بتوانید بخشی از سوال ۲ را حل کنید؛ بنابراین حتما به تمام سوالات مراجعه کنید.
رتبهبندی بر اساس مجموع امتیازاتی که از سوالات کسب میکنید صورت میگیرد؛ همچنین در صورتی که امتیاز دو نفر یکسان شود، کسی که سوالات را در مدتزمان کمتری حل کرده باشد، رتبۀ بهتری کسب میکند.
لینکهای مفید برای شرکت در مسابقه:
+ [قوانین شرکت در مسابقات](https://quera.org/course/assignments/2693/problems/33523)
+ [قالب صورت سؤال تکنولوژی](https://quera.org/course/assignments/2693/problems/16283)
+ [آشنایی با تست نمونهی سؤالات تکنولوژی](https://quera.org/course/assignments/2693/problems/42815)
+ [راهنمای کار با سیستم داوری Go کوئرا](https://quera.org/course/assignments/31745/problems/104120)
+ [آموزش مقدماتی Go](https://quera.org/course/assignments/31745/problems/104131)
+ [آموزش شرکت در مسابقهی Go](https://www.aparat.com/v/9JBVZ)
موفق باشید 😉✌
در این مسئله، *سلیب* میخواهد بازیای تعریف کند تا از تنهایی ابدی خود نجات یابد و کمی سرگرم شود. این بار میخواهد تا یک برنامه تعاملی بنویسد تا عددی که کد دیگر او انتخاب کرده را پیدا کند :). بازی به این صورت است که *سلیب* میخواهد تابع `GuessMyNumber`را در فایل `main.go` پیادهسازی کند. امضای این تابع به شکل زیر است:
```go main.go go
func GuessMyNumber(game Game) string {
...
}
```
این تابع یک شی از نوع `Game` را دریافت میکند. هدف این تابع پیدا کردن عددی است که بازی انتخاب کرده و در داخل `Game` ذخیره شده است. اما پیدا کردن به شکل مستقیم امکان ندارد و باید حتما بازی کنیم! در واقع ما فقط به یک تابع دسترسی داریم که حدسهای خود را به آن میدهیم و حدسمان را بررسی میکند و به ما **راهنمایی** میکند که به جواب اصلی نزدیکتر شویم.
در نهایت تابع `GuessMyNumber` پس از اینکه حدسهای مختلفی میزند و نهایتا پاسخ را پیدا میکند، پاسخ خود را با یک پیام به شکل رشته باز میگرداند:
```
Your Number was <mark class="blue" title="عدد پیدا شده"><NUMBER></mark>
```
برای مثال اگر عدد بازی برابر با `269`باشد، این تابع پس از فهمیدن عدد باید عبارت زیر را برگرداند.
```
Your Number was 269
```
# جرئیات Game
در فایل `utils.go`، اینترفیس `Game` آمده است که در اینجا نیز میتوانیم آن را ببینیم:
```go utils.go go
package main
type Game interface {
CheckNumber(n int) string
}
```
تابع `CheckNumber` عددی که به عنوان حدس میگیرد را بررسی میکند و ۳ حالت مختلف را برمیگرداند:
+ اگر عدد ورودی تابع یا همان `n` از عدد مورد نظر بازی کمتر باشد، عبارت `My Number is Greater` را برمیگرداند.
+ اگر عدد ورودی تابع یا همان `n` از عدد مورد نظر بازی بیشتر باشد، عبارت `My Number is Lower` را برمیگرداند.
+ اگر عدد ورودی تابع یا همان `n` دقیقا برابر با عدد مورد نظر بازی باشد، عبارت `CORRECT` را برمیگرداند.
# نمرهدهی
از آنجا که اجرای تابع `CheckNumber` برای *سلیب* هزینه دارد (و شاید هم به دنبال پیچاندن و سختتر کردن مسئله است!) *سلیب* مسئله را در ۴ بخش تعریف کرده است:
| مسئله | نمره |
|---|---|
| با پرسیدن حداکثر ۳۶۰ پرسش به عدد برسد | ۲۵ |
| با پرسیدن حداکثر ۱۸۰ پرسش به عدد برسد | ۲۵ |
| با پرسیدن حداکثر ۶۰ پرسش به عدد برسد | ۲۵ |
| با پرسیدن حداکثر ۱۰ پرسش به عدد برسد | ۲۵ |
هرچه الگوریتم شما برای یافتن عدد بهتر باشد، نمره بیشتری در این مسئله دریافت میکنید :) پس به دنبال راهحلهای خلاقانه باشید.
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/contest/assignments/54145/download_problem_initial_project/183357/) دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
```
.
├── go.mod
├── go.sum
├── main.go
├── utils.go
└── main_sample_test.go
```
فایل `utils.go` شامل اینترفیس `Game` است. فایل `main_sample_test.go` نیز شامل یک پیادهسازی نمونه از `Game` است که برای تستهای اولیهی کد خود میتوانید از آن استفاده کنید. فایل `main.go` نیز شامل تابعی است که شما باید پیادهسازی کنید.
**توجه:** در این سؤال تنها مجاز به استفاده از کتابخانههای `bufio` و `fmt` و `math/rand` و `os` و `strings` هستید.
### محدودهی عددی که باید حدس بزنید بین ۱ تا ۳۶۰ است
# آنچه باید آپلود کنید
پس از پیادهسازی تابع `GuessMyNumber`، فایل `main.go` را آپلود کنید.