in reply to Base36 numbers: speed and golf


The POSIX function strtol provides a straightforward method of converting from a Base36 number. Unfortunately, there isn't an equivalent ltostr.

Here is an un-golfed solution. It edits the number in-place.

There is a optimisation at the beginning that uses a simple string increment for numbers that don't end in 9 or Z. This gives a speed-up for 17/18 of the Base36 range.

#!/usr/bin/perl -w use strict; use POSIX 'strtol'; my @chars = (0..9, 'A'..'Z'); sub inc36 { my $num = $_[0]; if ($num !~ /[9Z]$/) { $num =~ tr/0-9/a-j/; ++$num; $num =~ tr/a-j/0-9/; return $_[0] = $num; } my $int = 1 + strtol($_[0], 36); my $base36 = ''; while ($int) { my $frac = $int % 36; $int = int ($int / 36); $base36 = $chars[$frac] . $base36; } $_[0] = $base36; }

--
John.