#include #include #include #include #include #include FILE *debug; void emit (int *lr, int b) { int16_t ilr[2]; if (!b) fprintf(debug,"\n"); fprintf(debug,"%d %d\n",lr[0],lr[1]); ilr[0] = lr[0]; ilr[1] = lr[1]; ilr[0] &= ~1; ilr[1] &= ~1; #if 1 if (!b) ilr[1] |= 1; #endif fwrite (ilr, sizeof (ilr), 1, stdout); //fprintf(stderr," %d %d %d\n",lr[0],lr[1],b); } int fast_steps (int *olr, int *lr) { uint64_t d, c; int ret = 0; int i; d = 0; for (i = 0; i < 2; ++i) { c = ((int64_t) lr[i]) - ((int64_t) olr[i]); d += c * c; } while (d > 5000) { ret++; d = d / 2; } return ret; } void move_fast (int *olr, int *lr) { int s = fast_steps (olr, lr); while (s--) emit (lr, 0); } void move_linear (int *olr, int *lr ,int b) { float d, c, s[2]; int elr[2]; float nlr[2]; int ns; int i; d = 0; for (i = 0; i < 2; ++i) { c = ((int64_t) lr[i]) - ((int64_t) olr[i]); d += c * c; } d = sqrt (d); // if (d<10) return; ns = (int) d/60 ; if (!ns) ns=1; for (i = 0; i < 2; ++i) { s[i] = ((float) (lr[i] - olr[i])) / (float) ns; nlr[i] = (float) olr[i]; } while (ns--) { for (i = 0; i < 2; ++i) { nlr[i] += s[i]; elr[i] = (int) (nlr[i] + .5); } emit (elr, b); } } void place (int *lr, int b) { static int olr[2], ob,q[2]; //fprintf(stderr,"%d %d %d %d\n",lr[0],lr[1],ob,b); //fprintf(stderr,"@ %d %d %d (%d)\n",lr[0],lr[1],b,ob); if (ob && !b) { //maybe_emit olr with beam off here? emit (olr, 1); emit (olr, 0); move_fast (olr, lr); // move_linear (olr, lr,0); } if (ob && b) { move_linear (olr, lr,1); // emit(lr,b); } if (!ob && b) { move_fast (olr, lr); // move_linear (olr, lr,0); emit(lr,1); } if (b || ob) { memcpy (olr, lr, sizeof (olr)); ob = b; } } void pos (int x, int y, int b) { int lr[2]; // lr[0] = 20000 - 3 * y ; lr[0] = 3 * y +10000; lr[1] = x * 3; place (lr, b); // emit(lr,b); } static int beam=0; static int ox,oy; void pu(void) { beam=0; } void pd(void) { beam=1; pos(ox,oy,1); } void pa(int x,int y) { ox=x; oy=y; pos(ox,oy,beam); } int main (int argc, char *argv[]) { char c; char buf[10240]; int ic, len; int commas; int x, y; debug=fopen("debug.dat","w"); buf[0] = 0; len = 0; commas = 0; while ((ic = getchar ()) != EOF) { c = ic; if ((c == ' ') || (c == '\t')) continue; buf[len++] = c; buf[len] = 0; if (!strcmp (buf, "PA")) { len = 0; commas = 0; continue; } if (!strcmp (buf, "PU")) { len = 0; commas = 0; pu(); continue; } if (!strcmp (buf, "PD")) { len = 0; commas = 0; pd(); continue; } if (!strncmp (buf, "SP", 2)) { commas = 0; if (c == ';') len = 0; continue; } if (c == ',') commas++; if (((commas) && ((c == ';') || (c == '\n'))) || (commas == 2)) { if (sscanf (buf, "%d,%d", &x, &y) == 2) { pa(x,y); } len = 0; commas = 0; } if ((c == ';') || (c == '\n')) { commas = 0; len = 0; } } return 0; }