Skip to main content
7 of 9
saved 1 byte
Arnauld
  • 197.7k
  • 20
  • 179
  • 650

#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)

Try it online!

###How?

We generate all numbers of \$N\$ digits in base 7 with an extra leading \$1\$ and interpret each digit 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:

s.replace(/0[62]|2[34]|4[51]/g, s => s[1]))  // in the code
s.replace(/I[VX]|X[LC]|C[DM]/g, s => s[1]))  // with Roman symbols

Examples:

  • XLIXIV becomes LXV
  • XIIV becomes XIV, leaving a I that will make the next test fail
  • IC is left unchanged, which also leaves an invalid I in place

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
Arnauld
  • 197.7k
  • 20
  • 179
  • 650