Skip to content

Commit 831690c

Browse files
author
Brian MacIntosh
committed
initial commt
1 parent 53eb8eb commit 831690c

File tree

5 files changed

+2047
-0
lines changed

5 files changed

+2047
-0
lines changed

gui.js

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
2+
gui = {};
3+
4+
gui.run = function()
5+
{
6+
var codeDom = document.getElementById("codebox");
7+
var inputDom = document.getElementById("inputbox");
8+
9+
this.input = "";
10+
this.currentSuccess = 0;
11+
this.successes = null;
12+
this.updateOutput();
13+
14+
this.input = inputDom.value;
15+
if (!snakeEx.run(codeDom.value, this.input, true))
16+
{
17+
this.outErrors();
18+
}
19+
else
20+
{
21+
this.successes = snakeEx.successes;
22+
this.updateOutput();
23+
}
24+
}
25+
26+
/// output the current contents of the error log
27+
gui.outErrors = function()
28+
{
29+
var outputDom = document.getElementById("outputbox");
30+
var errortext = '<span style="color:red;">';
31+
for (var c = 0; c < snakeEx.errors.length; c++)
32+
errortext += snakeEx.errors[c]+"<br/>";
33+
outputDom.innerHTML += errortext + '</span>';
34+
}
35+
36+
/// output the currently selected match in a table
37+
gui.updateOutput = function()
38+
{
39+
var curDom = document.getElementById("curmatch");
40+
curDom.innerHTML = "" + (this.successes && this.successes.length > 0 ? this.currentSuccess + 1 : 0);
41+
var countDom = document.getElementById("matchcount");
42+
countDom.innerHTML = "" + (this.successes ? this.successes.length : 0);
43+
44+
var outputDom = document.getElementById("outputbox");
45+
46+
if (!this.successes || this.currentSuccess >= this.successes.length)
47+
var success = null;
48+
else
49+
var success = this.successes[this.currentSuccess];
50+
51+
//Build input into a visual grid
52+
var visual = '<table style="font-family:monospace;font-size:large;text-align:center;"><tr>';
53+
var line = 0;
54+
var col = 0;
55+
for (var c = 0; c < this.input.length; c++)
56+
{
57+
if (this.input.charAt(c) == '\n')
58+
{
59+
visual += "</tr><tr>";
60+
line++;
61+
col = 0;
62+
}
63+
else
64+
{
65+
var content = this.input.charAt(c);
66+
67+
//Italicize match originators
68+
if (success && success.origX == col && success.origY == line)
69+
{
70+
content = "<i><b>" + content + "</b></i>";
71+
}
72+
73+
//Color match participants
74+
var mark = false;
75+
if (success && success.marks)
76+
{
77+
for (var e = 0; e < success.marks.length; e += 2)
78+
{
79+
if (success.marks[e] == col && success.marks[e+1] == line)
80+
mark = true;
81+
}
82+
}
83+
84+
if (mark)
85+
content = '<td style="background-color:lime;">' + content + "</td>";
86+
else
87+
content = '<td style="background-color:gainsboro;">' + content + "</td>";
88+
89+
visual += content;
90+
col++;
91+
}
92+
}
93+
visual += "</tr></table>";
94+
outputDom.innerHTML = visual;
95+
}
96+
97+
gui.nextMatch = function() { this.navMatch(1); }
98+
gui.prevMatch = function() { this.navMatch(-1); }
99+
100+
gui.navMatch = function(dir)
101+
{
102+
this.currentSuccess += dir;
103+
if (this.currentSuccess >= this.successes.length)
104+
this.currentSuccess = 0;
105+
else if (this.currentSuccess < 0)
106+
this.currentSuccess = this.successes.length-1;
107+
this.updateOutput();
108+
}

index.html

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<!DOCTYPE html>
2+
<html xmlns="http://www.w3.org/1999/xhtml">
3+
<head>
4+
<title>SnakeEx Interpreter Online</title>
5+
<meta property="og:title" content="SnakeEx Interpreter Online">
6+
<meta property="og:url" content="http://www.brianmacintosh.com/snakeex/">
7+
<meta property="og:site_name" content="Games by Brian MacIntosh">
8+
<meta property="og:type" content="website">
9+
<meta property="og:image" content="http://brianmacintosh.com/snakeex/og_icon.png">
10+
<meta property="og:description" content="SnakeEx is a two-dimensional pattern-matching language similar to regex.">
11+
<link rel="image_src" href="http://brianmacintosh.com/snakeex/og_icon.png"/>
12+
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
13+
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
14+
<meta name="keywords" content="code golf,brian macintosh,stack exchange,interpreter,regex,pattern match,html5,javascript">
15+
<meta name="description" content="SnakeEx is a two-dimensional pattern-matching language similar to regex.">
16+
<script src="snake-ex.js" type="text/javascript"></script>
17+
<script src="samples.js" type="text/javascript"></script>
18+
<script src="gui.js" type="text/javascript"></script>
19+
<!--script type="text/javascript">
20+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
21+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
22+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
23+
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
24+
ga('create', 'UA-36013541-1', 'brianmacintosh.com');
25+
ga('send', 'pageview');
26+
</script-->
27+
<style>
28+
html{width:100%;height:100%;font-family:verdana;}
29+
body{margin:0 20px 0 20px;background-color:white;}
30+
.center{text-align:center;}
31+
#homediv{position:absolute;left:10px;top:10px;}
32+
.column{float:left;padding-left:10px;}
33+
table{border-collapse:collapse;}
34+
</style>
35+
</head>
36+
<body onload="samples.populateSamples();">
37+
<div class="center">
38+
<div id="homediv"><a href="/" target="_blank"><img src="/media/title_penguin.png" height="64" alt="Penguin in a TV"/></a></div>
39+
<h1>SnakeEx Interpreter Online</h1>
40+
</div>
41+
<h3>What is this?</h3>
42+
<p>SnakeEx is a 2D text-search or pattern-matching language based on regex. This is an online interpreter for SnakeEx. SnakeEx is being developed for a contest on the <a href="http://codegolf.stackexchange.com/q/47311/32671">Code Golf Stack Exchange.</a></p>
43+
<p>Find the language spec <a href="spec.html">here</a>.</p>
44+
<p>Full interpreter source code (Javascript): <a href="snake-ex.js">snake-ex.js</a>.</p>
45+
<p><b>Not working right?</b> Try Ctrl-F5 to reload cached scripts.</p>
46+
<p><b>Samples:</b> <span id="samplebox"></span></p>
47+
<p><span style="color:red">Warning</span>: malformed code can hang your browser.</p>
48+
<div class="center"><noscript><p><b>You need Javascript enabled to play the simulation!</b></p></noscript></div>
49+
<div class="column">
50+
Input:<br/>
51+
<textarea rows="20" cols="30" id="inputbox" style="white-space: nowrap;"></textarea><br/>
52+
</div>
53+
<div class="column">
54+
Code:<br/>
55+
<textarea rows="20" cols="50" id="codebox" style="white-space: nowrap;"></textarea><br/>
56+
</div>
57+
<div class="column">
58+
Output:<br/><br/>
59+
<button type="button" onclick="gui.run();" style="width:100%;">Run!</button><br/><br/>
60+
<button onclick="gui.prevMatch()">Prev</button> Match <span id="curmatch">0</span>/<span id="matchcount">0</span> <button onclick="gui.nextMatch()">Next</button><br/><br/>
61+
<span id="outputbox"></span>
62+
</div>
63+
<br/></body></html>

samples.js

+178
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
2+
var samples = {};
3+
4+
samples.populateSamples = function()
5+
{
6+
var contents = "";
7+
var notComma = true;
8+
for (var i = 0; i < this.list.length; i++)
9+
{
10+
if (this.list[i].code.length == 0) continue;
11+
if (notComma)
12+
notComma = false;
13+
else
14+
contents += ", ";
15+
contents += this.list[i].name;
16+
if (this.list[i].input.length > 0)
17+
{
18+
contents += " (";
19+
for (var d = 0; d < this.list[i].input.length; d++)
20+
{
21+
if (d > 0) contents += ")(";
22+
contents += '<a href="javascript:void(0);" onclick="samples.loadSample('+i+','+d+')">' + (d+1) + "</a>";
23+
}
24+
contents += ")";
25+
}
26+
}
27+
var dom = document.getElementById("samplebox");
28+
dom.innerHTML = contents;
29+
}
30+
31+
samples.loadSample = function(sample, input)
32+
{
33+
if (sample < this.list.length)
34+
{
35+
var codeDom = document.getElementById("codebox");
36+
codeDom.value = this.list[sample].code;
37+
if (input < this.list[sample].input.length)
38+
{
39+
var inputDom = document.getElementById("inputbox");
40+
inputDom.value = this.list[sample].input[input];
41+
}
42+
}
43+
}
44+
45+
samples.list =
46+
[
47+
{
48+
name:"1.Finding Chessboards",
49+
code:"m:{v<R>2}{h<>1}\nv:{c<L>A1}+\nh:{c<R>A2}+\nc:_?(#_)+#?",
50+
input:[
51+
"~______~\n~##_#_#~\n~#_#_##~\n~##_#_#~\n~______~",
52+
"#_##\n_#_#\n__#_\n#_#_\n#_#_"
53+
]
54+
},{
55+
name:"2.Verifying Chessboards",
56+
code:"m:{v<R>2}{h<>1}\nv:${c<L>A1}+$\nh:${c<R>A2}+$\nc:$_?(#_)+#?$",
57+
input:[
58+
"_#_#_#_#\n#_#_#_#_\n_#_#_#_#",
59+
"_#_#_#__\n__#_#_#_\n_#_#_#__"
60+
]
61+
},{
62+
name:"3.Rectangle of Digits",
63+
code:"m:{c<R>A1}%{2,}\nc:[0-9]%{2,}",
64+
input:[
65+
"hbrewvgr\n18774gwe\n84502vgv\n19844f22\ncrfegc77",
66+
"uv88wn000\nvgr88vg0w\nv888wrvg7\nvvg88wv77"
67+
]
68+
},{
69+
name:"4.Finding a Word in a Word Search",
70+
code:"m:<*>GOLF",
71+
input:[
72+
"INOWCEF\nIFWNOPH\nVULUHGY\nGUYOIGI\nYTFUGYG\nFTGYIOO",
73+
"BHTGIVUHSR\nBWEVYWHBWB\nBHTWBYTWYB"
74+
]
75+
},{
76+
name:"5.Detect Square Inputs",
77+
code:"m:{v<R>1}{h<>1}\nv:${c<L>A1}+$\nh:${c<R>A1}+$\nc:$.+$",
78+
input:[
79+
"qwerty\nasdfgh\nzx vbn\nuiop[]\n`1234 \n67890-",
80+
"hello\nworld"
81+
]
82+
},{
83+
name:"6.Find Gliders in a Game of Life",
84+
code:"m:<+>[({l1<R>A}{l2<R>A}{l3<R>})({l1<L>A}{l2<L>A}{l3<L>})]\nl1:##\\.\nl2:[(#\\.)(\\.#)]#\nl3:#\\.\\.",
85+
input:[
86+
"##...#..\n..#.##..\n#...#.#.\n#.#.....\n##...###\n...#.#..\n.#....#.",
87+
"##...#.\n..#.###\n##..#.#\n#.#....\n##..###"
88+
]
89+
},{
90+
name:"7.Match Nether Portals",
91+
code:"m:{e<R>A1}{d<R>A1}%{2,22}{e<R>1}\ne:~.X%{3,22}~.\nd:X\\.+X",
92+
input:[
93+
"....X......\n.XXXXXX.XX.\n...X...X...\n.X.X...XXX.\n...X...X.X.\n.XXX...X.X.\nX..XXXXX.X.",
94+
"XX..XXXX\nXX..X..X\nXX..X..X\n..X.X..X\n.X..X.XX"
95+
]
96+
},{
97+
name:"8.Minecraft Chest Placement",
98+
code:"m:~{s<>}~!{d<+>}\\.\ns:<+>.<BR>([$\\.]<R>)%{3}\nd:.<+>CC",
99+
input:[
100+
".......C..\n...C..C...\n.........C\n.CC...CC..\n.........."
101+
]
102+
},{
103+
name:"9.Horizontal and Vertical Alignment",
104+
code:"m:<R>?#~.*#",
105+
input:[
106+
".,.,.,.#.,\n,.,#,.,.,.\n.,.,.,.,.,\n,.,.,.,.,.\n.,.#.,##.,\n,.,.,.,.,.",
107+
".,.#.,.,\n,.,.,.#.\n.,#,.,.,\n,.,.,.,#\n.#.,.,.,\n,.,.#.,.\n#,.,.,.,\n,.,.,#,."
108+
]
109+
},{
110+
name:"10.Collinear Points",
111+
code:"m:<!>#~.*#~.*#",
112+
input:[
113+
"........\n#..#..#.\n...#....\n#.......\n...#....",
114+
".#..#\n#..#.\n#....\n..#.#"
115+
]
116+
},{
117+
name:"11.Verify Prelude Syntax",
118+
code:"",
119+
input:[
120+
"?1-(v #1)- \n1 0v ^(# 0)(1+0)#)!\n (#) ^#1-(0 # ",
121+
"#(#(##)##)##(\n)##(##(##)#)#"
122+
]
123+
},{
124+
name:"12.Avoid the Letter Q",
125+
code:"m:{h<R>A}%{4}\nh:[^Qq]%{4}",
126+
input:[
127+
"bhtklkwt\nqlwQklqw\nvtvlwktv\nkQtwkvkl\nvtwlkvQk\nvnvevwvx",
128+
"zxvcmn\nxcvncn\nmnQxcv\nxcvmnx\nazvmne"
129+
]
130+
},{
131+
name:"13.Diamond Mining",
132+
code:"m:{tl<RB>1}{tr<RF>1}\ntl:X/*{bl<L>1}X\ntr:X\\\\*{br<R>1}X\nbl:X\\\\*X\nbr:X/*X",
133+
input:[
134+
"...X......X....\n../.\\..../.\\...\n./.X.\\..X...X..\nX.X.X.XX.\\./.\\.\n.\\.X.//.\\.X...X\n..\\./X...X.\\./.\n.X.X..\\./...X..\nX.X....X.......\n.X.............",
135+
".X......./....\n.\\....X.......\n...X.\\.\\...X..\n..X.\\...\\.X.\\.\n...X.X...X.\\.X\n../X\\...\\...X.\n.X...\\.\\..X...\n..\\./.X....X..\n...X..../....."
136+
]
137+
},{
138+
name:"14.Matching Crosses",
139+
code:"m:{a<R>A}+{b<R>A}+{a<R>A}+\na:{e<>P1}{c<>P2}{e<>P3}\nb:{c<>P1}{c<>P2}{c<>P3}\ne:\\.+\nc:#+",
140+
input:[
141+
".......\n.###...\n######.\n######.\n.###...\n.###...\n.###.#.\n....###\n.....#.",
142+
".######.\n...##...\n...##...\n........"
143+
]
144+
},{
145+
name:"15.Match a Word in a Boggle Board",
146+
code:"m{I}:<*>p<*>a<*>n<*>a<*>m<*>a",
147+
input:[
148+
"ExYPhNuy\nAfEKVsjL\noblGviCw\nDdOgArRn\nISepnmqc\nzMUkBGJQ",
149+
"BpbrzTHY\nmAJVRLuF\njyXSPknK\nhoeGcsEl\nQCZagNMI\ndvUOqixt"
150+
]
151+
},{
152+
name:"15.Match a Word in a Boggle Board (no reuse)",
153+
code:"m{EI}:<*>p<*>a<*>n<*>a<*>m<*>a",
154+
input:[
155+
"EmYPhNuy\nAaaKVsjL\nonlGviCw\nDdOgFrRn\nISeHZmqc\nzMUkBGJQ",
156+
"BpbrzTHY\nmAJVRLuF\njyXSPknK\nhoeGcsEl\nQCZagNMI\ndvUOqixt"
157+
]
158+
},{
159+
name:"16.Wrap around the Edges",
160+
code:"m{W}:{c<R>WA}%{3}\nc:###",
161+
input:[
162+
"#..##\n#..##\n.....\n#..##",
163+
"...##\n#..##\n#..##\n#..#."
164+
]
165+
},{
166+
name:"EX.Maze Solver!",
167+
code:"m{E}:$(<P>\\.)+$",
168+
input:[
169+
"+-+-+-+-+-+-+-+-+-+-+\n..|...|...|...|...|.|\n+.+-+.+.+.+-+.+.+.+.+\n|.......|...|.|.|.|.|\n+.+-+-+-+-+.+.+.+.+.+\n|.|...|...|.|.|.|...|\n+.+.+.+.+.+.+.+.+-+-+\n|.|.|...|.|.|.|.....|\n+.+.+-+-+.+.+.+-+-+.+\n|.|...|...|.|.....|.|\n+.+-+.+-+-+.+-+-+.+.+\n|...|.....|...|.....|\n+-+.+-+-+.+-+.+.+-+-+\n|.|.|...|...|.|...|.|\n+.+.+-+.+-+.+.+-+.+.+\n|.|.....|.......|...|\n+.+-+-+-+.+-+.+.+.+-+\n|.....|...|...|.|...|\n+-+-+.+-+-+.+-+-+.+.+\n|.................|..\n+-+-+-+-+-+-+-+-+-+-+"
170+
]
171+
},{
172+
name:"EX.Brace Matching",
173+
code:"m:\\(~{r<>P}\\)\nr:[^\\(\\)]*(\\({r<>P}\\))?[^\\(\\)]*",
174+
input:[
175+
"#(#(##)##)##(\n)##(##(##)#)#"
176+
]
177+
}
178+
]

0 commit comments

Comments
 (0)