The one I had the most fun with was Befunge, a 2d interpreted stack-based language in which the execution could run North, South, East, or West, and each command was a single character. In order to push a number larger than 9 you had to push two or more smaller numbers and use arithmetic. For instance, the following sequence would push the number 99:
where the included characters mean:
> execution proceeds to the right
: duplicate the value on top of the stack
# skip the next cell
, pop and print the value on top of the stack
_ pop and if zero then execution proceeds to the right, else execution proceeds to the left.