i64 write(i32, ptr i8, u64) { `scsbsa` syscall3(i64(1), `la` as i64, `lb` as i64, `lc` as i64) } i64 read(i32, ptr i8, u64) { `scsbsa` syscall3(i64(0), `la` as i64, `lb` as i64, `lc` as i64) } i32 open(ptr i8, i32, i32) { `scsbsa` syscall3(i64(2), `la` as i64, `lb` as i64, `lc` as i64) as i32 } void exit(i32) { as i64 i64(231) rev syscall1 trash } void putc(i8) { array i8[1] `dstr` store write(1, `lt`, u64(1)) trash } u64 strlen(ptr i8) { dup while(dup load i8(0) !=) { 1+ } `r-` } void print(ptr i8) { 1 rev dup strlen write trash } void println(ptr i8) { print i8(10) putc } void printnum(i32) { if (dup 0 ==) { putc('0') } else if (dup 0 <) { `0r-` '-' putc } array i8[11] 10+ dup i8(0) store -1+ `sb` while (dup 0 !=) { 10 divmod 48+ as i8 `lb` rev store `lb` -1+ `sb` } trash print(`lb`1+) } void printnum64(u64) { if (dup u64(0) ==) { putc('0') } array i8[22] 22+ dup i8(0) store -1+ `sb` while (dup u64(0) !=) { u64(10) divmod u64(48)+ as i8 `lb` rev store `lb` -1+ `sb` } trash print(`lb`1+) } i32 atoi(ptr i8) { set string 0 while (get string load '0' >= get string load '9' <= &) { 10* get string load '0'- as i32 + get string 1+ set string } } u64 atol(ptr i8) { set string u64(0) while (get string load '0' >= get string load '9' <= &) { u64(10)* get string load '0'- as u64 + get string 1+ set string } } i32 abs(i32) { if (dup 0 <) {`0r-`} } void _start() { open("input", 0, 0) set file array i8[65535] set buffer get buffer i8(48) store read(get file, get buffer, u64(65535)) as i32 set size #get buffer get size+ i8(10) store u64(0) `so` array ptr i8[10] set pointers pointers[0] get buffer store 1 set pointerlen `0si` while (buffer[get i] load '*' != buffer[get i] load '+' != &) { if (buffer[`li`] load i8(10) ==) { pointers[get pointerlen] buffer[get i] 1+ store inc(pointerlen) } inc(i) } dec(pointerlen) pointers[get pointerlen] load set ops `0si` `0sj` while (ops[`li`] load `dsc` i8(10) !=) { if (`lc` '*' == ) { println("*:") u1(1) `sf` u64(1) while (`lf`) { `0sk` u64(0) while (`lk` get pointerlen < ) { if (pointers[`lk`] load `lj`+ load `dsC` ' ' !=) { u64(10) * `lC` '0'- as u64 + } `lC` putc ' ' putc inc(k) } inc(j) dup printnum64 i8(10) putc if (dup u64(0) !=) { * } else { `t`u1(0)`sf` } } `lo+so` } else if (`lc` '+' == ) { println("+:") u1(1) `sf` u64(0) while (`lf`) { `0sk` u64(0) while (`lk` get pointerlen < ) { if (pointers[`lk`] load `lj`+ load `dsC` '0' >) { u64(10) * `lC` '0'- as u64 + } `lC` putc ' ' putc inc(k) } inc(j) dup printnum64 i8(10) putc if (dup u64(0) !=) { + } else { `t`u1(0)`sf` } } `lo+so` } inc(i) } println("answer:") `lo` printnum64 i8(10) putc exit(0) } void main() { _start }