Task

Produce a formatted   12×12   multiplication table of the kind memorized by rote when in primary (or elementary) school.



Only print the top half triangle of products.




define printTimesTables(max::integer) => {
    local(result)  = ``
    local(padSize) = string(#max*#max)->size + 1
 
    // Print header row
    #result->append((' ' * #padSize) + '|')
    loop(#max) => {
        #result->append(loop_count->asString(-padding=#padSize))
    }
    #result->append("\n" + (`-` * #padSize) + '+' + (`-` * (#padSize * #max)))
 
    with left in 1 to #max do {
        // left column
        #result->append("\n" + #left->asString(-padding=#padSize) + '|')
 
        // Table results
        with right in 1 to #max do {
            #result->append(
                #right < #left
                    ? ' ' * #padSize
                    | (#left * #right)->asString(-padding=#padSize)
            )
        }
    }
 
    return #result
}
 
printTimesTables(12)