Skip to content

Commit

Permalink
added my solution (gophercises#15)
Browse files Browse the repository at this point in the history
Signed-off-by: Vivek Singh <[email protected]>

added my solution

fixed issue with blocking input

added my solution

Signed-off-by: Vivek Singh <[email protected]>

added my solution
  • Loading branch information
viveksyngh authored and joncalhoun committed Jul 23, 2019
1 parent 5ea0850 commit 6ef43f9
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 0 deletions.
12 changes: 12 additions & 0 deletions students/viveksyngh/problems.csv
Original file line number Diff line number Diff line change
@@ -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
94 changes: 94 additions & 0 deletions students/viveksyngh/quiz.go
Original file line number Diff line number Diff line change
@@ -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))
}

0 comments on commit 6ef43f9

Please sign in to comment.