Base-26 Arithmetic
March 23, 2012
A reader named Prashant recently wrote to suggest an exercise in base-26 arithmetic:
Write a function that takes two base-26 numbers in which digits are represented by letters with A=0, B=1, … Z=25 and returns their product using the same notation. As an example, CSGHJ × CBA = FNEUZJA.
Prashant was worried that the problem was specific to C/C++, but that’s not an issue.
Your task is to write the base-26 multiplication function. When you are finished, you are welcome to read or run a suggested solution, or to post your own solution or discuss the exercise in the comments below.
PHP CLI:
Maybe it’s too early for me and I made a mistake, but I think that “CSGHJ” x “CBA” = “FOFVAJA”; here’s my Python:
Changing bases seems to work fine, i.e.
int_to_b26(b26_to_int(s)) == s
as far as I can tell.Woops, never mind. I tested against 25, instead of 26; let me work on this (make sure I don’t have any more embarassing mistakes) and get back to you later.
Yup. Changing all 25s to 26s does the trick. I won’t repost, since I’ve already filled this page with my comments.
Here is a Perl solution
Ok, I should stop, but this is good J practice for me.
Typically, I wouldn’t then bother with defining the multiply function and instead just use:
Of course, I could always define it if I wanted to:
The trick here, besides having base-conversion built-in (“#.”), is the “under” adverb, “&.”. “f &. g” translates to
J is pretty clever about deducing the inverses of functions, and you can always explicitly set the inverse to a function, if it can’t figure it out.
Hey! Here’s the C code :
Hey! there’s a flaw :P replace the last 3 lines with:
an erlang example.
“FNEUZJA” = base26:mult(“CSGHJ”, “CBA”).
In Haskell, but written for conciseness at the expense of speed and safety. :-)
Looks long now that I’ve seen the other comments, but here’s one in Common Lisp:
Another CL version, in a slightly different style from that of Jonathan.
>>> WholeSym(WholeSym(‘CSGHJ’) * WholeSym(‘CBA’))
WholeSym(‘FNEUZJA’)
>>> W = WholeSym
>>> W( W(‘C’) * W(‘BL’) * W(‘CJ’) * W(‘FV’) * W(‘VHJ’) * W(‘MVUTMJAWRZ’) )
WholeSym(‘PROGRAMMINGPRAXIS’)
Also python version
My solution written in Go lang: https://gist.github.com/2944246
@Siyuan The python one is a bit weird … int_to_b26(25) == ‘z’ int_to_b26(26) == ‘ba’ < should be 'aa'