Skip to content

Instantly share code, notes, and snippets.

@no-dashes
Last active September 15, 2021 08:31
Show Gist options
  • Save no-dashes/e61ece27e5e1227e7affb2ccad35ad37 to your computer and use it in GitHub Desktop.
Save no-dashes/e61ece27e5e1227e7affb2ccad35ad37 to your computer and use it in GitHub Desktop.
Base54
module Base54
L = %w{0 1 2 3 4 5 6 7 8 9
A B C D E F G H K L
M N P Q R T U V W X
Y a b c d e f g h i
j k m n p q r s t u
v w x z}
WHITESPACE = [' ', '-', '_', '.', '+']
EVIL = {
'l' => '1',
'I' => '1',
'J' => '1',
'S' => '5',
'O' => '0',
'o' => '0',
'Z' => 'Y',
'y' => 'z',
}
def self.encode54(int, delimiter: '-', group_size: nil)
l = []
r = int.to_i
while r > 0
l.unshift(L[r % 54])
r = r / 54
end
# debugger
if group_size && group_size > 0
raise "illegal delimiter `#{delimiter}`" unless WHITESPACE.member?(delimiter)
n = (l.length-1) / group_size
d = (l.length - (n-1) * group_size) / 2
n.times do |i|
l.insert(d + (group_size+1)*i, delimiter)
end
end
l.join('')
end
def self.decode54(str)
r = 0
str.each_char do |c|
j = L.index(c) || L.index(EVIL[c])
next if !j && WHITESPACE.member(c)
raise "illegal character `#{c}`" unless j
r = (r*54) + j
end
r
end
class << self
alias_method :encode, :encode54
alias_method :enc, :encode54
alias_method :decode, :decode54
alias_method :dec, :decode54
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment