Ciallo~(∠・ω< )⌒★
# Reverse - leannum
题目给的是 Lean 编程语言的编译产物和中间文件,Lean 是一种函数式编程语言。上次 AkiraHomework 没做出来,这次想做出来。
# 概览
比较有用的文件有 ir/Main.c 和 bin/leannum。
运行和动态调试用二进制文件,题目给的是 Nix 环境下的,Ubuntu/Kali 直接运行会提示没有那个文件或目录。墨水师傅教我的 patch:
patchelf --set-interpreter /lib64/ld-linux-x86-64.so.2 --set-rpath /nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib leannum
patch 完就可以运行和动态调试了。
二进制文件反编译后可以看到很多判断整数最低位的操作,属于 Lean 的数据结构,不好看。https://lean-lang.org/lean4/doc/dev/ffi.html
读程序逻辑时看 C 文件,因为 Lean 库函数还没有展开和内联,能把注意力集中在用户代码。
包含的 lean.h 是开源的,在遇到光看函数名称看不懂的时候可以查阅:https://github.com/leanprover/lean4/blob/master/src/include/lean/lean.h
先缩进一下,大概看看两千多行每个部分在干什么。前面的函数声明不用看,中间对函数装箱的函数没被调用也不用看。前面一半 79 个函数,接近 9*9,是在构造挖空的目标数独矩阵,被最后的 initialize_Main 函数依次调用。_lean_main 函数从标准输入读字符串,调用 l_fromString 转化为数独矩阵(标志性的减 48),然后调用 l_check 判断是否符合数独规则,最后输出结果。中间那些名字很长的函数,就是判断逻辑的片段。
数组、数组的数组、装箱等都是 lean_object。有非常多的 lean_inc 和 lean_dec 函数调用,都不用看,是在引用计数。
所以要看的就是 目标矩阵构造过程 和 简化判断逻辑。
断点打在 l_fromString 和 l_check,会发现输入连续 81 个范围在 0..9(而不是 1..=9)的阿拉伯数字,才能进入 l_check 函数。
# 目标矩阵构造过程
可执行文件反编译中,这个过程是内联的,但立即数是按 Lean 数据结构写的,是实际数乘 2 加 1。直接看 C 也很好看。
lean_array_push 是一个先 copy 后 push 的过程,每次 push 都会得到一个新的对象,旧的对象也不会析构。第一个参数是一个数组,第二个参数(地址或立即数)直接作为一个数 push 进去。
全局变量 l_target 在 l_check 中被使用,l_target 就是 l_target___closed__79,回溯 l_target___closed__79 的 push 过程,开始是立即数 9,然后接 l_target___closed__12、21、27、38、42、46、55、62、70 共 9 个数组地址。回溯 l_target___closed__12 的 push 过程,开始是立即数 9,然后接立即数 6、box (0)、立即数 1、6 个 box (0)。以此类推,就得到了 9*9 二维数组。
a1 = 6 | |
a2 = 1 | |
a3 = 9 | |
a4 = a3, a1 | |
a5 = a4, {} | |
a6 = a5, a2 | |
a7 = a6, {} | |
a8 = a7, {} | |
a9 = a8, {} | |
a10 = a9, {} | |
a11 = a10, {} | |
a12 = a11, {} | |
a13 = a3, {} | |
a14 = a13, {} | |
a15 = a14, {} | |
a16 = a15, {} | |
a17 = a16, {} | |
a18 = a17, {} | |
a19 = a18, {} | |
a20 = a19, {} | |
a21 = a20, {} | |
a22 = 5 | |
a23 = a16, a22 | |
a24 = a23, {} | |
a25 = a24, {} | |
a26 = a25, {} | |
a27 = a26, {} | |
a28 = 4 | |
a29 = 2 | |
a30 = a3, a28 | |
a31 = a30, {} | |
a32 = a31, a22 | |
a33 = a32, {} | |
a34 = a33, a29 | |
a35 = a34, {} | |
a36 = a35, {} | |
a37 = a36, {} | |
a38 = a37, {} | |
a39 = 0 | |
a40 = a18, a39 | |
a41 = a40, a29 | |
a42 = a41, {} | |
a43 = 7 | |
a44 = a18, a43 | |
a45 = a44, {} | |
a46 = a45, a22 | |
a47 = 3 | |
a48 = a13, a47 | |
a49 = a48, {} | |
a50 = a49, {} | |
a51 = a50, {} | |
a52 = a51, {} | |
a53 = a52, a28 | |
a54 = a53, {} | |
a55 = a54, {} | |
a56 = a14, a43 | |
a57 = a56, a28 | |
a58 = a57, {} | |
a59 = a58, a2 | |
a60 = a59, {} | |
a61 = a60, {} | |
a62 = a61, {} | |
a63 = a13, a28 | |
a64 = a63, {} | |
a65 = a64, {} | |
a66 = a65, {} | |
a67 = a66, {} | |
a68 = a67, {} | |
a69 = a68, {} | |
a70 = a69, {} | |
a71 = a3, a12 | |
a72 = a71, a21 | |
a73 = a72, a27 | |
a74 = a73, a38 | |
a75 = a74, a42 | |
a76 = a75, a46 | |
a77 = a76, a55 | |
a78 = a77, a62 | |
a79 = a78, a70 |
[ 6, -1, 1, -1, -1, -1, -1, -1, -1], | |
[-1, -1, -1, -1, -1, -1, -1, -1, -1], | |
[-1, -1, -1, -1, 5, -1, -1, -1, -1], | |
[ 4, -1, 5, -1, 2, -1, -1, -1, -1], | |
[-1, -1, -1, -1, -1, -1, 0, 2, -1], | |
[-1, -1, -1, -1, -1, -1, 7, -1, 5], | |
[-1, 3, -1, -1, -1, -1, 4, -1, -1], | |
[-1, -1, 7, 4, -1, 1, -1, -1, -1], | |
[-1, 4, -1, -1, -1, -1, -1, -1, -1], |
已定的格子非常少,可能除了横向、纵向外,还有别的必须满足的规则,还是要逆逻辑。
# 简化判断逻辑
由于编译中间语言的原因,一两条语句能说明白的东西拆分成了很多条语句。
# for 循环
以 init_l_target 之后第一个函数 l_Array_anyMUnsafe_any___at_check___spec__2 为例:
这个函数只被调用一次,传入的 x_3 是 0,x_4 是数组长度。所以可以简化为:
LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__2(lean_object *x_1, lean_object *x_2, size_t x_3, size_t x_4) | |
{ | |
for (x_3 /* = 0 */; x_3 < x_4; x_3++) | |
{ | |
if (x_2[x_3] == *x_1) | |
return 1; | |
} | |
return 0; | |
} |
这个函数的作用是判断 x_1 是否存在于 x_2 数组。
以此类推,很多函数的 for 循环都变成了这样,可以化简或者看多几个就习惯了。至于是立即数还是装箱后的数,凭感觉判断就行。
# 数组按索引取值和赋值
lean_array_uget(a, b) a[b] | |
lean_array_uset(a, b, c) a[b] = c | |
lean_array_get(T, a, b) (typeof(T))(a[b]) |
以下面这个函数为例,它被调用 9 次,传入的 x_1 分别是 0 至 8。
LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__4(lean_object *x_1, size_t x_2, size_t x_3, lean_object *x_4) // in: idx(0..9), 9, 0, msg | |
{ | |
_start: | |
{ | |
while(x_3 < x_2) | |
{ | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
lean_object *x_13; | |
x_6 = lean_array_uget(x_4, x_3); // 得到一行(这一行的地址) | |
x_7 = lean_unsigned_to_nat(0u); | |
x_8 = lean_array_uset(x_4, x_3, x_7); | |
x_9 = l_instInhabitedNat; | |
x_10 = lean_array_get(x_9, x_6, x_1); // 再从这一行得到一个数 | |
x_13 = lean_array_uset(x_8, x_3, x_10); // 用这一个数代替这一行 | |
x_3 ++; | |
x_4 = x_13; | |
} | |
return x_4; | |
} | |
} |
这个函数的作用是从矩阵中获得某一列,好判断这一列是否包含了 0..9。
类似的,l_Array_mapMUnsafe_map___at_check___spec__7 是从矩阵中获得某一条主对角线,好判断这一条主对角线是否包含了 0..9。总共要判断 9 条主对角线。
到这里就可以猜出判定逻辑、求解了,不过再看看 l_check 的逻辑。
# l_check
函数由好几个代码块组成,每个代码块要么返回,要么通过 goto 显式跳转到另一个代码块。控制流有很多判断条件,最后的目标是要返回 1。观察一下就可以发现,如果返回 1,那么必定是在 block_15 这个代码块返回的。有几个条件是已经知道正常情况下的值的,比如正常情况下矩阵长度大于 0 为真。一点一点地把正常情况不会执行的部分注释掉,剪枝一下,可以找到返回 1 的唯一控制流。
LEAN_EXPORT uint8_t l_check(lean_object *x_1) | |
{ | |
_start: | |
{ | |
lean_object *x_2; | |
lean_object *x_3; | |
uint8_t x_4; | |
uint8_t x_5; | |
lean_object *x_6; | |
uint8_t x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
uint8_t x_11; | |
uint8_t x_12; | |
uint8_t x_16; | |
x_2 = lean_array_get_size(x_1); // 9 | |
x_3 = lean_unsigned_to_nat(0u); // 0 | |
x_4 = lean_nat_dec_lt(x_3, x_2); // true | |
x_5 = LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(x_1, x_2, x_2, x_2); // sat requires x_5==true | |
x_6 = l_size; | |
x_7 = l_Nat_allTR_loop___at_check___spec__9(x_1, x_6, x_6); // sat requires x_7==true | |
x_8 = l_target; | |
x_9 = l_Array_zip___rarg(x_1, x_8); | |
x_10 = lean_array_get_size(x_9); | |
x_11 = lean_nat_dec_lt(x_3, x_10); // true | |
if (x_4 == 0) // should never | |
{ | |
// if (x_11 == 0) | |
// { | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
// } | |
// else | |
// { | |
// x_16 = 1; | |
// goto block_34; | |
// } | |
} | |
else | |
{ | |
size_t x_38; | |
uint8_t x_39; | |
x_38 = lean_usize_of_nat(x_2); | |
x_39 = LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(x_1, 0, x_38); | |
if (x_39 == 0) // should always | |
{ | |
if (x_11 == 0) // should never | |
{ | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
} | |
else | |
{ | |
x_16 = 1; | |
goto block_34; | |
} | |
} | |
else | |
{ | |
// if (x_11 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_16 = 0; | |
// goto block_34; | |
// } | |
} | |
} | |
block_15_must_return_here: | |
{ | |
if (x_5 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
if (x_7 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
return x_12; | |
} | |
} | |
} | |
block_34: | |
{ | |
uint8_t x_17; | |
x_17 = lean_nat_dec_le(x_10, x_10); // true | |
if (x_17 == 0) | |
{ | |
// if (x_11 == 0) | |
// { | |
// if (x_16 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
// } | |
// } | |
// else | |
// { | |
// size_t x_21; | |
// uint8_t x_22; | |
// x_21 = lean_usize_of_nat(x_10); | |
// x_22 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_21); | |
// if (x_22 == 0) | |
// { | |
// if (x_16 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
// } | |
// } | |
// else | |
// { | |
// return 0; | |
// // if (x_16 == 0) | |
// // { | |
// // return 0; | |
// // } | |
// // else | |
// // { | |
// // x_12 = 0; | |
// // goto block_15_must_return_here; | |
// // } | |
// } | |
// } | |
} | |
else // should always | |
{ | |
size_t x_28; | |
uint8_t x_29; | |
x_28 = lean_usize_of_nat(x_10); | |
x_29 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_28); // sat requires x_29==false | |
if (x_29 == 0) | |
{ | |
if (x_16 == 0) // should never | |
{ | |
// return 0; | |
} | |
else | |
{ | |
x_12 = 1; | |
goto block_15_must_return_here; | |
} | |
} | |
else | |
{ | |
return 0; | |
// if (x_16 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_12 = 0; | |
// goto block_15_must_return_here; | |
// } | |
} | |
} | |
} | |
} | |
} |
可以看到依次需要通过以下判断:
输入81个0..9的阿拉伯数字 true == l_fromString() | |
每列都是0..9 true == l_Nat_allTR_loop___at_check___spec__6() | |
每条对角线都是0..9 true == l_Nat_allTR_loop___at_check___spec__9() | |
每行都是0..9 false == l_Array_anyMUnsafe_any___at_check___spec__12() | |
输入符合构造的挖空矩阵(猜的) false == l_Array_anyMUnsafe_any___at_check___spec__11() |
# 我简化完的 C 伪代码
伪代码是给人看的,不能编译。
// Lean compiler output | |
// Module: Main | |
// Imports: Init Init.Data.List | |
#include <lean/lean.h> | |
#if defined(__clang__) | |
#pragma clang diagnostic ignored "-Wunused-parameter" | |
#pragma clang diagnostic ignored "-Wunused-label" | |
#elif defined(__GNUC__) && !defined(__CLANG__) | |
#pragma GCC diagnostic ignored "-Wunused-parameter" | |
#pragma GCC diagnostic ignored "-Wunused-label" | |
#pragma GCC diagnostic ignored "-Wunused-but-set-variable" | |
#endif | |
static lean_object *l_target___closed__60; | |
LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_fromString___spec__3(lean_object *, size_t, size_t); | |
static lean_object *l_target___closed__50; | |
static lean_object *l_target___closed__58; | |
LEAN_EXPORT uint8_t LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(lean_object *, lean_object *); | |
static lean_object *l_target___closed__56; | |
static lean_object *l_target___closed__25; | |
static lean_object *l_target___closed__21; | |
lean_object *lean_mk_empty_array_with_capacity(lean_object *); | |
LEAN_EXPORT lean_object *_lean_main(lean_object *); | |
static lean_object *l_target___closed__71; | |
lean_object *lean_uint32_to_nat(uint32_t); | |
static lean_object *l_target___closed__22; | |
LEAN_EXPORT uint8_t LR____done____l_Array_anyMUnsafe_any___at_check___spec__2(lean_object *, lean_object *, size_t, size_t); | |
static lean_object *l_target___closed__61; | |
static lean_object *l_target___closed__4; | |
static lean_object *l_target___closed__37; | |
lean_object *lean_array_push(lean_object *, lean_object *); | |
static lean_object *l_target___closed__59; | |
LEAN_EXPORT lean_object *LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4(lean_object *, size_t, size_t, lean_object *); | |
uint8_t lean_usize_dec_eq(size_t, size_t); | |
LEAN_EXPORT lean_object *l_fromString___lambda__1(lean_object *, lean_object *); | |
LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__9(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__75; | |
LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__7(lean_object *, lean_object *, size_t, size_t, lean_object *); | |
static lean_object *l_target___closed__73; | |
static lean_object *l_target___closed__63; | |
static lean_object *l_target___closed__76; | |
LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_fromString___spec__2___boxed(lean_object *, lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__13; | |
LEAN_EXPORT lean_object *l_Nat_allTR_loop___at_check___spec__9___boxed(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__66; | |
static lean_object *l_target___closed__57; | |
extern lean_object *l_instInhabitedNat; | |
LEAN_EXPORT uint8_t l_check(lean_object *); | |
static lean_object *l_target___closed__51; | |
static lean_object *l_target___closed__17; | |
LEAN_EXPORT lean_object *LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5___boxed(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__10; | |
LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_fromString___spec__2(lean_object *, size_t, size_t, lean_object *); | |
lean_object *l_IO_println___at_Lean_instEval___spec__1(lean_object *, lean_object *); | |
size_t lean_usize_of_nat(lean_object *); | |
static lean_object *l_target___closed__12; | |
static lean_object *l_target___closed__49; | |
static lean_object *l_target___closed__38; | |
lean_object *lean_string_data(lean_object *); | |
static lean_object *l_target___closed__41; | |
static lean_object *l_target___closed__65; | |
LEAN_EXPORT lean_object *l_target; | |
uint8_t lean_nat_dec_eq(lean_object *, lean_object *); | |
static lean_object *l_target___closed__74; | |
static lean_object *l_target___closed__52; | |
lean_object *l_Array_zip___rarg(lean_object *, lean_object *); | |
static lean_object *l_target___closed__78; | |
static lean_object *l_target___closed__19; | |
static lean_object *l_target___closed__3; | |
static lean_object *l_target___closed__28; | |
static lean_object *l_target___closed__35; | |
LEAN_EXPORT lean_object *l_Nat_allTR_loop___at_check___spec__8___boxed(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__47; | |
static lean_object *l_target___closed__2; | |
static lean_object *l_target___closed__29; | |
static lean_object *l_target___closed__18; | |
static lean_object *l_target___closed__6; | |
static lean_object *l_target___closed__31; | |
LEAN_EXPORT lean_object *l_Array_anyMUnsafe_any___at_check___spec__10___boxed(lean_object *, lean_object *, lean_object *); | |
LEAN_EXPORT lean_object *LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3___boxed(lean_object *, lean_object *, lean_object *); | |
LEAN_EXPORT lean_object *l_fromString___lambda__2___boxed(lean_object *, lean_object *); | |
lean_object *lean_get_stdin(lean_object *); | |
LEAN_EXPORT lean_object *l_size; | |
static lean_object *l_target___closed__14; | |
LEAN_EXPORT lean_object *LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6___boxed(lean_object *, lean_object *, lean_object *, lean_object *); | |
lean_object *l_IO_print___at_IO_println___spec__1(lean_object *, lean_object *); | |
static lean_object *l_target___closed__23; | |
static lean_object *l_target___closed__69; | |
LEAN_EXPORT uint8_t LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__7; | |
LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__7___boxed(lean_object *, lean_object *, lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__67; | |
LEAN_EXPORT uint8_t LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__11; | |
static lean_object *l_target___closed__42; | |
lean_object *l_Array_range(lean_object *); | |
static lean_object *l_target___closed__9; | |
LEAN_EXPORT lean_object *LR____done____l_Array_anyMUnsafe_any___at_check___spec__2___boxed(lean_object *, lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__62; | |
static lean_object *l_target___closed__20; | |
static lean_object *l_fromString___lambda__2___closed__1; | |
static lean_object *l_target___closed__16; | |
static lean_object *l_target___closed__54; | |
static lean_object *l_target___closed__64; | |
static lean_object *l_target___closed__70; | |
lean_object *l_Array_extract___rarg(lean_object *, lean_object *, lean_object *); | |
LEAN_EXPORT lean_object *LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12___boxed(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__44; | |
LEAN_EXPORT uint8_t LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(lean_object *, lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__5; | |
uint8_t lean_nat_dec_eq(lean_object *, lean_object *); | |
static lean_object *l_target___closed__68; | |
uint8_t lean_nat_dec_lt(lean_object *, lean_object *); | |
lean_object *lean_nat_mod(lean_object *, lean_object *); | |
static lean_object *l_target___closed__46; | |
static lean_object *l_target___closed__77; | |
static lean_object *l_target___closed__40; | |
static lean_object *l_target___closed__55; | |
LEAN_EXPORT lean_object *LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4___boxed(lean_object *, lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__45; | |
static lean_object *l_target___closed__53; | |
LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__8(lean_object *, lean_object *, lean_object *); | |
static lean_object *l_target___closed__32; | |
static lean_object *l_target___closed__26; | |
LEAN_EXPORT lean_object *l_fromString(lean_object *); | |
static lean_object *l_Nat_allTR_loop___at_check___spec__9___closed__1; | |
LEAN_EXPORT lean_object *l_boxSize; | |
lean_object *lean_nat_sub(lean_object *, lean_object *); | |
LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__10(lean_object *, size_t, size_t); | |
lean_object *lean_nat_mul(lean_object *, lean_object *); | |
LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__11(lean_object *, size_t, size_t); | |
static lean_object *l_target___closed__8; | |
static lean_object *l_target___closed__1; | |
static lean_object *l_target___closed__24; | |
static lean_object *l_target___closed__79; | |
static lean_object *l_target___closed__30; | |
static size_t l_Nat_allTR_loop___at_check___spec__9___closed__3; | |
lean_object *l_List_reverse___rarg(lean_object *); | |
LEAN_EXPORT lean_object *l_Array_anyMUnsafe_any___at_fromString___spec__3___boxed(lean_object *, lean_object *, lean_object *); | |
LEAN_EXPORT lean_object *l_Array_anyMUnsafe_any___at_check___spec__11___boxed(lean_object *, lean_object *, lean_object *); | |
size_t lean_usize_add(size_t, size_t); | |
static lean_object *l_target___closed__36; | |
static lean_object *l_target___closed__43; | |
lean_object *lean_array_uget(lean_object *, size_t); | |
static lean_object *l_target___closed__72; | |
static lean_object *l_target___closed__48; | |
lean_object *l_List_redLength___rarg(lean_object *); | |
lean_object *l_String_trimRight(lean_object *); | |
static lean_object *l_target___closed__27; | |
static lean_object *l_target___closed__39; | |
lean_object *lean_array_get_size(lean_object *); | |
LEAN_EXPORT lean_object *l_fromString___lambda__2(lean_object *, lean_object *); | |
static lean_object *l_target___closed__33; | |
uint8_t lean_nat_dec_le(lean_object *, lean_object *); | |
uint8_t lean_usize_dec_lt(size_t, size_t); | |
LEAN_EXPORT lean_object *l_fromString___lambda__1___boxed(lean_object *, lean_object *); | |
lean_object *lean_nat_add(lean_object *, lean_object *); | |
LEAN_EXPORT lean_object *l_check___boxed(lean_object *); | |
static lean_object *l_target___closed__34; | |
lean_object *lean_array_uset(lean_object *, size_t, lean_object *); | |
lean_object *lean_array_get(lean_object *, lean_object *, lean_object *); | |
LEAN_EXPORT lean_object *l_Array_contains___at_check___spec__1___boxed(lean_object *, lean_object *); | |
LEAN_EXPORT lean_object *l_List_mapTR_loop___at_fromString___spec__1(lean_object *, lean_object *); | |
lean_object *l_List_toArrayAux___rarg(lean_object *, lean_object *); | |
LEAN_EXPORT uint8_t LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(lean_object *, size_t, size_t); | |
static lean_object *l_target___closed__15; | |
static lean_object *_init_l_target___closed__1() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(6u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__2() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(1u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__3() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(9u); | |
x_2 = lean_mk_empty_array_with_capacity(x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__4() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__3; | |
x_2 = l_target___closed__1; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__5() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__4; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__6() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__5; | |
x_2 = l_target___closed__2; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__7() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__6; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__8() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__7; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__9() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__8; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__10() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__9; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__11() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__10; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__12() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__11; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__13() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__3; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__14() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__13; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__15() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__14; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__16() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__15; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__17() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__16; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__18() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__17; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__19() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__18; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__20() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__19; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__21() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__20; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__22() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(5u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__23() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__16; | |
x_2 = l_target___closed__22; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__24() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__23; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__25() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__24; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__26() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__25; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__27() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__26; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__28() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(4u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__29() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(2u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__30() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__3; | |
x_2 = l_target___closed__28; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__31() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__30; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__32() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__31; | |
x_2 = l_target___closed__22; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__33() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__32; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__34() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__33; | |
x_2 = l_target___closed__29; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__35() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__34; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__36() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__35; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__37() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__36; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__38() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__37; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__39() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(0u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__40() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__18; | |
x_2 = l_target___closed__39; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__41() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__40; | |
x_2 = l_target___closed__29; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__42() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__41; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__43() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(7u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__44() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__18; | |
x_2 = l_target___closed__43; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__45() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__44; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__46() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__45; | |
x_2 = l_target___closed__22; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__47() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
x_1 = lean_unsigned_to_nat(3u); | |
x_2 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_2, 0, x_1); | |
return x_2; | |
} | |
} | |
static lean_object *_init_l_target___closed__48() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__13; | |
x_2 = l_target___closed__47; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__49() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__48; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__50() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__49; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__51() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__50; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__52() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__51; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__53() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__52; | |
x_2 = l_target___closed__28; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__54() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__53; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__55() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__54; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__56() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__14; | |
x_2 = l_target___closed__43; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__57() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__56; | |
x_2 = l_target___closed__28; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__58() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__57; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__59() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__58; | |
x_2 = l_target___closed__2; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__60() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__59; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__61() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__60; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__62() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__61; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__63() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__13; | |
x_2 = l_target___closed__28; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__64() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__63; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__65() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__64; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__66() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__65; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__67() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__66; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__68() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__67; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__69() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__68; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__70() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = lean_box(0); | |
x_2 = l_target___closed__69; | |
x_3 = lean_array_push(x_2, x_1); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__71() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__3; | |
x_2 = l_target___closed__12; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__72() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__71; | |
x_2 = l_target___closed__21; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__73() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__72; | |
x_2 = l_target___closed__27; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__74() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__73; | |
x_2 = l_target___closed__38; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__75() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__74; | |
x_2 = l_target___closed__42; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__76() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__75; | |
x_2 = l_target___closed__46; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__77() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__76; | |
x_2 = l_target___closed__55; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__78() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__77; | |
x_2 = l_target___closed__62; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
static lean_object *_init_l_target___closed__79() | |
{ | |
_start: | |
{ | |
lean_object *x_1; | |
lean_object *x_2; | |
lean_object *x_3; | |
x_1 = l_target___closed__78; | |
x_2 = l_target___closed__70; | |
x_3 = lean_array_push(x_1, x_2); | |
return x_3; | |
} | |
} | |
LEAN_EXPORT uint8_t LR____done____l_Array_anyMUnsafe_any___at_check___spec__2(lean_object *x_1, lean_object *x_2, size_t x_3, size_t x_4) | |
{ | |
for (size_t x_3 /* = 0 */; x_3 < x_4; x_3++) | |
{ | |
if (x_2[x_3] == *x_1) | |
return 1; | |
} | |
return 0; | |
} | |
LEAN_EXPORT uint8_t LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(lean_object *x_1, lean_object *x_2) | |
{ | |
_start: | |
{ | |
if (len(x_1) == 0) | |
return 0; | |
// return LR____done____l_Array_anyMUnsafe_any___at_check___spec__2(x_2, x_1, x_7, x_8); | |
for (size_t x_7 = 0; x_7 < len(x_3); x_7++) | |
{ | |
if (x_1[x_7] == *x_2) | |
return 1; | |
} | |
return 0; | |
} | |
} | |
LEAN_EXPORT uint8_t LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3(lean_object *x_1, lean_object *x_2, lean_object *x_3) | |
{ | |
_start: | |
{ | |
if (*x_3 == 0) | |
return 1; | |
x_9 = *x_2 - *x_3; | |
x_10 = LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(x_1, x_9); | |
if (x_10 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
*x_3--; | |
goto _start; | |
} | |
} | |
} | |
LEAN_EXPORT lean_object *LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4(lean_object *x_1, size_t x_2, size_t x_3, lean_object *x_4) // in: idx(0..9), 9, 0, msg | |
{ | |
_start: | |
{ | |
while(x_3 < x_2) | |
{ | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
lean_object *x_13; | |
x_6 = lean_array_uget(x_4, x_3); // 得到一行 | |
x_7 = lean_unsigned_to_nat(0u); | |
x_8 = lean_array_uset(x_4, x_3, x_7); | |
x_9 = l_instInhabitedNat; | |
x_10 = lean_array_get(x_9, x_6, x_1); // 再从这一行得到一个 | |
x_13 = lean_array_uset(x_8, x_3, x_10); // 用这一个代替这一行 | |
x_3 ++; | |
x_4 = x_13; | |
} | |
return x_4; | |
} | |
} | |
LEAN_EXPORT uint8_t LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5(lean_object *x_1, lean_object *x_2, lean_object *x_3) //in: 上一步返回的数组,box (9), box (9) | |
{ | |
_start: | |
{ | |
if (x_3 == 0) | |
return 1; | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
uint8_t x_10; | |
x_6 = lean_unsigned_to_nat(1u); | |
x_7 = lean_nat_sub(x_3, x_6); | |
lean_dec(x_3); | |
x_8 = lean_nat_add(x_7, x_6); | |
x_9 = lean_nat_sub(x_2, x_8); | |
lean_dec(x_8); | |
x_10 = LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(x_1, x_9); | |
if (x_10 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
x_3 = x_7; | |
goto _start; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(lean_object *x_1, lean_object *x_2, lean_object *x_3, lean_object *x_4) // in: msg, box(9), box(9), box(9) | |
{ | |
_start: | |
{ | |
if (*x_4 == 0) | |
return 1; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_10; | |
size_t x_11; | |
size_t x_12; | |
lean_object *x_13; | |
lean_object *x_14; | |
uint8_t x_15; | |
x_10 = lean_nat_sub(x_3, x_4); | |
x_11 = lean_usize_of_nat(x_2); | |
x_12 = 0; | |
x_13 = LR____horizontal____l_Array_mapMUnsafe_map___at_check___spec__4(x_10, x_11, x_12, x_1); | |
x_14 = lean_array_get_size(x_13); | |
x_15 = LR____all_0_to_len_i_in_x_1____l_Nat_allTR_loop___at_check___spec__5(x_13, x_14, x_14); | |
if (x_15 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
x_4 --; | |
goto _start; | |
} | |
} | |
} | |
LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_check___spec__7(lean_object *x_1, lean_object *x_2, size_t x_3, size_t x_4, lean_object *x_5) // in: msg_mat, idx(0..9), 9, 0, ano_msg_mat | |
{ | |
_start: | |
{ | |
uint8_t x_6; | |
x_6 = lean_usize_dec_lt(x_4, x_3); | |
if (x_6 == 0) | |
{ | |
return x_5; | |
} | |
else | |
{ | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
lean_object *x_11; | |
lean_object *x_12; | |
lean_object *x_13; | |
lean_object *x_14; | |
lean_object *x_15; | |
lean_object *x_16; | |
size_t x_17; | |
size_t x_18; | |
lean_object *x_19; | |
x_7 = lean_array_uget(x_5, x_4); // 得到一个 0 到 9 的数(?) | |
x_8 = lean_unsigned_to_nat(0u); | |
x_9 = lean_array_uset(x_5, x_4, x_8); | |
x_10 = l_Array_mapMUnsafe_map___at_check___spec__7___closed__1; // is an empty array | |
x_11 = lean_array_get(x_10, x_1, x_7); // 得到一行(下标是?) | |
x_12 = lean_nat_add(x_7, x_2); // 值加下标?对角线? | |
lean_dec(x_7); | |
x_13 = l_size; | |
x_14 = lean_nat_mod(x_12, x_13); | |
lean_dec(x_12); | |
x_15 = l_instInhabitedNat; | |
x_16 = lean_array_get(x_15, x_11, x_14); | |
lean_dec(x_14); | |
lean_dec(x_11); | |
x_17 = 1; | |
x_18 = lean_usize_add(x_4, x_17); | |
x_19 = lean_array_uset(x_9, x_4, x_16); | |
x_4 = x_18; | |
x_5 = x_19; | |
goto _start; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__8(lean_object *x_1, lean_object *x_2, lean_object *x_3) | |
{ | |
_start: | |
{ | |
lean_object *x_4; | |
uint8_t x_5; | |
x_4 = lean_unsigned_to_nat(0u); | |
x_5 = lean_nat_dec_eq(x_3, x_4); | |
if (x_5 == 0) | |
{ | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
uint8_t x_10; | |
x_6 = lean_unsigned_to_nat(1u); | |
x_7 = lean_nat_sub(x_3, x_6); | |
lean_dec(x_3); | |
x_8 = lean_nat_add(x_7, x_6); | |
x_9 = lean_nat_sub(x_2, x_8); | |
lean_dec(x_8); | |
x_10 = LR____arg2_in_arg1____l_Array_contains___at_check___spec__1(x_1, x_9); | |
lean_dec(x_9); | |
if (x_10 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
x_3 = x_7; | |
goto _start; | |
} | |
} | |
else | |
{ | |
return 1; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t l_Nat_allTR_loop___at_check___spec__9(lean_object *x_1, lean_object *x_2, lean_object *x_3) | |
{ | |
_start: | |
{ | |
if (x_3 == 0) | |
return 1; | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
size_t x_11; | |
lean_object *x_12; | |
lean_object *x_13; | |
lean_object *x_14; | |
uint8_t x_15; | |
x_9 = x_2 - x_3; | |
x_11 = l_Nat_allTR_loop___at_check___spec__9___closed__3; | |
x_12 = l_Nat_allTR_loop___at_check___spec__9___closed__1; | |
x_13 = l_Array_mapMUnsafe_map___at_check___spec__7(x_1, x_9, x_11, 0, x_12); | |
x_14 = lean_array_get_size(x_13); | |
x_15 = l_Nat_allTR_loop___at_check___spec__8(x_13, x_14, x_14); | |
if (x_15 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
x_3--; | |
goto _start; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__10(lean_object *x_1, size_t x_2, size_t x_3) | |
{ | |
_start: | |
{ | |
uint8_t x_4; | |
x_4 = lean_usize_dec_eq(x_2, x_3); | |
if (x_4 == 0) | |
{ | |
lean_object *x_5; | |
lean_object *x_6; | |
x_5 = lean_array_uget(x_1, x_2); | |
x_6 = lean_ctor_get(x_5, 1); | |
lean_inc(x_6); | |
if (lean_obj_tag(x_6) == 0) | |
{ | |
size_t x_7; | |
size_t x_8; | |
lean_dec(x_5); | |
x_7 = 1; | |
x_8 = lean_usize_add(x_2, x_7); | |
x_2 = x_8; | |
goto _start; | |
} | |
else | |
{ | |
lean_object *x_10; | |
lean_object *x_11; | |
uint8_t x_12; | |
x_10 = lean_ctor_get(x_5, 0); | |
lean_inc(x_10); | |
lean_dec(x_5); | |
x_11 = lean_ctor_get(x_6, 0); | |
lean_inc(x_11); | |
lean_dec(x_6); | |
x_12 = lean_nat_dec_eq(x_10, x_11); | |
lean_dec(x_11); | |
lean_dec(x_10); | |
if (x_12 == 0) | |
{ | |
return 1; | |
} | |
else | |
{ | |
x_2++; | |
goto _start; | |
} | |
} | |
} | |
else | |
{ | |
return 0; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_check___spec__11(lean_object *x_1, size_t x_2, size_t x_3) | |
{ | |
_start: | |
{ | |
uint8_t x_4; | |
x_4 = lean_usize_dec_eq(x_2, x_3); | |
if (x_4 == 0) | |
{ | |
lean_object *x_5; | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
uint8_t x_11; | |
x_5 = lean_array_uget(x_1, x_2); | |
x_6 = lean_ctor_get(x_5, 0); | |
lean_inc(x_6); | |
x_7 = lean_ctor_get(x_5, 1); | |
lean_inc(x_7); | |
lean_dec(x_5); | |
x_8 = l_Array_zip___rarg(x_6, x_7); | |
lean_dec(x_7); | |
lean_dec(x_6); | |
x_9 = lean_array_get_size(x_8); | |
x_10 = lean_unsigned_to_nat(0u); | |
x_11 = lean_nat_dec_lt(x_10, x_9); | |
if (x_11 == 0) | |
{ | |
size_t x_12; | |
size_t x_13; | |
lean_dec(x_9); | |
lean_dec(x_8); | |
x_12 = 1; | |
x_13 = lean_usize_add(x_2, x_12); | |
x_2 = x_13; | |
goto _start; | |
} | |
else | |
{ | |
size_t x_15; | |
size_t x_16; | |
uint8_t x_17; | |
x_15 = 0; | |
x_16 = lean_usize_of_nat(x_9); | |
lean_dec(x_9); | |
x_17 = l_Array_anyMUnsafe_any___at_check___spec__10(x_8, x_15, x_16); | |
lean_dec(x_8); | |
if (x_17 == 0) | |
{ | |
x_2++; | |
goto _start; | |
} | |
else | |
{ | |
return 1; | |
} | |
} | |
} | |
else | |
{ | |
return 0; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(lean_object *x_1, size_t x_2, size_t x_3) | |
{ | |
_start: | |
{ | |
if (x_2 == x_3) | |
return 0; | |
lean_object *x_5; | |
lean_object *x_6; | |
uint8_t x_7; | |
x_5 = &x_1[x_2]; | |
x_6 = len(x_5); | |
x_7 = LR____all_0_to_x_3_in_x_1____l_Nat_allTR_loop___at_check___spec__3(x_5, x_6, x_6); | |
if (x_7 == 0) | |
{ | |
return 1; | |
} | |
else | |
{ | |
x_2++; | |
goto _start; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t l_check(lean_object *x_1) | |
{ | |
_start: | |
{ | |
lean_object *x_2; | |
lean_object *x_3; | |
uint8_t x_4; | |
uint8_t x_5; | |
lean_object *x_6; | |
uint8_t x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
uint8_t x_11; | |
uint8_t x_12; | |
uint8_t x_16; | |
x_2 = lean_array_get_size(x_1); // 9 | |
x_3 = lean_unsigned_to_nat(0u); // 0 | |
x_4 = lean_nat_dec_lt(x_3, x_2); // true | |
x_5 = LR____horizontal_all_0_to_len_i_in_a_for_a_in_x_1____l_Nat_allTR_loop___at_check___spec__6(x_1, x_2, x_2, x_2); // sat requires x_5==true | |
x_6 = l_size; | |
x_7 = l_Nat_allTR_loop___at_check___spec__9(x_1, x_6, x_6); // sat requires x_7==true | |
x_8 = l_target; | |
x_9 = l_Array_zip___rarg(x_1, x_8); | |
x_10 = lean_array_get_size(x_9); | |
x_11 = lean_nat_dec_lt(x_3, x_10); // true | |
if (x_4 == 0) // should never | |
{ | |
// if (x_11 == 0) | |
// { | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
// } | |
// else | |
// { | |
// x_16 = 1; | |
// goto block_34; | |
// } | |
} | |
else | |
{ | |
size_t x_38; | |
uint8_t x_39; | |
x_38 = lean_usize_of_nat(x_2); | |
x_39 = LR____not_that_all_0_to_len_i_in_a_for_a_in_x_1____l_Array_anyMUnsafe_any___at_check___spec__12(x_1, 0, x_38); | |
if (x_39 == 0) // should always | |
{ | |
if (x_11 == 0) // should never | |
{ | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
} | |
else | |
{ | |
x_16 = 1; | |
goto block_34; | |
} | |
} | |
else | |
{ | |
// if (x_11 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_16 = 0; | |
// goto block_34; | |
// } | |
} | |
} | |
block_15_must_return_here: | |
{ | |
if (x_5 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
if (x_7 == 0) | |
{ | |
return 0; | |
} | |
else | |
{ | |
return x_12; | |
} | |
} | |
} | |
block_34: | |
{ | |
uint8_t x_17; | |
x_17 = lean_nat_dec_le(x_10, x_10); // true | |
if (x_17 == 0) | |
{ | |
// if (x_11 == 0) | |
// { | |
// if (x_16 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
// } | |
// } | |
// else | |
// { | |
// size_t x_21; | |
// uint8_t x_22; | |
// x_21 = lean_usize_of_nat(x_10); | |
// x_22 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_21); | |
// if (x_22 == 0) | |
// { | |
// if (x_16 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_12 = 1; | |
// goto block_15_must_return_here; | |
// } | |
// } | |
// else | |
// { | |
// return 0; | |
// // if (x_16 == 0) | |
// // { | |
// // return 0; | |
// // } | |
// // else | |
// // { | |
// // x_12 = 0; | |
// // goto block_15_must_return_here; | |
// // } | |
// } | |
// } | |
} | |
else // should always | |
{ | |
size_t x_28; | |
uint8_t x_29; | |
x_28 = lean_usize_of_nat(x_10); | |
x_29 = l_Array_anyMUnsafe_any___at_check___spec__11(x_9, 0, x_28); // sat requires x_29==false | |
if (x_29 == 0) | |
{ | |
if (x_16 == 0) // should never | |
{ | |
// return 0; | |
} | |
else | |
{ | |
x_12 = 1; | |
goto block_15_must_return_here; | |
} | |
} | |
else | |
{ | |
return 0; | |
// if (x_16 == 0) | |
// { | |
// return 0; | |
// } | |
// else | |
// { | |
// x_12 = 0; | |
// goto block_15_must_return_here; | |
// } | |
} | |
} | |
} | |
} | |
} | |
LEAN_EXPORT lean_object *l_List_mapTR_loop___at_fromString___spec__1(lean_object *x_1, lean_object *x_2) | |
{ | |
_start: | |
{ | |
if (lean_obj_tag(x_1) == 0) | |
{ | |
lean_object *x_3; | |
x_3 = l_List_reverse___rarg(x_2); | |
return x_3; | |
} | |
else | |
{ | |
uint8_t x_4; | |
x_4 = !lean_is_exclusive(x_1); | |
if (x_4 == 0) | |
{ | |
lean_object *x_5; | |
lean_object *x_6; | |
uint32_t x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
x_5 = lean_ctor_get(x_1, 0); | |
x_6 = lean_ctor_get(x_1, 1); | |
x_7 = lean_unbox_uint32(x_5); | |
lean_dec(x_5); | |
x_8 = lean_uint32_to_nat(x_7); | |
x_9 = lean_unsigned_to_nat(48u); | |
x_10 = lean_nat_sub(x_8, x_9); | |
lean_dec(x_8); | |
lean_ctor_set(x_1, 1, x_2); | |
lean_ctor_set(x_1, 0, x_10); | |
{ | |
lean_object *_tmp_0 = x_6; | |
lean_object *_tmp_1 = x_1; | |
x_1 = _tmp_0; | |
x_2 = _tmp_1; | |
} | |
goto _start; | |
} | |
else | |
{ | |
lean_object *x_12; | |
lean_object *x_13; | |
uint32_t x_14; | |
lean_object *x_15; | |
lean_object *x_16; | |
lean_object *x_17; | |
lean_object *x_18; | |
x_12 = lean_ctor_get(x_1, 0); | |
x_13 = lean_ctor_get(x_1, 1); | |
lean_inc(x_13); | |
lean_inc(x_12); | |
lean_dec(x_1); | |
x_14 = lean_unbox_uint32(x_12); | |
lean_dec(x_12); | |
x_15 = lean_uint32_to_nat(x_14); | |
x_16 = lean_unsigned_to_nat(48u); | |
x_17 = lean_nat_sub(x_15, x_16); | |
lean_dec(x_15); | |
x_18 = lean_alloc_ctor(1, 2, 0); | |
lean_ctor_set(x_18, 0, x_17); | |
lean_ctor_set(x_18, 1, x_2); | |
x_1 = x_13; | |
x_2 = x_18; | |
goto _start; | |
} | |
} | |
} | |
} | |
LEAN_EXPORT lean_object *l_Array_mapMUnsafe_map___at_fromString___spec__2(lean_object *x_1, size_t x_2, size_t x_3, lean_object *x_4) | |
{ | |
_start: | |
{ | |
uint8_t x_5; | |
x_5 = lean_usize_dec_lt(x_3, x_2); | |
if (x_5 == 0) | |
{ | |
return x_4; | |
} | |
else | |
{ | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
lean_object *x_10; | |
lean_object *x_11; | |
lean_object *x_12; | |
size_t x_13; | |
size_t x_14; | |
lean_object *x_15; | |
x_6 = lean_array_uget(x_4, x_3); | |
x_7 = lean_unsigned_to_nat(0u); | |
x_8 = lean_array_uset(x_4, x_3, x_7); | |
x_9 = l_size; | |
x_10 = lean_nat_mul(x_6, x_9); | |
lean_dec(x_6); | |
x_11 = lean_nat_add(x_10, x_9); | |
x_12 = l_Array_extract___rarg(x_1, x_10, x_11); | |
lean_dec(x_11); | |
x_13 = 1; | |
x_14 = lean_usize_add(x_3, x_13); | |
x_15 = lean_array_uset(x_8, x_3, x_12); | |
x_3 = x_14; | |
x_4 = x_15; | |
goto _start; | |
} | |
} | |
} | |
LEAN_EXPORT uint8_t l_Array_anyMUnsafe_any___at_fromString___spec__3(lean_object *x_1, size_t x_2, size_t x_3) | |
{ | |
_start: | |
{ | |
uint8_t x_4; | |
x_4 = lean_usize_dec_eq(x_2, x_3); | |
if (x_4 == 0) | |
{ | |
lean_object *x_5; | |
lean_object *x_6; | |
uint8_t x_7; | |
x_5 = lean_array_uget(x_1, x_2); | |
x_6 = l_size; | |
x_7 = lean_nat_dec_lt(x_5, x_6); | |
lean_dec(x_5); | |
if (x_7 == 0) | |
{ | |
return 1; | |
} | |
else | |
{ | |
x_2 ++; | |
goto _start; | |
} | |
} | |
else | |
{ | |
return 0; | |
} | |
} | |
} | |
LEAN_EXPORT lean_object *l_fromString___lambda__1(lean_object *x_1, lean_object *x_2) | |
{ | |
_start: | |
{ | |
size_t x_4; | |
lean_object *x_5; | |
lean_object *x_6; | |
lean_object *x_7; | |
x_4 = l_Nat_allTR_loop___at_check___spec__9___closed__3; | |
x_5 = l_Nat_allTR_loop___at_check___spec__9___closed__1; | |
x_6 = l_Array_mapMUnsafe_map___at_fromString___spec__2(x_1, x_4, 0, x_5); | |
x_7 = lean_alloc_ctor(1, 1, 0); | |
lean_ctor_set(x_7, 0, x_6); | |
return x_7; | |
} | |
} | |
LEAN_EXPORT lean_object *l_fromString___lambda__2(lean_object *x_1, lean_object *x_2) | |
{ | |
_start: | |
{ | |
lean_object *x_3; | |
lean_object *x_4; | |
uint8_t x_5; | |
lean_dec(x_2); | |
x_3 = lean_array_get_size(x_1); | |
x_4 = l_fromString___lambda__2___closed__1; | |
x_5 = lean_nat_dec_eq(x_3, x_4); | |
lean_dec(x_3); | |
if (x_5 == 0) | |
{ | |
lean_object *x_6; | |
x_6 = lean_box(0); | |
return x_6; | |
} | |
else | |
{ | |
lean_object *x_7; | |
lean_object *x_8; | |
x_7 = lean_box(0); | |
x_8 = l_fromString___lambda__1(x_1, x_7); | |
return x_8; | |
} | |
} | |
} | |
LEAN_EXPORT lean_object *l_fromString(lean_object *x_1) | |
{ | |
_start: | |
{ | |
lean_object *x_2; | |
lean_object *x_3; | |
lean_object *x_4; | |
lean_object *x_5; | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
uint8_t x_10; | |
x_2 = lean_string_data(x_1); | |
x_3 = lean_box(0); | |
x_4 = l_List_mapTR_loop___at_fromString___spec__1(x_2, x_3); | |
x_5 = l_List_redLength___rarg(x_4); | |
x_6 = lean_mk_empty_array_with_capacity(x_5); | |
lean_dec(x_5); | |
x_7 = l_List_toArrayAux___rarg(x_4, x_6); | |
x_8 = lean_array_get_size(x_7); | |
x_9 = lean_unsigned_to_nat(0u); | |
x_10 = lean_nat_dec_lt(x_9, x_8); | |
if (x_10 == 0) | |
{ | |
lean_object *x_11; | |
lean_object *x_12; | |
lean_dec(x_8); | |
x_11 = lean_box(0); | |
x_12 = l_fromString___lambda__2(x_7, x_11); | |
lean_dec(x_7); | |
return x_12; | |
} | |
else | |
{ | |
size_t x_13; | |
size_t x_14; | |
uint8_t x_15; | |
x_13 = 0; | |
x_14 = lean_usize_of_nat(x_8); | |
lean_dec(x_8); | |
x_15 = l_Array_anyMUnsafe_any___at_fromString___spec__3(x_7, x_13, x_14); | |
if (x_15 == 0) | |
{ | |
lean_object *x_16; | |
lean_object *x_17; | |
x_16 = lean_box(0); | |
x_17 = l_fromString___lambda__2(x_7, x_16); | |
lean_dec(x_7); | |
return x_17; | |
} | |
else | |
{ | |
lean_object *x_18; | |
lean_dec(x_7); | |
x_18 = lean_box(0); | |
return x_18; | |
} | |
} | |
} | |
} | |
LEAN_EXPORT lean_object *_lean_main(lean_object *x_1) | |
{ | |
_start: | |
{ | |
println("Input: "); | |
lean_object *x_4; | |
lean_object *x_5; | |
lean_object *x_6; | |
lean_object *x_7; | |
lean_object *x_8; | |
lean_object *x_9; | |
x_4 = lean_ctor_get(x_3, 1); | |
lean_inc(x_4); | |
lean_dec(x_3); | |
x_5 = lean_get_stdin(x_4); | |
x_6 = lean_ctor_get(x_5, 0); | |
lean_inc(x_6); | |
x_7 = lean_ctor_get(x_5, 1); | |
lean_inc(x_7); | |
lean_dec(x_5); | |
x_8 = lean_ctor_get(x_6, 3); | |
lean_inc(x_8); | |
lean_dec(x_6); | |
x_9 = lean_apply_1(x_8, x_7); | |
if (lean_obj_tag(x_9) == 0) | |
{ | |
lean_object *x_10; | |
lean_object *x_11; | |
lean_object *x_12; | |
lean_object *x_13; | |
x_10 = lean_ctor_get(x_9, 0); | |
lean_inc(x_10); | |
x_11 = lean_ctor_get(x_9, 1); | |
lean_inc(x_11); | |
lean_dec(x_9); | |
x_12 = l_String_trimRight(x_10); | |
lean_dec(x_10); | |
x_13 = l_fromString(x_12); | |
if (lean_obj_tag(x_13) == 0) | |
{ | |
return println("No"); | |
} | |
else | |
{ | |
lean_object *x_16; | |
uint8_t x_17; | |
x_16 = lean_ctor_get(x_13, 0); | |
lean_inc(x_16); | |
lean_dec(x_13); | |
x_17 = l_check(x_16); | |
if (x_17 == 0) | |
{ | |
return println("No"); | |
} | |
else | |
{ | |
return println("Yes"); | |
} | |
} | |
} | |
else | |
{ | |
uint8_t x_22; | |
x_22 = !lean_is_exclusive(x_9); | |
if (x_22 == 0) | |
{ | |
return x_9; | |
} | |
else | |
{ | |
lean_object *x_23; | |
lean_object *x_24; | |
lean_object *x_25; | |
x_23 = lean_ctor_get(x_9, 0); | |
x_24 = lean_ctor_get(x_9, 1); | |
lean_inc(x_24); | |
lean_inc(x_23); | |
lean_dec(x_9); | |
x_25 = lean_alloc_ctor(1, 2, 0); | |
lean_ctor_set(x_25, 0, x_23); | |
lean_ctor_set(x_25, 1, x_24); | |
return x_25; | |
} | |
} | |
} | |
} | |
lean_object *initialize_Init(uint8_t builtin, lean_object *); | |
lean_object *initialize_Init_Data_List(uint8_t builtin, lean_object *); | |
static bool _G_initialized = false; | |
LEAN_EXPORT lean_object *initialize_Main(uint8_t builtin, lean_object *w) | |
{ | |
lean_object *res; | |
if (_G_initialized) | |
return lean_io_result_mk_ok(lean_box(0)); | |
_G_initialized = true; | |
res = initialize_Init(builtin, lean_io_mk_world()); | |
if (lean_io_result_is_error(res)) | |
return res; | |
lean_dec_ref(res); | |
res = initialize_Init_Data_List(builtin, lean_io_mk_world()); | |
if (lean_io_result_is_error(res)) | |
return res; | |
lean_dec_ref(res); | |
l_boxSize = lean_object(3); | |
l_size = lean_object(9); | |
l_target___closed__1 = _init_l_target___closed__1(); | |
lean_mark_persistent(l_target___closed__1); | |
l_target___closed__2 = _init_l_target___closed__2(); | |
lean_mark_persistent(l_target___closed__2); | |
l_target___closed__3 = _init_l_target___closed__3(); | |
lean_mark_persistent(l_target___closed__3); | |
// ... | |
// the way to init l_target, a 9*9 matrix | |
l_target___closed__78 = _init_l_target___closed__78(); | |
lean_mark_persistent(l_target___closed__78); | |
l_target___closed__79 = _init_l_target___closed__79(); | |
lean_mark_persistent(l_target___closed__79); | |
l_target = l_target___closed__79; | |
l_Array_mapMUnsafe_map___at_check___spec__7___closed__1 = lean_mk_empty_array_with_capacity(0); | |
l_Nat_allTR_loop___at_check___spec__9___closed__1 = l_Array_range(l_size); | |
l_Nat_allTR_loop___at_check___spec__9___closed__3 = lean_usize_of_nat(lean_array_get_size(l_Nat_allTR_loop___at_check___spec__9___closed__1)); | |
l_fromString___lambda__2___closed__1 = lean_nat_mul(l_size, l_size); | |
; | |
return lean_io_result_mk_ok(lean_box(0)); | |
} |
# 约束求解
import z3 | |
s = z3.Solver() | |
mat = [[z3.Int("x_%d_%d" % (i, j)) for j in range(9)] for i in range(9)] | |
for i in range(9): | |
for j in range(9): | |
s.add(0 <= mat[i][j], mat[i][j] <= 8) | |
s.add(z3.Distinct(mat[i])) | |
s.add(z3.Distinct([mat[j][i] for j in range(9)])) | |
s.add(z3.Distinct([mat[(i+j)%9][j] for j in range(9)])) | |
target = [ | |
[ 6, -1, 1, -1, -1, -1, -1, -1, -1], | |
[-1, -1, -1, -1, -1, -1, -1, -1, -1], | |
[-1, -1, -1, -1, 5, -1, -1, -1, -1], | |
[ 4, -1, 5, -1, 2, -1, -1, -1, -1], | |
[-1, -1, -1, -1, -1, -1, 0, 2, -1], | |
[-1, -1, -1, -1, -1, -1, 7, -1, 5], | |
[-1, 3, -1, -1, -1, -1, 4, -1, -1], | |
[-1, -1, 7, 4, -1, 1, -1, -1, -1], | |
[-1, 4, -1, -1, -1, -1, -1, -1, -1], | |
] | |
for i in range(9): | |
for j in range(9): | |
if target[i][j] != -1: | |
s.add(mat[i][j] == target[i][j]) | |
if s.check() == z3.sat: | |
m = s.model() | |
for i in range(9): | |
for j in range(9): | |
print(m[mat[i][j]], end='') | |
# 651708243714865302320654871485327160576183024168042735832570416207431658043216587 |
# 关于组这个队的碎碎念
队内参与人数是 25 左右,比预期略少;第 11 名,符合预期。队内共解出 11 题(含签到),其中个位数解的有墨水✌和我各 1 题 re。
当时决定组这个队,绝对不是退役前想瞎搅一下(划掉)。之前有想过建长期联队,但是有明确的原因让我抛弃了那个想法,现在建一次性队也算是达成了心愿。
虽然起初不是我发起的,但是实际建队当天(5 月 7 日)我在 XYCTF 群发了想组大队的想法,大部分队员是我私聊邀请的,后来还 “谋权篡位” 成了队长(误)。
如果只是把 CTF 看作竞技比赛,那么联合战队可以算是最好的解决方案。我是希望趁着 R3CTF 这种质量应该会好、人数不限的大比赛(知名战队的比赛通常好于官方的比赛),让还没有加入联队的、能力得到我认可的师傅们(收到我私聊邀请的师傅都是我认可的),特别是所在学校的 “独狼”,有机会体验联合作战,使用 Notion 之类的协作工具,在比赛过程中与能力相当的师傅交流共同解题(只要在同一个队里,就可以随便交流,不用偷偷 py)。过程是主要的,结果是次要的。
邀请五湖四海的 CTFer 来组一次性队是一次实验性的尝试。实话说,拉人的时候我心里没底,不知道会是什么结果。特别是一半以上的师傅不能来(出题的,准备期末的,打 CISCN 的,在其他联队的),我差点以为这个队组不起来了。我是有点怕如果这么多人的队都排名不前,会打击队员的自信心。还好,结果还行。
我拉人的时候想的是,最好让每个人都能有参与感,不要有 “能带飞的人” 和 “被带飞的人”。所以我拉人的策略是:不够强的不要(别把新人劝退了),过于强的不要(我的目的不是结果,把 flag 交到合适的队),乐子人不要,已有队伍的不要(虽然刚开始没想到这一点)。但是拉一群华南小师傅进来是个例外,在我知道他们要组队之后,与其让他们自己组队坐大牢,不如合到一起没那么坐牢。
不知不觉写了这么长🤔,和师傅们合作挺愉快的,师傅们太强了🤗