Single Digit Representations of Natural Numbers
Python 3, 210 bytes · 100 + 59045 digits = 80045



def f(n,d):
 m={d:d},
 while{n}-{*m[0]}:m={z:(p[x],o,q[y])for p,q in zip(m,m[::-1])for x in p for y in q for z,o in zip([x+y,x-y,x*y,y&lt;9and x**y,x%y&lt;1and x//y,int(f"{x}{y}")],"+-*^/|")if z&gt;0},*m
 return m[0][n]


Try it online!

Scoring

Scoring goes much faster using this modified version that solves 1 through 1000 all at once:

def f_gen(d):
 m={d:d},
 while 1:yield from m[0].items();m={z:(p[x],o,q[y])for p,q in zip(m,m[::-1])for x in p for y in q for z,o in zip([x+y,x-y,x*y,y&lt;9and x**y,x%y&lt;1and x//y,int(f"{x}{y}")],"+-*^/|")if z&gt;0},*m

def size(expr):
    return 1 if isinstance(expr, int) else size(expr[0]) + size(expr[2])

score = 0
for d in range(1, 10):
    s = set(range(1, 1001))
    for n, expr in f_gen(d):
        if n in s:
            s -= {n}
            score += size(expr)
            print(n, expr)
            if not s:
                break
print(score)