From b7ff9d1de8795beebf4a8c1d355d4eb9bf4402f2 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 26 Nov 2017 22:29:29 +0300 Subject: [PATCH 1/3] solve it --- students/mielofon/problems.csv | 12 +++++ students/mielofon/quiz.go | 88 ++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 students/mielofon/problems.csv create mode 100644 students/mielofon/quiz.go diff --git a/students/mielofon/problems.csv b/students/mielofon/problems.csv new file mode 100644 index 0000000..11506cb --- /dev/null +++ b/students/mielofon/problems.csv @@ -0,0 +1,12 @@ +5+5,10 +1+1,2 +8+3,11 +1+2,3 +8+6,14 +3+1,4 +1+4,5 +5+1,6 +2+3,5 +3+3,6 +2+4,6 +5+2,7 diff --git a/students/mielofon/quiz.go b/students/mielofon/quiz.go new file mode 100644 index 0000000..aade99f --- /dev/null +++ b/students/mielofon/quiz.go @@ -0,0 +1,88 @@ +package main + +import ( + "bufio" + "encoding/csv" + "flag" + "fmt" + "io" + "os" + "strings" + "time" + "errors" +) + +var problemFileName = flag.String("csv", "./problems.csv", "a csv file in the format 'quastion,answer'") +var limit = flag.Int("limit", 30, "the time limit for the quiz in seconds") + +type recordtype struct { + question string + answer string +} + +// ReadStringWithLimitTime - function read string from reader with time limit +func ReadStringWithLimitTime(limit int, reader *bufio.Reader) (string, error) { + timer := time.NewTimer(time.Duration(limit) * time.Second).C + doneChan := make(chan bool) + answer, err := "", error(nil) + go func() { + answer, err = reader.ReadString('\n') + doneChan <- true + }() + for { + select { + case <-timer: + return "", errors.New("Timer expired") + case <-doneChan: + return answer, err + } + } +} + +func main() { + + flag.Parse() + + problemFile, err := os.Open(*problemFileName) + if err != nil { + fmt.Println(err) + return + } + + defer problemFile.Close() // close CSV file + + readerProblem := csv.NewReader(problemFile) + + var problems []recordtype + + for { + record, err := readerProblem.Read() + if err == io.EOF { + break + } + if err != nil { + println(err) + } + problems = append(problems, recordtype{record[0], strings.ToLower(strings.Trim(record[1], "\n "))}) + } + + reader := bufio.NewReader(os.Stdin) + + successAnswerCount := 0 + for i := range problems { + print("Problem #", i+1, ": ", problems[i].question, " = ") + + answer, err := ReadStringWithLimitTime(*limit, reader) + if err != nil { + println("Time expire!") + break + } + if strings.ToLower(strings.Trim(answer, "\n ")) != problems[i].answer { + break + } else { + successAnswerCount++ + } + } + println("You scored", successAnswerCount, "out of", len(problems)) + +} From df15023a6062c65e1fa9cbacb20caa5e95133663 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 26 Nov 2017 22:49:45 +0300 Subject: [PATCH 2/3] fix exit by first error --- students/mielofon/quiz.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/students/mielofon/quiz.go b/students/mielofon/quiz.go index aade99f..d761700 100644 --- a/students/mielofon/quiz.go +++ b/students/mielofon/quiz.go @@ -77,9 +77,7 @@ func main() { println("Time expire!") break } - if strings.ToLower(strings.Trim(answer, "\n ")) != problems[i].answer { - break - } else { + if strings.ToLower(strings.Trim(answer, "\n ")) == problems[i].answer { successAnswerCount++ } } From 8364d7008cbdbb87a6132840a7ab0669dd053c38 Mon Sep 17 00:00:00 2001 From: Alexey Ponomarev Date: Sun, 24 Dec 2017 17:09:55 +0300 Subject: [PATCH 3/3] change by solution --- students/mielofon/quiz.go | 60 +++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/students/mielofon/quiz.go b/students/mielofon/quiz.go index d761700..6c6da94 100644 --- a/students/mielofon/quiz.go +++ b/students/mielofon/quiz.go @@ -1,32 +1,27 @@ package main import ( - "bufio" "encoding/csv" + "errors" "flag" "fmt" - "io" "os" "strings" "time" - "errors" ) -var problemFileName = flag.String("csv", "./problems.csv", "a csv file in the format 'quastion,answer'") -var limit = flag.Int("limit", 30, "the time limit for the quiz in seconds") - type recordtype struct { question string answer string } // ReadStringWithLimitTime - function read string from reader with time limit -func ReadStringWithLimitTime(limit int, reader *bufio.Reader) (string, error) { +func ReadStringWithLimitTime(limit int) (string, error) { timer := time.NewTimer(time.Duration(limit) * time.Second).C doneChan := make(chan bool) answer, err := "", error(nil) go func() { - answer, err = reader.ReadString('\n') + fmt.Scanf("%s\n", &answer) doneChan <- true }() for { @@ -39,45 +34,54 @@ func ReadStringWithLimitTime(limit int, reader *bufio.Reader) (string, error) { } } +// ParseLines - parse lines from array of array of string to array of recordtype +func ParseLines(lines [][]string) []recordtype { + ret := make([]recordtype, len(lines)) + for i, line := range lines { + ret[i] = recordtype{ + question: line[0], + answer: strings.TrimSpace(line[1]), + } + } + return ret +} + +func exit(msg string) { + fmt.Println(msg) + os.Exit(1) +} + func main() { + problemFileName := flag.String("csv", "./problems.csv", "a csv file in the format 'quastion,answer'") + limit := flag.Int("limit", 30, "the time limit for the quiz in seconds") flag.Parse() problemFile, err := os.Open(*problemFileName) if err != nil { - fmt.Println(err) - return + exit(fmt.Sprintf("Failed to open the CSV file: %s\n", *problemFileName)) } defer problemFile.Close() // close CSV file readerProblem := csv.NewReader(problemFile) - - var problems []recordtype - - for { - record, err := readerProblem.Read() - if err == io.EOF { - break - } - if err != nil { - println(err) - } - problems = append(problems, recordtype{record[0], strings.ToLower(strings.Trim(record[1], "\n "))}) + lines, err := readerProblem.ReadAll() + if err != nil { + exit("Failed to parse the provided CSV file.") } - reader := bufio.NewReader(os.Stdin) + problems := ParseLines(lines) successAnswerCount := 0 - for i := range problems { - print("Problem #", i+1, ": ", problems[i].question, " = ") + for i, p := range problems { + fmt.Printf("Problem #%d: %s=", i+1, p.question) - answer, err := ReadStringWithLimitTime(*limit, reader) + answer, err := ReadStringWithLimitTime(*limit) if err != nil { - println("Time expire!") + println("Time expire!") break } - if strings.ToLower(strings.Trim(answer, "\n ")) == problems[i].answer { + if strings.ToLower(strings.Trim(answer, "\n ")) == p.answer { successAnswerCount++ } }