Skip to content

Instantly share code, notes, and snippets.

@saml
Last active December 11, 2015 02:58
Show Gist options
  • Save saml/4533856 to your computer and use it in GitHub Desktop.
Save saml/4533856 to your computer and use it in GitHub Desktop.
(function() {
var format = /^(.+)<a href=.+<span>(.+)<\/span>$/;
var scores = {};
var rates = {};
var secs = 10;
jQuery('body').append('<div id="saml-rates"></div>');
var output = jQuery('#saml-rates');
var getProcessor = function(el) {
return function() {
var html = el.innerHTML;
var m = format.exec(html);
var name = m[1];
var score = parseInt(m[2]);
if (scores[name]) {
rates[name] = (score - scores[name]) / 1.0;
} else {
scores[name] = score;
}
};
};
var p = window.setInterval(function() {
jQuery('#grid_scores li').each(function(i, el) {
getProcessor(el)();
});
output.empty();
var arr = [];
for (var name in rates) {
arr.push([name, rates[name]]);
}
arr.sort(function(a, b) { return a[1] - b[1]; });
var n = arr.length;
for (var i = 0; i < n; i++) {
var kv = arr[i];
output.append(kv[0] + ': ' + kv[1] + '<br>');
}
}, secs * 1000);
}());
int n;
int s;
int w;
int e;
int top;
int left;
int right;
int top_left;
int top_right;
int bottom;
int bottom_left;
int bottom_right;
int orientation[4];
int cells[100];
int i;
int dest_x;
int dest_y;
int dest_direction;
int curr_x;
int curr_y;
int facing;
int follow_rock;
int follow_rock_started_towards;
int turn_to;
int turn_to_after;
int immediate() {
n = ffi(@look, @north);
w = ffi(@look, @west);
s = ffi(@look, @south);
e = ffi(@look, @east);
if (n == @cell_resource) {
dest_x = 0;
dest_y = 0;
return ffi(@pull, @north);
}
if (w == @cell_resource) {
dest_x = 0;
dest_y = 0;
return ffi(@pull, @west);
}
if (s == @cell_resource) {
dest_x = 0;
dest_y = 0;
return ffi(@pull, @south);
}
if (e == @cell_resource) {
dest_x = 0;
dest_y = 0;
return ffi(@pull, @east);
}
if (n == @cell_robot) {
return ffi(@punch, @north);
}
if (w == @cell_robot) {
return ffi(@punch, @west);
}
if (s == @cell_robot) {
return ffi(@punch, @south);
}
if (e == @cell_robot) {
return ffi(@punch, @east);
}
set_sail(set_dest());
}
int orient() {
if (facing == @north) {
top = cells[3];
left = cells[1];
bottom = cells[5];
right = cells[7];
top_left = cells[0];
top_right = cells[6];
bottom_left = cells[2];
bottom_rigtht = cells[8];
orientation[0] = @north;
orientation[1] = @west;
orientation[2] = @south;
orientation[3] = @east;
return;
}
if (facing == @south) {
top = cells[5];
left = cells[7];
bottom = cells[3];
right = cells[1];
top_left = cells[8];
top_right = cells[2];
bottom_left = cells[6];
bottom_rigtht = cells[0];
orientation[0] = @south;
orientation[1] = @east;
orientation[2] = @north;
orientation[3] = @west;
return;
}
if (facing == @west) {
top = cells[1];
left = cells[5];
bottom = cells[7];
right = cells[3];
top_left = cells[2];
top_right = cells[0];
bottom_left = cells[8];
bottom_rigtht = cells[6];
orientation[0] = @west;
orientation[1] = @south;
orientation[2] = @east;
orientation[3] = @north;
return;
}
//facing east
top = cells[7];
left = cells[3];
bottom = cells[1];
right = cells[5];
top_left = cells[6];
top_right = cells[8];
bottom_left = cells[0];
bottom_rigtht = cells[2];
orientation[0] = @east;
orientation[1] = @north;
orientation[2] = @west;
orientation[3] = @south;
}
int opposite_of(direction) {
if (direction == @north) {
return @south;
}
if (direction == @south) {
return @north;
}
if (direction == @west) {
return @east;
}
return @west;
}
int find_dest() {
start = -1;
end = 2;
i = 0;
found = 0;
while (i < 100) {
x = start;
while (x < end) {
y = start;
while (y < end) {
cells[i] = ffi(@scan, x, y);
if (cells[i] == @cell_resource) {
dest_x = x;
dest_y = y;
if (dest_x < 0) {
dest_direction = @west;
} else if (dest_x > 0) {
dest_direction = @east;
} else if (dest_y < 0) {
dest_direction = @north;
} else {
dest_direction = @south;
}
curr_x = 0;
curr_y = 0;
found = 1;
}
y = y + 1;
i = i + 1;
if (found) {
if (i > 8) {
return 1;
}
}
}
x = x + 1;
}
start = start - 1;
end = end + 1;
}
return 0;
}
int set_dest() {
if (dest_x == 0) {
if (dest_y == 0) {
return find_dest();
}
}
cells[0] = ffi(@scan, -1, -1);
cells[1] = w;
cells[2] = ffi(@scan, -1, 1);
cells[3] = n;
cells[5] = s;
cells[6] = ffi(@scan, 1, -1);
cells[7] = e;
cells[8] = ffi(@scan, 1, 1);
i = 8;
return 1;
}
int do_move(direction) {
facing = direction;
if (dest_x != 0) {
if (dest_y != 0) {
//has destination.
if (direction == @north) {
curr_y = curr_y - 1;
} else if (direction == @south) {
curr_y = curr_y + 1;
} else if (direction == @east) {
curr_x = curr_x + 1;
} else {
curr_x = curr_x - 1;
}
}
}
return ffi(@move, direction);
}
int first_empty(a, b, c) {
if (a == @cell_empty) {
return a;
}
if (b == @cell_empty) {
return b;
}
return c;
}
int calc_direction() {
if (follow_rock) {
orient();
if (right == @cell_empty) {
if (orientation[3] == opposite_of(follow_rock_started_towards)) {
follow_rock = 0;
}
return orientation[3];//right
}
if (top == @cell_empty) {
if (orientation[0] == opposite_of(follow_rock_started_towards)) {
follow_rock = 0;
}
return orientation[0];//top
}
if (left == @cell_empty) {
if (orientation[1] == opposite_of(follow_rock_started_towards)) {
follow_rock = 0;
}
return orientation[1];//left
}
if (orientation[2] == opposite_of(follow_rock_started_towards)) {
follow_rock = 0;
}
return orientation[2];//bottom
}
if (curr_x < dest_x) {
if (e == @cell_empty) {
return @east;
}
follow_rock = 1;
follow_rock_started_towards = @east;
return first_empty(n, s, w);
}
if (curr_x > dest_x) {
if (w == @cell_empty) {
return @west;
}
follow_rock = 1;
follow_rock_started_towards = @west;
return first_empty(n, s, e);
}
if (curr_y < dest_y) {
if (s == @cell_empty) {
return @south;
}
follow_rock = 1;
follow_rock_started_towards = @south;
return first_empty(w, e, n);
}
if (curr_y > dest_y) {
if (n == @cell_empty) {
return @north;
}
follow_rock = 1;
follow_rock_started_towards = @north;
return first_empty(w, e, s);
}
//it should not come here.
return first_empty(n, w, s, e);
}
int set_sail(no_random) {
tmp = 0;
if (no_random == 0) {
tmp = rand(4);
if (tmp == 0) {
tmp = @east;
}
return ffi(@move, tmp);
}
do_move(calc_direction());
}
int main() {
facing = @south;
follow_rock = 0;
dest_x = 0;
dest_y = 0;
curr_x = 0;
curr_y = 0;
while (1) {
immediate();
}
}
PUSH 0
DUPN << 127
CALL << @main
END
@immediate
PUSH @look
PUSH @north
CALLFF << 2
POKE << 0
PUSH @look
PUSH @west
CALLFF << 2
POKE << 2
PUSH @look
PUSH @south
CALLFF << 2
POKE << 1
PUSH @look
PUSH @east
CALLFF << 2
POKE << 3
PEEK << 0
PUSH @cell_resource
EQUAL
IFFGOTO << @L0
PUSH 0
POKE << 117
PUSH 0
POKE << 118
PUSH @pull
PUSH @north
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L0
@L1
PEEK << 2
PUSH @cell_resource
EQUAL
IFFGOTO << @L2
PUSH 0
POKE << 117
PUSH 0
POKE << 118
PUSH @pull
PUSH @west
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L2
@L3
PEEK << 1
PUSH @cell_resource
EQUAL
IFFGOTO << @L4
PUSH 0
POKE << 117
PUSH 0
POKE << 118
PUSH @pull
PUSH @south
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L4
@L5
PEEK << 3
PUSH @cell_resource
EQUAL
IFFGOTO << @L6
PUSH 0
POKE << 117
PUSH 0
POKE << 118
PUSH @pull
PUSH @east
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L6
@L7
PEEK << 0
PUSH @cell_robot
EQUAL
IFFGOTO << @L8
PUSH @punch
PUSH @north
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L8
@L9
PEEK << 2
PUSH @cell_robot
EQUAL
IFFGOTO << @L10
PUSH @punch
PUSH @west
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L10
@L11
PEEK << 1
PUSH @cell_robot
EQUAL
IFFGOTO << @L12
PUSH @punch
PUSH @south
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L12
@L13
PEEK << 3
PUSH @cell_robot
EQUAL
IFFGOTO << @L14
PUSH @punch
PUSH @east
CALLFF << 2
STORE retval
PUSH retval
RETURN
@L14
@L15
CALL << @set_dest
CALL << @set_sail
POP
PUSH 0
RETURN
@orient
PEEK << 122
PUSH @north
EQUAL
IFFGOTO << @L16
PUSH 3
ADD << 16
PEEK
POKE << 4
PUSH 1
ADD << 16
PEEK
POKE << 5
PUSH 5
ADD << 16
PEEK
POKE << 9
PUSH 7
ADD << 16
PEEK
POKE << 6
PUSH 0
ADD << 16
PEEK
POKE << 7
PUSH 6
ADD << 16
PEEK
POKE << 8
PUSH 2
ADD << 16
PEEK
POKE << 10
PUSH 8
ADD << 16
PEEK
PUSH @north
DUP
PUSH 0
ADD << 12
POKE
POP
PUSH @west
DUP
PUSH 1
ADD << 12
POKE
POP
PUSH @south
DUP
PUSH 2
ADD << 12
POKE
POP
PUSH @east
DUP
PUSH 3
ADD << 12
POKE
POP
POP
PUSH 0
RETURN
@L16
@L17
PEEK << 122
PUSH @south
EQUAL
IFFGOTO << @L18
PUSH 5
ADD << 16
PEEK
POKE << 4
PUSH 7
ADD << 16
PEEK
POKE << 5
PUSH 3
ADD << 16
PEEK
POKE << 9
PUSH 1
ADD << 16
PEEK
POKE << 6
PUSH 8
ADD << 16
PEEK
POKE << 7
PUSH 2
ADD << 16
PEEK
POKE << 8
PUSH 6
ADD << 16
PEEK
POKE << 10
PUSH 0
ADD << 16
PEEK
PUSH @south
DUP
PUSH 0
ADD << 12
POKE
POP
PUSH @east
DUP
PUSH 1
ADD << 12
POKE
POP
PUSH @north
DUP
PUSH 2
ADD << 12
POKE
POP
PUSH @west
DUP
PUSH 3
ADD << 12
POKE
POP
POP
PUSH 0
RETURN
@L18
@L19
PEEK << 122
PUSH @west
EQUAL
IFFGOTO << @L20
PUSH 1
ADD << 16
PEEK
POKE << 4
PUSH 5
ADD << 16
PEEK
POKE << 5
PUSH 7
ADD << 16
PEEK
POKE << 9
PUSH 3
ADD << 16
PEEK
POKE << 6
PUSH 2
ADD << 16
PEEK
POKE << 7
PUSH 0
ADD << 16
PEEK
POKE << 8
PUSH 8
ADD << 16
PEEK
POKE << 10
PUSH 6
ADD << 16
PEEK
PUSH @west
DUP
PUSH 0
ADD << 12
POKE
POP
PUSH @south
DUP
PUSH 1
ADD << 12
POKE
POP
PUSH @east
DUP
PUSH 2
ADD << 12
POKE
POP
PUSH @north
DUP
PUSH 3
ADD << 12
POKE
POP
POP
PUSH 0
RETURN
@L20
@L21
PUSH 7
ADD << 16
PEEK
POKE << 4
PUSH 3
ADD << 16
PEEK
POKE << 5
PUSH 1
ADD << 16
PEEK
POKE << 9
PUSH 5
ADD << 16
PEEK
POKE << 6
PUSH 6
ADD << 16
PEEK
POKE << 7
PUSH 8
ADD << 16
PEEK
POKE << 8
PUSH 0
ADD << 16
PEEK
POKE << 10
PUSH 2
ADD << 16
PEEK
PUSH @east
DUP
PUSH 0
ADD << 12
POKE
POP
PUSH @north
DUP
PUSH 1
ADD << 12
POKE
POP
PUSH @west
DUP
PUSH 2
ADD << 12
POKE
POP
PUSH @south
DUP
PUSH 3
ADD << 12
POKE
POP
POP
PUSH 0
RETURN
@opposite_of
DUP
PUSH @north
EQUAL
IFFGOTO << @L22
POP
PUSH @south
RETURN
@L22
@L23
DUP
PUSH @south
EQUAL
IFFGOTO << @L24
POP
PUSH @north
RETURN
@L24
@L25
DUP
PUSH @west
EQUAL
IFFGOTO << @L26
POP
PUSH @east
RETURN
@L26
@L27
POP
PUSH @west
RETURN
@find_dest
PUSH -1
PUSH 2
PUSH 0
POKE << 116
PUSH 0
@L28
PEEK << 116
PUSH 100
LESS
IFFGOTO << @L29
PEEK << -3
@L30
DUP
PEEK << -4
LESS
IFFGOTO << @L31
PEEK << -4
@L32
DUP
PEEK << -5
LESS
IFFGOTO << @L33
PUSH @scan
PEEK << -3
PEEK << -3
CALLFF << 3
DUP
PEEK << 116
ADD << 16
POKE
POP
PEEK << 116
ADD << 16
PEEK
PUSH @cell_resource
EQUAL
IFFGOTO << @L34
PEEK << -2
POKE << 117
DUP
POKE << 118
PEEK << 117
PUSH 0
LESS
IFFGOTO << @L36
PUSH @west
POKE << 119
GOTO << @L37
@L36
PEEK << 117
PUSH 0
GREATER
IFFGOTO << @L38
PUSH @east
POKE << 119
GOTO << @L39
@L38
PEEK << 118
PUSH 0
LESS
IFFGOTO << @L40
PUSH @north
POKE << 119
GOTO << @L41
@L40
PUSH @south
POKE << 119
@L41
@L39
@L37
PUSH 0
POKE << 120
PUSH 0
POKE << 121
PUSH 1
POKE << -3
@L34
@L35
DUP
PUSH 1
ADD
POKE << -1
PEEK << 116
PUSH 1
ADD
POKE << 116
PEEK << -3
IFFGOTO << @L42
PEEK << 116
PUSH 8
GREATER
IFFGOTO << @L44
POPN << 5
PUSH 1
RETURN
@L44
@L45
@L42
@L43
GOTO << @L32
@L33
PEEK << -2
PUSH 1
ADD
POKE << -2
POP
GOTO << @L30
@L31
PEEK << -4
PUSH 1
SUB
POKE << -4
PEEK << -3
PUSH 1
ADD
POKE << -3
POP
GOTO << @L28
@L29
POPN << 3
PUSH 0
RETURN
@set_dest
PEEK << 117
PUSH 0
EQUAL
IFFGOTO << @L46
PEEK << 118
PUSH 0
EQUAL
IFFGOTO << @L48
CALL << @find_dest
STORE retval
PUSH retval
RETURN
@L48
@L49
@L46
@L47
PUSH @scan
PUSH -1
PUSH -1
CALLFF << 3
DUP
PUSH 0
ADD << 16
POKE
POP
PEEK << 2
DUP
PUSH 1
ADD << 16
POKE
POP
PUSH @scan
PUSH -1
PUSH 1
CALLFF << 3
DUP
PUSH 2
ADD << 16
POKE
POP
PEEK << 0
DUP
PUSH 3
ADD << 16
POKE
POP
PEEK << 1
DUP
PUSH 5
ADD << 16
POKE
POP
PUSH @scan
PUSH 1
PUSH -1
CALLFF << 3
DUP
PUSH 6
ADD << 16
POKE
POP
PEEK << 3
DUP
PUSH 7
ADD << 16
POKE
POP
PUSH @scan
PUSH 1
PUSH 1
CALLFF << 3
DUP
PUSH 8
ADD << 16
POKE
POP
PUSH 8
POKE << 116
PUSH 1
RETURN
@do_move
DUP
POKE << 122
PEEK << 117
PUSH 0
NEQUAL
IFFGOTO << @L50
PEEK << 118
PUSH 0
NEQUAL
IFFGOTO << @L52
DUP
PUSH @north
EQUAL
IFFGOTO << @L54
PEEK << 121
PUSH 1
SUB
POKE << 121
GOTO << @L55
@L54
DUP
PUSH @south
EQUAL
IFFGOTO << @L56
PEEK << 121
PUSH 1
ADD
POKE << 121
GOTO << @L57
@L56
DUP
PUSH @east
EQUAL
IFFGOTO << @L58
PEEK << 120
PUSH 1
ADD
POKE << 120
GOTO << @L59
@L58
PEEK << 120
PUSH 1
SUB
POKE << 120
@L59
@L57
@L55
@L52
@L53
@L50
@L51
PUSH @move
PEEK << -2
CALLFF << 2
STORE retval
POP
PUSH retval
RETURN
@first_empty
PEEK << -3
PUSH @cell_empty
EQUAL
IFFGOTO << @L60
PEEK << -3
STORE retval
POPN << 3
PUSH retval
RETURN
@L60
@L61
PEEK << -2
PUSH @cell_empty
EQUAL
IFFGOTO << @L62
PEEK << -2
STORE retval
POPN << 3
PUSH retval
RETURN
@L62
@L63
DUP
STORE retval
POPN << 3
PUSH retval
RETURN
@calc_direction
PEEK << 123
IFFGOTO << @L64
CALL << @orient
POP
PEEK << 6
PUSH @cell_empty
EQUAL
IFFGOTO << @L66
PUSH 3
ADD << 12
PEEK
PEEK << 124
CALL << @opposite_of
EQUAL
IFFGOTO << @L68
PUSH 0
POKE << 123
@L68
@L69
PUSH 3
ADD << 12
PEEK
STORE retval
PUSH retval
RETURN
@L66
@L67
PEEK << 4
PUSH @cell_empty
EQUAL
IFFGOTO << @L70
PUSH 0
ADD << 12
PEEK
PEEK << 124
CALL << @opposite_of
EQUAL
IFFGOTO << @L72
PUSH 0
POKE << 123
@L72
@L73
PUSH 0
ADD << 12
PEEK
STORE retval
PUSH retval
RETURN
@L70
@L71
PEEK << 5
PUSH @cell_empty
EQUAL
IFFGOTO << @L74
PUSH 1
ADD << 12
PEEK
PEEK << 124
CALL << @opposite_of
EQUAL
IFFGOTO << @L76
PUSH 0
POKE << 123
@L76
@L77
PUSH 1
ADD << 12
PEEK
STORE retval
PUSH retval
RETURN
@L74
@L75
PUSH 2
ADD << 12
PEEK
PEEK << 124
CALL << @opposite_of
EQUAL
IFFGOTO << @L78
PUSH 0
POKE << 123
@L78
@L79
PUSH 2
ADD << 12
PEEK
STORE retval
PUSH retval
RETURN
@L64
@L65
PEEK << 120
PEEK << 117
LESS
IFFGOTO << @L80
PEEK << 3
PUSH @cell_empty
EQUAL
IFFGOTO << @L82
PUSH @east
RETURN
@L82
@L83
PUSH 1
POKE << 123
PUSH @east
POKE << 124
PEEK << 0
PEEK << 1
PEEK << 2
CALL << @first_empty
STORE retval
PUSH retval
RETURN
@L80
@L81
PEEK << 120
PEEK << 117
GREATER
IFFGOTO << @L84
PEEK << 2
PUSH @cell_empty
EQUAL
IFFGOTO << @L86
PUSH @west
RETURN
@L86
@L87
PUSH 1
POKE << 123
PUSH @west
POKE << 124
PEEK << 0
PEEK << 1
PEEK << 3
CALL << @first_empty
STORE retval
PUSH retval
RETURN
@L84
@L85
PEEK << 121
PEEK << 118
LESS
IFFGOTO << @L88
PEEK << 1
PUSH @cell_empty
EQUAL
IFFGOTO << @L90
PUSH @south
RETURN
@L90
@L91
PUSH 1
POKE << 123
PUSH @south
POKE << 124
PEEK << 2
PEEK << 3
PEEK << 0
CALL << @first_empty
STORE retval
PUSH retval
RETURN
@L88
@L89
PEEK << 121
PEEK << 118
GREATER
IFFGOTO << @L92
PEEK << 0
PUSH @cell_empty
EQUAL
IFFGOTO << @L94
PUSH @north
RETURN
@L94
@L95
PUSH 1
POKE << 123
PUSH @north
POKE << 124
PEEK << 2
PEEK << 3
PEEK << 1
CALL << @first_empty
STORE retval
PUSH retval
RETURN
@L92
@L93
PEEK << 0
PEEK << 2
PEEK << 1
PEEK << 3
CALL << @first_empty
STORE retval
PUSH retval
RETURN
@set_sail
PUSH 0
PEEK << -2
PUSH 0
EQUAL
IFFGOTO << @L96
PUSH 4
RAND
POKE << -1
DUP
PUSH 0
EQUAL
IFFGOTO << @L98
PUSH @east
POKE << -1
@L98
@L99
PUSH @move
PEEK << -2
CALLFF << 2
STORE retval
POPN << 2
PUSH retval
RETURN
@L96
@L97
CALL << @calc_direction
CALL << @do_move
POP
POPN << 2
PUSH 0
RETURN
@main
PUSH @south
POKE << 122
PUSH 0
POKE << 123
PUSH 0
POKE << 117
PUSH 0
POKE << 118
PUSH 0
POKE << 120
PUSH 0
POKE << 121
@L100
PUSH 1
IFFGOTO << @L101
CALL << @immediate
POP
GOTO << @L100
@L101
PUSH 0
RETURN
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment