14 static int do_debug
= -1;
16 debug(const char *fmt
, ...) {
19 do_debug
= !!getenv("DEBUG");
22 vfprintf(stderr
, fmt
, ap
);
31 for (int i
= 0; i
< len
; i
++)
36 static void __attribute__((noreturn
))
37 crash(const char *msg
) {
38 printf("invalid program, pc=%d: %s\n", pc
, msg
);
45 int scale
= pow(10, param
+ 1);
46 int mode
= (op
/ scale
) % 10;
49 debug("get mode=%d\n", mode
);
51 crash("program too short for opcode");
52 value
= a
[pc
+ param
];
55 if (value
> len
|| value
< 0)
56 crash("in position mode, param beyond end of program");
61 crash("unexpected mode");
66 put(int param
, int value
) {
68 int scale
= pow(10, param
+ 1);
69 int mode
= (op
/ scale
) % 10;
72 debug("put mode=%d\n", mode
);
74 crash("program too short for opcode");
75 offset
= a
[pc
+ param
];
79 crash("in position mode, param beyond end of program");
83 crash("unexpected mode");
88 main(int argc
, char **argv
) {
89 int i
, count
= 0, jump
;
91 int reads
= 0, input
= 1;
94 if (!(stdin
= freopen(argv
[1], "r", stdin
))) {
99 while (scanf("%d%*[,\n]", &i
) == 1) {
101 if (len
> LIMIT
- 3) {
102 printf("recompile with larger LIMIT\n");
106 printf("Read %u slots\n", len
);
110 input
= atoi(argv
[2]);
114 debug("executing %d,%d,%d,%d\n", a
[pc
], a
[pc
+1], a
[pc
+2], a
[pc
+3]);
115 if (pc
> len
|| pc
< 0)
116 crash("program ran out of bounds");
117 switch (a
[pc
] % 100) {
119 put(3, get(1) + get(2));
123 put(3, get(1) * get(2));
128 crash("too many reads");
133 printf("%d\n", get(1));
151 put(3, get(1) < get(2));
155 put(3, get(1) == get(2));
164 crash("unexpected opcode");
169 printf("after %d opcodes, slot 0 holds %d\n", count
, a
[0]);