Fungify is a utility for formatting numbers for the Funge family of programming languages. It emits Funge code for pushing a given integer on the stack.
Fungify is written in Haskell.Download
The source code is available here:
Motivation
Pushing numbers on the stack in Funge is not as trivial as in most programming languages. The only available numeric constants are 0–9 in Befunge-93 or 0–15 in Funge-98. Strings can also be used to extend those ranges to e.g. 0–127 for ASCII, although the availability of some values depends on your willingness to put non-printable characters in your source code.
Thus, to e.g. put 182 on the stack in Befunge-93, one might use the sequence 954**2+
, corresponding to the arithmetic expression 4 * 5 * 9 + 2, which is indeed equal to 182. Figuring this out can be a labourious or distracting process, which Fungify automates. In this case, the output of fungify dec 182
is 2794+**
, corresponding to (4 + 9) * 7 * 2, which also equals 182. (The dec
constrains Fungify to use the numbers 0–9: see usage, below, for details.)
Usage
Other than integers, Fungify takes three classes of command line arguments:
Output format selection arguments:
funge
- Funge code — specifically Unefunge, since it is always one-dimensional
rpn
- Reverse Polish notation
dc
- dc code
The last argument given overrides any previous ones. Alternatively, if a +
is prefixed to an argument, that output format will be used in addition to the previous selection.
Available number set selection arguments:
dec
- Decimal digits: 0–9
hex
- Hexadecimal digits: 0–15
ascii
- ASCII: 0–127, excluding non-printable characters
latin1
- ISO/IEC 8859-1: 0–255, excluding non-printable characters
These may also be prefixed with +
to select multiple number sets.
Behavioural arguments: best
and each
. These only have an effect when multiple number sets have been selected. best
is the default, and means to output the shortest code sequence obtainable using any of the selected sets. With each
, a separate code sequence for each selected number set is printed.
For example:
$ fungify each dec +hex +latin1 dc 123456
3 8 8 3 2 5 8 d * * * + * * *
6 4 8 3 10 8 d * * + * * *
192 3 10 64 * + *
$ fungify dec +hex +latin1 dc 123456
192 3 10 64 * + *
Typically, latin1
results in the shortest code sequence, but due to the heuristics used and the lack of optimization, with large numbers it may be beneficial to specify other sets as well. For example, in this case ascii
ended up being one character shorter:
$ fungify each ascii +latin1 999999999999999
'o9')738*+f4'@*+"1! +@"***+*****
'o9')738*+'ï' +'1'`b'+'@***+*****