mirror of
https://github.com/ProvableHQ/leo.git
synced 2024-12-29 13:14:05 +03:00
131 lines
3.6 KiB
Plaintext
131 lines
3.6 KiB
Plaintext
/*
|
|
namespace: Compile
|
|
expectation: Pass
|
|
*/
|
|
|
|
circuit Row {
|
|
e1: u8,
|
|
e2: u8,
|
|
e3: u8
|
|
}
|
|
|
|
circuit Board {
|
|
r1: Row,
|
|
r2: Row,
|
|
r3: Row,
|
|
}
|
|
|
|
function win(b: Board, p: u8) -> bool {
|
|
return
|
|
(b.r1.e1 == p && b.r1.e2 == p && b.r1.e3 == p) || // row 1
|
|
(b.r2.e1 == p && b.r2.e2 == p && b.r2.e3 == p) || // row 2
|
|
(b.r3.e1 == p && b.r3.e3 == p && b.r3.e3 == p) || // row 3
|
|
(b.r1.e1 == p && b.r2.e1 == p && b.r3.e1 == p) || // column 1
|
|
(b.r1.e2 == p && b.r2.e3 == p && b.r3.e2 == p) || // column 2
|
|
(b.r1.e3 == p && b.r2.e3 == p && b.r3.e3 == p) || // column 3
|
|
(b.r1.e1 == p && b.r2.e2 == p && b.r3.e3 == p) || // diagonal
|
|
(b.r1.e3 == p && b.r2.e2 == p && b.r3.e1 == p); // other diagonal
|
|
}
|
|
|
|
@program
|
|
function main(public player: u8, row: u8, col: u8, board: Board) -> (Board, u8) {
|
|
let updated: Board = board;
|
|
if row == 1u8 && col == 1u8 && updated.r1.e1 == 0u8 {
|
|
updated = Board {
|
|
r1: Row {
|
|
e1: player,
|
|
e2: updated.r1.e2,
|
|
e3: updated.r1.e3
|
|
},
|
|
r2: updated.r2,
|
|
r3: updated.r3
|
|
};
|
|
} else if row == 1u8 && col == 2u8 && updated.r1.e2 == 0u8 {
|
|
updated = Board {
|
|
r1: Row {
|
|
e1: updated.r1.e1,
|
|
e2: player,
|
|
e3: updated.r1.e3
|
|
},
|
|
r2: updated.r2,
|
|
r3: updated.r3
|
|
};
|
|
} else if row == 1u8 && col == 3u8 && updated.r1.e3 == 0u8 {
|
|
updated = Board {
|
|
r1: Row {
|
|
e1: updated.r1.e1,
|
|
e2: updated.r1.e2,
|
|
e3: player
|
|
},
|
|
r2: updated.r2,
|
|
r3: updated.r3
|
|
};
|
|
} else if row == 2u8 && col == 1u8 && updated.r2.e1 == 0u8 {
|
|
updated = Board {
|
|
r1: updated.r1,
|
|
r2: Row {
|
|
e1: player,
|
|
e2: updated.r2.e2,
|
|
e3: updated.r2.e3
|
|
},
|
|
r3: updated.r3
|
|
};
|
|
} else if row == 2u8 && col == 2u8 && updated.r2.e2 == 0u8 {
|
|
updated = Board {
|
|
r1: updated.r1,
|
|
r2: Row {
|
|
e1: updated.r2.e1,
|
|
e2: player,
|
|
e3: updated.r2.e3
|
|
},
|
|
r3: updated.r3
|
|
};
|
|
} else if row == 2u8 && col == 3u8 && updated.r2.e3 == 0u8 {
|
|
updated = Board {
|
|
r1: updated.r1,
|
|
r2: Row {
|
|
e1: updated.r2.e1,
|
|
e2: updated.r2.e2,
|
|
e3: player
|
|
},
|
|
r3: updated.r3
|
|
};
|
|
} else if row == 3u8 && col == 1u8 && updated.r3.e1 == 0u8 {
|
|
updated = Board {
|
|
r1: updated.r1,
|
|
r2: updated.r2,
|
|
r3: Row {
|
|
e1: player,
|
|
e2: updated.r3.e2,
|
|
e3: updated.r3.e3
|
|
}
|
|
};
|
|
} else if row == 3u8 && col == 2u8 && updated.r3.e2 == 0u8 {
|
|
updated = Board {
|
|
r1: updated.r1,
|
|
r2: updated.r2,
|
|
r3: Row {
|
|
e1: updated.r3.e1,
|
|
e2: player,
|
|
e3: updated.r3.e3
|
|
}
|
|
};
|
|
} else if row == 3u8 && col == 3u8 && updated.r3.e3 == 0u8 {
|
|
updated = Board {
|
|
r1: updated.r1,
|
|
r2: updated.r2,
|
|
r3: Row {
|
|
e1: updated.r3.e1,
|
|
e2: updated.r3.e2,
|
|
e3: player
|
|
}
|
|
};
|
|
}
|
|
if win(updated, 1u8) {
|
|
return (updated, 1u8);
|
|
} else if win(updated, 2u8) {
|
|
return (updated, 2u8);
|
|
} else {
|
|
return (updated, 0u8);
|
|
}
|
|
} |