TriINTERCAL

From Esolang
Jump to navigation Jump to search

TriINTERCAL is an esoteric programming language created by Louis Howell in 1991 as a more difficult version of INTERCAL. It uses ternary instead of binary, and introduces the logical BUT operation.

TriINTERCAL programs are distinguished from INTERCAL programs by the filename extension; .3i (as opposed to .i). There is often no other way to tell them apart, because BUT and sharkfin aren't really that useful and so are not often used, and INTERCAL programs don't necessarily specify constants above 59048.

Ternary logic

TriINTERCAL differs from INTERCAL only in the width of the data types (one-spot data types are 10 trits wide and two-spot data types are 20 trits wide), and in the operators available in expressions. AND and OR are generalizations of the INTERCAL binary versions, BUT is new, and sharkfin and what are two different interpretations of XOR (both of which are available in TriINTERCAL). Mingle mingles trits, rather than bits, whereas select ANDs the two original numbers, then sorts all the bits in the first number corresponding to 2s in the second number to the least significant end, 0s in the second number to the most significant end, and 1s in between them.

AND, OR, mingle, and select operate just like their binary counterparts if no trits with the value 2 are present.

AND

& 0 1 2
0 0 0 0
1 0 1 2
2 0 2 2

OR

V 0 1 2
0 0 1 2
1 1 1 2
2 2 2 2

BUT

@ 0 1 2
0 0 1 0
1 1 1 1
2 0 1 2

Sharkfin

^ 0 1 2
0 0 1 2
1 1 2 0
2 2 0 1

What

? 0 1 2
0 0 1 2
1 2 0 1
2 1 2 0

Examples

The following program is valid INTERCAL and TriINTERCAL; it outputs II if compiled as INTERCAL and III if compiled as TriINTERCAL.

DO .1 <- #1 $ #0
DO READ OUT .1
PLEASE GIVE UP

(This program is right on the boundary as far as politeness is concerned; any more polite and it would be too polite.)

The following program reads in (or WRITES IN) a twospot number, and then outputs the result of applying all 5 ternary logical operations to it:

DO WRITE IN :1
DO :2 <- :&1
PLEASE READ OUT :2
DO :2 <- :V1
PLEASE READ OUT :2
DO :2 <- :@1
DO READ OUT :2
DO :2 <- :^1
DO READ OUT :2
DO :2 <- :?1
DO READ OUT :2
PLEASE GIVE UP

When given the input ONE TWO THREE FOUR FIVE SIX SEVEN, this program gives the following output:

_          
LMMDCCCLVII
    __________       
mclxMMMDCCCLIVDCCVIII
    _______   
mclxMMCCCXVXLV
    _____________        
mclxMMMDCCCXXVIIIDCCXCVII
    ______     
mclxMMMCCXMMCIX

(This sort of thing explains why a wimpmode option was added to some INTERCAL compilers; the same wimpmode is often present in TriINTERCAL compilers (indeed, they are often the same compilers).)

In wimpmode, the output looks like this (with the input 1234567):

52857
1163854708
1162315045
1163828797
1163212109

which, unfortunately, is still unintelligible in decimal. So in ternary:

3r00000000002200111200
3r10000002222221111221
3r10000000002201111101
3r10000002221121222021
3r10000001210022000222

(here, the input is the same value, now written 3r00000002022201111201.)

External resources

Also see External INTERCAL resources.