Phillip Trelford's Array

POKE 36879,255

Times Tables

As part of his maths homework my eldest has to practice the times table under the clock to improve times. This looked like a good opportunity to combine maths homework with some programming. Over about half an hour and 43 lines of code we came up with a Times Table game as an F# console application.

TimesTable

First off some helper functions:

open System

let readln () = Console.ReadLine()
let readkey () = Console.ReadKey()
let tryParseInt = Int32.TryParse 
let using color f = 
    Console.ForegroundColor <- color
    f ()
    Console.ResetColor ()
let red = ConsoleColor.Red
let green = ConsoleColor.Green
let beep () = Console.Beep ()
let wait (n:int) = Threading.Thread.Sleep n
let now () = DateTime.Now
let rand = Random()

Then a function to play a single game:

let play times = 
    for message in ["Get Ready";"3";"2";"1";"Go"] do 
        printfn "%s" message
:        wait 1000
    let begun = now ()
    [1..times] |> Seq.sumBy (fun i ->
        let a, b = rand.Next 13, rand.Next 13
        printf "%d x %d = " a b
        let entered = readln ()
        match tryParseInt entered with
        | true, answer when answer = a * b -> 
            using green (fun () -> printfn "Correct")
            1
        | _, _ ->
            beep ()
            using red (fun () -> printfn "%d x %d = %d" a b (a*b))
            0
    ) |> (fun score ->
        let taken = (now() - begun).ToString("c")
        printfn "%d correct out of %d in %s" score times taken
    )

Finally a while loop to rinse and repeat:

while true do 
    play 20
    wait 5000
    printfn "Hit a key to play again?"
    readkey () |> ignore

He’s been playing the game quite a lot since and his times keep coming down.

Attwood’s Law:

any application that can be written in JavaScript, will eventually be written in JavaScript.

And so it was, you can now play a JavaScript version of the Times table game:

    TimeTableJavaScript

The code for the JavaScript version:

var form = document.multiplication
var count = 0, correct = 0
var begun
var a, b

function element(name) { return document.getElementById(name) }

function setQuestion() {
 a = Math.floor(Math.random()*13)
 b = Math.floor(Math.random()*13)
 element("question").innerText = a + " x " + b
 form.answer.focus()
}

function nextQuestion() {
 ++count
 form.answer.value = ""
 setQuestion()
} 

function completed() {
 form.answer.disabled = false
 form.answer.value = correct + " / " + count
 var complete = new Date()
 var seconds = Math.round((complete-begun)/1000) 
 element("question").innerText = seconds + " Seconds"
 form.submit.value = "Play again"
 count=0
 correct=0
}

function next() {
 if(count == 0)
 {
   form.submit.value = "Next"
   form.answer.disabled = false
   begun = new Date()
   nextQuestion()
 } 
 else
 {
  var answer = form.answer.value
  if (answer == a * b) ++correct
  else alert(a + " x " + b + " = " + a*b)

  if (count < 10) nextQuestion()
  else completed()
 }
}

Comments (1) -

  • Dave

    11/17/2011 7:38:24 AM |

    I love simple cmd line programs, great fun Smile

Pingbacks and trackbacks (1)+

Comments are closed