Lua math questions

Date: 2016-07-04
#!/usr/bin/lua
local app = {}
local fmt = string.format
local write = io.write
local exam = {}


local color = {
	NoColor = 0,
	Black = 30,
	Red = 31,
	Green = 32,
	Brown = 33,
	Blue = 34,  
	Purple = 35,
	Cyan = 36, 
	LightGray = 37
};

function setColor(color, light)
	if color == 0 then
		write('\x1B[0m');
	elseif light then
		write(fmt('\x1B[1;%dm', color));
	else
		write(fmt('\x1B[0;%dm', color));
	end
end

--exam.__index = exam
function exam:new()
	local n = {}
	setmetatable(n, exam)
	exam:init()
	return n
end

function exam:init()
	self.start = os.time()
	self.finished = 0
	self.correct = 0
	self.wrong = 0
end

local minVal = 0;
local maxVal = 20;
function getVal(notZero)
	local v = math.random(minVal, maxVal)
	while notZero and v == 0 do
		v = math.random(minVal, maxVal)
	end
	return v;
end

function exam:getQuestion()
	qt = math.random(1,3)
	x = getVal()
	y = getVal()
	if (qt == 1) then
	    q = fmt("# %d + %d = ?", x, y)
		a = x + y
	elseif (qt == 2) then
	    q = fmt("# %d - %d = ?", x, y)
		a = x - y
	elseif (qt == 3) then
	    q = fmt("# %d * %d = ?", x, y)
		a = x * y
	elseif (qt == 4) then
	    y = getVal(true)
	    q = fmt("# %d / %d = ?", x, y)
		a = x / y
	end
	return q, a
end

function exam:finish()
	self.finished = os.time()
end

function exam:printResults()
	local diff = os.difftime(self.finished, self.start)
	write( fmt("Exam time: %d sec.\n", diff) )
	write( fmt("%f sec. per correct answer\n", diff / self.correct))
	write( fmt("%d total,  %d correct, %d wrong\n", self.correct+self.wrong, self.correct, self.wrong) )
end

function app.main()
	math.randomseed(os.time())
	local myExam = exam:new()

	repeat
		local q, a = exam:getQuestion()
		write(q, "\n")
		answerStr = io.read()
		answer = tonumber(answerStr)
		if (answer) then
				if (answer >= a - 0.01 and answer <= a + 0.01) then
					setColor(color.Green);
					write("Correct!\n")					
					exam.correct = exam.correct + 1
				else
					setColor(color.Red);
					write("Wrong, correct answer: ", a,"\n")
					exam.wrong = exam.wrong + 1
				end
			setColor(color.NoColor);
			write(string.rep("-", 30), "\n")
		end
	until answerStr == ""

	exam:finish()
	exam:printResults()
end

app.main()
2520cookie-checkLua math questions