MickLH's suggestion of fitting a smooth function to your chosen point values is a good one. However, you do need to exercise some care in choosing the kind of function you want to fit.
For example, if, as I presume, you want the player's base score to remain above 1 (or at least above 0) no matter how much time he takes, then using a function of the form
a - b * log(x) may be a poor choice, since the logarithm will eventually grow larger than
a/b: you'd at least have to modify the calculation to always clamp the result above zero.
A better choice might be a function that naturally tends towards a limit, such as
a + b / (x + c) or
a + b * exp(-x / c). Both of these tend towards the value
x increases, so it may actually be best to fix
a at the limit value we want (e.g.
a = 1) and only vary
c to achieve the best fit.
For example, I tried the following code in gnuplot (which has a nice non-linear fitting feature):
f(x) = a + b * exp(-x / c) # define the function
a = 1; b = 15; c = 10 # initial guesses
fit f(x) '/tmp/data.dat' via b, c # adjust b and c to fit the data
/tmp/data.dat file just contained the following values:
After a few milliseconds, gnuplot spat out the following adjusted values (which were pretty close to my initial guesses anyway, since I'd eyeballed it in advance):
b = 16.2064
c = 11.7286
Rounding these to
b = 16 and
c = 12, here's what the final fit looks like, plotted with:
plot '/tmp/data.dat' with linespoints, f(x) with lines
Honestly, though, the initial guesses of
b = 15 and
c = 10 don't look bad either, they just tend to hug the lower corners of the data graph, whereas the fitted version runs closer to the middle of the range. In fact, if we drop the upper points from the data,
f(x) = 1 + 15 * exp(-x / 10) starts to look like an excellent fit, at least at x = 1, x = 5 and x = 20 (the x = 10 and x = 30 points are a bit off, but in a pretty consistent fashion):
Just pick whichever one seems more reasonable to you, or tweak them yourself.