Reng
by Conor O'Brien
HTML
<h1>Reng v.5.1</h1>
<div id="ops"></div>
<h2>input</h2>
<input id="upload" type="file"><button onclick="upload()">Submit file</button>
<textarea spellcheck="false" id="input"></textarea>
<button id=f>feed input</button>
<h2>code</h2>
<textarea spellcheck="false" id="code">
</textarea>
<button id=s>set code</button><button id=b>step</button><button id=r>run</button>(<input id=int value=500>ms delay)<button id=q>stop</button>
<div id="dispTable"></div>
<div id="stack"></div>
<hr>
<h2>output</h2>
<div id=o></div>
<hr>
<h2>Previous versions</h2>
<ul>
<li>v.current - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq">link</a></li>
<li>v.1 - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq/9/">link</a>
<ul>
<li>v.1.1 - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq/10/">link</a></li>
<li>v.1.2 - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq/15/">link</a></li>
<li>v.1.3 - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq/17/">link</a></li>
</ul>
</li>
<li>v.2 - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq/18/">link</a><ul>
<li>v.2.1 - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq/20/">link</a></li>
</ul></li>
<li>v.3 - <a target="_parent" href="https://jsfiddle.net/Conor_OBrien/avnLdwtq/22/">link</a></li>
</ul>
CSS
@import url(https://fonts.googleapis.com/css?family=Droid+Sans+Mono:400);@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,300,300italic,400italic,700,700italic);html,button,input{font-family:"Open Sans",sans-serif;}table{border-collapse:collapse;}td{width:1em;height:1em;border:1px solid #888;padding:5px;text-align:center;}td.cur{background:#edaaaa;}textarea,#o{width:100%;min-height:7em;}#int{width:6ch;}td,textarea,#stack,#o,#ops{font-family:"Droid Sans Mono",monospace;white-space:pre;}h1,h2{margin:0;}
JavaScript
// oollyfills
Array.from||(Array.from=function(){var r=Object.prototype.toString,n=function(n){return"function"==typeof n||"[object Function]"===r.call(n)},t=function(r){var n=Number(r);return isNaN(n)?0:0!==n&&isFinite(n)?(n>0?1:-1)*Math.floor(Math.abs(n)):n},e=Math.pow(2,53)-1,o=function(r){var n=t(r);return Math.min(Math.max(n,0),e)};return function(r){var t=this,e=Object(r);if(null==r)throw new TypeError("Array.from requires an array-like object - not null or undefined");var a,u=arguments.length>1?arguments[1]:void 0;if("undefined"!=typeof u){if(!n(u))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(a=arguments[2])}for(var i,f=o(e.length),c=n(t)?Object(new t(f)):new Array(f),h=0;f>h;)i=e[h],u?c[h]="undefined"==typeof a?u(i,h):u.call(a,i,h):c[h]=i,h+=1;return c.length=f,c}}());
function ord(c){
return String.fromCharCode(c);
}
// some algorithms
function sep(s, n){
var r = [];
for(var i=0;i<n;i++){
for(var j=i;j<s.length;j+=n){
r.push(s[j]);
}
}
return r;
}
function zip(s, n){
var r = [], g = [];
for(var i=0,d=s.length/n;i<s.length;i+=d){
r.push(s.slice(i,i+d));
}
var m = r.reduce(function(p,c){return Math.max(p,c.length)},0);
for(var j=0;j<m;j++){
for(var i=0;i<n;i++){
var e = r[i][j];
if(typeof e !== "undefined") g.push(e);
}
}
return g;
}
function upload(){
var fr=new FileReader();
fr.onload=function(){document.getElementById("code").value=fr.result};
fr.readAsBinaryString(document.getElementById("upload").files[0]);
}
function Reng(code){
this.code = code.split("\n").map(function(e){return e.split("");});
this.input = [];
this.input.shift = function(){
var a = this[0];
if(typeof a!=="undefined"){
this.splice(0,1);
return a;
} else return -1;
}
this.pos = {x:0,y:0};
this.dir = {x:1,y:0};
this.internal = {};
this.depth = 1;
this.mode = 1;
this.ops = {};
for(i in Reng.ops){
this.ops[i]...