d2p2 plasl

This commit is contained in:
m
2025-12-04 12:36:50 -05:00
parent 70facc84b9
commit ad0992ac2f

View File

@@ -0,0 +1,196 @@
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-`}
}
u64 pow10(i32) {
if (dup 1 ==) {u64(10)}
else if (dup 2 ==) {u64(100)}
else if (dup 3 ==) {u64(1000)}
else if (dup 4 ==) {u64(10000)}
else if (dup 5 ==) {u64(100000)}
else if (dup 6 ==) {u64(1000000)}
else if (dup 7 ==) {u64(10000000)}
else if (dup 8 ==) {u64(100000000)}
else if (dup 9 ==) {u64(1000000000)}
else if (dup 10 ==) {u64(10000000000)}
else {u64(0)}
`rt`
}
u64 range(u64, u64, u64) {
set divisor set end set start
get start get divisor + u64(1) - get divisor / set first
get end get divisor / set second
u64(1) get second + get first - get second get first +* u64(2) / get divisor *
}
u64 range2(u64, u64, i32) {
`sl` set end set start
if (`ll1` ==) {u64(0)}
else if (`ll2` ==) {range(get start, get end, u64(11))}
else if (`ll3` ==) {range(get start, get end, u64(111))}
else if (`ll4` ==) {range(get start, get end, u64(0101))}
else if (`ll5` ==) {range(get start, get end, u64(11111))}
else if (`ll6` ==) {range(get start, get end, u64(111111)) range(get start, get end, u64(010101)) range(get start, get end, u64(001001))+rev-}
else if (`ll7` ==) {range(get start, get end, u64(1111111))}
else if (`ll8` ==) {range(get start, get end, u64(00010001))}
else if (`ll9` ==) {range(get start, get end, u64(001001001))}
else if (`ll10` ==) {range(get start, get end, u64(1111111111))
range(get start, get end, u64(0101010101))
range(get start, get end, u64(0000100001))+rev-}
else if (`ll11` ==) {range(get start, get end, u64(11111111111))}
else { u64(0) print("aaa") }
}
void _start() {
open("example.txt", 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+ -1+ ',' store
u64(0) set out
0 set i
while (get i get size <) {
0 set startlen 0 set endlen
atol(get buffer get i+) set start
while (get buffer get i+ load '-' !=) {
`li1+si`
get startlen 1+ set startlen
}
`li1+si`
atol(get buffer get i+) set end
while (get buffer get i+ load ',' !=) {
`li1+si`
get endlen 1+ set endlen
}
`li1+si`
#printnum64(get start) '-' putc printnum64(get end) i8(10) putc
if (get endlen get startlen !=) {
range2(get start, pow10(get startlen) u64(1)-, get startlen)
range2(pow10(get startlen), get end, get endlen)
+
} else {
range2(get start, get end, get startlen)
}
#printnum64(dup) i8(10) putc
get out + set out
}
println("answer:")
get out printnum64 i8(10) putc
exit(0)
}
void main() {
_start
}