Multiplication tables: Difference between revisions
Content added Content deleted
m (→JS ES6: Updated primitives) |
|||
Line 3,919: | Line 3,919: | ||
====ES6==== |
====ES6==== |
||
<lang JavaScript>(() => { |
<lang JavaScript>(() => { |
||
"use strict"; |
|||
⚫ | |||
// multTable :: Int -> Int -> [[String]] |
// multTable :: Int -> Int -> [[String]] |
||
const multTable = m => n => { |
const multTable = m => n => { |
||
const xs = enumFromTo(m)(n); |
const xs = enumFromTo(m)(n); |
||
return [ |
return [ |
||
[ |
["x", ...xs], |
||
...xs.flatMap( |
...xs.flatMap( |
||
x => [ |
x => [ |
||
[x, ...xs.flatMap( |
[x, ...xs.flatMap( |
||
y => y < x ? |
y => y < x ? ( |
||
[""] |
|||
) : [str(x * y)] |
|||
)] |
)] |
||
] |
] |
||
Line 3,936: | Line 3,941: | ||
}; |
}; |
||
// |
// ---------------------- TEST ----------------------- |
||
// main :: () -> IO String |
// main :: () -> IO String |
||
const main = () => |
const main = () => |
||
wikiTable( |
wikiTable({ |
||
class: "wikitable", |
|||
style: [ |
|||
"text-align:center", |
|||
⚫ | |||
⚫ | |||
"table-layout:fixed" |
|||
⚫ | |||
⚫ | |||
⚫ | |||
); |
); |
||
// |
// ---------------- GENERIC FUNCTIONS ---------------- |
||
// Tuple (,) :: a -> b -> (a, b) |
|||
const Tuple = a => |
|||
b => ({ |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
// enumFromTo :: Int -> Int -> [Int] |
// enumFromTo :: Int -> Int -> [Int] |
||
Line 3,963: | Line 3,965: | ||
}, (_, i) => m + i) : []; |
}, (_, i) => m + i) : []; |
||
// quotRem :: Int -> Int -> (Int, Int) |
|||
const quotRem = m => n => |
|||
Tuple(Math.floor(m / n))( |
|||
⚫ | |||
⚫ | |||
// str :: a -> String |
// str :: a -> String |
||
const str = x => |
const str = x => |
||
Array.isArray(x) && x.every( |
Array.isArray(x) && x.every( |
||
v => ( |
v => ("string" === typeof v) && (1 === v.length) |
||
) ? ( |
) ? ( |
||
// [Char] -> String |
|||
x.join("") |
|||
) : null === x ? ( |
|||
⚫ | |||
) : x.toString(); |
) : x.toString(); |
||
// |
// ------------------- FORMATTING -------------------- |
||
// wikiTable :: [[a]] |
// wikiTable :: Dict -> [[a]] -> String |
||
const wikiTable = |
const wikiTable = opts => |
||
rows => { |
|||
const |
|||
style = ["class", "style"].reduce( |
|||
(a, k) => k in opts ? ( |
|||
`${a}${k}="${opts[k]}" ` |
|||
) : a, "" |
|||
) |
), |
||
. |
body = rows.map((row, i) => { |
||
const |
|||
cells = row.map( |
|||
⚫ | |||
x => `${x}` || " " |
|||
).join(" || "); |
|||
return `${i ? "|" : "!"} ${cells}`; |
|||
⚫ | |||
}).join("\n|-\n"); |
|||
return `{| ${style}\n${body}\n|}`; |
|||
⚫ | |||
// MAIN --- |
|||
return main(); |
return main(); |
||
})();</lang> |
})();</lang> |
||
{{Out}} |
{{Out}} |
||
{| class="wikitable" style="text-align:center;width:33em;height:33em;table-layout:fixed |
{| class="wikitable" style="text-align:center;width:33em;height:33em;table-layout:fixed" |
||
⚫ | |||
|- |
|||
⚫ | |||
|- |
|- |
||
| 1 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 |
| 1 || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 |
||
|- |
|- |
||
| 2 || || 4 || 6 || 8 || 10 || 12 || 14 || 16 || 18 || 20 || 22 || 24 |
| 2 || || 4 || 6 || 8 || 10 || 12 || 14 || 16 || 18 || 20 || 22 || 24 |
||
|- |
|- |
||
| 3 || || || 9 || 12 || 15 || 18 || 21 || 24 || 27 || 30 || 33 || 36 |
| 3 || || || 9 || 12 || 15 || 18 || 21 || 24 || 27 || 30 || 33 || 36 |
||
|- |
|- |
||
| 4 || || || || 16 || 20 || 24 || 28 || 32 || 36 || 40 || 44 || 48 |
| 4 || || || || 16 || 20 || 24 || 28 || 32 || 36 || 40 || 44 || 48 |
||
|- |
|- |
||
| 5 || || || || || 25 || 30 || 35 || 40 || 45 || 50 || 55 || 60 |
| 5 || || || || || 25 || 30 || 35 || 40 || 45 || 50 || 55 || 60 |
||
|- |
|- |
||
| 6 || || || || || || 36 || 42 || 48 || 54 || 60 || 66 || 72 |
| 6 || || || || || || 36 || 42 || 48 || 54 || 60 || 66 || 72 |
||
|- |
|- |
||
| 7 || || || || || || || 49 || 56 || 63 || 70 || 77 || 84 |
| 7 || || || || || || || 49 || 56 || 63 || 70 || 77 || 84 |
||
|- |
|- |
||
| 8 || || || || || || || || 64 || 72 || 80 || 88 || 96 |
| 8 || || || || || || || || 64 || 72 || 80 || 88 || 96 |
||
|- |
|- |
||
| 9 || || || || || || || || || 81 || 90 || 99 || 108 |
| 9 || || || || || || || || || 81 || 90 || 99 || 108 |
||
|- |
|- |
||
| 10 || || || || || || || || || || 100 || 110 || 120 |
| 10 || || || || || || || || || || 100 || 110 || 120 |
||
|- |
|- |
||
| 11 || || || || || || || || || || || 121 || 132 |
| 11 || || || || || || || || || || || 121 || 132 |
||
|- |
|- |
||
| 12 || || || || || || || || || || || || 144 |
| 12 || || || || || || || || || || || || 144 |
||
|} |
|} |
||