euler4
This commit is contained in:
23
examples/euler4.zr
Normal file
23
examples/euler4.zr
Normal file
@@ -0,0 +1,23 @@
|
||||
func print_i64[x: I64] : I64
|
||||
printf("%ld\n", x)
|
||||
|
||||
func i64_to_string[n: I64] : String
|
||||
let x: I64 = malloc(21)
|
||||
sprintf(x, "%ld", n)
|
||||
return x
|
||||
|
||||
func main[] : I64
|
||||
let out: I64 = 0
|
||||
|
||||
let a: I64 = 500
|
||||
while a < 1000
|
||||
let b: I64 = 500
|
||||
while b < 1000
|
||||
if a * b > out
|
||||
let s: String = i64_to_string(a * b)
|
||||
let s_rev: String = strrev(s)
|
||||
if strcmp(s, s_rev) == 0
|
||||
out = a * b
|
||||
b = b + 1
|
||||
a = a + 1
|
||||
print_i64(out)
|
||||
@@ -100,8 +100,37 @@ extern free
|
||||
extern printf
|
||||
extern sprintf
|
||||
extern strlen
|
||||
extern strcmp
|
||||
extern puts
|
||||
print equ puts
|
||||
|
||||
; generated with clang
|
||||
strrev:
|
||||
push r14
|
||||
push rbx
|
||||
push rax
|
||||
mov rbx, rdi
|
||||
call strlen
|
||||
mov r14, rax
|
||||
lea rdi, [rax + 1]
|
||||
call malloc
|
||||
mov rcx, rax
|
||||
mov rsi, r14
|
||||
mov rdx, r14
|
||||
.LBB0_1:
|
||||
sub rdx, 1
|
||||
jb .LBB0_2
|
||||
mov sil, byte [rbx + rsi - 1]
|
||||
mov byte [rcx], sil
|
||||
inc rcx
|
||||
mov rsi, rdx
|
||||
jmp .LBB0_1
|
||||
.LBB0_2:
|
||||
mov byte [rax + r14], 0
|
||||
add rsp, 8
|
||||
pop rbx
|
||||
pop r14
|
||||
ret
|
||||
",
|
||||
);
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user