рд╣рдо рдЯреЙрдк 10 рдореЗрдВ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдПред рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдмреЙрдЯ
рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдореЗрдВ рдПрдХ рдмреЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рднреЗрдЬрд╛ рдЬрд┐рд╕рдореЗрдВ рдЦреЗрд▓рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдереАред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдЧреЗрдо рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ 28 рдЕрдВрдХ рдЕрд░реНрдЬрд┐рдд рдХрд┐рдП, рди рдХрд┐ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкрд░рд┐рдгрд╛рдоред рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП - рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬреЛ рдореВрд▓ рд╢рдмреНрдж рдХреЗ рдЕрдХреНрд╖рд░реЛрдВ рдФрд░ рд░реВрд╕реА рд╢рдмреНрджреЛрдВ рдХреА рд╕рдВрдЬреНрдЮрд╛ рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╢рдмреНрдж рдвреВрдВрдврддрд╛ рд╣реИред
рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ
рдореИрдВрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП sqlite3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рд╣реИ рдФрд░ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
рдЖрдзрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИред
CREATE TABLE IF NOT EXISTS words ( word VARCHAR(225) UNIQUE NOT NULL, length INTEGER NOT NULL );
- рд╢рдмреНрдж - рдирд╛рдо рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╢рдмреНрдж рдХрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрде рд╣реИред
- рд▓рдВрдмрд╛рдИ - рдЪрд░рд┐рддреНрд░ рдХреА рд▓рдВрдмрд╛рдИред
рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ; рдЗрд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд░реВрд╕реА рд╢рдмреНрджреЛрдВ рдХреА рд╕рдВрдЬреНрдЮрд╛ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рднрд░рдирд╛ рдФрд░ рд╢рдмреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдирд╛, рдПрдХ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЭрдВрдбреЗ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА init () рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
func init() { var err error connection, err = sql.Open("sqlite3", "./words.db") if err != nil { log.Fatalf("Failed connection: %v", err) } _, err = connection.Exec(`CREATE TABLE IF NOT EXISTS words (word VARCHAR(225) UNIQUE NOT NULL, length INTEGER NOT NULL);`) if err != nil { log.Fatalf("Failed create database table words: %v", err) } }
рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ () рдлрд╝рдВрдХреНрд╢рди
рд╢рдмреНрджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рд╕рд┐рд░рд┐рд▓рд┐рдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп len()
рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд╢рдмреНрдж рдХреА рд▓рдВрдмрд╛рдИ рдХреА рд╕рд╣реА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП utf8.RuneCountInString()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ if err.Error() != "UNIQUE constraint failed: words.word"
- рдирдП рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╢рдмреНрджреЛрдВ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИред
func insert(word string) error { _, err := connection.Exec("INSERT INTO words (word,length) VALUES(?,?)", word, utf8.RuneCountInString(word)) if err != nil && err.Error() != "UNIQUE constraint failed: words.word" { return err } return nil }
рд╕реНрд░реЛрдд рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрдХ рд╢рдмреНрдж рдореЗрдВ рдХрдИ рд╕рдорд╛рди рдЕрдХреНрд╖рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд░рд╛рд╢рд┐ рдХреЗ рд▓рд┐рдП рд╣рдо map[rune]int
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ map[rune]int
рдЬрд╣рд╛рдВ int
рд╢рдмреНрдж рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдХреНрд╖рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред
func decay(word string) map[rune]int { var m = make(map[rune]int) for _, char := range word { m[char]++ } return m }
рдЦреЛрдЬ рд╕реНрд╡рдпрдВ рдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЧреЛрд░реБрдЯрд╛рдЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ = рдореВрд▓ рд╢рдмреНрдж рдХреА рд▓рдВрдмрд╛рдИ, рдорд╛рдЗрдирд╕ рдПрдХ рдЧреЛрд░реВрдЯрд╛рдЗрди рд╣рдо рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдХреНрд╖рд░реЛрдВ рд╡рд╛рд▓реЗ рд╢рдмреНрджреЛрдВ рдХреЛ рдЦреЛрдЬрдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдмреЙрдЯ рдХреЛ рдЪреИрдЯ рдореЗрдВ рдЬрд╡рд╛рдм = рдЧреЛрд░реВрдЯрд╛рдЗрди рдХреА рд╕рдВрдЦреНрдпрд╛ рднреЗрдЬреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рд░ рдЧреЛрд░рдЯрд╛рдЗрди рдореЗрдВ рд╕рдордп рдерд╛ time.Sleap(1 * time.Second)
- рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдореЗрд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЛ 10 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдореИрдВрдиреЗ рднреЗрдЬрдиреЗ рдореЗрдВ рджреЗрд░реА рдХреА, рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЧреЛрд░реВрдЯреАрди рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛, рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪреИрдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЦреЛрдЬ рдХреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдлрд┐рд░ рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ waitGroup{}
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
func findSubWords(word string) { list := decay(word) for length := 2; length <= utf8.RuneCountInString(word); length++ { wg.Add(1) go func(out chan<- string, length int) { search(out, list, length) wg.Done() fmt.Println("Done: ", length) }(out, length) } wg.Wait() fmt.Println("search done") close(out) }
рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╡рд╛рдВрдЫрд┐рдд рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд▓реВрдк рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╢рдмреНрдж рдЙрдкрдпреБрдХреНрдд рд╣реИред рд╕рддреНрдпрд╛рдкрди рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред map
рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг map
рд╣рдо рд╣рд░ рдмрд╛рд░ рд▓реВрдк рдЪрдХреНрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдкреНрд░рддрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХрд┐рд╕реА рд╢рдмреНрдж рдореЗрдВ рдЕрдХреНрд╖рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП map
рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рд░ рдмрд╛рд░ рдПрдХ рдкрддреНрд░ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд╣рдо рдПрдХ-рдПрдХ рдХреБрдВрдЬреА рдХрд╛ рдореВрд▓реНрдп рддрдм рддрдХ рдШрдЯрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рддрдХ рдХрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрджрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрддреНрд░ рдХрд╛ рдорд╛рди = 0 рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЪрд░ рдХреЛ рджреЗрддреЗ рд╣реИрдВ ontain=false
рдЬрдм рдЪрдХреНрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╢рдмреНрдж рдЪреИрдирд▓ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
func search(out chan<- string, wordRuneList map[rune]int, length int) { wordList, err := selects(length) if err != nil { log.Printf("fail length %v, error: %v", length, err) } for _, word := range wordList { var ( wordCopyList = make(map[rune]int) contain = true ) for k, v := range wordRuneList { wordCopyList[k] = v } for _, r := range word { if _, ok := wordCopyList[r]; ok && wordCopyList[r] > 0 { wordCopyList[r]-- } else { contain = false break } } if contain { out <- word } } }
рдпрд╣ рдЫреЛрдЯреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рд░рд╣рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЦреБрдж рдЪреИрдЯ рдХреЗ рдЬрд╡рд╛рдм рднреЗрдЬрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдмреЙрдЯ рджреВрд╕рд░реЗ рдмреЙрдЯ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЦрд╛рддреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВрдиреЗ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдЗрд╕реЗ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ рдЪрд▓рд╛рдирд╛: 9090ред рд╣рдо рдмреЙрдЯ рдХреЛ рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВред
func send(in <-chan string) { conn, _ := net.Dial("tcp", "localhost:9090")
рдбреЗрдмрд┐рдпрди рдкрд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдХреНрд▓реА рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рдЖрдЬреНрдЮрд╛ рджреЗрддрд╛ рд╣реИред
рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
sudo apt install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev libgcrypt20 libz-dev make git
рдПрдХ рднрдВрдбрд╛рд░ рдХрд╛ рдХреНрд▓реЛрдирд┐рдВрдЧред
git clone --recursive https://github.com/vysheng/tg.git && cd tg
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрдиред
./configure make
рдкреЛрд░реНрдЯ 9090 рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓реЙрдиреНрдЪ
bin/telegram-cli -P 9090
рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдмреЙрдЯ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА search WordsGame-bot
рдХрдорд╛рдВрдб рдЪрд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдлрд┐рд░ msg WordsGame-bot test
рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдпрджрд┐ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмрд╛рдж рдЖрдкрдиреЗ рдЪреИрдЯ рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рдЯреЗрд╕реНрдЯ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЧреЗрдо рдЦреЗрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рд╡рд╣ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ рдХрд┐ рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВред
рд▓рдЧрддрд╛ рд╣реИ рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдЖрдзрд╛рд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмреЙрдЯ рдХреЗ рд╕рд╛рде рдЧреЗрдо рдЦреЗрд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЖрдк рдЦреБрдж рдмреЙрдЯ рд╕реЗ рд╢рдмреНрдж рдкреВрдЫрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдзреАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рддреБрд░рдВрдд рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдмреЙрдЯ рд╕реЗ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ msg WordsGame-bot /play
рдХрдорд╛рдВрдб рднреЗрдЬреЗрдВрдЧреЗ, рдмреЙрдЯ рдореЗрдВ рджреЗрд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо 5 рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдХрд╣рд╛рдиреА рд╕реЗ рдЕрдВрддрд┐рдо рд╕рдВрджреЗрд╢ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ history WordsGame-bot 1
рд╕рд╛рде history WordsGame-bot 1
рдпрд╣ рдЙрддреНрддрд░ рд╣реЛрдЧрд╛, рдпрд╛ рдмрд▓реНрдХрд┐ рд╡рд╣ рд╢рдмреНрдж рдЬреЛ рд╣рдореЗрдВ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред conn
рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡реИрд░рд┐рдПрдмрд▓ reply = make([]byte, 512)
рдмрдирд╛рдПрдВ reply = make([]byte, 512)
рдмрдирд╛рдПрдВред рд╣рдо рдкреВрд░реЗ рдЬрд╡рд╛рдм рдХреЛ onn
рд╕рд╛рде рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ onn
рдРрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрддрд╛ рд╣реИред
history @manymanywords_bot 1 ANSWER 58 [16:10] WordsGame-bot ┬╗┬╗┬╗
рд╕рд┐рд░рд┐рд▓рд┐рдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рд╢рдмреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП regexp.MustCompile("([-]{1,100})")
рдмрдирд╛рдПрдВред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдирд╛ рд╢рдмреНрдж рдЪреБрдирддреЗ рд╣реИрдВред
else if *god { go send(out) for { var ( conn, _ = net.Dial("tcp", "localhost:9090")
рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рд╕рднреА рд╢рдмреНрдж рдкрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ GODMOD
рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред findSubWords
рд▓рд┐рдП рдПрдХ рд╢рд░реНрдд рдЬреЛрдбрд╝реЗрдВред рдЕрдм рдЬрдм рд╣рдо -g рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ GODMOD рд╡реЗрд░рд┐рдПрдмрд▓ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЪреИрдирд▓ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд▓реВрдк рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдирдП рд╢рдмреНрдж рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред
if !GODMOD { close(out) }
рдЕрдм рдЖрдк рдкрд░рд┐рдгрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ