Interpreting 69lang (a ;# dialect) in dc
,PPCG user caird coinheringaahing came up with a language, ;#
, and a code golf challenge to implement an interpreter thereof. The language has two commands: ;
adds one to the accumulator, #
mods the accumulator 127, outputs its ASCII counterpart, and resets the accumulator. It is, quite clearly, a language that only exists for the sake of this challenge. I mostly do challenges that I can do in dc, which this challenge is not (dc simply cannot do anything with strings).
What I can do is establish a dialect of ;#
wherein the commands are transliterated to digits1. I’ve opted for 6 and 9, because I am a mature adult. So, assuming the input is a gigantic number, the challenge is fairly trivial in dc: 0sa[10~rdZ1<P]dsPx[6=Ala127%P0sa]sR[la1+saq]sA[lRxz0<M]dsMx
0sa
initializes our accumulator, a
, to zero. Our first macro, [10~rdZ1<P]dsPx
breaks a (presumably very large) number into a ton of single-digit entries on the stack. ~
yields mod and remainder, which makes the task quite simple – we keep doing ~10
, r
eversing the top-of-stack, and checking the length of our number. Once it’s down to a single digit, our stack is populated with commands.
The main macro, [lRxz0<M]dsMx
runs macro R
, makes sure there are still commands left on the stack, and loops until that is no longer true. R
, that is, [6=Ala127%P0sa]sR
tests if our command is a 6
(nee ;
), and runs A
if so. A
has a q
command in it that exits a calling macro, which means everything else in R
is essentially an else statement. So, if the command is a 9
(or, frankly, anything but a 6
), it does the mod 127, P
rint ASCII, and reset a
to zero stuff. All we have left is [la1+saq]sA
, which is macro A
, doing nothing but incrementing a
.
66666666666666666666666666666666666666666666666666666666666666666666666696666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666696666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666669666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666696666666666666666666666666666666666666666666696666666666666666666666666666666696666666666666666666666666666666666666666666666666666666666666666666666666666666666666669666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666966666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666696666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666669666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666696666666666666666666666666666666669
0sa[10~rdZ1<P]dsPx[6=Ala127%P0sa]sR[la1+saq]sA[lRxz0<M]dsMx
Hello, World!
- I ended up submitting anyway, using
tr
to translate semicolons into sixes and hashes into nines. ↩︎