adding cs235
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type LengthError struct {
|
||||
Count int
|
||||
}
|
||||
|
||||
func (e LengthError) Error() string {
|
||||
return fmt.Sprintf("%d is not long enough (must be longer than 2)", e.Count)
|
||||
}
|
||||
|
||||
func parse(words []string) (map[string][]string, string, error) {
|
||||
if len(words) < 3 {
|
||||
return nil, "", LengthError{len(words)}
|
||||
}
|
||||
mapping := make(map[string][]string)
|
||||
var a, b, k, v, first_prefix string
|
||||
for i := 0; i < len(words)-2; i++ {
|
||||
a = words[i]
|
||||
b = words[i+1]
|
||||
k = fmt.Sprintf("%v %v", a, b)
|
||||
if i == 0 {
|
||||
first_prefix = k
|
||||
}
|
||||
v = words[i+2]
|
||||
mapping[k] = append(mapping[k], v)
|
||||
}
|
||||
k = fmt.Sprintf("%v %v", words[len(words)-2], words[len(words)-1])
|
||||
v = "THE_END"
|
||||
mapping[k] = append(mapping[k], v)
|
||||
return mapping, first_prefix, nil
|
||||
}
|
||||
|
||||
func generateText(mapping map[string][]string, first_prefix string) string {
|
||||
cur_prefix := first_prefix
|
||||
output := first_prefix
|
||||
for {
|
||||
suffix := mapping[cur_prefix][rand.Intn(len(mapping[cur_prefix]))]
|
||||
if suffix == "THE_END" {
|
||||
break
|
||||
}
|
||||
output += fmt.Sprintf(" %v", suffix)
|
||||
_prefix := strings.SplitN(cur_prefix, " ", 2)
|
||||
cur_prefix = fmt.Sprintf("%v %v", _prefix[1], suffix)
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
func main() {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
instream := bufio.NewReader(os.Stdin)
|
||||
for s, err := instream.ReadBytes('\n'); err == nil; s, err = instream.ReadBytes('\n') {
|
||||
words := strings.Fields(string(s))
|
||||
mapping, first_prefix, err := parse(words)
|
||||
var generated_text string
|
||||
if err != nil {
|
||||
generated_text = err.Error()
|
||||
} else {
|
||||
generated_text = generateText(mapping, first_prefix)
|
||||
}
|
||||
fmt.Printf("%v\n\t%v\n\t%v\n", words, mapping, generated_text)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user