تیم کدکاپ برای تهیه کیبوردهای مرحلهی حضوری کدکاپ به مشکل برخورد کرده است. قضیه از این قرار است که این کیبوردها بسیار بیکیفیت هستند و کلیدهایشان زود خراب میشود. بعد از اینکه یک کلید خراب میشود با فشار دادن آن هیچ اتفاقی نمیافتد.
در واقع هر **کلید** روی کیبورد یک عمر مشخص دارد و عمر همهی کلیدهای یک کیبورد نیز با هم برابر است.
به تعداد بارهای قابل پذیرش قبل از خراب شدن یک کلید روی کیبورد، «عدد کیفیت» میگوییم. برای مثال ممکن است «عدد کیفیت» یک کیبورد برابر ۲ باشد، در این صورت هر یک از کلیدها ۲ بار کار میکند و پس از آن از کار میافتد.
یعنی در این کیبورد به ازای متن ورودی زیر:
```
Welcome to CodeCup7
```
متن زیر را دریافت میکنید:
```
Welcome to Cdup7
```
در اینجا چند تا از حروف خراب شدند؛ مثلاً `o` خراب شد و دیگر کار نکرد.
حال در این مسئله از شما میخواهیم که با داشتن «عدد کیفیت» یک کیبورد، مشخص کنید اگر کاربر بخواد با آن یک متن اولیه را وارد کنید به جایش چه متنی وارد میشود.
## توجه
+ این کیبوردها اصلا *Caps Lock* ندارند.
+ عجیب بودن این کیبوردها به اینجا خلاصه نشده. آنها فقط یک شیفت دارند.
+ کیبورد اساساً امکان نگه داشتن یک کلید را ندارد و مثلاً برای تایپ "aa" باید دوبار کلید a را فشرد.
+ کاربر اصلا هیچ اشتباه تایپی نمیکند و از backspace استفاده نمیکند.
+ این کیبوردها keypad ندارند.
![کیبورد](https://quera.org/qbox/view/ArHsBy6pDW/keyboard.jpg)
# جزئیات پروژه
پروژهی اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/157641/) دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
```
Keyboard
├── go.mod
├── go.sum
├── main.go
└── main_sample_test.go
```
در فایل `main.go` دو تابع تعریف شدهاند که شما باید آنها را کامل کنید:
### تابع NewKeyboard
این تابع قرار است یک شی از نوع *Keyboard* را مقداردهی کند و بازگرداند. ورودی این متد همان «عدد کیفیت» کیبورد است. ساختار داخلی *Keyboard* را نیز میتوانید به دلخواه طراحی و استفاده کنید.
```go main.go go
type Keyboard struct {
// TODO
}
func NewKeyboard(dure int) *Keyboard {
return &Keyboard{
// TODO
}
}
```
### تابع Enter
این تابع یک رشته ورودی میگیرد و مانند این است که کاربر آن رشته را تایپ کرده است. در خروجی چیزی که واقعا تایپ میشود را برگردانید.
دقت کنید که ممکن است برای یک کیبورد چندین بار عملیات تایپ انجام شود. همچنین ممکن است در طول تایپ یک کلمه یک کلید خراب شود و در ادامهی کلمه خراب باشد.
```go main.go go
func (keyboard *Keyboard) Enter(inp string) string {
// TODO
return ""
}
```
برای سادگی فرض کنید ورودی *inp* فقط از کارکترهای زیر تشکیل شده است:
+ حروف کوچک و بزرگ انگلیسی
+ اعداد انگلیسی
+ فاصله معمولی
+ کارکترهای خاص مقابل: `?!'`
# آنچه باید آپلود کنید
پس از پیادهسازی توابع خواسته شده، فایل `main.go` را آپلود کنید.