diff --git a/students/viveksyngh/problems.csv b/students/viveksyngh/problems.csv new file mode 100644 index 0000000..1d3e38f --- /dev/null +++ b/students/viveksyngh/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 \ No newline at end of file diff --git a/students/viveksyngh/quiz.go b/students/viveksyngh/quiz.go new file mode 100755 index 0000000..58f05a4 --- /dev/null +++ b/students/viveksyngh/quiz.go @@ -0,0 +1,94 @@ +package main + +import ( + "encoding/csv" + "os" + "fmt" + "strings" + "log" + "flag" + "time" + "math/rand" +) + +type Question struct { + question string + answer string +} + +func getQuestions(filePath string) ([]Question) { + file, err := os.Open(filePath) + if(err != nil){ + log.Fatal("Failed to open file.") + } + reader := csv.NewReader(file) + questionList, err := reader.ReadAll() + if(err != nil) { + log.Fatal("Failed to parse CSV file.") + } + questions := make([]Question, 0) + + for _, question := range questionList { + questions = append(questions, Question{strings.TrimSpace(question[0]), + strings.TrimSpace(question[1])}) + } + return questions +} + +func Quiz(questions []Question, timer *time.Timer) (score int){ + + for i, question := range questions { + fmt.Printf("Problem #%d %s : ", i + 1, question.question) + answerChannel := make(chan string) + go func() { + var userAnswer string + fmt.Scanln(&userAnswer) + answerChannel <- userAnswer + }() + + select { + case <-timer.C: + fmt.Println("\nTimeout") + return score + case userAnswer := <- answerChannel: + if(strings.TrimSpace(userAnswer) == question.answer) { + score += 1 + } + } + } + return score +} + +func randomize(questions []Question) []Question{ + n := len(questions) + for i := n-1; i>0; i-- { + j := rand.Intn(i) + temp := questions[i] + questions[i] = questions[j] + questions[j] = temp + } + return questions +} + +var csvPath string +var timeout int +var shuffle bool + +func init() { + flag.StringVar(&csvPath, "csv", "problems.csv", "a CSV file in format of 'question,answer'") + flag.IntVar(&timeout, "limit", 30, "The time limit of the quiz in seconds") + flag.BoolVar(&shuffle, "shuffle", false, "Shuffle the questions (default 'false')") +} + +func main() { + flag.Parse() + fmt.Print("Hit Enter to start the timer:") + questions := getQuestions(csvPath) + if(shuffle) { + questions = randomize(questions) + } + fmt.Scanln() + timer := time.NewTimer(time.Second * time.Duration(timeout)) + score := Quiz(questions, timer) + fmt.Printf("Your scored %d out of %d\n", score, len(questions)) +}