#JavaScript (ES7), 133 bytes
Edit: Fixed to match the results returned by Jonathan Allan's code, which was given as a reference implementation by the OP.
n=>[...Array(m=k=7**n)].reduce(s=>s+/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test((--k+m).toString(7).replace(/0[62]|2[34]|4[51]/g,s=>s[1])),0)
###How?
We generate all numbers of \$N\$ digits in base 7 with an extra leading \$1\$:
[...Array(m = k = 7 ** n)].reduce(s => … (--k + m).toString(7) …, 0)
We generate all numbers of \$N\$ digits in base 7 with an extra leading \$1\$:
[...Array(m = k = 7 ** n)].reduce(s => … (--k + m).toString(7) …, 0)
EachFrom now on, each digit will be interpreted as a Roman numeral symbol according to the following table:
0: I 4: C
1: M 5: D
2: X 6: V
3: L
We replace all valid subtractive pairs of the form AB
with B
:$$\begin{array}{}0\longleftrightarrow \text{I}, & 1\longleftrightarrow \text{M}, & 2\longleftrightarrow \text{X}, & 3\longleftrightarrow \text{L},\\
4\longleftrightarrow \text{C}, & 5\longleftrightarrow \text{D}, & 6\longleftrightarrow \text{V}
\end{array}$$
- We replace all valid subtractive pairs of the form
AB
withB
:
.replace(/0[62]|2[34]|4[51]/g, s => s[1])) // in the code
.replace(/I[VX]|X[LC]|C[DM]/g, s => s[1])) // with Roman symbols
Examples:
XLIXIV
becomesLXV
XIIV
becomesXIV
, leaving aI
that will make the next test failIC
remains unchanged, which also leaves an invalidI
in place
We check that the remaining symbols are in the correct order and do not appear more times than they're allowed to:
- We check that the remaining symbols are in the correct order and do not appear more times than they're allowed to:
/^1*5?4{0,3}3?2{0,3}6?0{0,3}$/.test(…) // in the code
/^M*D?C{0,3}L?X{0,3}V?I{0,3}$/.test(…) // with Roman symbols