Convert to and from the backwards-factorial number base I wanted to ask this question: Convert to and from the factorial number system but I'm a couple of years too late!

So, instead you must convert to and from the lairotcaf backwards-factorial number base! The way it works is that the first digit is always 0, the maximum value of the next digit is 1, then 2 and so on. If a number has n digits, then each place value is given by n!/i! where i is the digit position starting at 1 on the left. The highest digit position is on the right. This means that each length uses different place values!

There is a unique shortest way to represent each number, which is what you must output for a decimal number input. If an input number starts with a 0, convert it to decimal. If it starts with any other digit, convert it to the backwards-factorial number base.

0 is both valid and the same number in both bases. In the test data no input value will use, or produce a number with a digit higher than 9. Note that the shortest representation of some numbers starts with multiple 0s.

Digit position:   1   2   3   4   5   6
Place value:    720 360 120  30   6   1
                  0   0   2   2   3   3
                  0   0 240+ 60+ 18+  3=321


This is the shortest way to represent 321 because removing a digit makes the highest number possible only 119 (5! - 1).

Test data:

Input:      Output:
0           0
1           01
002         2
3           010
011         4
5           012
0012        6
21          0121
0130        24
01000       60
01234       119
001000      120
321         002233
011235      563
0010330     987
4321        0120252
54321       000325536
654321      0010135621
0112351713  2838883
7654321     00102603574


This is code-golf so the fewest bytes wins!
ES6, 135 108 bytes

s=&gt;s&lt;"1"?[...s].reduce((t,d,i)=&gt;+d+t*++i):eval("for(i=j=k=1;i&lt;=s;i*=++j);for(r='';k&lt;=j;k++)r+=s%i/(i/=k)|0")


Converting from backwards-factorial is nice and easy. Converting to it... not so nice. I found a 119-byte version that doesn't use eval:

s=&gt;s&lt;"1"?[...s].reduce((t,d,i)=&gt;+d+t*++i):(i=j=k=1,g=_=&gt;s&lt;i||g(i*=++j),g(),[...Array(j)].map(_=&gt;s%i/(i/=k++)|0).join``)