Skip to content

Commit

Permalink
Quiz excercise (gophercises#35)
Browse files Browse the repository at this point in the history
  • Loading branch information
kdlug authored and joncalhoun committed Jul 22, 2019
1 parent 024f75b commit 97ea734
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 0 deletions.
99 changes: 99 additions & 0 deletions students/kdlug/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package main

import (
"bufio"
"bytes"
"encoding/csv"
"flag"
"fmt"
"io/ioutil"
"log"
"math/rand"
"os"
"strings"
"time"
)

func main() {
csvFile := flag.String("csv", "problems.csv", "csv file with questions and answers")
duration := flag.Int("time", 30, "quiz time limit")
randomize := flag.Bool("random", false, "randomize questions")

// Parse
flag.Parse()

reader := bufio.NewReader(os.Stdin)
questions := loadRecordsFromCsv(*csvFile)
correct := 0
total := len(questions) - 1

if *randomize {
questions = shuffle(questions)
}

fmt.Println("Total Questions:", total)
fmt.Println("Duration [s]:", *duration)

done := make(chan bool, 1)

go func() {
for i := 0; i < total; i++ {
fmt.Printf("Question #%d %s = ", i+1, questions[i][0])

answer, _ := reader.ReadString('\n')
// convert CRLF to LF
answer = strings.Replace(answer, "\n", "", -1)
answer = strings.ToLower(answer)
answer = strings.TrimSpace(answer)

// compare answer
if strings.Compare(questions[i][1], answer) == 0 {
correct++
}

}
done <- true
}()

select {
case <-done:
fmt.Println("Good Job!")

case <-time.After(time.Duration(*duration) * time.Second):
fmt.Println("\nYou reached maximum time.")
}

fmt.Println("Your score:", correct, "/", total)
}

// shuffle questions
func shuffle(questions [][]string) [][]string {
s := rand.NewSource(time.Now().UnixNano())
r := rand.New(s)

for i := range questions {
np := r.Intn(len(questions) - 1)
questions[i], questions[np] = questions[np], questions[i]
}

return questions
}

func loadRecordsFromCsv(csvFile string) [][]string {

// load csv file into memory, returns bytes
content, err := ioutil.ReadFile(csvFile)
if err != nil {
log.Fatal(err)
}

r := csv.NewReader(bytes.NewReader(content)) // if we have string instead of btes we can use strings.NewReader(content)

records, err := r.ReadAll()

if err != nil {
log.Fatal(err)
}

return records[1:len(records)]
}
14 changes: 14 additions & 0 deletions students/kdlug/problems.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
question,answer
5+5,10
7+3,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

0 comments on commit 97ea734

Please sign in to comment.