If we're allowed to introduce our own operators, we could concoct something like decimal notation
a . b := 10a + b
So we could write 90210 as 9 . 0 . 2 . 1 . 0 = S(S(S(S(S(S(S(S(S(0))))))))) . 0 . S(S(0)) . S(0) . 0
That doesn't quite work as it still depends upon a bunch of literal zeros. We could replace 0 with an operator Z() := 0, but that seems to be very much against the spirit of the challenge.
We could rewrite our ersatz decimal expression to only require a single zero & then evaluate a vector of functions f : N -> N across that zero, resulting in a vector of natural numbers, then reduce that vector to a single number with our `.` decimal notation operator.
Let M(fs, x) := (fs_1(x), ..., fs_n(x))
Let R(x) := x_1 . x_2 . ... . x_n
90210 = R(M((SSSSSSSSS, Id, SS, S, Id), 0))
the number of symbols to write a d-digit number this way is bounded by 10 + 10d = 10 + 10log_10(n)
Is this cheating / against the spirit of the challenge? Perhaps!
If we're allowed to introduce our own operators, we could concoct something like decimal notation
a . b := 10a + b
So we could write 90210 as 9 . 0 . 2 . 1 . 0 = S(S(S(S(S(S(S(S(S(0))))))))) . 0 . S(S(0)) . S(0) . 0
That doesn't quite work as it still depends upon a bunch of literal zeros. We could replace 0 with an operator Z() := 0, but that seems to be very much against the spirit of the challenge.
We could rewrite our ersatz decimal expression to only require a single zero & then evaluate a vector of functions f : N -> N across that zero, resulting in a vector of natural numbers, then reduce that vector to a single number with our `.` decimal notation operator.
Let M(fs, x) := (fs_1(x), ..., fs_n(x))
Let R(x) := x_1 . x_2 . ... . x_n
90210 = R(M((SSSSSSSSS, Id, SS, S, Id), 0))
the number of symbols to write a d-digit number this way is bounded by 10 + 10d = 10 + 10log_10(n)
Is this cheating / against the spirit of the challenge? Perhaps!