راهنمایی سؤالات مسابقهٔ دست‌گرمی Go کدکاپ ۷

978

راه‌حل‌های سؤالات مسابقهٔ دست‌گرمی Go کدکاپ ۷ در ادامه توضیح داده شدند. در صورتی که متوجه راه‌حلی نشدید، می‌تونید در بخش نظرات، سؤالات و ابهام‌های خودتون رو مطرح کنید.

اگه راه‌حل دیگه‌ای برای سؤالات دارید، خوشحال می‌شیم که راه‌حلتون رو در بخش نظرات با ما و دوستانتون به اشتراک بذارید.

خوش آمدید

در این سؤال، برای پیاده‌سازی تابع HelloCodeCup، می‌توان از تابع Sprintf پکیج fmt استفاده کرد. پیاده‌سازی این تابع به‌صورت زیر خواهد بود:

func HelloCodeCup(n int) string {
	return fmt.Sprintf("Hello CodeCup %d", n)
}

اروررررر

در این سؤال باید توابع پیاده‌سازی‌شده در فایل utils.go را به‌گونه‌ای در فایل helper.go فراخوانی کنید تا شرط‌های مختلف موجود در توابع برقرار شوند. برای مثال، می‌توان ErrPathShort را به‌صورت زیر مقداردهی کرد:

_, ErrPathShort = the_lib.LoadDataWithPath("1")

یک روش مناسب برای انجام این مقداردهی‌ها، قرار دادن آن‌ها در تابع init فایل helper.go است.

SIMD

برای انجام چهار عملیات f بر روی ورودی، می‌توان از چهار goroutine استفاده کرد و با استفاده از WaitGroup منتظر پایان آن‌ها ماند:

func Solution(f func(uint8) uint8, inp uint32) uint32 {
	var wg sync.WaitGroup
	var a1, a2, a3, a4 uint32

	wg.Add(4)
	go func() {
		defer wg.Done()

		a1 = uint32(f(uint8(inp & 0xff)))
	}()

	go func() {
		defer wg.Done()

		a2 = uint32(f(uint8((inp>>8)&0xff))) << 8
	}()

	go func() {
		defer wg.Done()

		a3 = uint32(f(uint8(inp>>16&0xff))) << 16
	}()

	go func() {
		defer wg.Done()

		a4 = uint32(f(uint8(inp>>24&0xff))) << 24
	}()

	wg.Wait()
	return a1 + a2 + a3 + a4
}

با تشکر از حسین زلفی.

کم‌تر ریکوئست بزن!

برای پیاده‌سازی این سؤال، می‌توان یک map از stringها به rate.Limiter را به‌همراه مقادیری دیگر (نظیر mutex جهت مدیریت هم‌روندی) در قالب یک struct تعریف کرد:

var limiter *IPRateLimiter

type IPRateLimiter struct {
	ips map[string]*rate.Limiter
	mu  *sync.RWMutex
	r   rate.Limit
	b   int
}

در ادامه، می‌توان از تابع Allow این Limiterها استفاده کرد:

func ByIp(next http.Handler, refillRate rate.Limit, tokenBucketSize int) http.Handler {
	limiter = NewIPRateLimiter(refillRate, tokenBucketSize)
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		lmtr := limiter.GetLimiter(r.RemoteAddr)
		if !lmtr.Allow() {
			w.WriteHeader(http.StatusTooManyRequests)
			w.Header().Set("Content-Type", "application/json")
			w.Write([]byte(`{"error": "too many requests"}`))
			return
		}

		next.ServeHTTP(w, r)
	})
}

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

آموزش برنامه نویسی با کوئرا کالج
نیما حیدری‌نسب

اشتراک در
اطلاع از
guest

10 دیدگاه‌
قدیمی‌ترین
تازه‌ترین بیشترین واکنش
بازخورد (Feedback) های اینلاین
View all comments
نیما
نیما
2 سال قبل

عالی

حمیدرضا
حمیدرضا
2 سال قبل

سلام ممنون برای مسابقه دستگرمی.

func main(){
        fmt.Println(errors.New("A") == errors.New("A"))
}

سوال ارررور یکم گنگ هست برام. کد بالا میگه که دو تا آبجکت errors.new با هم برابر نیستن. اگر کاربر از فانکشن های the_lib استفاده کنه که ارور هایی که the_lib برمیگردونه با ارور های پکیج کمکی برابر نمیشه؟
بازم ممنون برای مسابقه آشنا شدم با سوالات.

محمود
محمود
2 سال قبل

صادقانه بخوام بگم صورت سوالاتتون اصلا واضح نبود که دقیقا چه کاری نیاز بوده انجام بشه در حالی که برای هر سوال دقیقا فقط یک راه حل مشخص در نظر گرفته بودید و اگر شخص اون راه حل مشخص رو انجام نمیداد 0 میگرفت یا نهایتا 10 یا 20 بهش میدادید.
در ضمن در حل سوال 2، اگر بحث استفاده از یک helper برای یک کتابخونست، باید یک instance مشخص از error هر بار توسط کتابخونه برگرده که بتونید از == داخل کدهای شرکت استفاده کنید. مثلا اینطوری استفاده کنید:
if err == helper.ErrNoPath
نه تنها سوالتون نامشخص بود بلکه راه حلی که الان ارائه دادید غلطه چون اون err ای که برمیگرده هیچ وقت مساوی با helper.IsNotPath نخواهد شد چون err ای که برمیگرده یک instance کاملا جدا هستش.
خودتون برید تست کنید.
وقتی که کتابخونه هر بار داره ی error instance رو new میکنه و بهتون برش میگردونه، شما نمیتونید بیاید و از == استفاده کنید و انتظار داشته باشید بین دو error از == استفاده کنید و اونم به شما true برگردونه.
البته چرا، اگر در صورت سوال میگفتید که قرار است از errors.Is در چک کردن ها استفاده شود، همچنین درخواستی منطقی میبود ولی با توجه به صورت سوال گفته شده، این پاسخ برای سوال 2 غلط است.
}چرا

کوئرا بلاگ
ادمین
2 سال قبل
پاسخ به  محمود

سلام دوست عزیز

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

محمود
محمود
2 سال قبل

امیدوارم کامنتامو که تایید نمیکنید و حذف میکنید لااقل توی مرحله انتخابی درست کنید مشکلاتو.
همچنین امیدوارم حداقل متن کامنت قبلیمو خونده بوده باشید و همینجوری پاک نکرده باشید چون به جد ی انتقاد صحیح بود، توی کامنت قبلی هم رک گفتم و الان هم میگم، پاسخ سوال 2 غلطه.
و همچنین امیدوارم من تنها نفری نبوده باشم که غلط بودن پاسخ سوال 2 رو متوجه شده.
روز خوش.

کوئرا بلاگ
ادمین
2 سال قبل
پاسخ به  محمود

سلام مجدد دوست عزیز

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

مواردی که توضیح دادید رو پیگیری کردیم و به‌زودی بررسی میشه

حسین زلفی
2 سال قبل

سپاس از به اشتراک گذاری، مختصر و مفید بیان کردید

این خط result |= … به صورت atomic نیست و ممکنه در بعضی از حالات جواب نهایی با مقدار مورد انتظار متفاوت بشه

به نظرم مفیدتر می‌شد که پیاده سازی Allow هم می اومد، چون یک نکته‌ی ریز داشت و سوال هم به خوبی بیان نشده بود.

در کل ممنونم بخاطر به اشتراک گذاری