تیم کدکاپ برای تهیه کیبورد‌های مرحله‌ی حضوری کدکاپ به مشکل برخورد کرده است. قضیه از این قرار است که این کیبورد‌ها بسیار بی‌کیفیت هستند و کلید‌هایشان زود خراب می‌شود. بعد از اینکه یک کلید خراب می‌شود با فشار دادن آن هیچ اتفاقی نمی‌افتد.

در واقع هر کلید روی کیبورد یک عمر مشخص دارد و عمر همه‌ی کلید‌های یک کیبورد نیز با هم برابر است. به تعداد بارهای قابل پذیرش قبل از خراب شدن یک کلید روی کیبورد، «عدد کیفیت» می‌گوییم. برای مثال ممکن است «عدد کیفیت» یک کیبورد برابر ۲ باشد، در این صورت هر یک از کلید‌ها ۲ بار کار می‌کند و پس از آن از کار می‌افتد.

یعنی در این کیبورد به ازای متن ورودی زیر:

Welcome to CodeCup7
Plain text

متن زیر را دریافت می‌کنید:

Welcome to Cdup7
Plain text

در اینجا چند تا از حروف خراب شدند؛ مثلاً o خراب شد و دیگر کار نکرد.

حال در این مسئله از شما می‌خواهیم که با داشتن «عدد کیفیت» یک کیبورد، مشخص کنید اگر کاربر بخواد با آن یک متن اولیه را وارد کنید به جایش چه متنی وارد می‌شود.

توجه

  • این کیبورد‌ها اصلا Caps Lock ندارند.
  • عجیب بودن این کیبورد‌ها به اینجا خلاصه نشده. آن‌ها فقط یک شیفت دارند.
  • کیبورد اساساً امکان نگه داشتن یک کلید را ندارد و مثلاً برای تایپ "aa" باید دوبار کلید a را فشرد.
  • کاربر اصلا هیچ اشتباه تایپی نمی‌کند و از backspace استفاده نمی‌کند.
  • این کیبورد‌ها keypad ندارند.

کیبورد

جزئیات پروژه

پروژه‌ی اولیه را از این لینک دانلود کنید. ساختار فایل‌های پروژه به‌صورت زیر است:

Keyboard
├── go.mod
├── go.sum
├── main.go
└── main_sample_test.go
Plain text

در فایل main.go دو تابع تعریف شده‌اند که شما باید آن‌ها را کامل کنید:

تابع NewKeyboard

این تابع قرار است یک شی از نوع Keyboard را مقداردهی کند و بازگرداند. ورودی این متد همان «عدد کیفیت» کیبورد است. ساختار داخلی Keyboard را نیز می‌توانید به دلخواه طراحی و استفاده کنید.


type Keyboard struct {
     // TODO
}

func NewKeyboard(dure int) *Keyboard {
	return &Keyboard{
		// TODO
	}
}

Go
main.go

تابع Enter

این تابع یک رشته ورودی می‌گیرد و مانند این است که کاربر آن رشته را تایپ کرده است. در خروجی چیزی که واقعا تایپ می‌شود را برگردانید.

دقت کنید که ممکن است برای یک کیبورد چندین بار عملیات تایپ انجام شود. همچنین ممکن است در طول تایپ یک کلمه یک کلید خراب شود و در ادامه‌ی کلمه خراب باشد.


func (keyboard *Keyboard) Enter(inp string) string {
	// TODO
	return ""
}

Go
main.go

برای سادگی فرض کنید ورودی inp فقط از کارکترهای زیر تشکیل شده است:

  • حروف کوچک و بزرگ انگلیسی
  • اعداد انگلیسی
  • فاصله معمولی
  • کارکترهای خاص مقابل: ?!'

آن‌چه باید آپلود کنید

پس از پیاده‌سازی توابع خواسته شده، فایل main.go را آپلود کنید.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.