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 printf
|
||||||
extern sprintf
|
extern sprintf
|
||||||
extern strlen
|
extern strlen
|
||||||
|
extern strcmp
|
||||||
extern puts
|
extern puts
|
||||||
print equ 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(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user