Skip to main content
6 of 9
minor update
Arnauld
  • 197.7k
  • 20
  • 179
  • 650

#JavaScript (ES7), 134 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+/^.6*5?4{0,3}3?2{0,3}1?0{0,3}$/.test((--k+m).toString(7).replace(/0[12]|2[34]|4[56]/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: V    5: D
2: X    6: M
3: L

We replace all valid subtractive pairs of the form AB with B:

s.replace(/0[12]|2[34]|4[56]/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

We check that the remaining symbols are in the correct order and do not appear more times than they're allowed to:

/^.6*5?4{0,3}3?2{0,3}1?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