X++
Jump to navigation
Jump to search
X++ has just a bool and a stream to store values. X++ was invented in April 2008 by User:Feuermonster.
Instructions
(* may be 1 or 0) (? may be a number from 0 to stream.len)
- Xor *
- bool = bool xor *
- Or *
- bool = bool or *
- And *
- bool = bool and *
- Not
- bool = not bool
- Addr
- adds the bool to the stream which is actually a string. stream = stream + (string)bool
- Addl
- adds the bool to the stream which is actually a string. stream = (string)bool + stream
- Outc
- converts the stream to a number using binary representation. Then it prints the number as a character. (65=a)
- Outn
- converts the stream to a number using binary representation. Then it prints the number in decimal.
- Clear
- clears the stream
- Clear ?
- removes stream[?] from the stream
- Get ?
- bool = stream[?]
- Set ?
- stream[?] = bool
- XGet ?1:?2
- bool = stream[bintodec(stream[?1:?1+?2])]
- XSet ?1:?2
- stream[bintodec(stream[?1:?1+?2])] = bool
- XClear ?1:?2
- removes stream[bintodec(stream[?1:?1+?2])] from the stream
- In
- Input. (0 or 1) bool = (bool)input()
stream[?1:?1+?2] means the following:
Clear Or 1 Addl XClear 0:8 //This would convert stream[0] + stream[1] ... + stream[7] to a number using binary representation //In this case, it would remove the 128th element from the stream.
Loops
- [...] while(bool=0) { ... }
- (...) while(bool!=0) { ... }
- {...} while(stream.Length < 8) { ... }
Examples
Or 1 Addr And 0 Addr Or 1 Addr Outn
This will print 101 as decimal -> 5.
Or 1 Set 1 And 0 Set 1 Set 2 Set 3 Set 4 Set 5 Or 1 Set 6 Outc
this will print 00100001 as character -> A
Implementation
Java implementation by User:Mafi with stream readers (use a for bit 0 in the stream, b=1, c=2 ... h=7). [now all loop types]
Note: You can't use Addl in this implementation!
import java.io.*; class XppInterpreter { private static boolean actbool = false; private static boolean[] stream = new boolean[8]; private static int streamlength = 0; private static final String CMD_XOR = "XOR _b_", CMD_OR = "OR _b_", CMD_AND = "AND _b_", CMD_NOT = "NOT", CMD_ADDR = "ADDR", CMD_OUTC = "OUTC", CMD_OUTN = "OUTN", CMD_CLEAR = "CLEAR", CMD_GET = "GET _i_", CMD_SET = "SET _i_", CMD_IN = "IN"; private static final String[] varnames = { "A","B","C","D","E","F","G","H" }; private static void initStream(){ for(int i=0; i<=7; i++){ stream[i] = false; } streamlength = 0; } private static void pushOnStream(boolean newb){ for(int i=1; i<=7; i++){ stream[i-1] = stream[i]; } stream[7] = newb; streamlength++; if(streamlength>8) streamlength=8; } private static int streamToInt(){ int t = 128, r = 0; for(int i=0; i<=7; i++){ if(stream[i] == true){ r += t; } t /= 2; } return(r); } private static String goBack(String code, String oldcode){ return(oldcode.substring(oldcode.length()-code.length()-1)); } public static void interpret(String code){ initStream(); actbool = false; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); code = code.toUpperCase(); String oldcode = code; boolean noelse = false; //continue while(code.length() > 0){ noelse = false; //simple Befehle / simple Commands //not if(code.startsWith(CMD_NOT)){ actbool = !actbool; code = code.substring(CMD_NOT.length()); noelse = true; } //addr if(code.startsWith(CMD_ADDR)){ pushOnStream(actbool); code = code.substring(CMD_ADDR.length()); noelse = true; } //outc if(code.startsWith(CMD_OUTC)){ System.out.print((char) streamToInt()); code = code.substring(CMD_OUTC.length()); noelse = true; } //outn if(code.startsWith(CMD_OUTN)){ System.out.print(streamToInt()); code = code.substring(CMD_OUTN.length()); noelse = true; } //clear if(code.startsWith(CMD_CLEAR)){ initStream(); code = code.substring(CMD_CLEAR.length()); noelse = true; } //in if(code.startsWith(CMD_IN)){ try{ actbool = ((char)br.read() == ' '); }catch(Exception ex){ actbool = false; } code = code.substring(CMD_IN.length()); noelse = true; } //Bool-Funktionen / bool functions for(int i=0; i<=9; i++){ //true or false if(i <= 1) { //xor if( code.startsWith(CMD_XOR.replace("_b_",""+i)) ){ actbool = actbool ^ (1 == i); code = code.substring(CMD_XOR.length()-2); noelse = true; } //or if( code.startsWith(CMD_OR.replace("_b_",""+i)) ){ actbool = actbool | (1 == i); code = code.substring(CMD_OR.length()-2); noelse = true; } //and if( code.startsWith(CMD_AND.replace("_b_",""+i)) ){ actbool = actbool & (1 == i); code = code.substring(CMD_AND.length()-2); noelse = true; } }else{ //stream readers String var = varnames[i-2]; //xor if( code.startsWith(CMD_XOR.replace("_b_",var)) ){ actbool = actbool ^ stream[i-2]; code = code.substring(CMD_XOR.length()-2); noelse = true; } //or if( code.startsWith(CMD_OR.replace("_b_",var)) ){ actbool = actbool | stream[i-2]; code = code.substring(CMD_OR.length()-2); noelse = true; } //and if( code.startsWith(CMD_AND.replace("_b_",var)) ){ actbool = actbool & stream[i-2]; code = code.substring(CMD_AND.length()-2); noelse = true; } } } //Index-Funktionen / index functions for(int i=0; i<=7; i++){ //get if( code.startsWith(CMD_GET.replace("_i_",""+i)) ){ actbool = stream[i]; code = code.substring(CMD_GET.length()-2); noelse = true; } //set if( code.startsWith(CMD_SET.replace("_i_",""+i)) ){ stream[i] = actbool; code = code.substring(CMD_SET.length()-2); noelse = true; } } //Schelife/loop //[...] if(code.startsWith("[") && actbool == false){ int inside = 1; while(inside >= 1){ code = code.substring(1); if(code.startsWith("[")) inside++; if(code.startsWith("]")) inside--; } } if(code.startsWith("]") && actbool == true){ int inside = 1; while(inside >= 1){ code = goBack(code,oldcode); if(code.startsWith("[")) inside--; if(code.startsWith("]")) inside++; } } //(...) if(code.startsWith("(") && actbool == true){ int inside = 1; while(inside >= 1){ code = code.substring(1); if(code.startsWith("(")) inside++; if(code.startsWith(")")) inside--; } } if(code.startsWith(")") && actbool == false){ int inside = 1; while(inside >= 1){ code = goBack(code,oldcode); if(code.startsWith("(")) inside--; if(code.startsWith(")")) inside++; } } //{...} if(code.startsWith("{") && streamlength >= 8){ int inside = 1; while(inside >= 1){ code = code.substring(1); if(code.startsWith("{")) inside++; if(code.startsWith("}")) inside--; } } if(code.startsWith("}") && streamlength < 8){ int inside = 1; while(inside >= 1){ code = goBack(code,oldcode); if(code.startsWith("{")) inside--; if(code.startsWith("}")) inside++; } } //sonst... / else... if(noelse==false) code = code.substring(1); //...ein Zeichen wegmachen / ...remove one char } } public static void main(String[] args){ interpret("or 1 [addr xor a ] outn"); //255 } }