-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgame.go
54 lines (46 loc) · 1.59 KB
/
game.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package main
const wordLen = 5
const (
fixedCharResp = '+'
badCharResp = '.'
deadCharResp = '-'
)
// Предположительная функция генерации ответа игры (информации об угаданных
// буквах). С ее учетом строится алгоритм фильтрации слов.
func getGameResponse(secret, try string) (string, error) {
// результат работы
respChars := make([]rune, wordLen)
// массивы символов загаданного слова и предположения
secretChars := []rune(secret)
if len(secretChars) != wordLen {
return "", wordLenError(secret)
}
tryChars := []rune(try)
if len(tryChars) != wordLen {
return "", wordLenError(try)
}
// число вхождений каждой буквы в загаданное слово
secretCharCount := make(map[rune]int)
for _, sc := range secretChars {
secretCharCount[sc]++
}
// сначала обозначаем угаданные буквы, уменьшая счетчик оставшихся в слове букв
for i, tc := range tryChars {
if tc == secretChars[i] {
respChars[i] = fixedCharResp
secretCharCount[tc]--
}
}
// обозначаем буквы не на своих местах и отсутствующие, в зависимости от счетчика
for i, tc := range tryChars {
if tc != secretChars[i] {
if secretCharCount[tc] > 0 {
respChars[i] = badCharResp
secretCharCount[tc]--
} else {
respChars[i] = deadCharResp
}
}
}
return string(respChars), nil
}