Skip to content

Instantly share code, notes, and snippets.

@dragon0
Created December 2, 2017 00:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dragon0/28b4a48458a6eefda0ae8ce69e71b313 to your computer and use it in GitHub Desktop.
Save dragon0/28b4a48458a6eefda0ae8ce69e71b313 to your computer and use it in GitHub Desktop.
Generates arithmetic questions and times your answers
import groovy.swing.SwingBuilder
import java.awt.BorderLayout as BL
import javax.swing.JFrame
final int COUNT = 20
xs = []
ys = []
ops = []
results = []
index = 0
startTime = 0
endTime = 0
regen = {
xs = []
ys = []
ops = []
results = []
index = 0
for(i in new IntRange(1, COUNT)) {
opi = (int)(Math.random() * 4)
switch(opi) {
case 0: op = '+'; break
case 1: op = '-'; break
case 2: op = '*'; break
case 3: op = '/'; break
}
switch(op) {
case '+':
x = (int)(Math.random() * 100) + 1
y = (int)(Math.random() * 100) + 1
break
case '-':
x = (int)(Math.random() * 100) + 1
y = (int)(Math.random() * 100) + 1
if(x < y) {
tmp = x
x = y
y = tmp
}
break
case '*':
x = (int)(Math.random() * 10) + 1
y = (int)(Math.random() * 10) + 1
break
case '/':
y = (int)(Math.random() * 10) + 1
q = (int)(Math.random() * 10) + 1
x = y * q
break
}
xs.add(x)
ys.add(y)
ops.add(op)
}
}
start = {
state = running
startTime = System.currentTimeMillis()
textlabel.text = "${xs[0]} ${ops[0]} ${ys[0]} = ?"
}
running = {
res = textfield.text
textfield.text = ""
results.add(res)
index ++
if(index < COUNT) {
textlabel.text = "${xs[index]} ${ops[index]} ${ys[index]} = ?"
}
else {
endTime = System.currentTimeMillis()
state = showResults
showResults()
}
}
showResults = {
s = '<html>'
for(i in new IntRange(0, COUNT-1)) {
try {
res = Integer.parseInt(results[i])
}
catch(NumberFormatException ex) {
s += "<font color='red'>${xs[i]} ${ops[i]} ${ys[i]} = NAN (${results[i]})</font><br>"
continue
}
switch(ops[i]) {
case '+':
exp = xs[i] + ys[i]
break
case '-':
exp = xs[i] - ys[i]
break
case '*':
exp = xs[i] * ys[i]
break
case '/':
exp = xs[i] / ys[i] //
break
}
if(res != exp) {
s += "<font color='red'>${xs[i]} ${ops[i]} ${ys[i]} != ${results[i]}</font> (= ${exp})<br>"
}
else {
s += "${xs[i]} ${ops[i]} ${ys[i]} = ${results[i]}<br>"
}
}
s += "time: ${(endTime - startTime) / 1000}"
textlabel.text = s
state = restart
}
new SwingBuilder().edt {
frame(title: 'Frame', defaultCloseOperation: JFrame.EXIT_ON_CLOSE, size: [200, 400], show: true) {
borderLayout()
textlabel = label(text: 'Press enter', constraints: BL.NORTH)
textfield = textField(
actionPerformed: {state()},
constraints: BL.SOUTH
)
}
}
restart = {
regen()
state = start
textlabel.text = 'Press enter'
}
restart()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment