Legend
Paradigm(s) | imperative |
---|---|
Designed by | Joe |
Appeared in | 2022 |
Memory system | tape |
Dimensions | one-dimensional |
Computational class | Turing complete |
Reference implementation | In Prolog (GitHub) |
File extension(s) | .leg |
Legend is an esolang made by User:Joe, employing a minimalistic syntax comprising of legendre symbols, operating on an infinite tape.
Syntax
A Legend program consists of n legendre symbols of the form
(a/p)
where a and p are natural numbers, and p is an odd prime.
In addition, no other characters are allowed, not even whitespace. Using characters other than (
, )
, /
, or a digit
will result in a crash.
Legendre Symbol Evaluation
(a/p) is 1 if n^2 is congruent to a mod p for some n, and -1 otherwise. If a = p then it evaluates to 0.
Semantics
A Legend program consists of n legendre symbols, and every symbol must be different else the program will crash.
Each legendre symbol evaluates to 0
, 1
or -1
, corresponding to the following instruction table.
The table tallies three members:
Command | Description |
---|---|
0
|
Move the pointer to the right and flip the bit at the new location |
1
|
Skip the next instruction if the current cell's bit is zero (0) |
-1
|
Move the pointer to the left if the pointer index is greater than one (1) |
A program executes inside of a loop that ends if, by the end of the program, the active cell's bit is 0.
Every program structure has infinitely many implementations, as there are infinitely many legendre symbols evaluating to the same number.
Examples
Hello, world!
The following program produces in its tape the bits of the ASCII character codes defining the text "Hello, World!". Each character code octet's bits represent from left to right the most significant bit (MSB) to the least significant (LSB). Please note that an adscititious zero-valued bit is adhibited in the desinent memory cell in order to terminate the program.
This is an example of the infinitely many Hello World's in Legend out there. Using the Python script ([1]) will generate a perfectly valid random and different Hello World.
(5/73)(3/103)(1/71)(7/73)(2/139)(4/79)(8/139)(6/107)(10/23)(9/7)(13/167)(12/127)(14/173)(11/29)(15/29)(16/199)(18/59)(17/79)(19/179)(20/17)(22/43)(23/127)(21/61)(25/13)(24/17)(27/103)(28/193)(26/173)(29/97)(30/47)(31/79)(32/109)(35/181)(37/163)(33/163)(39/173)(38/47)(34/53)(42/83)(36/173)(43/31)(41/79)(40/103)(44/67)(45/149)(46/71)(51/97)(49/3)(47/41)(48/79)(52/181)(50/181)(54/89)(53/23)(57/181)(55/67)(56/97)(59/157)(58/191)(62/137)(60/103)(61/181)(63/191)(64/53)(66/7)(67/131)(68/157)(65/3)(69/103)(70/157)(72/29)(71/157)(73/167)(75/41)(74/17)(77/197)(76/113)(82/89)(79/97)(78/181)(84/139)(81/67)(80/137)(87/37)(83/59)(85/59)(86/101)(92/89)(89/137)(88/157)(90/41)(91/193)(93/13)(95/163)(94/103)(97/139)(98/199)(96/31)(99/101)(100/181)(101/191)(103/53)(102/127)(107/193)(106/23)(109/59)(113/7)(104/139)(105/163)(110/53)(111/13)(115/83)(108/107)(112/89)(114/61)(119/11)(116/61)(117/163)(118/139)(122/13)(123/71)(120/109)(121/139)(124/47)(125/103)(127/107)(128/73)(126/83)(131/137)(129/83)(133/157)(134/97)(130/59)(132/191)(135/107)(136/113)(137/131)(138/59)(139/7)(140/83)(142/97)(141/139)(143/7)(145/79)(144/103)(149/157)(150/107)(147/89)(146/7)(152/107)(148/107)(151/191)(155/191)(156/31)(153/113)(154/89)(157/61)(158/73)(160/11)(159/191)(165/101)(162/197)(168/103)(161/67)(164/97)(166/131)(163/109)(167/199)(170/173)(172/107)(169/199)(171/193)(173/59)(256/7)(257/127)(174/19)(258/61)(262/139)(175/151)(176/197)(259/113)(260/67)(261/193)(264/181)(263/37)(266/193)(177/41)(178/53)(179/127)(267/199)(180/97)(181/101)(265/97)(182/17)(183/43)(268/61)(184/151)(269/199)(272/37)(185/29)(270/131)(273/11)(271/97)(274/61)(276/31)(186/151)(187/13)(188/197)(277/5)(278/7)(275/139)(189/13)(279/29)(282/5)(281/59)(190/167)
Computational class
- This article is not detailed enough and needs to be expanded. Please help us by adding some more information.
Implementations
:-module(i,[main/1]). :-use_module(library(dcg/basics)). +[A/P|S]-->"(",number(A),"/",number(P),")",(+S;{S=[]}). \[]. \[H|T]:- \+ member(H,T),\T. 1-0. 0-1. []*I*H*V:-reverse(H,X),append(X,V,S),reverse(S,D),atomics_to_string(D,E),writeln(E),(V=[0|_];I*I*H*V). [2|R]*I*H*V:-(H=[],B=1,F=H;H=[A|F],A-B),R*I*F*[B|V]. [1|R]*I*H*[A|V]:-(A=1,G=[A|H],F=V;G=H,F=[A|V]),R*I*G*F. [0,F|R]*I*H*[A|V]:-(A=0,S=[F|R];S=R),S*I*H*[A|V]. main([C]):-open(C,read,Q),read_string(Q,_,Z),string_codes(Z,T),close(Q),+(F,T,[]),\F,maplist([A/P,L]>>(J is A^((P-1)//2)mod P,(J is P-1->L=2;L=J)),F,G),G*G*[]*[0].
See also
- Kak, on which this language was heavily based