a06a38e3e6 2012-07-13 kinaba: import std.algorithm; a06a38e3e6 2012-07-13 kinaba: import std.array; a06a38e3e6 2012-07-13 kinaba: import std.conv; a06a38e3e6 2012-07-13 kinaba: import std.stdio; a06a38e3e6 2012-07-13 kinaba: import std.string; a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: class Map a06a38e3e6 2012-07-13 kinaba: { a06a38e3e6 2012-07-13 kinaba: private char[][] data; a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: this(File input) a06a38e3e6 2012-07-13 kinaba: { a06a38e3e6 2012-07-13 kinaba: foreach(s; input.byLine()) a06a38e3e6 2012-07-13 kinaba: data ~= s.chomp.dup; a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: int width = 0; a06a38e3e6 2012-07-13 kinaba: foreach(s; data) a06a38e3e6 2012-07-13 kinaba: width = max(width, s.length); a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: // space padding and sentinels a06a38e3e6 2012-07-13 kinaba: foreach(ref s; data) { a06a38e3e6 2012-07-13 kinaba: int p = s.length; a06a38e3e6 2012-07-13 kinaba: s.length = width; a06a38e3e6 2012-07-13 kinaba: s[p..$] = ' '; a06a38e3e6 2012-07-13 kinaba: s = '#' ~ s ~ '#'; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: // vertical sentinel a06a38e3e6 2012-07-13 kinaba: char[] sen = new char[width+2]; a06a38e3e6 2012-07-13 kinaba: sen[] = '#'; a06a38e3e6 2012-07-13 kinaba: data = sen.dup ~ data ~ sen; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: @property const a06a38e3e6 2012-07-13 kinaba: { a06a38e3e6 2012-07-13 kinaba: int W() { return data[0].length; } a06a38e3e6 2012-07-13 kinaba: int H() { return data.length; } a06a38e3e6 2012-07-13 kinaba: string toString() { a06a38e3e6 2012-07-13 kinaba: string result; a06a38e3e6 2012-07-13 kinaba: foreach(i,s; data) { a06a38e3e6 2012-07-13 kinaba: if(i) result ~= '\n'; a06a38e3e6 2012-07-13 kinaba: result ~= s.idup; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: return result; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: void command_R() { move(0, +1); } a06a38e3e6 2012-07-13 kinaba: void command_L() { move(0, -1); } a06a38e3e6 2012-07-13 kinaba: void command_U() { move(-1, 0); } a06a38e3e6 2012-07-13 kinaba: void command_D() { move(+1, 0); } a06a38e3e6 2012-07-13 kinaba: void wait() { update(); } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: void move(int dy, int dx) { a06a38e3e6 2012-07-13 kinaba: foreach(y,s; data) a06a38e3e6 2012-07-13 kinaba: foreach(x,c; s) a06a38e3e6 2012-07-13 kinaba: if(c == 'R') a06a38e3e6 2012-07-13 kinaba: return move(dy, dx, y, x); a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: void move(int dy, int dx, int y, int x) { a06a38e3e6 2012-07-13 kinaba: if(data[y+dy][x+dx]==' ' || data[y+dy][x+dx]=='.' a06a38e3e6 2012-07-13 kinaba: || data[y+dy][x+dx]=='\\' || data[y+dy][x+dx]=='O') { a06a38e3e6 2012-07-13 kinaba: data[y][x]=' '; a06a38e3e6 2012-07-13 kinaba: data[y+dy][x+dx]='R'; a06a38e3e6 2012-07-13 kinaba: } else if(dy==0 && data[y+dy][x+dx]=='*' && data[y+2*dy][x+2*dx]==' ') { a06a38e3e6 2012-07-13 kinaba: data[y][x]=' '; a06a38e3e6 2012-07-13 kinaba: data[y+dy][x+dx]='R'; a06a38e3e6 2012-07-13 kinaba: data[y+2*dy][x+2*dx]='*'; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: update(); a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: void update() { a06a38e3e6 2012-07-13 kinaba: char[][] next; a06a38e3e6 2012-07-13 kinaba: foreach(y,s; data) a06a38e3e6 2012-07-13 kinaba: next ~= s.dup; a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: bool lambda = false; a06a38e3e6 2012-07-13 kinaba: for(int y=1; y+1<H; ++y) a06a38e3e6 2012-07-13 kinaba: for(int x=1; x+1<W; ++x) a06a38e3e6 2012-07-13 kinaba: lambda |= (data[y][x] == '\\'); a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: for(int y=1; y+1<H; ++y) a06a38e3e6 2012-07-13 kinaba: for(int x=1; x+1<W; ++x) { a06a38e3e6 2012-07-13 kinaba: if(data[y][x]=='*') { a06a38e3e6 2012-07-13 kinaba: if(data[y+1][x]==' ') { a06a38e3e6 2012-07-13 kinaba: next[y][x]=' '; a06a38e3e6 2012-07-13 kinaba: next[y+1][x]='*'; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: else if(data[y+1][x]=='*' && data[y][x+1]==' ' && data[y+1][x+1]==' ') { a06a38e3e6 2012-07-13 kinaba: next[y][x]=' '; a06a38e3e6 2012-07-13 kinaba: next[y+1][x+1]='*'; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: else if(data[y+1][x]=='*' && data[y][x-1]==' ' && data[y+1][x-1]==' ') { a06a38e3e6 2012-07-13 kinaba: next[y][x]=' '; a06a38e3e6 2012-07-13 kinaba: next[y+1][x-1]='*'; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: else if(data[y+1][x]=='\\' && data[y][x+1]==' ' && data[y+1][x+1]==' ') { a06a38e3e6 2012-07-13 kinaba: next[y][x]=' '; a06a38e3e6 2012-07-13 kinaba: next[y+1][x+1]='*'; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: else if(data[y][x]=='L') { a06a38e3e6 2012-07-13 kinaba: if(!lambda) a06a38e3e6 2012-07-13 kinaba: next[y][x] = 'O'; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: data = next; a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: void main(string[] args) a06a38e3e6 2012-07-13 kinaba: { a06a38e3e6 2012-07-13 kinaba: Map m = new Map(File(args[1])); a06a38e3e6 2012-07-13 kinaba: for(;;) { a06a38e3e6 2012-07-13 kinaba: writeln(m); a06a38e3e6 2012-07-13 kinaba: write("> "); a06a38e3e6 2012-07-13 kinaba: string s = readln(); a06a38e3e6 2012-07-13 kinaba: if(s.length == 0) a06a38e3e6 2012-07-13 kinaba: break; a06a38e3e6 2012-07-13 kinaba: s = s.chomp().toUpper(); a06a38e3e6 2012-07-13 kinaba: if(s=="R")m.command_R(); a06a38e3e6 2012-07-13 kinaba: if(s=="L")m.command_L(); a06a38e3e6 2012-07-13 kinaba: if(s=="U")m.command_U(); a06a38e3e6 2012-07-13 kinaba: if(s=="D")m.command_D(); a06a38e3e6 2012-07-13 kinaba: if(s=="W")m.wait(); a06a38e3e6 2012-07-13 kinaba: } a06a38e3e6 2012-07-13 kinaba: a06a38e3e6 2012-07-13 kinaba: }