mirror of
https://github.com/AmanTahiliani/gophercises.git
synced 2026-08-08 04:06:16 -04:00
Different solution for Gophercise 1
This commit is contained in:
12
1. Quiz Game Sol2/students/viveksyngh/problems.csv
Normal file
12
1. Quiz Game Sol2/students/viveksyngh/problems.csv
Normal file
@@ -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
1. Quiz Game Sol2/students/viveksyngh/quiz.go
Executable file
94
1. Quiz Game Sol2/students/viveksyngh/quiz.go
Executable file
@@ -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))
|
||||
}
|
||||
Reference in New Issue
Block a user