54 lines
1.2 KiB
Text
54 lines
1.2 KiB
Text
get "libhdr";
|
|
|
|
// Reverse a string
|
|
let reverse(str) = valof
|
|
$( let i = 1
|
|
let j = str%0
|
|
while i<j
|
|
$( let c = str%i
|
|
str%i := str%j
|
|
str%j := c
|
|
i := i+1
|
|
j := j-1
|
|
$)
|
|
resultis str
|
|
$)
|
|
|
|
// Convert number to string given base
|
|
let itoa(n, base, buf) = valof
|
|
$( let digitchar(n) =
|
|
n < 10 -> n + '0',
|
|
(n - 10) + 'A'
|
|
buf%0 := 0
|
|
$( buf%0 := buf%0 + 1
|
|
buf%(buf%0) := digitchar(n rem base)
|
|
n := n / base
|
|
$) repeatuntil n<=0
|
|
resultis reverse(buf)
|
|
$)
|
|
|
|
// Convert string to number given base
|
|
let atoi(str, base) = valof
|
|
$( let digitval(d, base) =
|
|
'0' <= d <= '9' -> d - '0',
|
|
'A' <= d <= 'Z' -> (d - 'A') + 10,
|
|
'a' <= d <= 'z' -> (d - 'a') + 10,
|
|
0
|
|
let result = 0
|
|
for i=1 to str%0 do
|
|
result := result * base + digitval(str%i, base)
|
|
resultis result
|
|
$)
|
|
|
|
// Examples
|
|
let start() be
|
|
$( let buffer = vec 64
|
|
|
|
writes("1234 in bases 2-36:*N")
|
|
for base=2 to 36 do
|
|
writef("Base %I2: %S*N", base, itoa(1234, base, buffer))
|
|
|
|
writes("*N*"25*" in bases 10-36:*N")
|
|
for base=10 to 36 do
|
|
writef("Base %I2: %N*N", base, atoi("25", base))
|
|
$)
|