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';
"use strict";

// -------------- MULTIPLICATION TABLE ---------------


// 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],
["x", ...xs],
...xs.flatMap(
...xs.flatMap(
x => [
x => [
[x, ...xs.flatMap(
[x, ...xs.flatMap(
y => y < x ? [''] : [str(x * y)]
y => y < x ? (
[""]
) : [str(x * y)]
)]
)]
]
]
Line 3,936: Line 3,941:
};
};


// ----------------------- TEST ------------------------
// ---------------------- TEST -----------------------


// main :: () -> IO String
// main :: () -> IO String
const main = () =>
const main = () =>
wikiTable(
wikiTable({
multTable(1)(12),
class: "wikitable",
true,
style: [
'text-align:center;width:33em;height:33em;table-layout:fixed;'
"text-align:center",
"width:33em",
"height:33em",
"table-layout:fixed"
].join(";")
})(
multTable(1)(12)
);
);


// ----------------- GENERIC FUNCTIONS -----------------
// ---------------- GENERIC FUNCTIONS ----------------

// Tuple (,) :: a -> b -> (a, b)
const Tuple = a =>
b => ({
type: 'Tuple',
'0': a,
'1': b,
length: 2
});


// 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))(
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 => ('string' === typeof v) && (1 === v.length)
v => ("string" === typeof v) && (1 === v.length)
) ? (
) ? (
x.join('')
// [Char] -> String
x.join("")
) : null === x ? (
"null"
) : x.toString();
) : x.toString();


// -------------------- FORMATTING ---------------------
// ------------------- FORMATTING --------------------


// wikiTable :: [[a]] -> Bool -> String -> String
// wikiTable :: Dict -> [[a]] -> String
const wikiTable = (rows, blnHeader, style) =>
const wikiTable = opts =>
'{| class="wikitable" ' + (
rows => {
style ? 'style="' + style + '"' : ''
const
) + rows.map((row, i) => {
style = ["class", "style"].reduce(
const dlm = ((blnHeader && !i) ? '!' : '|');
(a, k) => k in opts ? (
return '\n|-\n' + dlm + ' ' + row.map(v =>
`${a}${k}="${opts[k]}" `
typeof v !== 'undefined' ? v : ' '
) : a, ""
)
),
.join(' ' + dlm + dlm + ' ');
body = rows.map((row, i) => {
})
const
cells = row.map(
.join('') + '\n|}';
x => `${x}` || " "
).join(" || ");


return `${i ? "|" : "!"} ${cells}`;
// ----------------------- MAIN ------------------------
}).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"
! x || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12
|-
! x !! 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
| 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
|}
|}