From 55571a38e5443f774d0d276de116034615515635 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 5 Apr 2025 21:56:43 +0200 Subject: Fixed bld algs --- src/speedcubing/bldsheets/corners.csv | 42 +++++++++++++++++----------------- src/speedcubing/bldsheets/edges.csv | 28 +++++++++++------------ src/speedcubing/bldsheets/tcenters.csv | 30 ++++++++++++------------ src/speedcubing/bldsheets/wings.csv | 28 +++++++++++------------ src/speedcubing/bldsheets/xcenters.csv | 40 ++++++++++++++++---------------- 5 files changed, 84 insertions(+), 84 deletions(-) (limited to 'src') diff --git a/src/speedcubing/bldsheets/corners.csv b/src/speedcubing/bldsheets/corners.csv index 58ff0f8..3113f3c 100644 --- a/src/speedcubing/bldsheets/corners.csv +++ b/src/speedcubing/bldsheets/corners.csv @@ -1,22 +1,22 @@ "","UBR","UBL","UFL","DFR","DFL","DBL","DBR","RUB","RDF","RDB","LUF","LUB","LDB","LDF","FUL","FDL","FDR","BUL","BUR","BDR","BDL", -"UBR","","[R' B' R: U', R D R']","[R F R': R' D' R, U]","[R' D R U' R D' R', U]","[R F': R' U' R, D]","[R' B: D', R U R']","[U', R D' R' U R' D R]","","[R' D' R, U]","[U', R D R']","[R': R' D' R, U']","[R: U, R D R']","[U', R D' R']","[R' D R, U]","[R: U2, R D R']","[D R' D' R, U]","[D' R' D R, U]","[R': R' D' R, U2]","","[U', D R D' R']","[U': D' R D R']", -"UBL","[R' B' R: R D R', U']","","[R' D' R U': U', R' D R]","[U R' D R: U2, R D' R']","[R F' R' U': R D R', U2]","[R' D' R: R U2 R', D]","[R D' R': R' D R, U2]","[U R D' U: R' D' R, U2]","[R' D' R, U2]","[U': R D R', U2]","[F: U2, R' D' R]","","[U': R D' R', U2]","[R' D R, U2]","[R' F R D': R D' R', U] go back to this","[D R' D' R, U2]","[D' R' D R, U2]","","[R': U2, D' R' D R]","[D': R' D' R, U2] but maybe switch","[D: R' D R, U2] but maybe switch to (see second row)", -"UFL","[R F R': U, R' D' R]","[R' D' R U': R' D R, U']","","[R' D R U' R D' R', U']","[U': U R' U' R, F2] sledge","[R' D' R: R U' R', D]","[R D' R': R' D R, U']","[U' R': U2, R' D' R]","[R' D' R, U']","[U': R D R', U']","","[U' R: R D R', U2]","[U': R D' R', U']","[R' D R, U']","","[D: R' D' R, U']","[D' R' D R, U']","[U' R': U', R' D' R]","[R': U', D' R' D R]","[D': R' D' R, U']","[D: R' D R, U']", -"DFR","[U, R' D R U' R D' R']","[U R' D R: R D' R', U2]","[U': R' D R U' R D' R']","","[U' R' U R: R U' R', D]","[R U' R' U: R D' R', U2]","[R U' R' D R' U R, D']","[U' D' R': U2, R' D R]","","[D' R: F2, R' U R U'] sledge","[R U' R': U2, R' D' R]","[U2 R': R' U R, D] or U R' D'...","[U2 R': R' U R, D']","[U D R: D' R' D R, U']","[R U' R': U2, D' R' D R]","[R U' R': U2, R' D R]","","[U' D' R': U', R' D R]","[U R': D', U' R U R']","[D' R: D R' D' R, U]","[U' D' R': U, R' D R]", -"DFL","[R F': D, R' U' R]","[R F' R' U: R D R', U2]","[U': F2, U R' U' R] sledge","[U' R' U R: D, R' U' R]","","[D' R U' R': D', R' U R]","[R U' R': D2, R' U R] or nightmare? (see below)","[U' R': U2, R' D R]","[R: D R' D' R, U]","[U' R': U, R' D R]","[U' R': D, U R U' R']","[D' R: U, R D' R']","[D R U' R': U2, R' D R]","","[R U' D: R' D' R, U2]","","[R: F2, R' U R U'] sledge","[U' R': U', R' D R]","[U D R' U': D', R U R'] or D' R D'...","[D' R: U', R D' R']","[U' D' R': U, R' D2 R]", -"DBL","[R' B: R U R', D']","[R' D' R: D, R U2 R']","[R' D' R: D, R U' R']","[R U' R' U': R D' R', U2]","[D' R U' R': R' U R, D']","","[R U' R': D', R' U R]","[U' D R': U2, R' D2 R]","[R: U', R D' R']","[U' R': U, R' D2 R]","[F R: R D' R', U']","[R: U, R D' R']","","[D R: F2, R' U R U'] sledge","[R: U2, R D' R']","[D R: D R' D' R, U]","[R' D' R: D, R U R'] new!","[U' D R': U', R' D R]","[R: D', U' R' U R]","[R D': U' R' U R, D2]","", -"DBR","[R D' R' U R' D R, U']","[R D' R': U2, R' D R]","[R D' R': U', R' D R]","[D': R U' R' D R' U R]","[R U' R': R' U R, D2] or nightmare? see NM","[R U' R': R' U R, D']","","[R': U, R' D R U' R D' R']","[R: R' D R U' R D' R', U]","","[R U' R': R' U R, D]","[D R: U, R D' R']","[R D' R': U, R' D R]","[U R: R U' R', D]","[D R: U2, R D' R']","[D R: U', R D' R']","[U R: D' R' D R, U']","[U R: R U' R', D']","[D R: U' R' U R, D']","","[U R: R U' R', D2]", -"RUB","","[U R U' D': R' D' R, U2]","[U' R': R' D' R, U2]","[U' D' R': R' D R, U2]","[U' R': R' D R, U2]","[U' D R': R' D R, U2]","[R': R' D R U' R D' R', U]","","[R: U', R D' R' U R' D R]","[U' D R' U': R D' R', U2] new!","[R U' D' R': R' U R, D] new!","[R: U, R D' R' U R' D R]","[U R: U2, R D' R']","[U R U': R' D R, U2]","[R': U', R' D R U' R D' R']","[U D' R: U2, R D' R']","[U' R' U': R D R', U2]","[U R: U2, R D R']","","[U D R: U2, R D' R']","[U' R' U': R D' R', U2]", -"RDF","[U, R' D' R]","[U2, R D' R]","[U', R' D' R]","","[R: U, D R' D' R]","[R: R D' R', U']","[R: U, R' D R U' R D' R']","[R: R D' R' U R' D R, U']","","[R: U, D' R' D R]","[R', U' R U R', D']","[U R' U': R D R', U']","[R U R', D2]","[U R' D': R U' R', D2]","[D' R U': R' D R, U2]","[R U R', D]","","[R': D, R' U R]","[R': U R U' R', D']","[R U R', D']","[U R' D': R U' R', D']", -"RDB","[R D R', U']","[U': R D R', U2]","[U': U', R D R']","[D' R: R' U R U', F2] sledge","[U' R': R' D R, U]","[U' R': R' D2 R, U]","","[U' D R' U: R D' R', U2] new!","[R D': R' D R, U]","","[R' U': R' D' R, U2]","[U' R: D', R U' R']","[R D: R' U' R, D2]","[D': U R U' R', D2]","[R U': D' R' D R, U2]","[R D: R' U' R, D]","[D', U R U' R']","[R' U: R' D' R, U]","[U' R: U R' U' R, D]","","[U' R' U' R, D']", -"LUF","[R': U', R' D' R]","[F: R' D' R, U2]","","[R U' R': R' D' R, U2]","[U' R': U R U' R', D]","[F R: U', R D' R']","[R U' R': D, R' U R]","[R U' D' R': D, R' U R] new!","[R': D', U' R U R']","[R': R' D' R, U2]","","[U' R' U, L]","[F: D2, R U R'] or RUD see below","[R': D, U' R U R']","","[D R': D', U' R U R']","[R: F, R' U R U']","[R' U': R' D' R, U']","[R' F: R U R', D]","[F: D', R U R']","[D R': D, U' R U R']", -"LUB","[R: R D R', U]","","[U' R: U2, R D R']","[U2 R': D, R' U R] or U R' D'...","[D' R: R D' R', U]","[R: R D' R', U]","[D R: R D' R', U]","[R: R D' R' U R' D R, U]","[U R' U': U', R D R']","[U' R: R U' R', D']","[L, U' R' U]","","[R: D' R D R', U]","[U R': U', R' D R]","[R' B' R2 U': R' D' R, U2]","[R U: R' D R, U]","[R U R': R' D' R, U']","","[R', F' L F]","[R U: R' D' R, U]","[U D R': U', R' D R]", -"LDB","[R D' R', U']","[U: R D' R', U2]","[U': U', R D' R']","[U2 R': D', R' U R]","[D R U' R': R' D R, U2]","","[R D' R': R' D R, U]","[U R: R D' R', U2]","[D2, R U R']","[R D': R' U' R, D2]","[F: R U R', D2] or RUD see jw","[R: U, D' R D R']","","[D R': R D' R' D, F']","[D R U': R' D R, U2]","[D: D, R U R']","[U R U': R D' R', U']","[U2: R: R D' R', U]","[U' R: U R' U' R, D']","[D': D', R U R']","", -"LDF","[U, R' D R]","[U2, R' D R]","[U', R' D R]","[U D R: U', D' R' D R]","","[D R: R' U R U', F2] sledge","[U R: D, R U' R']","[U R U: R' D R, U2]","[U R' D: R U' R', D2]","[D: U R U' R', D2]","[R': U' R U R', D]","[U R': R' D R, U']","[D R': F', R D' R' D] sledge","","[R' D: D' R D R', F2] sledge","","[D, U R U' R']","[U' R': U', D R' D' R]","[R': U R U' R', D]","[R' D: R' U' R, D]","[D: U R U' R', D]", -"FUL","[R: R D R', U2]","[R' F R D': U, R D' R'] go back to this","","[R U R': D' R' D R, U2]","[R U D: R' D' R, U2]","[R: R D' R', U2]","[D R: R D' R', U2]","[R': R' D R U' R D' R', U']","[D R U: R' D' R, U2]","[R U: D' R' D R, U2]","","[R' B' R2 U: R' D' R, U2]","[D R U: R' D R, U2] or R U D (see below)","[D R': R D' R' D, F2] sledge","","[R U: R' D R, U2]","[R': R D' R' D, F2] sledge","[R U R' D': U2, R' D R]","[R D' U: R' D' R, U2]","[R U: R' D' R, U2]","[D' R U: D' R' D R, U2]", -"FDL","[U, D R' D' R]","[U2, D R' D' R]","[U', D R' D' R]","[R U' R': R' D R, U2]","","[D R: U, D R' D' R]","[D R: U', R D' R']","[U D' R: R D' R', U2]","[D, R U R']","[R D: R' U' R, D]","[D R': U R U' R', D']","[R U: U, R' D R]","[D: R U R', D]","","[R U': R' D R, U2]","","[R': R D' R' D, F']","[D R': D, R' U R]","[R' F: R U' R', D] different from Elliot","[D: R U R', D2]","[R' F': R U R', D2] or D' R D'...", -"FDR","[U, D' R' D R]","[U2, D' R' D R]","[U', D' R' D R]","","[R: R' U R U', F2] sledge","[R' D' R: R U R', D] new!","[U R D': U', R' D R]","[U' R' U: R D R', U2]","","[U R U' R', D']","[R: R' U R U', F] sledge","[R U R': U', R' D' R]","[U R U': U', R D' R']","[U R U' R', D]","[R': F2, R D' R' D] sledge","[R': F', R D' R' D] sledge","","[U' R' U': R' D R', U]","[D' R': U R U' R', D]","[R U R' U': D', R U R'] or D R D...","[U R U' R', D2]", -"BUL","[R': U2, R' D' R]","","[U' R': R' D' R, U']","[U R' U': R U R', D']","[U' R': U', R' D R]","[U' D R': R' D R, U']","[U R: D', R U' R']","[U R: R D R', U2]","[R': R' U R, D]","[R' U: U, R' D' R]","[R' U': U', R' D' R]","","[U2 R: U, R D' R']","[U' R': D R' D' R, U']","[R U R' D': R' D R, U2]","[D R': R' U R, D]","[U' R' U': R D R', U']","","[U' L' U, R]","[D' R': R' U R, D]","[U' R' U': R D' R', U']", -"BUR","","[R': D' R' D R, U2]","[R': D' R' D R, U']","[U R': U' R U R', D']","[U D R' U': R U R', D'] or D' R U'...","[R: U' R' U R, D']","[D R: U' R' U R, D']","","[R': D', U R U' R']","[U' R: D, U R' U' R]","[R' F: D, R U R']","[F' L F, R']","[U' R: D', U R' U' R]","[R': D, U R U' R']","[R D' U': R' D' R, U2]","[R' F: D, R U' R'] different from Elliot","[D' R': D, U R U' R']","[R, U' L' U]","","[R': D' R' D R, U]","[D R': D, U R U' R']", -"BDR","[D R D' R', U']","[D': R' D' R, U2] but maybe switch to D U'...","[D': U', R' D' R]","[D' R: U, D R' D' R]","[D' R: R D' R', U']","[R D: U' R' U R, D2]","","[U D R: R D' R', U2]","[D', R U R']","","[F: R U R', D']","[R U: U, R' D' R]","[D': R U R', D']","[R' D: D, R' U' R]","[R U': R' D' R, U2]","[D': R U R', D2]","[R U R' U': R U R', D'] or D R D'...","[D' R': D, R' U R]","[R': U, D' R' D R]","","[R' D': R' U' R, D2] or D' R...", -"BDL","[D' R D R', U']","[D: U2, R' D R] but maybe switch to D' U'","[D: U', R' D R]","[U' D' R': R' D R, U]","[U' D' R': R' D2 R, U]","","[U R: D2, R U' R']","[U' R' U: R D' R', U2]","[U R' D': D', R U' R']","[U' R' U' R, D']","[D R': U R U R', D]","[U D R': R' D R, U']","","[D: D, U R U' R']","[D' R U': D' R' D R, U2]","[R' F': D2, R U R'] or D' R D...","[D2, U R U' R']","[U' R' U': U', R D' R']","[D R': U R U' R', D]","[R' D: R' U' R, D2] or D' R...","", +"UBR","","[R' B' R: U', R D R']","[R F R': R' D' R, U]","[R' D R U' R D' R', U]","[R F': R' U' R, D]","[R' B: D', R U R']","[U', R D' R' U R' D R]","","[R' D' R, U]","[U', R D R']","[R': R' D' R, U']","[R: U, R D R']","[U', R D' R']","[R' D R, U]","[R: U2, R D R']","[D R' D' R, U]","[D' R' D R, U]","[R': R' D' R, U2]","","[U', D R D' R']","[U', D' R D R']", +"UBL","[R' B' R: R D R', U']","","[R' D' R U': U', R' D R]","[U R' D R: U2, R D' R']","[R F' R' U': R D R', U2]","[R' D' R: R U2 R', D]","[R D' R': R' D R, U2]","[U R D' U: R' D' R, U2]","[R' D' R, U2]","[U': R D R', U2]","[F: U2, R' D' R]","","[U': R D' R', U2]","[R' D R, U2]","[R' F R D': U, R D' R']","[D R' D' R, U2]","[D' R' D R, U2]","","[R': U2, D' R' D R]","[D U': R D' R', U2]","[D' U': R D R', U2]", +"UFL","[R F R': U, R' D' R]","[R' D' R U': R' D R, U']","","[R' D R U' R D' R', U']","[U': U R' U' R, F2]","[R' D' R: R U' R', D]","[R D' R': R' D R, U']","[U' R': U2, R' D' R]","[R' D' R, U']","[U': R D R', U']","","[U' R: R D R', U2]","[U': R D' R', U']","[R' D R, U']","","[D: R' D' R, U']","[D' R' D R, U']","[U' R': U', R' D' R]","[R': U', D' R' D R]","[D': R' D' R, U']","[D: R' D R, U']", +"DFR","[U, R' D R U' R D' R']","[U R' D R: R D' R', U2]","[U', R' D R U' R D' R']","","[U' R' U R: R U' R', D]","[R U' R' U: R D' R', U2]","[R U' R' D R' U R, D']","[U' D' R': U2, R' D R]","","[D' R: F2, R' U R U']","[R U' R': U2, R' D' R]","[U2 R': R' U R, D]","[U2 R': R' U R, D']","[U D R: D' R' D R, U']","[R U' R': U2, D' R' D R]","[R U' R': U2, R' D R]","","[U D R: R U' R', D']","[U R': D', U' R U R']","[D' R: D R' D' R, U]","[U' D' R': U, R' D R]", +"DFL","[R F': D, R' U' R]","[R F' R' U: R D R', U2]","[U': F2, U R' U' R]","[U' R' U R: D, R U' R']","","[D' R U' R': D', R' U R]","[R U' R': D2, R' U R]","[U' R': U2, R' D R]","[R: D R' D' R, U]","[U' R': U, R' D R]","[U' R': D, U R U' R']","[D' R: U, R D' R']","[D R U' R': U2, R' D R]","","[R U' D: R' D' R, U2]","","[R: F2, R' U R U']","[U' R': U', R' D R]","[U D R' U': D', R U R']","[D' R: U', R D' R']","[U' D' R': U, R' D2 R]", +"DBL","[R' B: R U R', D']","[R' D' R: D, R U2 R']","[R' D' R: D, R U' R']","[R U' R' U': R D' R', U2]","[D' R U' R': R' U R, D']","","[R U' R': D', R' U R]","[U' D R': U2, R' D R]","[R: U', R D' R']","[U' R': U, R' D2 R]","[F R: R D' R', U']","[R: U, R D' R']","","[D R: F2, R' U R U']","[R: U2, R D' R']","[D R: D R' D' R, U]","[R' D' R: D, R U R']","[U' D R': U', R' D R]","[R: D', U' R' U R]","[R D': U' R' U R, D2]","", +"DBR","[R D' R' U R' D R, U']","[R D' R': U2, R' D R]","[R D' R': U', R' D R]","[D', R U' R' D R' U R]","[R U' R': R' U R, D2]","[R U' R': R' U R, D']","","[R': U, R' D R U' R D' R']","[R: R' D R U' R D' R', U]","","[R U' R': R' U R, D]","[D R: U, R D' R']","[R D' R': U, R' D R]","[U R: R U' R', D]","[D R: U2, R D' R']","[D R: U', R D' R']","[U R: D' R' D R, U']","[U R: R U' R', D']","[D R: D', U' R' U R]","","[U R: R U' R', D2]", +"RUB","","[U R U' D': R' D' R, U2]","[U' R': R' D' R, U2]","[U' D' R': R' D R, U2]","[U' R': R' D R, U2]","[U' D R': R' D R, U2]","[R': R' D R U' R D' R', U]","","[R: U', R D' R' U R' D R]","[U R U': R' D' R, U2]","[R U' D' R': R' U R, D]","[R: U, R D' R' U R' D R]","[U R: U2, R D' R']","[U R U': R' D R, U2]","[R': R' D R U' R D' R', U']","[U D' R: U2, R D' R']","[U' R' U': R D R', U2]","[U R: U2, R D R']","","[U D R: U2, R D' R']","[U' R' U': R D' R', U2]", +"RDF","[U, R' D' R]","[U2, R' D' R]","[U', R' D' R]","","[R: U, D R' D' R]","[R: R D' R', U']","[R: U, R' D R U' R D' R']","[R: R D' R' U R' D R, U']","","[R: U, D' R' D R]","[R': U' R U R', D']","[U R' U': R D R', U']","[R U R', D2]","[U R' D': R U' R', D2]","[D' R U': R' D R, U2]","[R U R', D]","","[R': D, R' U R]","[R': U R U' R', D']","[R U R', D']","[U R' D': R U' R', D']", +"RDB","[R D R', U']","[U: R D R', U2]","[U': U', R D R']","[D' R: R' U R U', F2]","[U' R': R' D R, U]","[U' R': R' D2 R, U]","","[U R U: R' D' R, U2]","[R D': R' D R, U]","","[R' U: R' D' R, U2]","[U' R: D', R U' R']","[R D: R' U' R, D2]","[D': U R U' R', D2]","[R U': D' R' D R, U2]","[R D: R' U' R, D]","[D', U R U' R']","[R' U: R' D' R, U]","[U' R: U R' U' R, D]","","[U' R' U' R, D']", +"LUF","[R': U', R' D' R]","[F: R' D' R, U2]","","[R U' R': R' D' R, U2]","[U' R': U R U' R', D]","[F R: U', R D' R']","[R U' R': D, R' U R]","[R U' D' R': D, R' U R]","[R': D', U' R U R']","[R' U': R' D' R, U2]","","[U' R' U, L]","[F: D2, R U R']","[R': D, U' R U R']","","[D R': D', U' R U R']","[R: F, R' U R U']","[R' U': R' D' R, U']","[R' F: R U R', D]","[F: D', R U R']","[D R': D, U' R U R']", +"LUB","[R: R D R', U]","","[U' R: U2, R D R']","[U2 R': D, R' U R]","[D' R: R D' R', U]","[R: R D' R', U]","[D R: R D' R', U]","[R: R D' R' U R' D R, U]","[U R' U': U', R D R']","[U' R: R U' R', D']","[L, U' R' U]","","[R: D' R D R', U]","[U R': U', R' D R]","[R' B' R2 U': R' D' R, U2]","[R U: R' D R, U]","[R U R': R' D' R, U']","","[R', F' L F]","[R U: R' D' R, U]","[U D R': U', R' D R]", +"LDB","[R D' R', U']","[U: R D' R', U2]","[U': U', R D' R']","[U2 R': D', R' U R]","[D R U' R': R' D R, U2]","","[R D' R': R' D R, U]","[U R: R D' R', U2]","[D2, R U R']","[R D': R' U' R, D2]","[F: R U R', D2]","[R: U, D' R D R']","","[D R': R D' R' D, F']","[D R U': R' D R, U2]","[D: D, R U R']","[U R U': R D' R', U']","[U2 R: R D' R', U]","[U' R: U R' U' R, D']","[D': D', R U R']","", +"LDF","[U, R' D R]","[U2, R' D R]","[U', R' D R]","[U D R: U', D' R' D R]","","[D R: R' U R U', F2]","[U R: D, R U' R']","[U R U: R' D R, U2]","[U R' D: R U' R', D2]","[D: U R U' R', D2]","[R': U' R U R', D]","[U R': R' D R, U']","[D R': F', R D' R' D]","","[R' D: D' R D R', F2]","","[D, U R U' R']","[U' R': U', D R' D' R]","[R': U R U' R', D]","[R' D: R' U' R, D]","[D: U R U' R', D]", +"FUL","[R: R D R', U2]","[R' F R D': R D' R', U]","","[R U' R': D' R' D R, U2]","[R U D: R' D' R, U2]","[R: R D' R', U2]","[D R: R D' R', U2]","[R': U', R' D R U' R D' R']","[D R U: R' D' R, U2]","[R U: D' R' D R, U2]","","[R' B' R2 U: R' D' R, U2]","[D R U: R' D R, U2]","[D R': R D' R' D, F2]","","[R U: R' D R, U2]","[R': R D' R' D, F2]","[R U R' D': U2, R' D R]","[R D' U: R' D' R, U2]","[R U: R' D' R, U2]","[D' R U: D' R' D R, U2]", +"FDL","[U, D R' D' R]","[U2, D R' D' R]","[U', D R' D' R]","[R U' R': R' D R, U2]","","[D R: U, D R' D' R]","[D R: R D' R', U']","[U D' R: R D' R', U2]","[D, R U R']","[R D: D, R' U' R]","[D R': U' R U R', D']","[R U: U, R' D R]","[D: R U R', D]","","[R U': R' D R, U2]","","[R': R D' R' D, F']","[U R' F': D, R U' R']","[R' F: R U' R', D]","[D: R U R', D2]","[R' F': R U R', D2]", +"FDR","[U, D' R' D R]","[U2, D' R' D R]","[U', D' R' D R]","","[R: R' U R U', F2]","[R' D' R: R U R', D]","[U R D': U', R' D R]","[U' R' U: R D R', U2]","","[U R U' R', D']","[R: R' U R U', F] sledge","[R U R': U', R' D' R]","[U R U': U', R D' R']","[U R U' R', D]","[R': F2, R D' R' D]","[R': F', R D' R' D]","","[U' R' U': U', R D R']","[D' R': U R U' R', D]","[R U R' U': D', R U R']","[U R U' R', D2]", +"BUL","[R': U2, R' D' R]","","[U' R': R' D' R, U']","[U D R: D', R U' R']","[U' R': R' D R, U']","[U' D R': R' D R, U']","[U R: D', R U' R']","[U R: R D R', U2]","[R': R' U R, D]","[R' U: U, R' D' R]","[R' U': U', R' D' R]","","[U2 R: U, R D' R']","[U' R': D R' D' R, U']","[R U R' D': R' D R, U2]","[U R' F': R U' R', D]","[U' R' U': R D R', U']","","[U' L' U, R]","[D' R': R' U R, D]","[U' R' U': R D' R', U']", +"BUR","","[R': D' R' D R, U2]","[R': D' R' D R, U']","[U R': U' R U R', D']","[U D R' U': R U R', D']","[R: U' R' U R, D']","[D R: U' R' U R, D']","","[R': D', U R U' R']","[U' R: D, U R' U' R]","[R' F: D, R U R']","[F' L F, R']","[U' R: D', U R' U' R]","[R': D, U R U' R']","[R D' U': R' D' R, U2]","[R' F: D, R U' R']","[D' R': D, U R U' R']","[R, U' L' U]","","[R': D' R' D R, U]","[D R': D, U R U' R']", +"BDR","[D R D' R', U']","[D U: R D' R', U2]","[D': U', R' D' R]","[D' R: U, D R' D' R]","[D' R: R D' R', U']","[R D: U' R' U R, D2]","","[U D R: R D' R', U2]","[D', R U R']","","[F: R U R', D']","[R U: U, R' D' R]","[D': R U R', D']","[R' D: D, R' U' R]","[R U': R' D' R, U2]","[D': R U R', D2]","[R U R' U': R U R', D']","[D' R': D, R' U R]","[R': U, D' R' D R]","","[R' D': R' U' R, D2]", +"BDL","[D' R D R', U']","[D' U: R D R', U2]","[D: U', R' D R]","[U' D' R': R' D R, U]","[U' D' R': R' D2 R, U]","","[U R: D2, R U' R']","[U' R' U: R D' R', U2]","[U R' D': D', R U' R']","[D', U' R' U' R]","[D R': U' R U R', D]","[U D R': R' D R, U']","","[D: D, U R U' R']","[D' R U': D' R' D R, U2]","[R' F': D2, R U R']","[D2, U R U' R']","[U' R' U': U', R D' R']","[D R': U R U' R', D]","[R' D: R' U' R, D2]","", diff --git a/src/speedcubing/bldsheets/edges.csv b/src/speedcubing/bldsheets/edges.csv index 6c296dc..2589022 100644 --- a/src/speedcubing/bldsheets/edges.csv +++ b/src/speedcubing/bldsheets/edges.csv @@ -1,23 +1,23 @@ "","UB","UL","UF","DR","DF","DL","DB","RB","RF","RD","LF","LU","LB","LD","FR","FU","FL","FD","BL","BU","BR","BD", -"UB","","[M2 U: M', U2]","[R' B' R: U', R E R']","[R U' R': S, R2]","[R U' R' D: S, R2]","[S R B' R': S, R2]","[U', M' U2 M']","[U': U', R' S' R]","[U': U', R S' R']","[R E R', U]","[R' E R, U]","[S, U R' U' R]","[R E' R', U]","[U': U', R' S R]","[E': R' E R, U]","[R U R' U', M']","[R E R2 E' R, U]","[U: M', R U' R' U]","[R' E' R2 E R', U]","","[E: R E' R', U]","[R' U R U', M]", +"UB","","[M2 U: M', U2]","[R' B' R: U', R E R']","[R E' R2 E R, U]","[R U' R' D: S, R2]","[S R B' R': S, R2]","[U', M' U2 M']","[U': U', R' S' R]","[U': U', R S' R']","[R E R', U]","[R' E R, U]","[S, U R' U' R]","[R E' R', U]","[U': U', R' S R]","[E': R' E R, U]","[R U R' U', M']","[R E R2 E' R, U]","[U: M', R U' R' U]","[R' E' R2 E R', U]","","[E: R E' R', U]","[R' U R U', M]", "UL","[M2 U': M', U2]","","[M2 U: M, U2]","[S, R2]","[U': M', U2]","[L2, S']","[U: M, U2]","[U2, R' S' R]","[U2, R S' R']","[R E R', U2]","[R' E R, U2]","","[R E' R', U2]","[U2, R' S R]","[R, S' l2 S]","[M U': M', U2]","[S R2 S', l']","[M U: M, U2]","[S R2 S', l]","[M' U: M, U2]","[R', S' l2 S]","[M' U': M', U2]", -"UF","[R' B' R: R E R', U']","[M2 U': M, U2]","","[R U R': S, R2]","[U, M U2 M]","[S R' F R: S, R2]","[R U R' D': R2, S]","[U: U, R' S' R]","[U: U, R S' R']","[R' E' R, U']","[R' E R, U']","[S, U' R' U R]","[R E' R', U']","[U: U, R' S R]","[E': R' E R, U']","","[R E R2 E' R, U']","[R U' R' U, M']","[R' E' R2 E R', U']","[R' U' R U, M]","[E: R E' R', U']","M U' M' U' M U' M' U'", -"DR","[R' U' R': S, R2]","[R2, S]","[R' U R': S, R2]","","[R D' R': S, R2]","[S', R2]","[R D R': S, R2]","[R' S' R': S, R2]","[R S' R: S, R2]","","[S' l' S, R2]","[l': S' l S, R2]","R2 S R' E' R2 E R S'","[R: E l E', R2]","[R U2 R: S, R2]","[r U' R: S, R2]","[R: E, R2]","[S' U: M', U2]","[R': E', R2]","[r' U R': S, R2]","[R' U2 R': S, R2]","[S' U: M, U2]", -"DF","[R U' R' D: R2, S]","[U: M', U2]","[M U2 M, U]","[R D' R: S', R2]","","[S R' F' R: S, R2]","[D': R2, S']","[R' S' R U: M', U2]","[R S' R' U: M', U2]","[R F' R', S]","[R F R': R' E R, U']","[U2: R' F' R, S]","[S R' F': R2, E']","[R' S R U: M', U2]","[R, U' M2 U]","[R' F': R U' R', E]","[D R: E, R2]","","[D R': E', R2]","[r' U' r U': M', U2]","[R', U' M2 U]","[r' U' r U: M', U2]", -"DL","[S' R B' R': S, R2]","[S', L2]","[S' R' F R: S, R2]","[R2, S']","[S' R' F' R: S, R2]","","[S' R B R': S, R2]","[R' S' R: R S' R', U2]","[R S' R': R' S' R, U2]","[U: S', R F R']","[S U2 R': E, R2]","[R' F' R: R' S R, U]","[S U2 R: E', R2]","","[U R' U': R2, S']","[R F R: S', R2]","[l': l', S R2 S']","[R F' R: S', R2]","[l: l, S R2 S']","[R' B' R': S', R2]","[U R U': R2, S']","[R' B R': S, R2]", -"DB","[M' U2 M', U']","[U': M, U2]","[R U R' D': S, R2]","[R D R: S, R2]","[D': R2, S']","[S R B R': S, R2]","","[R' S' R U': M, U2]","[R S' R' U': M, U2]","[R' B R, S]","[S R B: R2, E]","[U2: R B R', S]","[R' B' R: U, R E' R']","[R' S R U': M, U2]","[R, U M2 U']","[r U' r' U': M, U2]","[D' R: E, R2]","[r U r' U': M, U2]","[D' R': E', R2]","[U D': S', R' F R]","[R', U M2 U']","", -"RB","[U': R' S' R, U']","[R' S' R, U2]","[U: R' S' R, U]","[R' S' R: S, R2]","[R' S' R U': M', U2]","[R' S' R: U2, R S' R']","[R' S' R U: M, U2]","","[S R: S, R2]","[U' R U, S]","[R' S': E, R U2 R']","[R' U2 R, S']","[R' S' R: R E' R', U2]","[R' S': R U2 R', S2]","[u: R U' R', E]","[R' U: U, R' S' R]","[S' R': U2, R' E R]","[S' R' U: M', U2]","[E, R B2 R']","[R' U': U', R S' R']","","[S' R' U': M, U2]", -"RF","[U': R S' R', U']","[R S' R', U2]","[U: R S' R', U]","[R S' R': S, R2]","[R S' R' U': M', U2]","[R S' R': U2, R' S' R]","[R S' R' U: M, U2]","[S R': S, R2]","","[U' R' U, S]","[R S' R': R' E R, U2]","[R U2 R', S']","[R S': E', R' U2 R]","[R S': R' U2 R, S2]","","[R U: U, R' S' R]","[E': R' F2 R]","[S' R U: M', U2]","[S' R: U2, R E' R']","[R U': U', R' S' R]","[u': R' U R, E']","[S' R U': M, U2]", +"UF","[R' B' R: R E R', U']","[M2 U': M, U2]","","[R E' R2 E R, U']","[U, M U2 M]","[S R' F R: S, R2]","[R U R' U: M, U2]","[U: U, R' S' R]","[U: U, R S' R']","[R' E' R, U']","[R' E R, U']","[S, U' R' U R]","[R E' R', U']","[U: U, R' S R]","[E': R' E R, U']","","[R E R2 E' R, U']","[R U' R' U, M']","[R' E' R2 E R', U']","[R' U' R U, M]","[E: R E' R', U']","M U' M' U' M U' M' U'", +"DR","[U, R E' R2 E R]","[R2, S]","[U', R E' R2 E R]","","[R D' R': S', R2]","[S', R2]","[R D R': S', R2]","[R' S' R': S, R2]","[R S' R: S, R2]","","[S' l' S, R2]","[l': S' l S, R2]","R2 S R' E' R2 E R S'","[R: E l E', R2]","[R U2 R: S, R2]","[r U' R: S, R2]","[R: E, R2]","[S' U: M', U2]","[R': E', R2]","[r' U R': S, R2]","[R' U2 R': S, R2]","[S' U': M, U2]", +"DF","[R U' R' D: R2, S]","[U: M', U2]","[M U2 M, U]","[R D' R: S', R2]","","[S R' F' R: S, R2]","[D': R2, S']","[R' S' R U: M', U2]","[R S' R' U: M', U2]","[R F' R', S]","[R F R': U', R' E R]","[U2: R' F' R, S]","[S R' F': R2, E']","[R' S R U: M', U2]","[R, U' M2 U]","[R' F': R U' R', E]","[D R: E, R2]","","[D R': E', R2]","[r' U r U: M', U2]","[R', U' M2 U]","[r' U' r U: M', U2]", +"DL","[S' R B' R': S, R2]","[S', L2]","[S' R' F R: S, R2]","[R2, S']","[S' R' F' R: S, R2]","","[S' R B R': S, R2]","[R' S' R: R S' R', U2]","[R S' R': R' S' R, U2]","[U: S', R F R']","[S U2 R': E, R2]","[R' F' R: R' S R, U]","[S U2 R: E', R2]","","[U R' U': R2, S']","[R F R: S', R2]","[l': l', S R2 S']","[R F' R: S', R2]","[l: l, S R2 S']","[R' B' R': S', R2]","[U R U': R2, S']","[R' B R': S', R2]", +"DB","[M' U2 M', U']","[U': M, U2]","[R U R' U': M, U2]","[R D R: S', R2]","[D: R2, S']","[S R B R': S, R2]","","[R' S' R U': M, U2]","[R S' R' U': M, U2]","[R' B R, S]","[S R B: R2, E]","[U2: R B R', S]","[R' B' R: U, R E' R']","[R' S R U': M, U2]","[R, U M2 U']","[r U' r' U': M, U2]","[D' R: E, R2]","[r U r' U': M, U2]","[D' R': E', R2]","[U D': S', R' F R]","[R', U M2 U']","", +"RB","[U': R' S' R, U']","[R' S' R, U2]","[U: R' S' R, U]","[R' S' R: S, R2]","[R' S' R U': M', U2]","[R' S' R: U2, R S' R']","[R' S' R U: M, U2]","","[S' R: S, R2]","[U' R U, S]","[R' S': E, R U2 R']","[R' U2 R, S']","[R' S' R: R E' R', U2]","[R' S': R U2 R', S2]","[u: R U' R', E]","[R' U: U, R S' R']","[S' R': U2, R' E R]","[S' R' U: M', U2]","[E, R B2 R']","[R' U': U', R S' R']","","[S' R' U': M, U2]", +"RF","[U': R S' R', U']","[R S' R', U2]","[U: R S' R', U]","[R S' R': S, R2]","[R S' R' U': M', U2]","[R S' R': U2, R' S' R]","[R S' R' U: M, U2]","[S' R': S, R2]","","[U' R' U, S]","[R S' R': R' E R, U2]","[R U2 R', S']","[R S': E', R' U2 R]","[R S': R' U2 R, S2]","","[R U: U, R' S' R]","[E', R' F2 R]","[S' R U: M', U2]","[S' R: U2, R E' R']","[R U': U', R' S' R]","[u': R' U R, E']","[S' R U': M, U2]", "RD","[U, R E R']","[U2, R E R']","[U', R' E' R]","","[S, R F' R']","[U: R F R', S']","[S, R' B R]","[S, U' R U]","[S, U' R' U]","","[S, R F2 R']","[D': S, R' F' R]","[S, R' B2 R]","[U R' F R: S', R2]","[R U R' U', S']","[R' F R, S']","[R' F2 R, S']","[R' F' R, S']","[R B2 R', S']","[R B' R', S']","[R' U R U', S']","[R B R', S']", -"LF","[U, R' E R]","[U2, R' E R]","[U', R' E R]","[R2, S' l' S]","[R F R': U', R' E R]","[S U2 R: E, R2]","[S R B: E, R2]","[R' S': R U2 R', E]","[R S' R': U2, R' E R]","[R F2 R', S]","","[E R' E', l]","[R' B': R U R', E]","[E R' E', l']","[u': R U' R', E']","[S U' R: E, R2]","","[D: R F2 R', S]","[E', R B2 R']","[S U R: E, R2]","[R' u': R U R', E']","[D': R F2 R', S]", -"LU","[U R' U' R, S]","","[U' R' U R, S]","[l: S l S', R2]","[U2: S, R' F' R]","[R' F' R: U, R' S R]","[U2: S, R B R']","[S', R' U2 R]","[S', R U2 R']","[D': R' F' R, S]","[l, S R' S']","","[l', S R S']","[D: R' F' R, S]","[R, U' M' U]","[R' F R, S]","[R' F2 R, S]","[R' F' R, S]","[R B2 R', S]","[S', R U' R']","[R', U' M' U]","[R B R', S]", -"LB","[U, R E' R']","[U2, R E' R']","[U', R E' R']","[R2, S' l S]","[S R' F': E', R2]","[S U2 R': E', R2]","[R' B' R: R E' R', U]","[R' S' R: U2, R E' R']","[R S': R' U2 R, E']","[R' B2 R, S]","[R' B': E, R U R']","[E' R E, l']","","[E' R E, l]","[R U: R' U' R, E']","[S U' R': E', R2]","[E, R' F2 R]","[D: R' B2 R, S]","","[S U R': E', R2]","[u: R' U' R, E]","[D': R' B R, S]", +"LF","[U, R' E R]","[U2, R' E R]","[U', R' E R]","[R2, S' l' S]","[R F R': R' E R, U']","[S U2 R: E, R2]","[S R B: E, R2]","[R' S': R U2 R', E]","[R S' R': U2, R' E R]","[R F2 R', S]","","[E R' E', l]","[R' B': R U R', E]","[E R' E', l']","[u': R U R', E']","[S U' R: E, R2]","","[D: R F2 R', S]","[E', R B2 R']","[S U R: E, R2]","[R' U': R U R', E]","[D': R F2 R', S]", +"LU","[U R' U' R, S]","","[U' R' U R, S]","[l: S l S', R2]","[U2: S, R' F' R]","[R' F' R: U, R' S R]","[U2: S, R B R']","[S', R' U2 R]","[S', R U2 R']","[D': R' F' R, S]","[l, E R' E']","","[l', E' R E]","[D: R' F' R, S]","[R, U' M' U]","[R' F R, S]","[R' F2 R, S]","[R' F' R, S]","[R B2 R', S]","[S', R U' R']","[R', U' M' U]","[R B R', S]", +"LB","[U, R E' R']","[U2, R E' R']","[U', R E' R']","[R2, S' l S]","[S R' F': E', R2]","[S U2 R': E', R2]","[R' B' R: R E' R', U]","[R' S' R: U2, R E' R']","[R S': R' U2 R, E']","[R' B2 R, S]","[R' B': E, R U R']","[E' R E, l']","","[E' R E, l]","[R U: R' U' R, E']","[S U' R': E', R2]","[E, R' F2 R]","[D: R' B2 R, S]","","[S U R': E', R2]","[u: R' U' R, E]","[D': R' B2 R, S]", "LD","[U': R' S R, U']","[R' S R, U2]","[U: R' S R, U]","[R': E l E', R2]","[R' S R U': M', U2]","","[R' S R U: M, U2]","[R' S: R U2 R', S2]","[R S: R' U2 R, S2]","[U R' F R': S', R2]","[l', E R' E']","[D: S, R' F' R]","[l, E' R E]","","[E' l' E, R']","[R': F, R' S' R]","[R': F2, R' S' R]","[D: S', R' F' R]","[R: B2, R S' R']","[R: B', R S' R']","[E l E', R]","[D': S', R B R']", "FR","[u: R' E R, U']","[S' l2 S, R]","[E': U', R' E R]","[R U2 R': S, R2]","[U' M2 U, R]","[U R' U': S', R2]","[U M2 U', R]","[U: R U' R', E']","","[S', R U R' U']","[U': R U R', E]","[U' M' U, R]","[R u: R' U' R, E]","[R', E' l' E]","","[S': U, R S' R']","[U R' U' R: E, R2]","[U M' U', R]","[U R' U' R': E', R2]","[S': U', R S' R']","[U2 R': S, R2]","[U' M U, R]", "FU","[M', R U R' U']","[M U: M', U2]","","[r U' R': S, R2]","[R' F': E, R U' R']","[R F R': S', R2]","[r U' r' U: M, U2]","[R' U: R S' R', U]","[R U: R' S' R, U]","[S', R' F R]","[S U' R': E, R2]","[S, R' F R]","[S U' R: E', R2]","[R': R' S' R, F]","[S': R S' R', U]","","R E R' U' R' E2 R U R' E R","[D: S', R' F R]","[R F: R2, E']","[U' M' U: M, U2]","[S': R' S' R, U]","[D': S', R' F R]", -"FL","[U, R E R2 E' R]","[l', S R2 S']","[U', R E R2 E' R]","[R': E, R2]","[D R': E, R2]","[l': S R2 S', l']","[D' R': E, R2]","[S' R': R' E R, U2]","[R' F2 R, E']","[S', R' F2 R]","","[S, R' F2 R]","[R' F2 R, E]","[R': R' S' R, F2]","[U R' U' R': E, R2]","R' E' R U' R' E2 R U R E' R'","","[D: S', R' F2 R]","[L: S', L2]","[R' B': E, R2]","[U R U' R': E, R2]","[R' B: R2, E]", -"FD","U' M' U' M U' M' U' M","[M U': M, U2]","[M': R U' R' U]","[S' U': M', U2]","","[R F' R': S', R2]","[r U r' U: M, U2]","[S' R' U': M', U2]","[S' R U': M', U2]","[S', R' F' R]","[D: S, R F2 R']","[S, R' F' R]","[D: S, R' B2 R]","[D: R' F' R, S']","[R, U M' U']","[D: R' F R, S']","[D: R' F2 R, S']","","[R F': R2, E']","[D: R B' R', S']","[R', U M' U']","[M' U M, d2]", +"FL","[U, R E R2 E' R]","[l', S R2 S']","[U', R E R2 E' R]","[R': E, R2]","[D R': E, R2]","[l': S R2 S', l']","[D' R': E, R2]","[S' R': R' E R, U2]","[R' F2 R, E']","[S', R' F2 R]","","[S, R' F2 R]","[R' F2 R, E]","[R': R' S' R, F2]","[U R' U' R': E, R2]","R' E' R U' R' E2 R U R E' R'","","[D: S', R' F2 R]","[L: S', L2]","[R' B': E, R2]","[U R U' R': E, R2]","[R' B: E, R2]", +"FD","U' M' U' M U' M' U' M","[M U': M, U2]","[M', R U' R' U]","[S' U': M', U2]","","[R F' R': S', R2]","[r U r' U: M, U2]","[S' R' U': M', U2]","[S' R U': M', U2]","[S', R' F' R]","[D: S, R F2 R']","[S, R' F' R]","[D: S, R' B2 R]","[D: R' F' R, S']","[R, U M' U']","[D: R' F R, S']","[D: R' F2 R, S']","","[R F': R2, E']","[D: R B' R', S']","[R', U M' U']","[M' U M, d2]", "BL","[U, R' E' R2 E R']","[l, S R2 S']","[U', R' E' R2 E R']","[R: E', R2]","[D R: E', R2]","[l: S R2 S', l]","[D' R: E', R2]","[R B2 R', E]","[S' R: R E' R', U2]","[S', R B2 R']","[R B2 R', E']","[S, R B2 R']","","[R: R S' R', B2]","[U R' U' R: E', R2]","[R F: E', R2]","[L': S', L2]","[R F': E', R2]","","R E R' U R E2 R' U' R' E R","[U R U' R: E', R2]","[D': S', R B2 R']", "BU","","[M' U': M, U2]","[M, R' U' R U]","[r' U R: S, R2]","[r' U r U': M', U2]","[R' B' R: S', R2]","[U D': R' F R, S']","[R' U': R S' R', U']","[R U': R' S' R, U']","[S', R B' R']","[S U R': E, R2]","[R U' R', S']","[S U R: E', R2]","[R: R S' R', B']","[S': R S' R', U']","[U' M' U': M, U2]","[R' B': R2, E]","[D: S', R B' R']","R' E' R U R E2 R' U' R E' R'","","[S': R' S' R, U']","[D': S', R B' R']", "BR","[E: U, R E' R']","[S' l2 S, R']","[u': R E' R', U]","[R' U2 R: S, R2]","[U' M2 U, R']","[U R U': S', R2]","[U M2 U', R']","","[U': R' U R, E]","[S', R' U R U']","[R' u': R U R', E']","[U' M' U, R']","[U: R' U' R, E']","[R, E l E']","[U2 R: S, R2]","[S': U, R' S' R]","[U R U' R: E, R2]","[U M' U', R']","[U R U' R': E', R2]","[S': U', R' S' R]","","[U' M U, R']", -"BD","[M, R' U' R U]","[M' U: M', U2]","[D': U', R E R']","[S' U: M, U2]","[r' U' r U': M', U2]","[R' B R: S', R2]","","[S' R' U: M, U2]","[S' R U: M, U2]","[S', R B R']","[D': S, R F2 R']","[S, R B R']","[D': S, R' B2 R]","[D': R B R', S']","[R, U' M U]","[D': R' F R, S']","[R' B: R2, E]","[M U' M', d2]","[D': R B2 R', S']","[D': R B' R', S']","[R', U' M U]","", +"BD","[M, R' U R U']","[M' U: M', U2]","[D': U', R E R']","[S' U: M, U2]","[r' U' r U': M', U2]","[R' B R: S', R2]","","[S' R' U: M, U2]","[S' R U: M, U2]","[S', R B R']","[D': S, R F2 R']","[S, R B R']","[D': S, R' B2 R]","[D': R B R', S']","[R, U' M U]","[D': R' F R, S']","[R' B: R2, E]","[M U' M', d2]","[D': R B2 R', S']","[D': R B' R', S']","[R', U' M U]","", diff --git a/src/speedcubing/bldsheets/tcenters.csv b/src/speedcubing/bldsheets/tcenters.csv index 97fd9b6..fd47a04 100644 --- a/src/speedcubing/bldsheets/tcenters.csv +++ b/src/speedcubing/bldsheets/tcenters.csv @@ -1,24 +1,24 @@ "","Ub","Ul","Ur","Df","Dr","Dl","Db","Rb","Ru","Rf","Rd","Lu","Lf","Lb","Ld","Fr","Fu","Fl","Fd","Bd","Bu","Br","Bl", "Ub","","","","[m' u2 m, U2]","[D': m' u2 m, U2]","[D: m' u2 m, U2]","[U2, m U2 m']","[U': r' e' r, U2]","[m' u' m, U2]","[U': r e r', U2]","[m d' m', U2]","[m' u m, U2]","[U': r' e r, U2]","[U': r e' r', U2]","[m d m', U2]","[Rw U 3Rw' U': m', U' r U]","[U' Rw U: U r' U', m']","[3Rw' F Rw U': U' l' U, m']","[U Rw' U': m', U' r U]","[U' Rw' U: U r U', m]","[U' Rw' U': U' r U, m]","[Rw' U' 3Rw U: U r' U', m]","[U' Rw' F: U' m' U, l]", "Ul","","","","[m' u2 m, U']","[3Rw' U': m', U' r' U]","[l2, D' m2 D]","[D l2 D', m2]","[U': r' e' r, U']","[m' u' m, U']","[U': r e r', U']","[m d' m', U']","[m' u m, U']","[U': r' e r, U']","[U': r e' r', U']","[m d m', U']","[U' rm': U m U', r']","[U2 3Rw: U r' U', m]","[3Rw: U' m U, l']","[U' Rw: U' r' U, m']","[U2 3Rw': U r U', m']","[U' Rw': U' r U, m]","[U' mr': U m' U', r]","[3Rw': U' m' U, l]", -"Ur","","","","[m' u2 m, U]","[r2, D m2 D']","[3Lw U: m', U l U']","[D' r2 D, m2]","[U', r' e' r]","[m' u' m, U]","[U', r e r']","[m d' m', U]","[m' u m, U]","[U', r' e r]","[U', r e' r']","[m d m', U]","[m': U m U', r]","[U' 3Rw: U r' U', m]","[U 4Rw: U' m U, l]","[3Rw: U' r' U, m]","[U' Rw': U r U', m]","[3Rw': U' r U, m']","[m: U m' U', r']","[U 4Rw': U' m' U, l']", -"Df","[U2, m' u2 m]","[U', m' u2 m]","[U, m' u2 m]","","","","","[D r: r U' r', e']","[U m': m' U m, u]","[3Uw': 3Uw' m2 3Uw, r']","[Dw' l'm': U l ' U', m]","[U m': m' U m, u']","[3Uw': r, 3Uw' m2 3Uw]","[D r': r' U' r, e']","[Dw 3Rw: U' r U, m]","[U': r, U' m2 U]","[U' Rw: m', U r' U']","[U: l', U m2 U']","[D 3Rw: U' r U, m]","[D U': U' m U, r2]","[D 3Rw': U' r' U, m']","[U': r', U' m2 U']","[U: l, U m2 U']", -"Dr","[D': U2, m' u2 m]","[3Rw' U': U' r' U, m']","[D m2 D', r2]","","","","","[r: r U' r', e']","[u' 3Rw': U' r' U, m']","[r': r' U' r, e]","[d' 3Rw: U' r U, m]","[u 3Rw': U' r' U, m']","[r: r U' r', e]","[r': r' U' r, e]","[d 3Rw: U' r U, m]","[D: U' r U, m2]","[U': U' m' U, r2]","[D: U l' U', m2]","[3Rw: U' r U, m]","[U': U' m U, r2]","[3Rw: U' r' U, m]","[D': U' r' U, m2]","[D: U l U', m2]", -"Dl","[D: U2, m' u2 m]","[D' m2 D, l2]","[3Lw U: U l U', m']","","","","","[l: l U l', e]","[u' lm: U l U', m']","[l': l' U l, e']","[d' l'm': U l' U', m]","[u lm: U l U', m']","[l: l U l', e']","[l': l' U l, e]","[d l'm': U l' U', m]","[D: U' r U, m2]","[U: U m' U', l2]","[D': U l' U', m2]","[l'm': U l' U', m]","[U: U m U', l2]","[3Lw: U l U', m']","[D': U' r' U, m2]","[D': U l U', m2]", -"Db","[m u2 m', U2]","[m2, D l2 D']","[m2, D' r2 D]","","","","","[D' r: r U' r', e']","[U m: m U' m', u']","[3Uw' r' 3Uw, m2]","[Dw' 3Rw: U' r U, m]","[U m: m U' m', u]","[3Uw' r 3Uw, m2]","[D' r': r' U' r, e']","[Dw l'm': U l' U', m]","[U' m' U, m2]","[D' U': U' m' U, r2]","[U l' U', m2]","[D' 3Rw: U' r U, m]","[D' U': U' m U, r2]","[D' 3Rw': U' r' U, m']","[U' r' U, m2]","[U l U', m2]", +"Ur","","","","[m' u2 m, U]","[r2, D m2 D']","[3Lw U: m', U l U']","[D' r2 D, m2]","[U', r' e' r]","[m' u' m, U]","[U', r e r']","[m d' m', U]","[m' u m, U]","[U', r' e r]","[U', r e' r']","[m d m', U]","[m': U m U', r]","[U' Rw: U r' U', m']","[U 4Rw: U' m U, l]","[3Rw: U' r' U, m]","[U' Rw': U r U', m]","[3Rw': U' r U, m']","[m: U m' U', r']","[U 4Rw': U' m' U, l']", +"Df","[U2, m' u2 m]","[U', m' u2 m]","[U, m' u2 m]","","","","","[D r: r U' r', e']","[U m': m' U m, u]","[3Uw': r', 3Uw' m2 3Uw]","[Dw' l'm': U l ' U', m]","[U m': m' U m, u']","[3Uw': r, 3Uw' m2 3Uw]","[D r': r' U' r, e']","[Dw 3Rw: U' r U, m]","[U': r, U' m2 U]","[U' 3Rw: m', U r' U']","[U: l', U m2 U']","[D 3Rw: U' r U, m]","[D U': U' m U, r2]","[D 3Rw': U' r' U, m']","[U': r', U' m2 U]","[U: l, U m2 U']", +"Dr","[D': U2, m' u2 m]","[3Rw' U': U' r' U, m']","[D m2 D', r2]","","","","","[r: r U' r', e']","[u' 3Rw': U' r' U, m']","[r': r' U' r, e]","[d' 3Rw: U' r U, m]","[u 3Rw': U' r' U, m']","[r: r U' r', e]","[r': r' U' r, e']","[d 3Rw: U' r U, m]","[D: U' r U, m2]","[U': U' m' U, r2]","[D: U l' U', m2]","[3Rw: U' r U, m]","[U': U' m U, r2]","[3Rw': U' r' U, m']","[D: U' r' U, m2]","[D: U l U', m2]", +"Dl","[D: U2, m' u2 m]","[D' m2 D, l2]","[3Lw U: U l U', m']","","","","","[l: l U l', e]","[u' lm: U l U', m']","[l': l' U l, e']","[d' l'm': U l' U', m]","[u lm: U l U', m']","[l: l U l', e']","[l': l' U l, e]","[d l'm': U l' U', m]","[D': U' r U, m2]","[U: U m' U', l2]","[D': U l' U', m2]","[l'm': U l' U', m]","[U: U m U', l2]","[3Lw: U l U', m']","[D': U' r' U, m2]","[D': U l U', m2]", +"Db","[m u2 m', U2]","[m2, D l2 D']","[m2, D' r2 D]","","","","","[D' r: r U' r', e']","[U m: m U' m', u']","[3Uw' r' 3Uw, m2]","[Dw' 3Rw: U' r U, m]","[U m: m U' m', u]","[3Uw' r 3Uw, m2]","[D' r': r' U' r, e']","[Dw l'm': U l' U', m]","[U' r U, m2]","[D' U': U' m' U, r2]","[U l' U', m2]","[D' 3Rw: U' r U, m]","[D' U': U' m U, r2]","[D' 3Rw': U' r' U, m']","[U' r' U, m2]","[U l U', m2]", "Rb","[U: r' e' r, U2]","[U': U', r' e' r]","[r' e' r, U']","[D r: e', r U' r']","[r: e', r U' r']","[l: e, l U l']","[D' r: e', r U' r']","","","","","[ue': m, U' r U]","[e': r U' r', e2]","[R d'e': U' r' U, m']","[de: m', U l U']","[e', r U' r']","[R' Uw: m' U m, u']","[F2: e', r U' r']","[ue': m', U' r U]","[U 3Rw': m u m', U]","[e': m, U' r U]","[Rw': U, m' u' m]","[e, l U l']", -"Ru","[U2, m' u' m]","[U': m' U' m]","[U, m' u' m]","[U m': u, m' U m]","[u' Rw': U' r' U, m]","[u' l: U l U', m]","[U m: u', m U' m']","","","","","[R ue: m, U' r U]","[3Uw': r, U m U']","[u'e': U l' U', m]","[R de: m', U l U']","[Uw': r, U m U']","[Uw: m' U m, u']","[l': U', m' u' m]","[Rw': m', 3Uw' r' 3Uw]","[U m: m u m', U]","[3Rw': 3Uw' r' 3Uw, m']","[Uw': r', U m U']","[Uw: l, U m' U']", -"Rf","[U: r e r', U2]","[U': U', r e r']","[r e r', U']","[3Uw': r', 3Uw' m2 3Uw]","[r': e, r' U' r]","[l': e', l' U l]","[m2, 3Uw' r' 3Uw]","","","","","[ue': m, U l' U']","[R 3Uw': r, U m U']","[e: r' U' r, e2]","[E: m', U' r' U]","[Rw: U, m' u' m]","[R Uw: m' U m, u']","[e', l' U l]","[m', 3Uw' r' 3Uw]","[3Uw': 3Uw' m 3Uw, r']","[m, 3Uw' r' 3Uw]","[e, r' U' r]","[l: l e' l', U]", -"Rd","[U2, m d' m']","[U', m d' m']","[U, m d' m']","[Dw' l': U l' U', m']","[d' Rw: U' r U, m']","[d' l': U l' U', m']","[Dw' Rw: U' r U, m']","","","","","[R ue': m, U l' U']","[4Uw: l, U' m' U]","[d'e': U' r' U, m']","[R E: m', U' r' U]","[Dw': U' r U, m']","[R2 Uw: m' U m, u']","[Dw': U l' U', m']","[3Rw: 3Uw' r' 3Uw, m]","[U: d, m U m']","[Rw: m, 3Uw' r' 3Uw]","[Dw': U' r' U, m']","[Dw': U l U', m']", +"Ru","[U2, m' u' m]","[U', m' u' m]","[U, m' u' m]","[U m': u, m' U m]","[u' Rw': U' r' U, m]","[u' l: U l U', m]","[U m: u', m U' m']","","","","","[R ue': m, U' r U]","[3Uw': r, U m U']","[eu': U l' U', m]","[R de: m', U l U']","[Uw': r, U m U']","[Uw: m' U m, u']","[l': U', m' u' m]","[Rw': m', 3Uw' r' 3Uw]","[U m: m u m', U]","[3Rw': 3Uw' r' 3Uw, m']","[Uw': r', U m U']","[Uw: l, U m' U']", +"Rf","[U: r e r', U2]","[U': U', r e r']","[r e r', U']","[3Uw': 3Uw' m2 3Uw, r']","[r': e, r' U' r]","[l': e', l' U l]","[m2, 3Uw' r' 3Uw]","","","","","[ue': m, U l' U']","[R 3Uw': r, U m U']","[e: r' U' r, e2]","[L e: r' U' r, e2]","[Rw: U, m' u' m]","[R Uw: m' U m, u']","[e', l' U l]","[m', 3Uw' r' 3Uw]","[3Uw': 3Uw' m 3Uw, r']","[m, 3Uw' r' 3Uw]","[e, r' U' r]","[l: l e' l', U]", +"Rd","[U2, m d' m']","[U', m d' m']","[U, m d' m']","[Dw' l': U l' U', m']","[d' Rw: U' r U, m']","[d' l': U l' U', m']","[Dw' Rw: U' r U, m']","","","","","[R ue': m, U l' U']","[R' e': r U' r', e2]","[d'e': U' r' U, m']","[U d': m' U' m, d2]","[Dw': U' r U, m']","[R2 Uw: m' U m, u']","[Dw': U l' U', m']","[3Rw: 3Uw' r' 3Uw, m]","[U: d, m U m']","[Rw: m, 3Uw' r' 3Uw]","[Dw': U' r' U, m']","[Dw': U l U', m']", "Lu","[U2, m' u m]","[U', m' u m]","[U, m' u m]","[U m': u', m' U m]","[u Rw': U' r' U, m]","[u l: U l U', m]","[U m: u, m U' m']","[ue': U' r U, m]","[R ue': U' r U, m]","[3Uw: l', U' m U]","[R 3Uw: l', U' m U]","","","","","[Rw: U, m' u m]","[Uw': m' U' m, u]","[l': U', m' u m]","[Lw: m', 3Uw l 3Uw']","[U m: m u' m', U]","[3Lw: 3Uw' r 3Uw, m']","[Uw': r', U' m' U]","[Uw: l, U' m U]", -"Lf","[U: r' e r, U2]","[U': U', r' e r]","[r' e r, U']","[3Uw': 3Uw' m2 3Uw, r]","[r: e, r U' r']","[l: e', l U l']","[m2, 3Uw' r 3Uw]","[e: r U' r', e2]","[u'e': m, U' r U]","[R eu': m, U' r U]","[E': m', U l U']","","","","","[e, r U' r']","[F: e, r U' r']","[Lw': U', m' u m]","[m', 3Uw l 3Uw']","[3Uw': 3Uw' m 3Uw, r]","[m, 3Uw' r 3Uw]","[Rw': r' e r, U']","[e', l U l']", -"Lb","[U: r e' r', U2]","[U': U', r e' r']","[r e' r', U']","[D r': e', r' U' r]","[r': e, r' U' r]","[l': e, l' U l]","[D' r': e', r' U' r]","[R d'e': m', U' r' U]","[u'e': m, U l' U']","[e', r' U' r, e2]","[d'e': m', U' r' U]","","","","","[Rw: r e' r', U']","[F': e, l' U l]","[e, l' U l]","[eu': m', U l' U']","[U' 3Lw: m u' m', U']","[e: m, U l U']","[e', r' U' r]","[Lw: U', m' u m]", -"Ld","[U2, m d m']","[U', m d m']","[U, m d m']","[Dw Rw: U' r U, m']","[d' Rw: U' r U, m']","[d l': U' l' U, m']","[Dw l': U l' U', m']","[de: U l U', m']","[R de: U l U', m']","[4Uw': r', U m' U']","[R 4Uw': r', U m' U']","","","","","[Dw: U' r U, m']","[L2 Uw': m' U' m, u]","[Dw: U l' U', m']","[3Lw': 3Uw l 3Uw', m]","[U': d', m U' m']","[Lw': m, 3Uw' r 3Uw]","[Rw': U, m d m']","[Dw: U l U', m']", -"Fr","[Rw U 3Rw' U': U' r U, m']","[U' m': U m U', r]","[rm': U m U', r']","[U': U' m2 U, r]","[D: m2, U' r U]","[D': m2, U' r U]","[m2, U' r U]","[r U' r', e']","[u': m, U' r U]","[3Rw: u', m U m']","[Dw': m', U' r U]","[3Rw: u, m U m']","[r U' r', e]","[Rw: U', r e' r']","[Dw: m', U' r U]","","","","","[U': U' m U, r]","[m, U' r U]","[F: U' r' U, m']","[3Lw: U': U' r U, m']", -"Fu","[U' Rw U: m', U r' U']","[U2 Rw: U r' U', m']","[U' Rw: U r' U', m']","[U' 3Rw: U r' U', m']","[U': r2, U' m' U]","[U: l2, U m' U']","[D' U': r2, U' m' U]","[R' U: m' U m, u]","[U: m' U m, u]","[R U: m' U m, u]","[R2 U: m' U m, u]","[U': m' U' m, u']","[F: r U' r', e]","[F': l' U l, e]","[L2 U': m' U' m, u']","","","","","[F U': U' m U, r]","[F: m, U' r U]","[U': r', U' m' U]","[U: l, U m' U']", +"Lf","[U: r' e r, U2]","[U': U', r' e r]","[r' e r, U']","[3Uw': 3Uw' m2 3Uw, r]","[r: e, r U' r']","[l: e', l U l']","[m2, 3Uw' r 3Uw]","[e: r U' r', e2]","[eu': m, U' r U]","[R eu': m, U' r U]","[R' e: r U' r', e2]","","","","","[e, r U' r']","[F: e, r U' r']","[Lw': U', m' u m]","[m', 3Uw l 3Uw']","[3Uw': 3Uw' m 3Uw, r]","[m, 3Uw' r 3Uw]","[Rw': r' e r, U']","[e', l U l']", +"Lb","[U: r e' r', U2]","[U': U', r e' r']","[r e' r', U']","[D r': e', r' U' r]","[r': e', r' U' r]","[l': e, l' U l]","[D' r': e', r' U' r]","[R d'e': m', U' r' U]","[eu': m, U l' U']","[e': r' U' r, e2]","[d'e': m', U' r' U]","","","","","[Rw: r e' r', U']","[F': e, l' U l]","[e, l' U l]","[eu': m', U l' U']","[U' 3Lw: m u' m', U']","[e': m, U' r' U]","[e', r' U' r]","[Lw: U', m' u m]", +"Ld","[U2, m d m']","[U', m d m']","[U, m d m']","[Dw Rw: U' r U, m']","[d Rw: U' r U, m']","[d l': U l' U', m']","[Dw l': U l' U', m']","[de: U l U', m']","[R de: U l U', m']","[L e': r' U' r, e2]","[U d: m' U' m, d2]","","","","","[Dw: U' r U, m']","[L2 Uw': m' U' m, u]","[Dw: U l' U', m']","[3Lw': 3Uw l 3Uw', m]","[U': d', m U' m']","[Lw': m, 3Uw' r 3Uw]","[Rw': U, m d m']","[Dw: U l U', m']", +"Fr","[Rw U 3Rw' U': U' r U, m']","[U' m': U m U', r]","[rm': U m U', r']","[U': U' m2 U, r]","[D: m2, U' r U]","[D': m2, U' r U]","[m2, U' r U]","[r U' r', e']","[u': m, U' r U]","[3Rw: u', m U m']","[Dw': m', U' r U]","[3Rw: u, m U m']","[r U' r', e]","[Rw: U', r e' r']","[Dw: m', U' r U]","","","","","[U': U' m U, r]","[m, U' r U]","[F: U' r' U, m']","[3Lw U': U' r U, m']", +"Fu","[U' Rw U: m', U r' U']","[U2 Rw: U r' U', m']","[U' 3Rw: U r' U', m]","[U' 3Rw: U r' U', m']","[U': r2, U' m' U]","[U: l2, U m' U']","[D' U': r2, U' m' U]","[R' U: m' U m, u]","[U: m' U m, u]","[R U: m' U m, u]","[R2 U: m' U m, u]","[U': m' U' m, u']","[F: r U' r', e]","[F': l' U l, e]","[L2 U': m' U' m, u']","","","","","[F U': U' m U, r]","[F: m, U' r U]","[U': r', U' m' U]","[U: l, U m' U']", "Fl","[3Rw' F Rw U': m', U' l' U]","[4Rw: U' m U, l]","[U 3Rw: U' m U, l']","[U: U m2 U', l']","[D: m2, U l' U']","[D': m2, U l' U']","[m2, U l' U']","[F2: r U' r', e']","[l'm': u', m U' m']","[l' U l, e']","[Dw': m', U l' U']","[l'm': u, m U' m']","[3Lw': u, m U' m']","[l' U l, e]","[Dw: m', U l' U']","","","","","[U: U m U', l']","[m, U l' U']","[3Rw' U: U l' U', m']","[F': U l U', m']", "Fd","[U Rw' U': U' r U, m']","[U' 3Rw: U' r' U, m]","[Rw: U' r' U, m']","[D Rw: U' r U, m']","[Rw: U' r U, m']","[l': U l' U', m']","[D' Rw: U' r U, m']","[ue': U' r U, m']","[Rw': 3Uw' r' 3Uw, m']","[3Uw' r' 3Uw, m']","[Rw: 3Uw' r' 3Uw, m']","[Lw: 3Uw l 3Uw', m']","[3Uw l 3Uw', m']","[eu': U l' U', m']","[Lw': 3Uw l 3Uw', m']","","","","","[F' U': U' m U, r]","[F': m, U' r U]","[U' r' U, m']","[U l U', m']", "Bd","[U' Rw' U: m, U r U']","[U2 Rw': U r U', m]","[U' 3Rw': U r U', m']","[D U': r2, U' m U]","[U': r2, U' m U]","[U: l2, U m U']","[D' U': r2, U' m U]","[U 3Rw': U, m u m']","[U m: U, m u m']","[3Uw': r', 3Uw' m 3Uw]","[U: m U m', d]","[U m: U, m u' m']","[3Uw': r, 3Uw' m 3Uw]","[U' 3Lw: U', m u' m']","[U': m U' m', d']","[U': r, U' m U]","[F U': r, U' m U]","[U: l', U m U']","[F' U': r, U' m U]","","","","", -"Bu","[U' Rw' U': m, U' r U]","[U' 3Rw': U' r U, m']","[Rw': U' r U, m]","[D Rw': U' r' U, m]","[Rw: U' r' U, m']","[Lw: U l U', m]","[D' Rw': U' r' U, m]","[e': U' r U, m]","[Rw': 3Uw' r' 3Uw, m]","[3Uw' r' 3Uw, m]","[Rw: 3Uw' r' 3Uw, m]","[Lw: 3Uw' r 3Uw, m]","[3Uw' r 3Uw, m]","[e: U l U', m]","[Lw': 3Uw' r 3Uw, m]","[U' r U, m]","[F: U' r U, m]","[U l' U', m]","[F': U' r U, m]","","","","", -"Br","[Rw' U' 3Rw U: m, U r' U']","[U' m: U m' U', r']","[mr': U m' U', r]","[U': U' m2 U, r']","[D': m2, U' r' U]","[D': m2, U' r' U]","[m2, U' r' U]","[Rw': m' u' m, U]","[u': m, U' r' U]","[r' U' r, e]","[Dw': m', U' r' U]","[Uw': U' m' U, r']","[Rw': U', r' e r]","[r' U' r, e']","[3Rw': d, m' U m]","[F: m', U' r' U]","[U': U' m' U, r']","[3Rw' U: m', U l' U']","[m', U' r' U]","","","","", +"Bu","[U' Rw' U': m, U' r U]","[U' 3Rw': U' r U, m']","[Rw': U' r U, m]","[D Rw': U' r' U, m]","[Rw': U' r' U, m]","[Lw: U l U', m]","[D' Rw': U' r' U, m]","[e': U' r U, m]","[Rw': 3Uw' r' 3Uw, m]","[3Uw' r' 3Uw, m]","[Rw: 3Uw' r' 3Uw, m]","[Lw: 3Uw' r 3Uw, m]","[3Uw' r 3Uw, m]","[e': U' r' U, m]","[Lw': 3Uw' r 3Uw, m]","[U' r U, m]","[F: U' r U, m]","[U l' U', m]","[F': U' r U, m]","","","","", +"Br","[Rw' U' 3Rw U: m, U r' U']","[U' m: U m' U', r']","[mr': U m' U', r]","[U': U' m2 U, r']","[D: m2, U' r' U]","[D': m2, U' r' U]","[m2, U' r' U]","[Rw': m' u' m, U]","[u': m, U' r' U]","[r' U' r, e]","[Dw': m', U' r' U]","[Uw': U' m' U, r']","[Rw': U', r' e r]","[r' U' r, e']","[3Rw': d, m' U m]","[F: m', U' r' U]","[U': U' m' U, r']","[3Rw' U: m', U l' U']","[m', U' r' U]","","","","", "Bl","[U' Rw' F: l, U' m' U]","[4Rw': U' m' U, l']","[U 3Rw': U' m' U, l]","[U: U m2 U', l]","[D: m2, U l U']","[D': m2, U l U']","[m2, U l U']","[l U l', e]","[Uw: U m' U', l]","[l: U, l e' l']","[Dw': m', U l U']","[u: m, U l U']","[l U l', e']","[Lw: m' u m, U']","[Dw: m', U l U']","[3Lw U': m', U' r U]","[U: U m' U', l]","[F': m', U l U']","[m', U l U']","","","","", diff --git a/src/speedcubing/bldsheets/wings.csv b/src/speedcubing/bldsheets/wings.csv index 65f5cff..c41ab8b 100644 --- a/src/speedcubing/bldsheets/wings.csv +++ b/src/speedcubing/bldsheets/wings.csv @@ -1,24 +1,24 @@ "","URb","UBl","ULf","DRf","DFl","DLb","DBr","RBu","RUf","RFd","RDb","LFu","LUb","LBd","LDf","FRu","FUl","FLd","FDr","BLu","BUr","BRd","BDl", -"URb","","[Rw' U: R, U r U']","[Rw' U': U' R U, r]","[U Rw' U': U' R' U, r]","[3Lw: D2, r U r']","[D': r2, R U' R' U]","[r2, R U' R' U]","[R D': r, U' R' U]","[U Rw' U' Rw: U R' U', r]","[R' D': r, U' R U]","[D': r, R U' R' U]","[U', R' u' R]","[U' 3Rw: U R' U', l]","[U', R d' R']","[D: r, R U' R' U]","[r': U r U', R]","[x Rw2 U: R, U r U']","[r' U: r, U L' U']","[r, R U' R' U]","[Uw': R' u' R, U]","[r', R' U' R U]","[r' U r U', R']","[U': l, Rw' U R U']", -"UBl","[Rw' U: U r U', R]","","[Rw' U2: r, R U' R' U]","[Rw' U: U r U', R']","[D Rw' U: U r U', R']","[Lw' U: L', U l U']","[D' Rw' U: U r U', R']","[U R' U': r', U' R U]","[3Rw' U': U' r2 U, R]","[Rw': D', r U2 r']","[r' D' r, U2]","[U': R' u' R, U2]","[Rw' U2 Rw: r, U R' U']","[U': R d' R', U2]","[r' D r, U2]","[r' U: U r U', R]","[Rw' D: l, U' R2 U]","[Rw' U': U' r U, L']","[U2, l' D2 l]","[Rw' U': U' r U, L]","[Rw': l' D2 l, U2]","[Rw' U: r, R U' R' U]","[r' D2 r, U2]", -"ULf","[Rw' U': r, U' R U]","[Rw' U2: R U R' U', r]","","[Rw' U': r, U' R' U]","[D Rw' U': r, U' R' U]","[U' D': R U' R' U, r2]","[U': R U' R' U, r2]","[R' U': R' U' R U, r']","[U': R' U' R U, r']","[R U': R' U' R U, r']","[U' D': R U' R', r]","[U': R' u' R, U']","[Rw' U' l': U2, l' D2 l]","[U': R d' R', U']","[U' D: R U' R' U, r]","[r' U': r, U' R U]","[Rw' U' Rw: r, U R' U']","[3Rw': U' r U, L']","[U': R U' R' U, r]","[3Rw': U' r U, L]","[3Lw: U L' U', r]","[U': R', r' U r U']","[3Rw' U2: R U' R' U, r]", -"DRf","[U Rw' U': r, U' R' U]","[Rw' U: R', U r U']","[Rw': U': U' R' U, r]","","[U': U' l2 U, R2]","[R D': r2, U' R U]","[Rw r: U' R U, r2]","[R D': r, U' R U]","[R: R U' R', u]","[R' D': r, U' R' U]","[D' Rw D: U' R2 U, r']","[3Lw' U: U, R u' R']","[U' D' 3Rw: l', U R' U']","[R': R' U' R, d']","[R D: U' R U, r]","[D: U' R U, r2]","[r: U2, r D r']","[D: U L' U', r2]","[Rw: U' R U, r']","[D: U L U', r2]","[R': r', U' R' U]","[D: U' R' U, r2]","[U': U' l U, R2]", -"DFl","[Lw: U, r' D2 r]","[D Rw' U: R', U r U']","[D Rw' U': U' R' U, r]","[U': R2, U' l2 U]","","[Lw U: L, U l U']","[D R D': r2, U' R U]","[r U: R', U l' U']","[Rw U: R', U l' U']","[r U: R, U l' U']","[Rw U: R, U l' U']","[Rw U': L', U' l' U]","[U' 3Rw: l', U R' U']","[Rw U': L, U' l' U]","[D Rw: U' R U, r']","[U': R, U' l2 U]","[r: U2, r D2 r']","[U': L', U l2 U']","[Rw D: U' R2 U, r']","[U: L, U l2 U']","[D R': r', U' R' U]","[U': R', U' l2 U]","[U' 3Rw': l, U R U']", +"URb","","[Rw' U: R, U r U']","[Rw' U': U' R U, r]","[U Rw' U': U' R' U, r]","[3Lw: D2, r U r']","[D': r2, R U' R' U]","[r2, R U' R' U]","[R D': r, U' R' U]","[U Rw' U' Rw: U R' U', r]","[R' D': r, U' R U]","[D': r, R U' R' U]","[U', R' u' R]","[U' Rw: U R' U', l']","[U', R d' R']","[D: r, R U' R' U]","[r': U r U', R]","[x Rw2 U: R, U r U']","[r' U: r, U L' U']","[r, R U' R' U]","[Uw': R' u' R, U]","[r', R' U' R U]","[r' U r U', R']","[U': Rw' U R U', l]", +"UBl","[Rw' U: U r U', R]","","[Rw' U2: r, R U' R' U]","[Rw' U: U r U', R']","[D Rw' U: U r U', R']","[Lw' U: L', U l U']","[D' Rw' U: U r U', R']","[U R' U': r', U' R U]","[3Rw' U': U' r2 U, R]","[Rw': D', r U2 r']","[r' D' r, U2]","[U': R' u' R, U2]","[Rw' U2 Rw: r, U R' U']","[U': R d' R', U2]","[r' D r, U2]","[r' U: U r U', R]","[Rw' D: l, U' R2 U]","[Rw' U': U' r U, L']","[U2, l' D2 l]","[Rw' U': U' r U, L]","[Rw': l' D2 l, U2]","[Rw' U: R U' R' U, r]","[r' D2 r, U2]", +"ULf","[Rw' U': r, U' R U]","[Rw' U2: R U' R' U, r]","","[Rw' U': r, U' R' U]","[D Rw' U': r, U' R' U]","[U' D': R U' R' U, r2]","[U': R U' R' U, r2]","[R' U': R' U' R U, r']","[U': R' U' R U, r']","[R U': R' U' R U, r']","[U' D': R U' R' U, r]","[U': R' u' R, U']","[Rw' U' l': U2, l' D2 l]","[U': R d' R', U']","[U' D: R U' R' U, r]","[r' U': r, U' R U]","[Rw' U' Rw: r, U R' U']","[3Rw': U' r U, L']","[U': R U' R' U, r]","[3Rw': U' r U, L]","[3Lw: U L' U', r]","[U': R', r' U r U']","[3Rw' U2: R U' R' U, r]", +"DRf","[U Rw' U': r, U' R' U]","[Rw' U: R', U r U']","[Rw' U': U' R' U, r]","","[U': U' l2 U, R2]","[R D': r2, U' R U]","[Rw r: U' R U, r2]","[R D': r, U' R U]","[R: R U' R', u]","[R' D': r, U' R' U]","[D' Rw D: U' R2 U, r']","[3Lw' U: U, R u' R']","[U' D' 3Rw: l', U R' U']","[R': R' U' R, d']","[R D: r, U' R U]","[D: U' R U, r2]","[r: U2, r D r']","[D: U L' U', r2]","[Rw: U' R U, r']","[D: U L U', r2]","[R': r', U' R' U]","[D: U' R' U, r2]","[U': U' l U, R2]", +"DFl","[Lw: U, r' D2 r]","[D Rw' U: R', U r U']","[D Rw' U': U' R' U, r]","[U': R2, U' l2 U]","","[Lw U: L, U l U']","[D R D': r2, U' R U]","[r U: R', U l' U']","[Rw U: R', U l' U']","[r U: R, U l' U']","[Rw U: R, U l' U']","[Rw U': L', U' l' U]","[U' 3Rw: l', U R' U']","[Rw U': L, U' l' U]","[D Rw: U' R U, r']","[U': R, U' l2 U]","[r: U2, r D2 r']","[U: L', U l2 U']","[Rw D: U' R2 U, r']","[U: L, U l2 U']","[D R': r', U' R' U]","[U': R', U' l2 U]","[U' 3Rw': l, U R U']", "DLb","[D': R U' R' U, r2]","[Lw' U: U l U', L']","[U' D': r2, R U' R' U]","[R D': U' R U, r2]","[Lw U: U l U', L]","","[D': U' R2 U, r2]","[D' r: U R' U', r2]","[Rw D': U R' U', r']","[D' r: U R U', r2]","[Rw D': U R U', r']","[Rw D': U' L' U, r']","[U' D 3Rw: l', U R' U']","[L' D: r, U L' U']","[D Rw D: U' R2 U, r']","[D': U' R U, r2]","[r: U2, r D' r']","[D' r2 D, L]","[3Lw': U L' U', r']","[D' r2 D, L']","[3Lw: U L U', r]","[D': U' R' U, r2]","[D2 Rw: U' R U, r']", -"DBr","[R U' R' U, r2]","[D' Rw' U: R', U r U']","[U': r2, R U' R' U]","[R: U' R U, r2]","[D R D': U' R U, r2]","[D': r2, U' R2 U]","","[r: U R' U', r2]","[Rw: U R' U', r2]","[r: U R U', r2]","[D' Rw: U' R U, r']","[r: U' L' U, r2]","[3Lw': U' L U, r2]","[r: U' L U, r2]","[3Lw': U' L' U, r2]","[U' R U, r2]","[D r: U2, r D' r']","[U L' U', r2]","[U' Rw: r, U' R' U]","[U L U', r2]","[D' R2': U' R' U, r]","[U' R' U, r2]","[U' r: r U r', D2]", +"DBr","[R U' R' U, r2]","[D' Rw' U: R', U r U']","[U': r2, R U' R' U]","[R: U' R U, r2]","[D R D': U' R U, r2]","[D': r2, U' R2 U]","","[r: U R' U', r2]","[Rw: U R' U', r2]","[r: U R U', r2]","[D' Rw: U' R U, r']","[r: U' L' U, r2]","[3Lw': U' L U, r2]","[r: U' L U, r2]","[3Lw': U' L' U, r2]","[U' R U, r2]","[D r: U2, r D' r']","[U L' U', r2]","[U' Rw: r, U' R' U]","[U L U', r2]","[D' Rw': U' R' U, r]","[U' R' U, r2]","[U' r: r U r', D2]", "RBu","[R D': U' R' U, r]","[U R' U': U' R U, r']","[R' U': r', R' U' R U]","[R D': U' R U, r]","[r U: U l' U', R']","[D' r': U R' U', r2]","[r': U R' U', r2]","","[R U R': R', U' r U]","[U R': U' r U, R2]","[U R': U' r U, R']","[u: R U' R', u2]","[Rw2 U: U R U', r']","[3Lw U: U R' U', r2]","[D r: r, U R' U']","[u, R U' R']","[Rw2 U': R, U' r' U]","[R D': U L' U', r]","[r: r, U R' U']","[u', L U L']","[U R' U', r]","[Uw2 R': R' u' R, U]","[D' U R': U' r U, R']", -"RUf","[U Rw' U' Rw: r, U R' U']","[3Rw' U': R, U' r2 U]","[U': r', R' U' R U]","[R: u, R U' R']","[Rw U: U l' U', R']","[Rw D': r', U R' U']","[Rw: r2, U R' U']","[R U R': U' r U, R']","","[R' U R: U' r U, R]","[D' Rw: r, U R' U']","[U' Rw': u', R U' R']","[Rw' U: U R U', r2]","[x' U: U R U', r2]","[D Rw: r, U R' U']","[F: R, U' r2 U]","[Rw' U': R, U' r2 U]","[L' U': r', R' U' R U]","[Rw: r, U R' U']","[Rw: R' U R, u]","[R U R' U', r]","[Rw D: U R' U', r']","[3Rw U: U l' U', R']", -"RFd","[R' D': U' R U, r]","[R': U2, r' D r]","[R U': r', R' U' R U]","[R' D': U' R' U, r]","[r U: U l' U', R]","[D' r': U R U', r2]","[r': U R U', r2]","[U R: U' r U, R2]","[R' U R: R, U' r U]","","[U R: U' r U, R]","[R' D' Rw: U' L' U, r]","[Rw2 U: U R' U', r']","[3Lw U: U R U', r2]","[D r: r, U R U']","[Uw R Uw': U' R U, r']","[r' U': R, U' r2 U]","[d', L' U L]","[r: r, U R U']","[Uw R: U' r U, R2]","[U R U', r]","[R': R' u R, U']","[D' U R: U' r U, R]", +"RUf","[U Rw' U' Rw: r, U R' U']","[3Rw' U': R, U' r2 U]","[U': r', R' U' R U]","[R: u, R U' R']","[Rw U: U l' U', R']","[Rw D': r', U R' U']","[Rw: r2, U R' U']","[R U R': U' r U, R']","","[R' U R: U' r U, R]","[D' Rw: r, U R' U']","[U' Rw': u', R U' R']","[Rw' U: U R U', r2]","[x' U: U R U', r2]","[D Rw: r, U R' U']","[F: R, U' r2 U]","[Rw' U': R, U' r2 U]","[L' U': r', R' U' R U]","[Rw: r, U R' U']","[Rw: R' U R, u]","[R U R' U', r]","[Rw D: r', U R' U']","[3Rw U: U l' U', R']", +"RFd","[R' D': U' R U, r]","[R': U2, r' D' r]","[R U': r', R' U' R U]","[R' D': U' R' U, r]","[r U: U l' U', R]","[D' r': U R U', r2]","[r': U R U', r2]","[U R: U' r U, R2]","[R' U R: R, U' r U]","","[U R: U' r U, R]","[R' D' Rw: U' L' U, r]","[Rw2 U: U R' U', r']","[3Lw U: U R U', r2]","[D r: r, U R U']","[Uw R Uw': U' R U, r']","[r' U': R, U' r2 U]","[d', L' U L]","[r: r, U R U']","[Uw R: U' r U, R2]","[U R U', r]","[R': R' u R, U']","[D' U R: U' r U, R]", "RDb","[D': R U' R' U, r]","[U2, r' D' r]","[U' D': r, R U' R' U]","[D' Rw D: r', U' R2 U]","[Rw U: U l' U', R]","[Rw D': r', U R U']","[D' R: U' R U, r]","[U R': R', U' r U]","[D' Rw: U R' U', r]","[U R: R, U' r U]","","[D' Rw: U' L' U, r]","[Rw' U: U R' U', r2]","[D' Rw: U' L U, r]","[U D': r U' r', D2]","[D': U' R U, r]","[l': l' D l, U2]","[D': U L' U', r]","[Rw: r, U R U']","[Uw R': R', U' r U]","[R: U R U', r]","[D': U' R' U, r]","[D, l U2 l']", "LFu","[R' u' R, U']","[U: R' u' R, U2]","[U': U', R' u' R]","[3Lw' U: R u' R', U]","[Rw U': U' l' U, L']","[Rw D': r', U' L' U]","[r': U' L' U, r2]","[u': R U' R', u2]","[U' r': U', R' u' R]","[R' D' Rw: r, U' L' U]","[D' Rw: r, U' L' U]","","[3Rw': L', U r2 U']","[U' L': U r U', L2]","[L, D r' D']","[u', R U' R']","[Rw' U: L', U r2 U']","[u x': U' r U, L2]","[Rw: r, U' L' U]","[u, L U L']","[U' L' U, r]","[R': R' u' R, U']","[Uw': U' l U, R]", -"LUb","[U' Rw: U R' U', l]","[Rw' U2 Rw: U R' U', r]","[Rw' U' l': l' D2 l, U2]","[U' D' 3Rw: U R' U', l']","[U' 3Rw: U R' U', l']","[U' D 3Rw: U R' U', l']","[3Lw: U' L' U, r2]","[Rw2 U: r', U R U']","[Rw' U: r2, U R U']","[Rw2 U: r', U R' U']","[Rw' U: r2, U R' U']","[3Rw': U r2 U', L']","","[3Rw': U r2 U', L]","[D: r, F' L F]","[Rw U: R U R' U', r]","[Rw2: U', l D2 l']","[F': L', U r2 U']","[r, F' L F]","[L U': U', R' u' R]","[Lw': U' L U, r]","[R' U' Rw: U R' U', l']","[3Rw' U2 Rw: U R' U', r]", +"LUb","[U' 3Rw: U R' U', l]","[Rw' U2 Rw: U R' U', r]","[Rw' U' l': l' D2 l, U2]","[U' D' 3Rw: U R' U', l']","[U' 3Rw: U R' U', l']","[U' D 3Rw: U R' U', l']","[3Lw: U' L' U, r2]","[Rw2 U: r', U R U']","[Rw' U: r2, U R U']","[Rw2 U: r', U R' U']","[Rw' U: r2, U R' U']","[3Rw': U r2 U', L']","","[3Rw': U r2 U', L]","[D: r, F' L F]","[Rw U: R U R' U', r]","[Rw2: U', l D2 l']","[F': L', U r2 U']","[r, F' L F]","[L U': U', R' u' R]","[Lw': U' L U, r]","[R' U' 3Rw: U R' U', l]","[3Rw' U2 Rw: U R' U', r]", "LBd","[R d' R', U']","[U: R d' R', U2]","[U': U', R d' R']","[R': d', R' U' R]","[Rw U': U' l' U, L]","[L' D: U L' U', r]","[r': U' L U, r2]","[3Lw U: r2, U R' U']","[x' U: r2, U R U']","[3Lw U: r2, U R U']","[D' Rw: r, U' L U]","[U' L: U r U', L2]","[x': U r2 U', L']","","[L', D r' D']","[R: R d' R', U']","[Lw': l' D' l, U2]","[d, L' U L]","[Rw: r, U' L U]","[Uw' L: U r U', L2]","[U' L U, r]","[d', R' U' R]","[D2 Rw: r, U' L U]", -"LDf","[D: R U' R' U, r]","[U2, r' D r]","[U' D: r, R U' R' U]","[R D: r, U' R U]","[D R: U' R U, r]","[D Rw D: r', U' R2 U]","[3Lw': r2, U' L' U]","[D r: U R' U', r]","[D Rw: U R' U', r]","[D r: U R U', r]","[U D: r U' r', D2]","[D r' D', L]","[D: F' L F, r]","[D r' D', L']","","[D: U' R U, r]","[l': l' D' l, U2]","[D: U L' U', r]","[U: D, r U' r']","[D: U L U', r]","[Lw': U' L' U, r]","[D: U' R' U, r]","[D', l U2 l']", +"LDf","[D: R U' R' U, r]","[U2, r' D r]","[U' D: r, R U' R' U]","[R D: U' R U, r]","[D R: U' R U, r]","[D Rw D: r', U' R2 U]","[3Lw': r2, U' L' U]","[D r: U R' U', r]","[D Rw: U R' U', r]","[D r: U R U', r]","[U D: r U' r', D2]","[D r' D', L]","[D: F' L F, r]","[D r' D', L']","","[D: U' R U, r]","[l': l' D' l, U2]","[D: U L' U', r]","[U: D, r U' r']","[D: U L U', r]","[Lw': U' L' U, r]","[D: U' R' U, r]","[D', l U2 l']", "FRu","[r': R, U r U']","[r' U: R, U r U']","[r' U': U' R U, r]","[D: r2, U' R U]","[U': U' l2 U, R]","[D': r2, U' R U]","[r2, U' R U]","[R U' R', u]","[F: U' r2 U, R]","[Uw R Uw': r', U' R U]","[D': r, U' R U]","[R U' R', u']","[Rw U: r, R U R' U']","[R: U', R d' R']","[D: r, U' R U]","","[Lw U': U' l2 U, R]","[L D': r2, U' R U]","[r, U' R U]","[R U' R', u2]","[r', U' R U]","[Rw': R2, U r U']","[U': U' l U, R]", "FUl","[x Rw2 U: U r U', R]","[Rw' D: U' R2 U, l]","[Rw' U' Rw: U R' U', r]","[r: r D r', U2]","[r: r D2 r', U2]","[r: r D' r', U2]","[D r: r D' r', U2]","[Rw2 U': U' r' U, R]","[Rw' U': U' r2 U, R]","[r' U': U' r2 U, R]","[l': U2, l' D l]","[Rw' U: U r2 U', L']","[Rw2: l D2 l', U']","[Lw': U2, l' D' l]","[l': U2, l' D' l]","[Lw U': R, U' l2 U]","","[Rw2 F2 Rw2: U' R' U, r']","[l': U2, l' D2 l]","[Lw2 U: L', U l U']","[Rw: U2, l D2 l']","[Rw: U2, l D' l']","[D' l': U2, l' D l]", "FLd","[r' U: U L' U', r]","[Rw' U': L', U' r U]","[3Rw': L', U' r U]","[D: r2, U L' U']","[U: U l2 U', L']","[L, D' r2 D]","[r2, U L' U']","[R D': r, U L' U']","[L' U': R' U' R U, r']","[L' U L, d']","[D': r, U L' U']","[u x': L2, U' r U]","[F': U r2 U', L']","[L' U L, d]","[D: r, U L' U']","[L D': U' R U, r2]","[Rw2 F2 Rw2: r', U' R' U]","","[r, U L' U']","[x': L2, U' r U]","[r', U L' U']","[Rw' U: U L' U', r]","[U: U l U', L']", -"FDr","[R U' R' U, r]","[l' D2 l, U2]","[U': r, R U' R' U]","[R: U' R U, r]","[Rw D: r', U' R2 U]","[Lw': U L' U', r]","[U' Rw: U' R' U, r]","[r: U R' U', r]","[Rw: U R' U', r]","[r: U R U', r]","[U: r U' r', D']","[Rw: U' L' U, r]","[F' L F, r]","[Rw: U' L U, r]","[U: r U' r', D]","[U' R U, r]","[l': l' D2 l, U2]","[U L' U', r]","","[U L U', r]","[D R: U R U', r]","[U R' U', r]","[D2, l U2 l']", +"FDr","[R U' R' U, r]","[l' D2 l, U2]","[U': r, R U' R' U]","[R: U' R U, r]","[Rw D: r', U' R2 U]","[Lw': U L' U', r]","[U' Rw: U' R' U, r]","[r: U R' U', r]","[Rw: U R' U', r]","[r: U R U', r]","[U: r U' r', D']","[Rw: U' L' U, r]","[F' L F, r]","[Rw: U' L U, r]","[U: r U' r', D]","[U' R U, r]","[l': l' D2 l, U2]","[U L' U', r]","","[U L U', r]","[D R: U R U', r]","[U' R' U, r]","[D2, l U2 l']", "BLu","[u': R' u' R, U']","[Rw' U': L, U' r U]","[x': U' r U, L']","[D: r2, U L U']","[U: U l2 U', L]","[L', D' r2 D]","[r2, U L U']","[L U L', u']","[Rw: u, R' U R]","[Uw R': U' r U, R2]","[Uw R': U' r U, R']","[L U L', u]","[L U': R' u' R, U']","[Uw' L': U r U', L2]","[D: r, U L U']","[u2, R U' R']","[Lw2 U: U l U', L']","[x': U' r U, L2]","[r, U L U']","","[r', U L U']","[3Lw U': r, U' R' U]","[U: U l U', L]", -"BUr","[R' U' R U, r']","[Rw': U2, l' D2 L]","[Lw: U L' U', r']","[R': U' R' U, r']","[D R': U' R' U, r']","[Lw: U L U', r']","[D' R': U' R' U, r']","[r, U R' U']","[r, R U R' U']","[r, U R U']","[Rw: U R U', r']","[r, U' L' U]","[3Lw': U' L U, r']","[r, U' L U]","[3Lw': U' L' U, r']","[U' R U, r']","[Rw: l D2 l', U2]","[U L' U', r']","[D Rw: U R U', r']","[U L U', r']","","[U' R' U, r']","[D' Rw: U R U', r']", -"BRd","[R', r' U r U']","[Rw' U: R U' R' U, r]","[U': r' U r U', R']","[D: r2, U' R' U]","[U': U' l2 U, R']","[D': r2, U' R' U]","[r2, U' R' U]","[Uw2 R': U, R' u' R]","[Rw D: r', U R' U']","[R': U', R' u R]","[D': r, U' R' U]","[R': U', R' u' R]","[R' U' 3Rw: U R' U', l]","[R' U' R, d']","[D: r, U' R' U]","[Rw': U r U', R2]","[Rw: l D' l', U2]","[Rw' U: r, U L' U']","[r, U' R' U]","[3Lw U': U' R' U, r]","[r', U' R' U]","","[U': U' l U, R']", -"BDl","[U': Rw' U R U', l]","[U2, r' D2 r]","[3Rw' U2: r, R U' R' U]","[U': R2, U' l U]","[U' 3Rw': U R U', l]","[D2 R: U' R U, r]","[U' r: D2, r U r']","[D' U R': R', U' r U]","[3Rw U: R', U l' U']","[D' U R: R, U' r U]","[l U2 l', D]","[Uw': R, U' l U]","[3Rw' U2 Rw: r, U R' U']","[D2 Rw: U' L U, r]","[l U2 l', D']","[U': R, U' l U]","[D' l': l' D l, U2]","[U: L', U l U']","[l U2 l', D2]","[U: L, U l U']","[D' R: U R U', r]","[U': R', U' l U]","", +"BUr","[R' U' R U, r']","[Rw': U2, l' D2 l]","[Lw: U L' U', r']","[R': U' R' U, r']","[D R': U' R' U, r']","[Lw: U L U', r']","[D' R': U' R' U, r']","[r, U R' U']","[r, R U R' U']","[r, U R U']","[Rw: U R U', r']","[r, U' L' U]","[3Lw': U' L U, r']","[r, U' L U]","[3Lw': U' L' U, r']","[U' R U, r']","[Rw: l D2 l', U2]","[U L' U', r']","[D Rw: U R U', r']","[U L U', r']","","[U' R' U, r']","[D' Rw: U R U', r']", +"BRd","[R', r' U r U']","[Rw' U: r, R U' R' U]","[U': r' U r U', R']","[D: r2, U' R' U]","[U': U' l2 U, R']","[D': r2, U' R' U]","[r2, U' R' U]","[Uw2 R': U, R' u' R]","[Rw D: U R' U', r']","[R': U', R' u R]","[D': r, U' R' U]","[R': U', R' u' R]","[R' U' Rw: U R' U', l']","[R' U' R, d']","[D: r, U' R' U]","[Rw': U r U', R2]","[Rw: l D' l', U2]","[Rw' U: r, U L' U']","[r, U' R' U]","[3Lw U': U' R' U, r]","[r', U' R' U]","","[U': U' l U, R']", +"BDl","[U': l, Rw' U R U']","[U2, r' D2 r]","[3Rw' U2: r, R U' R' U]","[U': R2, U' l U]","[U' 3Rw': U R U', l]","[D2 R: U' R U, r]","[U' r: D2, r U r']","[D' U R': R', U' r U]","[3Rw U: R', U l' U']","[D' U R: R, U' r U]","[l U2 l', D]","[Uw': R, U' l U]","[3Rw' U2 Rw: r, U R' U']","[D2 Rw: U' L U, r]","[l U2 l', D']","[U': R, U' l U]","[D' l': l' D l, U2]","[U: L', U l U']","[l U2 l', D2]","[U: L, U l U']","[D' R: U R U', r]","[U': R', U' l U]","", diff --git a/src/speedcubing/bldsheets/xcenters.csv b/src/speedcubing/bldsheets/xcenters.csv index 1f90f44..b8e70eb 100644 --- a/src/speedcubing/bldsheets/xcenters.csv +++ b/src/speedcubing/bldsheets/xcenters.csv @@ -1,24 +1,24 @@ "","Ubr","Ufl","Ufr","Dfr","Dfl","Dbl","Dbr","Rub","Ruf","Rdf","Rdb","Luf","Lub","Ldb","Ldf","Fur","Ful","Fdl","Fdr","Bul","Bur","Bdr","Bdl", -"Ubr","","","","[r2, D' l2 D]","[D r2 D', l2]","[D: D r2 D', l2]","[D': r2, D' l2 D]","[U, r' u r]","[l u l', U']","[U, r d r']","[l' d l, U']","[U, r' u' r]","[l u' l', U']","[U, r d' r']","[U: U, r' d r]","[l': U' l U, r]","[3Rw: U r' U', l]","[U2 3Rw: U' r' U, l]","[3Rw U': r', U' l U] or see below","[U2 Rw': U' r U, l]","[U', l u2 l']","[l': U' l U, r']","[3Rw': U r U', l']", -"Ufl","","","","[U: D' l2 D, r2]","[U: l2, D r2 D']","[U': D' r2 D, l2]","[U': r2, D l2 D']","[U: r' u r, U]","[l u l', U]","[U, l d' l']","[U': U', r' d' r]","[U: r' u' r, U]","[l u' l', U]","[U', l d l']","[U': U', r' d r]","[Uw: r' u' r, U]","[U Rw: U r' U', l']","[U' 3Rw: U' r' U, l]","[U' l': U l U', r]","[U' 3Rw': U' r U, l']","[l u2 l', U2]","[U M: U' l' U, r]","[U Rw': U r U', l]", -"Ufr","","","","[l U': U' l' U, r2]","[Rw' F': l2, U r U']","[Rw' U': l2, U' r U]","[D Rw' U': l2, U' r U]","[U: r' u r, U2]","[U2, r u' r']","[R': U2, r' d' r]","[U2, r' d' r]","[U: r' u' r, U2]","[U2, r u r']","[U r d' r', U2]","[U2, r' d r]","[L' U': U' l U, r]","[U2, r u2 r']","[Rw' U': l', U' r U]","[U' Lw U: U l' U', r]","[U: r' U2 r, U2]","[l u2 l', U2]","[l' U': U' l' U', r']","[Rw' F': l, U r U']", +"Ubr","","","","[r2, D' l2 D]","[D r2 D', l2]","[D: D r2 D', l2]","[D': r2, D' l2 D]","[U, r' u r]","[l u l', U']","[U, r d r']","[l' d l, U']","[U, r' u' r]","[l u' l', U']","[U, r d' r']","[U: U, r' d r]","[l': U' l U, r]","[3Rw: U r' U', l]","[U2 Rw: U' r' U, l']","[U2 M': U l U', r']","[U2 Rw': U' r U, l]","[l u2 l', U']","[l': U' l U, r']","[3Rw': U r U', l']", +"Ufl","","","","[U: D' l2 D, r2]","[U: l2, D r2 D']","[U': D' r2 D, l2]","[U': r2, D l2 D']","[U: r' u r, U]","[l u l', U]","[U', l d' l']","[U': U', r' d' r]","[U: r' u' r, U]","[l u' l', U]","[U', l d l']","[U': U', r' d r]","[Uw: r' u' r, U]","[U Rw: U r' U', l']","[U' 3Rw: U' r' U, l]","[U' l': U l U', r]","[U' 3Rw': U' r U, l']","[l u2 l', U]","[U M: U' l' U, r]","[U Rw': U r U', l]", +"Ufr","","","","[l U': U' l' U, r2]","[Rw' F': l2, U r U']","[Rw' U': l2, U' r U]","[D Rw' U': l2, U' r U]","[U: r' u r, U2]","[U2, r u' r']","[R': U2, r' d' r]","[U2, r' d' r]","[U: r' u' r, U2]","[U2, r u r']","[U r d' r', U2]","[U2, r' d r]","[l' U': U' l U, r]","[U2, r u2 r']","[Rw' U': l', U' r U]","[U' Lw U: U l' U', r]","[Rw' U': l, U' r U]","[l u2 l', U2]","[l' U': U' l U, r']","[Rw' F': l, U r U']", "Dfr","[D' l2 D, r2]","[U: r2, D' l2 D]","[l U': r2, U' l' U]","","","","","[D': Uw r Uw', l2]","[Rw: r U r', u]","[Rw2: U, r' u r]","[R' D': Uw r Uw', l2]","[Rw: r U r', u']","[u' 3Rw: U r U', l]","[Rw': r' U r, d']","[D Rw: r U2 r', d]","[D': U r U', l2]","[3Rw: U r U', l]","[3Rw U: U r U', l]","[3Rw U': r, U' l U]","[3Rw' U: U r' U', l']","[3Rw' U': r', U' l' U]","[D': U r' U', l2]","[3Rw': U r' U', l']", -"Dfl","[l2, D r2 D']","[U: D r2 D', l2]","[Rw' F': U r U', l2]","","","","","[Uw r Uw': l2]","[R: Uw r Uw', l2]","[Rw2: Uw r Uw']","[R': Uw r Uw', l2]","[u': U r U', l2]","[U l': l' U' l, u']","[3Uw: r', U' l2 U]","[Fw: l' u l, U']","[U r U', l2]","[D Rw: U r U', l']","[F2: U r U', l2]","[F': U r U', l2]","[D 3Rw' U: U r' U', l']","[D' U': U' r' U, l2]","[U r' U', l2]","[D 3Rw': U r' U', l']", -"Dbl","[D: l2, D r2 D']","[U': l2, D' r2 D]","[Rw' U': U' r U, l2]","","","","","[D: Uw r Uw', l2]","[Uw': U' r' U, l2]","[Dw: U r' U, l2]","[R' D: Uw r Uw', l2]","[Uw' F: U' r U, l2]","[D' Rw': r' U2 r, u]","[U l': l' U l, d]","[3Uw': U' r U, l2]","[D: U r U', l2]","[Uw2: r', U l2 U']","[U' D' 3Rw: U' r U, l]","[U': U' r U, l2]","[D' U': l, U' r2 U]","[U': U' r' U, l2]","[D: U r' U', l2]","[D2 3Rw': U r' U', l']", -"Dbr","[D': D' l2 D, r2]","[U': D l2 D', r2]","[D Rw' U': U' r U, l2]","","","","","[Uw': l, Uw' r2 Uw]","[R Uw': l, U' r2 U]","[R2 Uw': l, Uw' r2 Uw]","[R' Uw': l, Uw' r2 Uw]","[D' Rw: r U r', u']","[Rw': r' U2 r, u]","[3Uw': l', U r2 U']","[Rw: r U2 r', d]","[D2: U r U', l2]","[D' 3Rw: U r U', l]","[U' 3Rw: U' r U, l]","[U' 3Rw: U l U', r]","[U': l, U' r2 U]","[D U': U' r' U, l2]","[D2: U r' U', l2]","[D' 3Rw': U r' U', l']", -"Rub","[r' u r, U]","[U: U, r' u r]","[U': r' u r, U2]","[D': Uw r Uw', l2]","[l2, Uw r Uw']","[D: l2, Uw r Uw']","[Uw': Uw' r2 Uw, l]","","","","","[u: r U r', u2]","[R' u': r' U2 r, u2]","[R' 3Uw: r', U' l' U]","[3Uw: U' l U, r]","[u, r U r']","[l', Uw r Uw']","[F: l', Uw r Uw']","[Uw': Uw' r Uw, l]","[u: r U r', u]","[Rw': U2, l u l']","[Rw': U', l' u l]","[l, Uw r Uw']", -"Ruf","[U', l u l']","[U, l u l']","[r u' r', U2]","[Rw: u, r U r']","[R: Uw r Uw', l2]","[Uw': l2, U' r' U]","[R Uw': Uw' r2 Uw, l]","","","","","[R u: r U r', u2]","[u': r' U2 r, u2]","[3Uw: r', U' l' U]","[R 3Uw: U' l U, r]","[R: u, r U r']","[3Rw: Uw r Uw', l]","[Uw': l', U' r' U]","[Rw U': r' u r, U2]","[U': l, Uw' r' Uw]","[u', r' U2 r]","[Uw: r', U' l' U]","[Rw: l, Uw r Uw']", -"Rdf","[r d r', U]","[l d' l', U']","[Rw': d', r U2 r']","[Rw2: r' u r, U]","[3Rw2: Uw r Uw', l2]","[Dw: l2, U r' U']","[R2 Uw': Uw' r2 Uw, l2]","","","","","[R2 u: r U r', u2]","[R u': r' U2 r, u2]","[d: r' U2 r, d2]","[R' d': r U2 r', d2]","[R2: u, r U r']","[R2: l', Uw r Uw']","[R Uw': l', U' r' U]","[R': d', r U2 r']","[R2 u: r U r', u]","[R: u', r' U2 r]","[d, r' U r]","[R2: l, Uw r Uw']", -"Rdb","[U', l' d l]","[U': r' d' r, U']","[r' d' r, U2]","[R' D': l2, Uw r Uw']","[R': l2, Uw r Uw']","[R' D: l2, Uw r Uw']","[R' Uw': Uw' r2 Uw, l]","","","","","[R' u: r U r', u2]","[R2 u': r' U2 r, u2]","[R d: r' U2 r, d2]","[d': r U2 r', d2]","[R': u, r U r']","[Rw': l', Uw r Uw']","[F': d', r U2 r']","[d', r U2 r']","[R' u: r U r', u]","[Rw' U': r' u r, U2]","[Rw', r' u r, U]","[3Rw': Uw r Uw', l']", -"Luf","[r' u' r, U]","[U: U, r' u' r]","[U': r' u' r, U2]","[Rw: u', r U r']","[u': l2, U r U']","[Uw' F: l2, U' r U]","[D' Rw: u', r U r']","[u': r U r', u2]","[R u': r U r', u2]","[R2 u': r U r', u2]","[R' u': r U r', u2]","","","","","[u', r U r']","[F: u', r U r']","[F2: u', r U' r']","[F': u', r U r']","[Uw: l U2 l', u']","[U2: r', Uw l Uw']","[Rw': r' u' r, U]","[u': l, U r U']", -"Lub","[U', l u' l']","[U, l u' l']","[r u r', U2]","[u' Rw: U r U', l']","[U l': u', l' U' l]","[D' Rw': u, r' U2 r]","[Rw': u, r' U2 r]","[R' u: r' U2 r, u2]","[u': r' U2 r, u2]","[R u: r' U2 r, u2]","[R2 u: r' U2 r, u2]","","","","","[U: r, Uw' l' Uw]","[U: u', l' U' l]","[z U': Uw r Uw', l']","[Rw: r u r', U2]","[3Rw' U2: r' U' r, u']","[u, r' U2 r]","[Rw': U', l u' l']","[3Rw' U: l' U' l, u']", -"Ldb","[r d' r', U]","[l d l', U']","[U': r d' r', U2]","[Rw': d', r' U r]","[3Uw: U' l2 U, r']","[U l': d, l' U2 l]","[3Uw': U' r2 U, l']","[R' 3Uw: U' l' U, r']","[3Uw: U' l' U, r']","[d': r' U2 r, d2]","[R d': r' U2 r, d2]","","","","","[Rw: r d' r', U]","[S: Uw r Uw', l']","[z: Uw r Uw', l']","[Rw U': r d' r', U2]","[L2 u': r U r', u']","[Rw' U': r d' r', U2]","[d', r' U r]","[S: Uw r Uw', l]", +"Dfl","[l2, D r2 D']","[U: D r2 D', l2]","[Rw' F': U r U', l2]","","","","","[Uw r Uw', l2]","[R: Uw r Uw', l2]","[Rw2: Uw r Uw', l2]","[R': Uw r Uw', l2]","[u': U r U', l2]","[U l': l' U' l, u']","[3Uw: r', U' l2 U]","[Fw: l' u l, U']","[U r U', l2]","[D 3Rw: U r U', l]","[F2: U r U', l2]","[F': U r U', l2]","[D 3Rw' U: U r' U', l']","[D' U': U' r' U, l2]","[U r' U', l2]","[D 3Rw': U r' U', l']", +"Dbl","[D: l2, D r2 D']","[U': l2, D' r2 D]","[Rw' U': U' r U, l2]","","","","","[D: Uw r Uw', l2]","[Uw': U' r' U, l2]","[Dw: U r' U', l2]","[R' D: Uw r Uw', l2]","[Uw' F: U' r U, l2]","[D' Rw': r' U2 r, u]","[U l': l' U2 l, d]","[3Uw': U' r U, l2]","[D: U r U', l2]","[Uw2: r', Uw l2 Uw']","[U' D' 3Rw: U' r U, l]","[U': U' r U, l2]","[D' U': l, U' r2 U]","[U': U' r' U, l2]","[D: U r' U', l2]","[D2 3Rw': U r' U', l']", +"Dbr","[D': D' l2 D, r2]","[U': D l2 D', r2]","[D Rw' U': U' r U, l2]","","","","","[Uw': l, Uw' r2 Uw]","[R Uw': l, U' r2 U]","[R2 Uw': l, Uw' r2 Uw]","[R' Uw': l, Uw' r2 Uw]","[D' Rw: r U r', u']","[Rw': r' U2 r, u]","[3Uw': l', U' r2 U]","[Rw: r U2 r', d]","[D2: U r U', l2]","[D' 3Rw: U r U', l]","[U' 3Rw: U' r U, l]","[U' 3Rw: r, U l U']","[U': l, U' r2 U]","[D U': U' r' U, l2]","[D2: U r' U', l2]","[D' 3Rw': U r' U', l']", +"Rub","[r' u r, U]","[U: U, r' u r]","[U': r' u r, U2]","[D': l2, Uw r Uw']","[l2, Uw r Uw']","[D: l2, Uw r Uw']","[Uw': Uw' r2 Uw, l]","","","","","[u: r U r', u2]","[R' u': r' U2 r, u2]","[R' 3Uw: r', U' l' U]","[3Uw: U' l U, r]","[u, r U r']","[l', Uw r Uw']","[F: l', Uw r Uw']","[Uw': Uw' r Uw, l]","[u: r U r', u]","[Rw': U2, l u l']","[Rw': U', l u l']","[l, Uw r Uw']", +"Ruf","[U', l u l']","[U, l u l']","[r u' r', U2]","[Rw: u, r U r']","[R: l2, Uw r Uw']","[Uw': l2, U' r' U]","[R Uw': Uw' r2 Uw, l]","","","","","[R u: r U r', u2]","[u': r' U2 r, u2]","[3Uw: r', U' l' U]","[R 3Uw: U' l U, r]","[R: u, r U r']","[3Rw: Uw r Uw', l]","[Uw': l', U' r' U]","[Rw U': r' u r, U2]","[U': l, Uw' r' Uw]","[u', r' U2 r]","[Uw: r', U' l' U]","[Rw: l, Uw r Uw']", +"Rdf","[r d r', U]","[l d' l', U']","[Rw': d', r U2 r']","[Rw2: r' u r, U]","[3Rw2: Uw r Uw', l2]","[Dw: l2, U r' U']","[R2 Uw': Uw' r2 Uw, l]","","","","","[R2 u: r U r', u2]","[R u': r' U2 r, u2]","[d: r' U r, d2]","[R' d': r U2 r', d2]","[R2: u, r U r']","[R2: l', Uw r Uw']","[R Uw': l', U' r' U]","[R': d', r U2 r']","[R2 u: r U r', u]","[R: u', r' U2 r]","[d, r' U r]","[R2: l, Uw r Uw']", +"Rdb","[U', l' d l]","[U': r' d' r, U']","[r' d' r, U2]","[R' D': l2, Uw r Uw']","[R': l2, Uw r Uw']","[R' D: l2, Uw r Uw']","[R' Uw': Uw' r2 Uw, l]","","","","","[R' u: r U r', u2]","[R2 u': r' U2 r, u2]","[R d: r' U r, d2]","[d': r U2 r', d2]","[R': u, r U r']","[Rw': l', Uw r Uw']","[F': d', r U2 r']","[d', r U2 r']","[R' u: r U r', u]","[Rw' U': r' u r, U2]","[Rw': r' u r, U]","[3Rw': Uw r Uw', l']", +"Luf","[r' u' r, U]","[U: U, r' u' r]","[U': r' u' r, U2]","[Rw: u', r U r']","[u': l2, U r U']","[Uw' F: l2, U' r U]","[D' Rw: u', r U r']","[u': r U r', u2]","[R u': r U r', u2]","[R2 u': r U r', u2]","[R' u': r U r', u2]","","","","","[u', r U r']","[F: u', r U r']","[F2: u', r U r']","[F': u', r U r']","[Uw: l U2 l', u']","[U2: r', Uw l Uw']","[Rw': r' u' r, U]","[u': l, U r U']", +"Lub","[U', l u' l']","[U, l u' l']","[r u r', U2]","[u' Rw: U r U', l']","[U l': u', l' U' l]","[D' Rw': u, r' U2 r]","[Rw': u, r' U2 r]","[R' u: r' U2 r, u2]","[u: r' U2 r, u2]","[R u: r' U2 r, u2]","[R2 u: r' U2 r, u2]","","","","","[U: r, Uw' l' Uw]","[U: u', l' U' l]","[z U': Uw r Uw', l']","[Rw: r u r', U2]","[3Rw' U2: l' U' l, u']","[u, r' U2 r]","[Rw': U', l u' l']","[3Rw' U: l' U' l, u']", +"Ldb","[r d' r', U]","[l d l', U']","[U': r d' r', U2]","[Rw': d', r' U r]","[3Uw: U' l2 U, r']","[U l': d, l' U2 l]","[3Uw': U' r2 U, l']","[R' 3Uw: U' l' U, r']","[3Uw: U' l' U, r']","[d': r' U r, d2]","[R d': r' U r, d2]","","","","","[Rw: r d' r', U]","[S: Uw r Uw', l']","[z: Uw r Uw', l']","[Rw U': r d' r', U2]","[L2 u': r U r', u']","[Rw' U': r d' r', U2]","[d', r' U r]","[S: Uw r Uw', l]", "Ldf","[U: r' d r, U]","[U': r' d r, U']","[r' d r, U2]","[D Rw: d, r U2 r']","[Fw: U', l' u l]","[3Uw': l2, U' r U]","[Rw: d, r U2 r']","[3Uw: r, U' l U]","[R 3Uw: r, U' l U]","[R' d: r U2 r', d2]","[d: r U2 r', d2]","","","","","[L': u', r U r']","[z: r U2 r', u]","[z U: Uw r Uw', l']","[d, r U2 r']","[L' u': r U r', u']","[Rw': r' d r, U2]","[Rw' U: r' d r, U]","[3Uw: l U' l', d]", "Fur","[M': U' l U, r']","[Uw: U, r' u' r]","[l' U': r, U' l U]","[D': l2, U r U']","[l2, U r U']","[D: l2, U r U']","[D2: l2, U r U']","[r U r', u]","[Rw: U, r' u r]","[R2: r U r', u]","[R': r U r', u]","[r U r', u']","[U: Uw' l' Uw, r]","[Rw: U, r d' r']","[L': r U r', u']","","","","","[r U r', u2]","[3Rw' U': r2, U' l' U]","[F': U r' U', l']","[l, U r U']", -"Ful","[Rw: U r' U', l']","[U 3Rw: U r' U', l]","[r u2 r', U2]","[Rw: U r U', l']","[D 3Rw: U r U', l]","[Uw': l2, U' r' U]","[D' Rw: U r U', l']","[Uw r Uw', l']","[Rw: Uw R Uw', l']","[R2: Uw r Uw', l']","[Rw': Uw r Uw', l']","[F: r U r', u']","[U: l' U l, u']","[S: l', Uw r Uw']","[z: u, r U2 r']","","","","","[F: r U r', u2]","[u2, r' U2 r]","[U r' U', l']","[F: l, U r U']", -"Fdl","[U2 Rw: U' r' U, l']","[U' Rw: U' r' U, l']","[Rw' U': l', U' r U]","[3Rw U: l, U r U']","[F2: l2, U r U']","[U' D' Rw: U' r U, l']","[U' Rw: U' r U, l']","[F: Uw r Uw', l']","[Uw': U' r' U, l']","[R Uw': U' r' U, l']","[F': r U2 r', d']","[F2: r U r', u']","[z U': l', Uw r Uw']","[z: l', Uw r Uw']","[z U: l', Uw r Uw']","","","","","[F' U': l, U' r U]","[U': U' r' U, l']","[d2, r' U r]","[F2: l, U r U']", -"Fdr","[3Rw U': U' l U, r'] or see below","[U' M': U l U', r]","[U' Lw U: r, U l' U']","[3Rw U': U' l U, r]","[F': l2, U r U']","[U': l2, U' r U]","[U' 3Rw: r, U l U']","[Uw': l, Uw' r Uw]","[Rw U: r' u r, U2]","[R': r U2 r', d']","[r U2 r', d']","[F': r U r', u']","[Rw: U2, r u r']","[Rw U: r d' r', U2]","[r U2 r', d]","","","","","[U': l, U' r U]","[U' 3Rw: U l U', r2]","[3Rw U': U' l U, r2]","[F': l, U r U']", -"Bul","[U2 3Rw': U' r U, l]","[U' Rw': U' r U, l]","[U': r' U2 r, U2]","[3Rw' U: l', U r' U']","[D 3Rw' U: l', U r' U']","[D' U': U' r2 U, l]","[U': U' r2 U, l]","[u: u, r U r']","[U': Uw' r' Uw, l]","[R2 u: u, r U r']","[R' u: u, r U r']","[U: l U2 l', u]","[3Rw' U2: u', l' U' l]","[L2 u': r U r', u']","[L' u': u', r U r']","[u2, r U r']","[F: u2, r U r']","[F' U': U' r U, l]","[U': U' r U, l]","","","","", -"Bur","[U', l U2 l']","[U, l u2 l']","[U2, l u2 l']","[3Rw' U': U' l' U, r']","[U' D': l2, U' r' U]","[U': l2, U' r' U]","[D U': l2, U' r' U]","[3Rw': u, l' U2 l]","[r' U2 r, u']","[R: r' U2 r, u']","[Rw' U: r' u r, U2]","[U2: Uw l Uw', r']","[r' U2 r, u]","[Rw' U: r d' r', U2]","[Rw': U2, r' d r]","[3Rw' U': U' l' U, r2]","[r' U2 r, u2]","[U': l', U' r' U]","[U' 3Rw: r2, U l U']","","","","", -"Bdr","[M: U' l' U, r]","[U l: U' l' U, r']","[l' U': r', U' l' U]","[D': l2, U r' U']","[l2, U r' U']","[D: l2, U r' U']","[D2: l2, U r' U']","[3Rw': u, l' U' l]","[u: l', U r' U']","[r' U r, d]","[Rw': U, r' u r]","[Rw': U, r' u' r]","[3Rw': l' U' l, u']","[r' U r, d']","[Rw' U: U, r' d r]","[F': l', U r' U']","[l', U r' U']","[r' U r, d2]","[3Rw U': r2, U' l U]","","","","", -"Bdl","[Rw': U r U', l]","[U 3Rw': U r U', l']","[Rw' F': U r U', l]","[Rw': U r' U', l]","[D Rw': U r' U', l]","[D2 Rw': U r' U', l]","[D' Rw': U r' U', l']","[Uw r Uw', l]","[Rw: Uw r Uw', l]","[R2: Uw r Uw', l]","[Rw': Uw r Uw', l]","[u': U r U', l]","[3Rw' U: u', l' U' l]","[S: l, Uw r Uw']","[Uw: l U' l', d']","[U r U', l]","[F: U r U', l]","[F2: U r U', l]","[F': U r U', l]","","","","", +"Ful","[Rw: U r' U', l']","[U 3Rw: U r' U', l]","[r u2 r', U2]","[Rw: U r U', l']","[D Rw: U r U', l']","[Uw': l2, Uw' r' Uw]","[D' Rw: U r U', l']","[Uw r Uw', l']","[Rw: Uw r Uw', l']","[R2: Uw r Uw', l']","[Rw': Uw r Uw', l']","[F: r U r', u']","[U: l' U' l, u']","[S: l', Uw r Uw']","[z: u, r U2 r']","","","","","[F: r U r', u2]","[u2, r' U2 r]","[U r' U', l']","[F: l, U r U']", +"Fdl","[U2 3Rw: U' r' U, l]","[U' Rw: U' r' U, l']","[Rw' U': U' r U, l']","[3Rw U: l, U r U']","[F2: l2, U r U']","[U' D' Rw: U' r U, l']","[U' Rw: U' r U, l']","[F: Uw r Uw', l']","[Uw': U' r' U, l']","[R Uw': U' r' U, l']","[F': r U2 r', d']","[F2: r U r', u']","[z U': l', Uw r Uw']","[z: l', Uw r Uw']","[z U: l', Uw r Uw']","","","","","[F' U': l, U' r U]","[U': U' r' U, l']","[d2, r' U r]","[F2: l, U r U']", +"Fdr","[U2 l': U l U', r]","[U' M': U l U', r']","[U' Lw U: r, U l' U']","[3Rw U': U' l U, r]","[F': l2, U r U']","[U': l2, U' r U]","[U' 3Rw: U l U', r]","[Uw': l, Uw' r Uw]","[Rw U: r' u r, U2]","[R': r U2 r', d']","[r U2 r', d']","[F': r U r', u']","[Rw: U2, r u r']","[Rw U: r d' r', U2]","[r U2 r', d]","","","","","[U': l, U' r U]","[U' 3Rw: U l U', r2]","[3Rw U': U' l U, r2]","[F': l, U r U']", +"Bul","[U2 3Rw': U' r U, l']","[U' Rw': U' r U, l]","[Rw' U': U' r U, l]","[3Rw' U: l', U r' U']","[D 3Rw' U: l', U r' U']","[D' U': U' r2 U, l]","[U': U' r2 U, l]","[u: u, r U r']","[U': Uw' r' Uw, l]","[R2 u: u, r U r']","[R' u: u, r U r']","[U: l U2 l', u]","[3Rw' U2: u', l' U' l]","[L2 u': u', r U r']","[L' u': u', r U r']","[u2, r U r']","[F: u2, r U r']","[F' U': U' r U, l]","[U': U' r U, l]","","","","", +"Bur","[U', l u2 l']","[U, l u2 l']","[U2, l u2 l']","[3Rw' U': U' l' U, r']","[U' D': l2, U' r' U]","[U': l2, U' r' U]","[D U': l2, U' r' U]","[3Rw': u, l' U2 l]","[r' U2 r, u']","[R: r' U2 r, u']","[Rw' U: r' u r, U2]","[U2: Uw l Uw', r']","[r' U2 r, u]","[Rw' U: r d' r', U2]","[Rw': U2, r' d r]","[3Rw' U': U' l' U, r2]","[r' U2 r, u2]","[U': l', U' r' U]","[U' 3Rw: r2, U l U']","","","","", +"Bdr","[M: U' l' U, r]","[U l: U' l' U, r']","[l' U': r', U' l U]","[D': l2, U r' U']","[l2, U r' U']","[D: l2, U r' U']","[D2: l2, U r' U']","[3Rw': u, l' U' l]","[u: l', U r' U']","[r' U r, d]","[Rw': U, r' u r]","[Rw': U, r' u' r]","[3Rw': u', l' U' l]","[r' U r, d']","[Rw' U: U, r' d r]","[F': l', U r' U']","[l', U r' U']","[r' U r, d2]","[3Rw U': r2, U' l U]","","","","", +"Bdl","[Rw': U r U', l]","[U 3Rw': U r U', l']","[Rw' F': U r U', l]","[Rw': U r' U', l]","[D Rw': U r' U', l]","[D2 Rw': U r' U', l]","[D' Rw': U r' U', l]","[Uw r Uw', l]","[Rw: Uw r Uw', l]","[R2: Uw r Uw', l]","[Rw': Uw r Uw', l]","[u': U r U', l]","[3Rw' U: u', l' U' l]","[S: l, Uw r Uw']","[Uw: l U' l', d']","[U r U', l]","[F: U r U', l]","[F2: U r U', l]","[F': U r U', l]","","","","", -- cgit v1.3 From 2868467137fe193cb48dde9560656dbd6e4bde82 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Mon, 7 Apr 2025 09:47:09 +0200 Subject: Update to blog post --- src/blog/2025-04-04-qt-minimal/qt-minimal.md | 35 ++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'src') diff --git a/src/blog/2025-04-04-qt-minimal/qt-minimal.md b/src/blog/2025-04-04-qt-minimal/qt-minimal.md index 6f112bb..4cc0e18 100644 --- a/src/blog/2025-04-04-qt-minimal/qt-minimal.md +++ b/src/blog/2025-04-04-qt-minimal/qt-minimal.md @@ -98,3 +98,38 @@ And finally you can enjoy your new app: ``` ./run ``` + +## Update 2025-04-07 - now with AI! + +When I shared this post on LinkedIn, I asked if anyone could prompt an +LLM to build a QT app without QT Creator or CMake. A colleague did, +and the catbot's (pun intended) response can be found +[here](https://chat.mistral.ai/chat/fa3e3a76-0e8c-4135-94a1-ae7735174e93). + +This solution is different from the one I found. The bot opted for using +[qmake](https://doc.qt.io/qt-6/qmake-manual.html), another tool bundled +with QT, like moc and uic. This tool reads a `.pro` file that describes +the project's structure and build configuration, and it generates a +`Makefile`. This method is a bit more black-boxy than the one I found, +but it does not require more external dependencies; I think I might use +this other approach in the future. + +The chat bot's response is great, but it is "only" 99% +accurate. Unfortunately this means that if one blindly follows these +instructions, they won't get a working QT application. The problem is +with the commands: + +``` +qmake -project +qmake +``` + +The first one is completely useless, and actually prevents the project +from being built by generating a second project file. If one simply +ignores the `qmake -project` line, the instructions become correct. + +This story is quite insightful: the chat bot gave me instructions that are +almost correct (so technically they are *incorrect*). With my experience +(a whole 5 hours of CV-worthy QT development) I was able to fix these +instructions easily in a couple of minutes, but someone without the same +experience would have probably struggled for much longer. -- cgit v1.3 From 688f03f9c8c3322e049592fe5e17201731a9ea0b Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 12 Apr 2025 09:28:36 +0200 Subject: Converted pics from svg to png --- src/speedcubing/figure-it-out/comm1.png | Bin 0 -> 10415 bytes src/speedcubing/figure-it-out/comm2.png | Bin 0 -> 10603 bytes src/speedcubing/figure-it-out/edgecomm.png | Bin 0 -> 10411 bytes src/speedcubing/figure-it-out/face.png | Bin 0 -> 10744 bytes src/speedcubing/figure-it-out/figure-it-out.md | 20 ++++++++++---------- src/speedcubing/figure-it-out/layer.png | Bin 0 -> 10509 bytes src/speedcubing/figure-it-out/pair.png | Bin 0 -> 10334 bytes src/speedcubing/figure-it-out/setup.png | Bin 0 -> 10278 bytes src/speedcubing/figure-it-out/twist.png | Bin 0 -> 10145 bytes 9 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 src/speedcubing/figure-it-out/comm1.png create mode 100644 src/speedcubing/figure-it-out/comm2.png create mode 100644 src/speedcubing/figure-it-out/edgecomm.png create mode 100644 src/speedcubing/figure-it-out/face.png create mode 100644 src/speedcubing/figure-it-out/layer.png create mode 100644 src/speedcubing/figure-it-out/pair.png create mode 100644 src/speedcubing/figure-it-out/setup.png create mode 100644 src/speedcubing/figure-it-out/twist.png (limited to 'src') diff --git a/src/speedcubing/figure-it-out/comm1.png b/src/speedcubing/figure-it-out/comm1.png new file mode 100644 index 0000000..cbc6112 Binary files /dev/null and b/src/speedcubing/figure-it-out/comm1.png differ diff --git a/src/speedcubing/figure-it-out/comm2.png b/src/speedcubing/figure-it-out/comm2.png new file mode 100644 index 0000000..69d3b63 Binary files /dev/null and b/src/speedcubing/figure-it-out/comm2.png differ diff --git a/src/speedcubing/figure-it-out/edgecomm.png b/src/speedcubing/figure-it-out/edgecomm.png new file mode 100644 index 0000000..6b4d230 Binary files /dev/null and b/src/speedcubing/figure-it-out/edgecomm.png differ diff --git a/src/speedcubing/figure-it-out/face.png b/src/speedcubing/figure-it-out/face.png new file mode 100644 index 0000000..e342999 Binary files /dev/null and b/src/speedcubing/figure-it-out/face.png differ diff --git a/src/speedcubing/figure-it-out/figure-it-out.md b/src/speedcubing/figure-it-out/figure-it-out.md index 4690c76..5405d19 100644 --- a/src/speedcubing/figure-it-out/figure-it-out.md +++ b/src/speedcubing/figure-it-out/figure-it-out.md @@ -89,7 +89,7 @@ say that two or more adjacent pieces form a block when adjacent stickers of different pieces have the same color. For example, the simplest kind of block is a **pair**, that you can see in the picture below: -![A corner-edge pair](pair.svg) +![A corner-edge pair](pair.png) To be precise, the one above is a coner-edge pair. There are also center-edge pairs, consisting of a center and an edge, but they are rarely referred to @@ -99,11 +99,11 @@ A more complex example of a block is a **layer**, which is the result of the first two steps of the classic "layer by layer" method. This one is a correctly solved layer: -![A layer](layer.svg) +![A layer](layer.png) On the other hand, this is **not a layer**: -![A non-solved layer, but with a solve "face"](face.svg) +![A non-solved layer, but with a solve "face"](face.png) It is worth pausing here to reflect a bit. The last two pictures both clearly show a solved white face, don't they? For a most people, they @@ -161,7 +161,7 @@ If you have not done it already, you should have a look at my page on Suppose that you manage, via blockbuilding, to reach the following state: -![A commutator](comm1.svg) +![A commutator](comm1.png) First of all, this would be an amazing achievement! The whole cube is solved except for three corners. The bottom-left corner (only one red @@ -227,14 +227,14 @@ To help understanding all of this, you can visualize this commutator determine a correct commutator to permute them. Their **orientation** is also important. For example, consider the following case: -![Another commutator](comm2.svg) +![Another commutator](comm2.png) The three corners are permuted in exactly the same way, so everything we said above could be repeated word by word, move by move. However, if you apply the commutator we constructed to this case, you'll get something like this: -![Two twisted corners](twist.svg) +![Two twisted corners](twist.png) What's wrong here? Well, obviously the cube is not solved. All the pieces are in their correct position, but two corners are twisted in place! @@ -246,7 +246,7 @@ but sometimes it is important to keep track of both. Let's highlight the difference between the two 3-cycles. In the first one: -![A commutator](comm1.svg) +![A commutator](comm1.png) 1. The red-green-white corner must go to the place of the white-red-blue one, *with the white sticker of the first going to the place of the white sticker @@ -260,7 +260,7 @@ white sticker of the latter*. While in the second case: -![Another commutator](comm2.svg) +![Another commutator](comm2.png) 1. The red-green-white corner must go to the place of the white-red-blue one, *with the white sticker of the first going to the place of the* **blue** *sticker @@ -290,7 +290,7 @@ but you can visualize a solution So far I have only talked about *corner* commutators, but what if you are also left with some unsolved edges? For example, consider this case: -![A edge 3-cycle](edgecomm.svg) +![A edge 3-cycle](edgecomm.png) The picture shows a 3-cycle of edges. You might think that the same reasoning can be applied and that you can use commutators to solve @@ -323,7 +323,7 @@ you need to use **set-up moves**, also known as Consider the following case: -![A 3-cycle of corners requiring a set-up move](setup.svg) +![A 3-cycle of corners requiring a set-up move](setup.png) No matter how much you try, you are not going to find valid interchange and insertion moves as above. The fundamental problem is that you would diff --git a/src/speedcubing/figure-it-out/layer.png b/src/speedcubing/figure-it-out/layer.png new file mode 100644 index 0000000..3957cf3 Binary files /dev/null and b/src/speedcubing/figure-it-out/layer.png differ diff --git a/src/speedcubing/figure-it-out/pair.png b/src/speedcubing/figure-it-out/pair.png new file mode 100644 index 0000000..516cd1f Binary files /dev/null and b/src/speedcubing/figure-it-out/pair.png differ diff --git a/src/speedcubing/figure-it-out/setup.png b/src/speedcubing/figure-it-out/setup.png new file mode 100644 index 0000000..ac2bf6c Binary files /dev/null and b/src/speedcubing/figure-it-out/setup.png differ diff --git a/src/speedcubing/figure-it-out/twist.png b/src/speedcubing/figure-it-out/twist.png new file mode 100644 index 0000000..a1fb42a Binary files /dev/null and b/src/speedcubing/figure-it-out/twist.png differ -- cgit v1.3 From 46e8ca4aa90b92ea8ba857d4b0d5ddde615e6dc0 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 25 Apr 2025 10:18:37 +0200 Subject: Updated links after repository rename --- src/blog/2023-04-10-the-big-rewrite/the-big-rewrite.md | 2 +- src/blog/2025-04-05-learned-rewrite/learned-rewrite.md | 4 ++-- src/git/git.md | 14 +++++--------- src/speedcubing/coordinates/coordinates.md | 4 ++-- 4 files changed, 10 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/blog/2023-04-10-the-big-rewrite/the-big-rewrite.md b/src/blog/2023-04-10-the-big-rewrite/the-big-rewrite.md index 45da3cb..6a2f782 100644 --- a/src/blog/2023-04-10-the-big-rewrite/the-big-rewrite.md +++ b/src/blog/2023-04-10-the-big-rewrite/the-big-rewrite.md @@ -93,7 +93,7 @@ projects, or probably it will be never done. And that's OK. My plan is to split the work into the following parts: -* Starting from the [stable branch](https://nissy.tronto.net/download) +* Starting from the [stable branch](https://nissy.tronto.net) of nissy, remove all the code that is needed only by the optimal solver and other unnecessary steps. Work on a GUI and other simple features useful for assisting fewest moves solvers. diff --git a/src/blog/2025-04-05-learned-rewrite/learned-rewrite.md b/src/blog/2025-04-05-learned-rewrite/learned-rewrite.md index 6a7a3ed..0973dd3 100644 --- a/src/blog/2025-04-05-learned-rewrite/learned-rewrite.md +++ b/src/blog/2025-04-05-learned-rewrite/learned-rewrite.md @@ -17,8 +17,8 @@ than as fast as possible. Both the old and the new versions are written in C, but not all the things I discuss in this post are language-specific. You can find the new version of this project, the "Big Rewrite", -in [this repository](https://git.tronto.net/h48) - or -[on github](https://github.com/sebastianotronto/h48), if you prefer. +in [this repository](https://git.tronto.net/nissy-core) - or +[on github](https://github.com/sebastianotronto/nissy-core), if you prefer. I decided to rename it "H48" back when I planned to have separate projects for the different features of the old version, but I may change it back to Nissy at some point. diff --git a/src/git/git.md b/src/git/git.md index 15f32f6..cbfbf80 100644 --- a/src/git/git.md +++ b/src/git/git.md @@ -16,16 +16,12 @@ Here are some highlights of what you can find in my git repositories. * [nissy](https://git.tronto.net/nissy): A Rubik's cube solver, intended primarily as a tool for practicing FMC. Since april 2023 - the project has been split into the FMC trainer - [nissy-fmc](https://git.tronto.net/nissy-fmc) and the optimal solver - [nissy-nx](https://git.tronto.net/nissy-nx). Both are work in - progress. The stable version is available at - [nissy-classic](https://git.tronto.net/nissy-classic), and is - maintained with bugfixes. + the stable version of the project has been moved to + [nissy-classic](https://git.tronto.net/nissy-classic), while I kept + working on the H48 optimal solver. This new solver, which will be + integrated in a future version of nissy, can be found + [here](https://git.tronto.net/nissy-core). Check out also [the project's homepage](https://nissy.tronto.net). -* [h48](https://git.tronto.net/h48): Another Rubik's cube optimal solver, - intended to replace the engine of nissy in the future. Written in - collaboration with [Enrico](https://github.com/enricotenuti). * [scripts](https://git.tronto.net/scripts): Various scripts for Unix-like systems. * [zmodn](https://git.tronto.net/zmodn): A simple C++ library for working diff --git a/src/speedcubing/coordinates/coordinates.md b/src/speedcubing/coordinates/coordinates.md index afae46f..e1e6785 100644 --- a/src/speedcubing/coordinates/coordinates.md +++ b/src/speedcubing/coordinates/coordinates.md @@ -276,5 +276,5 @@ See [fst.c](https://git.tronto.net/nissy-nx/file/src/fst.c.html#l113) for an implementation. For these reasons, I am not using the coordinate approach described here -for my new work-in-progress solver (temporarily named -[h48](https://git.tronto.net/h48)). +for my new work-in-progress solver (which can be found +[here](https://git.tronto.net/nissy-core)). -- cgit v1.3 From 3d70f253ef49b80f58b3009074b889ac833ad542 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 24 May 2025 15:37:35 +0200 Subject: Fixed typo --- src/blog/2022-06-04-gemini/gemini.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/blog/2022-06-04-gemini/gemini.md b/src/blog/2022-06-04-gemini/gemini.md index b04a8ac..6e228c5 100644 --- a/src/blog/2022-06-04-gemini/gemini.md +++ b/src/blog/2022-06-04-gemini/gemini.md @@ -192,4 +192,4 @@ and, more annoyingly for the few gemini users, I am going to use http(s) links even when a gemini counterpart is available. *Update: as of August 2023, my website is still available on gemini, -but new blog posts are no longer mirrore there* +but new blog posts are no longer mirrored there* -- cgit v1.3 From 5e87743663d9cd54323593d0ffc7f7e31adb1e72 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 24 May 2025 16:37:15 +0200 Subject: Update figure it out guide with twizzle applets --- src/speedcubing/figure-it-out/comm1.png | Bin 10415 -> 0 bytes src/speedcubing/figure-it-out/comm1.svg | 39 ------------ src/speedcubing/figure-it-out/comm2.png | Bin 10603 -> 0 bytes src/speedcubing/figure-it-out/comm2.svg | 39 ------------ src/speedcubing/figure-it-out/edgecomm.png | Bin 10411 -> 0 bytes src/speedcubing/figure-it-out/edgecomm.svg | 39 ------------ src/speedcubing/figure-it-out/figure-it-out.md | 82 +++++++++++++++++++------ src/speedcubing/figure-it-out/setup.png | Bin 10278 -> 0 bytes src/speedcubing/figure-it-out/setup.svg | 39 ------------ src/speedcubing/figure-it-out/twist.png | Bin 10145 -> 0 bytes src/speedcubing/figure-it-out/twist.svg | 39 ------------ 11 files changed, 63 insertions(+), 214 deletions(-) delete mode 100644 src/speedcubing/figure-it-out/comm1.png delete mode 100644 src/speedcubing/figure-it-out/comm1.svg delete mode 100644 src/speedcubing/figure-it-out/comm2.png delete mode 100644 src/speedcubing/figure-it-out/comm2.svg delete mode 100644 src/speedcubing/figure-it-out/edgecomm.png delete mode 100644 src/speedcubing/figure-it-out/edgecomm.svg delete mode 100644 src/speedcubing/figure-it-out/setup.png delete mode 100644 src/speedcubing/figure-it-out/setup.svg delete mode 100644 src/speedcubing/figure-it-out/twist.png delete mode 100644 src/speedcubing/figure-it-out/twist.svg (limited to 'src') diff --git a/src/speedcubing/figure-it-out/comm1.png b/src/speedcubing/figure-it-out/comm1.png deleted file mode 100644 index cbc6112..0000000 Binary files a/src/speedcubing/figure-it-out/comm1.png and /dev/null differ diff --git a/src/speedcubing/figure-it-out/comm1.svg b/src/speedcubing/figure-it-out/comm1.svg deleted file mode 100644 index 6c41aad..0000000 --- a/src/speedcubing/figure-it-out/comm1.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/speedcubing/figure-it-out/comm2.png b/src/speedcubing/figure-it-out/comm2.png deleted file mode 100644 index 69d3b63..0000000 Binary files a/src/speedcubing/figure-it-out/comm2.png and /dev/null differ diff --git a/src/speedcubing/figure-it-out/comm2.svg b/src/speedcubing/figure-it-out/comm2.svg deleted file mode 100644 index e69065b..0000000 --- a/src/speedcubing/figure-it-out/comm2.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/speedcubing/figure-it-out/edgecomm.png b/src/speedcubing/figure-it-out/edgecomm.png deleted file mode 100644 index 6b4d230..0000000 Binary files a/src/speedcubing/figure-it-out/edgecomm.png and /dev/null differ diff --git a/src/speedcubing/figure-it-out/edgecomm.svg b/src/speedcubing/figure-it-out/edgecomm.svg deleted file mode 100644 index 6cffd65..0000000 --- a/src/speedcubing/figure-it-out/edgecomm.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/speedcubing/figure-it-out/figure-it-out.md b/src/speedcubing/figure-it-out/figure-it-out.md index 5405d19..1c38657 100644 --- a/src/speedcubing/figure-it-out/figure-it-out.md +++ b/src/speedcubing/figure-it-out/figure-it-out.md @@ -1,3 +1,5 @@ + + # Rubik's cube: how to figure it out So you decided to try and solve a @@ -124,6 +126,14 @@ If you want some more hints, Ryan Heise's website contains some nice examples about building blocks in his [fundamental techniques page](https://www.ryanheise.com/cube/fundamental_techniques.html). +*Note: I have updated this page to use [twizzle](https://alpha.twizzle.net) +applets instead of simple pictures. These applets can be played to show the +solution. To experiment around with this solution, click on +the TW at the bottom right to open them in +[twizzle](https://alpha.twizzle.net/). In this way you can also +check which moves correspond to the written notation, if you +are not familiar with it.* + ## Commutators *In the rest of this page I am going to use the standard @@ -161,7 +171,13 @@ If you have not done it already, you should have a look at my page on Suppose that you manage, via blockbuilding, to reach the following state: -![A commutator](comm1.png) +
+ +
First of all, this would be an amazing achievement! The whole cube is solved except for three corners. The bottom-left corner (only one red @@ -220,21 +236,28 @@ the insertion sequence; then we have D', the inverse of the second move; and finally R, the inverse of the first move of the insertion sequence. * **U'**: the inverse of the interchange move. -To help understanding all of this, you can visualize this commutator -[alg.cubing.net](https://alg.cubing.net/?setup=%5BU,_R-DR%5D&alg=R-_D_R_%2F%2FInsertion%0AU_%2F%2FInterchange%0AR-_D-_R_%2F%2FInverse_insertion%0AU-_%2F%2FInverse_interchange). - **Note:** looking at the position of the pieces is not enough to determine a correct commutator to permute them. Their **orientation** is also important. For example, consider the following case: -![Another commutator](comm2.png) +
+ + +
The three corners are permuted in exactly the same way, so everything we said above could be repeated word by word, move by move. However, if you apply the commutator we constructed to this case, you'll get -something like this: +something like this (you can also see this by playing the applet above): -![Two twisted corners](twist.png) +
+ + +
What's wrong here? Well, obviously the cube is not solved. All the pieces are in their correct position, but two corners are twisted in place! @@ -246,7 +269,13 @@ but sometimes it is important to keep track of both. Let's highlight the difference between the two 3-cycles. In the first one: -![A commutator](comm1.png) +
+ +
1. The red-green-white corner must go to the place of the white-red-blue one, *with the white sticker of the first going to the place of the white sticker @@ -260,7 +289,14 @@ white sticker of the latter*. While in the second case: -![Another commutator](comm2.png) +
+ + +
1. The red-green-white corner must go to the place of the white-red-blue one, *with the white sticker of the first going to the place of the* **blue** *sticker @@ -281,16 +317,19 @@ white sticker of the red-green-white corner to the position of the red sticker of the white-red-blue one, while it should move it to the position of the blue sticker! -I won't repeat the whole construction for the second commutator, -but you can visualize a solution -[here](https://alg.cubing.net/?setup=%5BR-,_UL-U-%5D&alg=U_L-_U-_%2F%2FInsertion%0AR-_%2F%2FInterchange%0AU_L_U-_%2F%2FInverse_insertion%0AR_%2F%2FInverse_interchange). - ### Edge commutators So far I have only talked about *corner* commutators, but what if you are also left with some unsolved edges? For example, consider this case: -![A edge 3-cycle](edgecomm.png) +
+ + +
The picture shows a 3-cycle of edges. You might think that the same reasoning can be applied and that you can use commutators to solve @@ -301,7 +340,7 @@ Let's see how to solve the case above. As interchange move, you can use the **inner-layer move** E' (check out the [notation page](../notation) if you are unfamiliar with these). The insertion sequence to be used with it is L' U2 L. Putting everything together, you get -[E' L' U2 L E L' U2 L](https://alg.cubing.net/?setup=%5BL-U2L,E-%5D&alg=E-_%2F%2FInterchange%0AL-_U2_L_%2F%2FInsertion%0AE_%2F%2FInverse_interchange%0AL-_U2_L_%2F%2FInverse_insertion). +E' L' U2 L E L' U2 L. ### Commutators with set-up moves @@ -323,7 +362,15 @@ you need to use **set-up moves**, also known as Consider the following case: -![A 3-cycle of corners requiring a set-up move](setup.png) +
+ +
No matter how much you try, you are not going to find valid interchange and insertion moves as above. The fundamental problem is that you would @@ -353,9 +400,6 @@ putting it all together you get: **Note:** in this case the insertion coincides with its inverse. This can happen and there is nothing particular about it. -As usual, you can visualize the final result on -[alg.cubing.net](https://alg.cubing.net/?setup=L2B2R-F-RB2R-FRL2&alg=L_%2F%2FSet%26%2345%3Bup%0AU-_%2F%2FInterchange%0AR_D2_R-_%2F%2FInsertion%0AU_%2F%2FInverse_interchange%0AR_D2_R-_%2F%2FInverse_insertion%0AL-_%2F%2FInverse_set%26%2345%3Bup) - ## Conclusion With what you have learned so far, you can now try and solve the Rubik's diff --git a/src/speedcubing/figure-it-out/setup.png b/src/speedcubing/figure-it-out/setup.png deleted file mode 100644 index ac2bf6c..0000000 Binary files a/src/speedcubing/figure-it-out/setup.png and /dev/null differ diff --git a/src/speedcubing/figure-it-out/setup.svg b/src/speedcubing/figure-it-out/setup.svg deleted file mode 100644 index fa2360a..0000000 --- a/src/speedcubing/figure-it-out/setup.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/speedcubing/figure-it-out/twist.png b/src/speedcubing/figure-it-out/twist.png deleted file mode 100644 index a1fb42a..0000000 Binary files a/src/speedcubing/figure-it-out/twist.png and /dev/null differ diff --git a/src/speedcubing/figure-it-out/twist.svg b/src/speedcubing/figure-it-out/twist.svg deleted file mode 100644 index 79e0a02..0000000 --- a/src/speedcubing/figure-it-out/twist.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file -- cgit v1.3 From 27da726b22d2dc966a37198b67e11a6024f6b0e0 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Mon, 26 May 2025 08:51:53 +0200 Subject: BLD alg changes --- src/speedcubing/bldsheets/corners.csv | 4 ++-- src/speedcubing/bldsheets/edges.csv | 20 ++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/speedcubing/bldsheets/corners.csv b/src/speedcubing/bldsheets/corners.csv index 3113f3c..447c3c5 100644 --- a/src/speedcubing/bldsheets/corners.csv +++ b/src/speedcubing/bldsheets/corners.csv @@ -1,9 +1,9 @@ "","UBR","UBL","UFL","DFR","DFL","DBL","DBR","RUB","RDF","RDB","LUF","LUB","LDB","LDF","FUL","FDL","FDR","BUL","BUR","BDR","BDL", "UBR","","[R' B' R: U', R D R']","[R F R': R' D' R, U]","[R' D R U' R D' R', U]","[R F': R' U' R, D]","[R' B: D', R U R']","[U', R D' R' U R' D R]","","[R' D' R, U]","[U', R D R']","[R': R' D' R, U']","[R: U, R D R']","[U', R D' R']","[R' D R, U]","[R: U2, R D R']","[D R' D' R, U]","[D' R' D R, U]","[R': R' D' R, U2]","","[U', D R D' R']","[U', D' R D R']", "UBL","[R' B' R: R D R', U']","","[R' D' R U': U', R' D R]","[U R' D R: U2, R D' R']","[R F' R' U': R D R', U2]","[R' D' R: R U2 R', D]","[R D' R': R' D R, U2]","[U R D' U: R' D' R, U2]","[R' D' R, U2]","[U': R D R', U2]","[F: U2, R' D' R]","","[U': R D' R', U2]","[R' D R, U2]","[R' F R D': U, R D' R']","[D R' D' R, U2]","[D' R' D R, U2]","","[R': U2, D' R' D R]","[D U': R D' R', U2]","[D' U': R D R', U2]", -"UFL","[R F R': U, R' D' R]","[R' D' R U': R' D R, U']","","[R' D R U' R D' R', U']","[U': U R' U' R, F2]","[R' D' R: R U' R', D]","[R D' R': R' D R, U']","[U' R': U2, R' D' R]","[R' D' R, U']","[U': R D R', U']","","[U' R: R D R', U2]","[U': R D' R', U']","[R' D R, U']","","[D: R' D' R, U']","[D' R' D R, U']","[U' R': U', R' D' R]","[R': U', D' R' D R]","[D': R' D' R, U']","[D: R' D R, U']", +"UFL","[R F R': U, R' D' R]","[R' D' R U': R' D R, U']","","[R' D R U' R D' R', U']","[U' R F': D, R' U' R]","[R' D' R: R U' R', D]","[R D' R': R' D R, U']","[U' R': U2, R' D' R]","[R' D' R, U']","[U': R D R', U']","","[U' R: R D R', U2]","[U': R D' R', U']","[R' D R, U']","","[D: R' D' R, U']","[D' R' D R, U']","[U' R': U', R' D' R]","[R': U', D' R' D R]","[D': R' D' R, U']","[D: R' D R, U']", "DFR","[U, R' D R U' R D' R']","[U R' D R: R D' R', U2]","[U', R' D R U' R D' R']","","[U' R' U R: R U' R', D]","[R U' R' U: R D' R', U2]","[R U' R' D R' U R, D']","[U' D' R': U2, R' D R]","","[D' R: F2, R' U R U']","[R U' R': U2, R' D' R]","[U2 R': R' U R, D]","[U2 R': R' U R, D']","[U D R: D' R' D R, U']","[R U' R': U2, D' R' D R]","[R U' R': U2, R' D R]","","[U D R: R U' R', D']","[U R': D', U' R U R']","[D' R: D R' D' R, U]","[U' D' R': U, R' D R]", -"DFL","[R F': D, R' U' R]","[R F' R' U: R D R', U2]","[U': F2, U R' U' R]","[U' R' U R: D, R U' R']","","[D' R U' R': D', R' U R]","[R U' R': D2, R' U R]","[U' R': U2, R' D R]","[R: D R' D' R, U]","[U' R': U, R' D R]","[U' R': D, U R U' R']","[D' R: U, R D' R']","[D R U' R': U2, R' D R]","","[R U' D: R' D' R, U2]","","[R: F2, R' U R U']","[U' R': U', R' D R]","[U D R' U': D', R U R']","[D' R: U', R D' R']","[U' D' R': U, R' D2 R]", +"DFL","[R F': D, R' U' R]","[R F' R' U: R D R', U2]","[U' R F': R' U' R, D]","[U' R' U R: D, R U' R']","","[D' R U' R': D', R' U R]","[R U' R': D2, R' U R]","[U' R': U2, R' D R]","[R: D R' D' R, U]","[U' R': U, R' D R]","[U' R': D, U R U' R']","[D' R: U, R D' R']","[D R U' R': U2, R' D R]","","[R U' D: R' D' R, U2]","","[R: F2, R' U R U']","[U' R': U', R' D R]","[U D R' U': D', R U R']","[D' R: U', R D' R']","[U' D' R': U, R' D2 R]", "DBL","[R' B: R U R', D']","[R' D' R: D, R U2 R']","[R' D' R: D, R U' R']","[R U' R' U': R D' R', U2]","[D' R U' R': R' U R, D']","","[R U' R': D', R' U R]","[U' D R': U2, R' D R]","[R: U', R D' R']","[U' R': U, R' D2 R]","[F R: R D' R', U']","[R: U, R D' R']","","[D R: F2, R' U R U']","[R: U2, R D' R']","[D R: D R' D' R, U]","[R' D' R: D, R U R']","[U' D R': U', R' D R]","[R: D', U' R' U R]","[R D': U' R' U R, D2]","", "DBR","[R D' R' U R' D R, U']","[R D' R': U2, R' D R]","[R D' R': U', R' D R]","[D', R U' R' D R' U R]","[R U' R': R' U R, D2]","[R U' R': R' U R, D']","","[R': U, R' D R U' R D' R']","[R: R' D R U' R D' R', U]","","[R U' R': R' U R, D]","[D R: U, R D' R']","[R D' R': U, R' D R]","[U R: R U' R', D]","[D R: U2, R D' R']","[D R: U', R D' R']","[U R: D' R' D R, U']","[U R: R U' R', D']","[D R: D', U' R' U R]","","[U R: R U' R', D2]", "RUB","","[U R U' D': R' D' R, U2]","[U' R': R' D' R, U2]","[U' D' R': R' D R, U2]","[U' R': R' D R, U2]","[U' D R': R' D R, U2]","[R': R' D R U' R D' R', U]","","[R: U', R D' R' U R' D R]","[U R U': R' D' R, U2]","[R U' D' R': R' U R, D]","[R: U, R D' R' U R' D R]","[U R: U2, R D' R']","[U R U': R' D R, U2]","[R': R' D R U' R D' R', U']","[U D' R: U2, R D' R']","[U' R' U': R D R', U2]","[U R: U2, R D R']","","[U D R: U2, R D' R']","[U' R' U': R D' R', U2]", diff --git a/src/speedcubing/bldsheets/edges.csv b/src/speedcubing/bldsheets/edges.csv index 2589022..827ec7f 100644 --- a/src/speedcubing/bldsheets/edges.csv +++ b/src/speedcubing/bldsheets/edges.csv @@ -1,23 +1,23 @@ "","UB","UL","UF","DR","DF","DL","DB","RB","RF","RD","LF","LU","LB","LD","FR","FU","FL","FD","BL","BU","BR","BD", -"UB","","[M2 U: M', U2]","[R' B' R: U', R E R']","[R E' R2 E R, U]","[R U' R' D: S, R2]","[S R B' R': S, R2]","[U', M' U2 M']","[U': U', R' S' R]","[U': U', R S' R']","[R E R', U]","[R' E R, U]","[S, U R' U' R]","[R E' R', U]","[U': U', R' S R]","[E': R' E R, U]","[R U R' U', M']","[R E R2 E' R, U]","[U: M', R U' R' U]","[R' E' R2 E R', U]","","[E: R E' R', U]","[R' U R U', M]", -"UL","[M2 U': M', U2]","","[M2 U: M, U2]","[S, R2]","[U': M', U2]","[L2, S']","[U: M, U2]","[U2, R' S' R]","[U2, R S' R']","[R E R', U2]","[R' E R, U2]","","[R E' R', U2]","[U2, R' S R]","[R, S' l2 S]","[M U': M', U2]","[S R2 S', l']","[M U: M, U2]","[S R2 S', l]","[M' U: M, U2]","[R', S' l2 S]","[M' U': M', U2]", -"UF","[R' B' R: R E R', U']","[M2 U': M, U2]","","[R E' R2 E R, U']","[U, M U2 M]","[S R' F R: S, R2]","[R U R' U: M, U2]","[U: U, R' S' R]","[U: U, R S' R']","[R' E' R, U']","[R' E R, U']","[S, U' R' U R]","[R E' R', U']","[U: U, R' S R]","[E': R' E R, U']","","[R E R2 E' R, U']","[R U' R' U, M']","[R' E' R2 E R', U']","[R' U' R U, M]","[E: R E' R', U']","M U' M' U' M U' M' U'", +"UB","","[R' E R U: R' E' R, U]","[R' E R U: R' E' R, U2]","[R E' R2 E R, U]","[R U' R' D: S, R2]","[S R B' R': S, R2]","[U', M' U2 M']","[U': U', R' S' R]","[U': U', R S' R']","[R E R', U]","[R' E R, U]","[S: U, R E R']","[R E' R', U]","[U': U', R' S R]","[U': U', R' S2 R]","[R U R' U', M']","[R E2 R', U]","[U: M', R U' R' U]","[R' E2 R, U]","","[U': U', R S2 R']","[R' U R U', M]", +"UL","[R' E R U: U, R' E' R]","","[R' E R U': U', R' E' R]","[S, R2]","[U': M', U2]","[L2, S']","[U: M, U2]","[U2, R' S' R]","[U2, R S' R']","[R E R', U2]","[R' E R, U2]","","[R E' R', U2]","[U2, R' S R]","[U2, R' S2 R]","[M U': M', U2]","[R E2 R', U2]","[M U: M, U2]","[R' E2 R, U2]","[M' U: M, U2]","[U2, R S2 R']","[M' U': M', U2]", +"UF","[R' E R U': R' E' R, U2]","[R' E R U': R' E' R, U']","","[R E' R2 E R, U']","[U, M U2 M]","[S R' F R: S, R2]","[R U R' U: M, U2]","[U: U, R' S' R]","[U: U, R S' R']","[R' E' R, U']","[R' E R, U']","[S: U', R E R']","[R E' R', U']","[U: U, R' S R]","[U: U, R' S2 R]","","[R E2 R', U']","[R U' R' U, M']","[R' E2 R, U']","[R' U' R U, M]","[U: U, R S2 R']","M U' M' U' M U' M' U'", "DR","[U, R E' R2 E R]","[R2, S]","[U', R E' R2 E R]","","[R D' R': S', R2]","[S', R2]","[R D R': S', R2]","[R' S' R': S, R2]","[R S' R: S, R2]","","[S' l' S, R2]","[l': S' l S, R2]","R2 S R' E' R2 E R S'","[R: E l E', R2]","[R U2 R: S, R2]","[r U' R: S, R2]","[R: E, R2]","[S' U: M', U2]","[R': E', R2]","[r' U R': S, R2]","[R' U2 R': S, R2]","[S' U': M, U2]", "DF","[R U' R' D: R2, S]","[U: M', U2]","[M U2 M, U]","[R D' R: S', R2]","","[S R' F' R: S, R2]","[D': R2, S']","[R' S' R U: M', U2]","[R S' R' U: M', U2]","[R F' R', S]","[R F R': U', R' E R]","[U2: R' F' R, S]","[S R' F': R2, E']","[R' S R U: M', U2]","[R, U' M2 U]","[R' F': R U' R', E]","[D R: E, R2]","","[D R': E', R2]","[r' U r U: M', U2]","[R', U' M2 U]","[r' U' r U: M', U2]", "DL","[S' R B' R': S, R2]","[S', L2]","[S' R' F R: S, R2]","[R2, S']","[S' R' F' R: S, R2]","","[S' R B R': S, R2]","[R' S' R: R S' R', U2]","[R S' R': R' S' R, U2]","[U: S', R F R']","[S U2 R': E, R2]","[R' F' R: R' S R, U]","[S U2 R: E', R2]","","[U R' U': R2, S']","[R F R: S', R2]","[l': l', S R2 S']","[R F' R: S', R2]","[l: l, S R2 S']","[R' B' R': S', R2]","[U R U': R2, S']","[R' B R': S', R2]", "DB","[M' U2 M', U']","[U': M, U2]","[R U R' U': M, U2]","[R D R: S', R2]","[D: R2, S']","[S R B R': S, R2]","","[R' S' R U': M, U2]","[R S' R' U': M, U2]","[R' B R, S]","[S R B: R2, E]","[U2: R B R', S]","[R' B' R: U, R E' R']","[R' S R U': M, U2]","[R, U M2 U']","[r U' r' U': M, U2]","[D' R: E, R2]","[r U r' U': M, U2]","[D' R': E', R2]","[U D': S', R' F R]","[R', U M2 U']","", -"RB","[U': R' S' R, U']","[R' S' R, U2]","[U: R' S' R, U]","[R' S' R: S, R2]","[R' S' R U': M', U2]","[R' S' R: U2, R S' R']","[R' S' R U: M, U2]","","[S' R: S, R2]","[U' R U, S]","[R' S': E, R U2 R']","[R' U2 R, S']","[R' S' R: R E' R', U2]","[R' S': R U2 R', S2]","[u: R U' R', E]","[R' U: U, R S' R']","[S' R': U2, R' E R]","[S' R' U: M', U2]","[E, R B2 R']","[R' U': U', R S' R']","","[S' R' U': M, U2]", -"RF","[U': R S' R', U']","[R S' R', U2]","[U: R S' R', U]","[R S' R': S, R2]","[R S' R' U': M', U2]","[R S' R': U2, R' S' R]","[R S' R' U: M, U2]","[S' R': S, R2]","","[U' R' U, S]","[R S' R': R' E R, U2]","[R U2 R', S']","[R S': E', R' U2 R]","[R S': R' U2 R, S2]","","[R U: U, R' S' R]","[E', R' F2 R]","[S' R U: M', U2]","[S' R: U2, R E' R']","[R U': U', R' S' R]","[u': R' U R, E']","[S' R U': M, U2]", +"RB","[U': R' S' R, U']","[R' S' R, U2]","[U: R' S' R, U]","[R' S' R: S, R2]","[R' S' R U': M', U2]","[R' S' R: U2, R S' R']","[R' S' R U: M, U2]","","[S' R: S, R2]","[U' R U, S]","[R' S': E, R U2 R']","[R' U2 R, S']","[R' S' R: R E' R', U2]","[R' S': R U2 R', S2]","[u: R U' R', E]","[R' U: U, R S' R']","[R' U' B': R2, E]","[S' R' U: M', U2]","[E, R B2 R']","[R' U': U', R S' R']","","[S' R' U': M, U2]", +"RF","[U': R S' R', U']","[R S' R', U2]","[U: R S' R', U]","[R S' R': S, R2]","[R S' R' U': M', U2]","[R S' R': U2, R' S' R]","[R S' R' U: M, U2]","[S' R': S, R2]","","[U' R' U, S]","[R S' R': R' E R, U2]","[R U2 R', S']","[R S': E', R' U2 R]","[R S': R' U2 R, S2]","","[R U: U, R' S' R]","[E', R' F2 R]","[S' R U: M', U2]","[R U F: R2, E']","[R U': U', R' S' R]","[u': R' U R, E']","[S' R U': M, U2]", "RD","[U, R E R']","[U2, R E R']","[U', R' E' R]","","[S, R F' R']","[U: R F R', S']","[S, R' B R]","[S, U' R U]","[S, U' R' U]","","[S, R F2 R']","[D': S, R' F' R]","[S, R' B2 R]","[U R' F R: S', R2]","[R U R' U', S']","[R' F R, S']","[R' F2 R, S']","[R' F' R, S']","[R B2 R', S']","[R B' R', S']","[R' U R U', S']","[R B R', S']", "LF","[U, R' E R]","[U2, R' E R]","[U', R' E R]","[R2, S' l' S]","[R F R': R' E R, U']","[S U2 R: E, R2]","[S R B: E, R2]","[R' S': R U2 R', E]","[R S' R': U2, R' E R]","[R F2 R', S]","","[E R' E', l]","[R' B': R U R', E]","[E R' E', l']","[u': R U R', E']","[S U' R: E, R2]","","[D: R F2 R', S]","[E', R B2 R']","[S U R: E, R2]","[R' U': R U R', E]","[D': R F2 R', S]", -"LU","[U R' U' R, S]","","[U' R' U R, S]","[l: S l S', R2]","[U2: S, R' F' R]","[R' F' R: U, R' S R]","[U2: S, R B R']","[S', R' U2 R]","[S', R U2 R']","[D': R' F' R, S]","[l, E R' E']","","[l', E' R E]","[D: R' F' R, S]","[R, U' M' U]","[R' F R, S]","[R' F2 R, S]","[R' F' R, S]","[R B2 R', S]","[S', R U' R']","[R', U' M' U]","[R B R', S]", +"LU","[S: R E R', U]","","[S: R E R', U']","[l: S l S', R2]","[U2: S, R' F' R]","[R' F' R: U, R' S R]","[U2: S, R B R']","[S', R' U2 R]","[S', R U2 R']","[D': R' F' R, S]","[l, E R' E']","","[l', E' R E]","[D: R' F' R, S]","[R, U' M' U]","[R' F R, S]","[R' F2 R, S]","[R' F' R, S]","[R B2 R', S]","[S', R U' R']","[R', U' M' U]","[R B R', S]", "LB","[U, R E' R']","[U2, R E' R']","[U', R E' R']","[R2, S' l S]","[S R' F': E', R2]","[S U2 R': E', R2]","[R' B' R: R E' R', U]","[R' S' R: U2, R E' R']","[R S': R' U2 R, E']","[R' B2 R, S]","[R' B': E, R U R']","[E' R E, l']","","[E' R E, l]","[R U: R' U' R, E']","[S U' R': E', R2]","[E, R' F2 R]","[D: R' B2 R, S]","","[S U R': E', R2]","[u: R' U' R, E]","[D': R' B2 R, S]", "LD","[U': R' S R, U']","[R' S R, U2]","[U: R' S R, U]","[R': E l E', R2]","[R' S R U': M', U2]","","[R' S R U: M, U2]","[R' S: R U2 R', S2]","[R S: R' U2 R, S2]","[U R' F R': S', R2]","[l', E R' E']","[D: S, R' F' R]","[l, E' R E]","","[E' l' E, R']","[R': F, R' S' R]","[R': F2, R' S' R]","[D: S', R' F' R]","[R: B2, R S' R']","[R: B', R S' R']","[E l E', R]","[D': S', R B R']", -"FR","[u: R' E R, U']","[S' l2 S, R]","[E': U', R' E R]","[R U2 R': S, R2]","[U' M2 U, R]","[U R' U': S', R2]","[U M2 U', R]","[U: R U' R', E']","","[S', R U R' U']","[U': R U R', E]","[U' M' U, R]","[R u: R' U' R, E]","[R', E' l' E]","","[S': U, R S' R']","[U R' U' R: E, R2]","[U M' U', R]","[U R' U' R': E', R2]","[S': U', R S' R']","[U2 R': S, R2]","[U' M U, R]", +"FR","[U': R' S2 R, U']","[R' S2 R, U2]","[U: R' S2 R, U]","[R U2 R': S, R2]","[U' M2 U, R]","[U R' U': S', R2]","[U M2 U', R]","[U: R U' R', E']","","[S', R U R' U']","[U': R U R', E]","[U' M' U, R]","[R u: R' U' R, E]","[R', E' l' E]","","[S': U, R S' R']","[U R' U' R: E, R2]","[U M' U', R]","[U R' U' R': E', R2]","[S': U', R S' R']","[U2 R': S, R2]","[U' M U, R]", "FU","[M', R U R' U']","[M U: M', U2]","","[r U' R': S, R2]","[R' F': E, R U' R']","[R F R': S', R2]","[r U' r' U: M, U2]","[R' U: R S' R', U]","[R U: R' S' R, U]","[S', R' F R]","[S U' R': E, R2]","[S, R' F R]","[S U' R: E', R2]","[R': R' S' R, F]","[S': R S' R', U]","","R E R' U' R' E2 R U R' E R","[D: S', R' F R]","[R F: R2, E']","[U' M' U: M, U2]","[S': R' S' R, U]","[D': S', R' F R]", -"FL","[U, R E R2 E' R]","[l', S R2 S']","[U', R E R2 E' R]","[R': E, R2]","[D R': E, R2]","[l': S R2 S', l']","[D' R': E, R2]","[S' R': R' E R, U2]","[R' F2 R, E']","[S', R' F2 R]","","[S, R' F2 R]","[R' F2 R, E]","[R': R' S' R, F2]","[U R' U' R': E, R2]","R' E' R U' R' E2 R U R E' R'","","[D: S', R' F2 R]","[L: S', L2]","[R' B': E, R2]","[U R U' R': E, R2]","[R' B: E, R2]", +"FL","[U, R E2 R']","[U2, R E2 R']","[U', R E2 R']","[R': E, R2]","[D R': E, R2]","[l': S R2 S', l']","[D' R': E, R2]","[R' U' B': E, R2]","[R' F2 R, E']","[S', R' F2 R]","","[S, R' F2 R]","[R' F2 R, E]","[R': R' S' R, F2]","[U R' U' R': E, R2]","R' E' R U' R' E2 R U R E' R'","","[D: S', R' F2 R]","[L: S', L2]","[R' B': E, R2]","[U R U' R': E, R2]","[R' B: E, R2]", "FD","U' M' U' M U' M' U' M","[M U': M, U2]","[M', R U' R' U]","[S' U': M', U2]","","[R F' R': S', R2]","[r U r' U: M, U2]","[S' R' U': M', U2]","[S' R U': M', U2]","[S', R' F' R]","[D: S, R F2 R']","[S, R' F' R]","[D: S, R' B2 R]","[D: R' F' R, S']","[R, U M' U']","[D: R' F R, S']","[D: R' F2 R, S']","","[R F': R2, E']","[D: R B' R', S']","[R', U M' U']","[M' U M, d2]", -"BL","[U, R' E' R2 E R']","[l, S R2 S']","[U', R' E' R2 E R']","[R: E', R2]","[D R: E', R2]","[l: S R2 S', l]","[D' R: E', R2]","[R B2 R', E]","[S' R: R E' R', U2]","[S', R B2 R']","[R B2 R', E']","[S, R B2 R']","","[R: R S' R', B2]","[U R' U' R: E', R2]","[R F: E', R2]","[L': S', L2]","[R F': E', R2]","","R E R' U R E2 R' U' R' E R","[U R U' R: E', R2]","[D': S', R B2 R']", +"BL","[U, R' E2 R]","[U2, R' E2 R]","[U', R' E2 R]","[R: E', R2]","[D R: E', R2]","[l: S R2 S', l]","[D' R: E', R2]","[R B2 R', E]","[R U F: E', R2]","[S', R B2 R']","[R B2 R', E']","[S, R B2 R']","","[R: R S' R', B2]","[U R' U' R: E', R2]","[R F: E', R2]","[L': S', L2]","[R F': E', R2]","","R E R' U R E2 R' U' R' E R","[U R U' R: E', R2]","[D': S', R B2 R']", "BU","","[M' U': M, U2]","[M, R' U' R U]","[r' U R: S, R2]","[r' U r U': M', U2]","[R' B' R: S', R2]","[U D': R' F R, S']","[R' U': R S' R', U']","[R U': R' S' R, U']","[S', R B' R']","[S U R': E, R2]","[R U' R', S']","[S U R: E', R2]","[R: R S' R', B']","[S': R S' R', U']","[U' M' U': M, U2]","[R' B': R2, E]","[D: S', R B' R']","R' E' R U R E2 R' U' R E' R'","","[S': R' S' R, U']","[D': S', R B' R']", -"BR","[E: U, R E' R']","[S' l2 S, R']","[u': R E' R', U]","[R' U2 R: S, R2]","[U' M2 U, R']","[U R U': S', R2]","[U M2 U', R']","","[U': R' U R, E]","[S', R' U R U']","[R' u': R U R', E']","[U' M' U, R']","[U: R' U' R, E']","[R, E l E']","[U2 R: S, R2]","[S': U, R' S' R]","[U R U' R: E, R2]","[U M' U', R']","[U R U' R': E', R2]","[S': U', R' S' R]","","[U' M U, R']", +"BR","[U': R S2 R', U']","[R S2 R', U2]","[U: R S2 R', U]","[R' U2 R: S, R2]","[U' M2 U, R']","[U R U': S', R2]","[U M2 U', R']","","[U': R' U R, E]","[S', R' U R U']","[R' u': R U R', E']","[U' M' U, R']","[U: R' U' R, E']","[R, E l E']","[U2 R: S, R2]","[S': U, R' S' R]","[U R U' R: E, R2]","[U M' U', R']","[U R U' R': E', R2]","[S': U', R' S' R]","","[U' M U, R']", "BD","[M, R' U R U']","[M' U: M', U2]","[D': U', R E R']","[S' U: M, U2]","[r' U' r U': M', U2]","[R' B R: S', R2]","","[S' R' U: M, U2]","[S' R U: M, U2]","[S', R B R']","[D': S, R F2 R']","[S, R B R']","[D': S, R' B2 R]","[D': R B R', S']","[R, U' M U]","[D': R' F R, S']","[R' B: R2, E]","[M U' M', d2]","[D': R B2 R', S']","[D': R B' R', S']","[R', U' M U]","", -- cgit v1.3 From 958502fb3521c274144ce6cc8294ed155207f7f1 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 6 Jun 2025 15:47:12 +0200 Subject: New blog post --- src/blog/2025-06-06-webdev/blocking.png | Bin 0 -> 29516 bytes src/blog/2025-06-06-webdev/callback.jpg | Bin 0 -> 27472 bytes src/blog/2025-06-06-webdev/callback2.jpg | Bin 0 -> 60575 bytes src/blog/2025-06-06-webdev/hello.png | Bin 0 -> 70582 bytes src/blog/2025-06-06-webdev/logos.png | Bin 0 -> 31951 bytes src/blog/2025-06-06-webdev/spectre.png | Bin 0 -> 28193 bytes src/blog/2025-06-06-webdev/storage.png | Bin 0 -> 74806 bytes src/blog/2025-06-06-webdev/threads.jpg | Bin 0 -> 65580 bytes src/blog/2025-06-06-webdev/wasm.png | Bin 0 -> 8457 bytes src/blog/2025-06-06-webdev/webdev.md | 1186 ++++++++++++++++++++++++++++++ 10 files changed, 1186 insertions(+) create mode 100644 src/blog/2025-06-06-webdev/blocking.png create mode 100644 src/blog/2025-06-06-webdev/callback.jpg create mode 100644 src/blog/2025-06-06-webdev/callback2.jpg create mode 100644 src/blog/2025-06-06-webdev/hello.png create mode 100644 src/blog/2025-06-06-webdev/logos.png create mode 100644 src/blog/2025-06-06-webdev/spectre.png create mode 100644 src/blog/2025-06-06-webdev/storage.png create mode 100644 src/blog/2025-06-06-webdev/threads.jpg create mode 100644 src/blog/2025-06-06-webdev/wasm.png create mode 100644 src/blog/2025-06-06-webdev/webdev.md (limited to 'src') diff --git a/src/blog/2025-06-06-webdev/blocking.png b/src/blog/2025-06-06-webdev/blocking.png new file mode 100644 index 0000000..6d8f1c6 Binary files /dev/null and b/src/blog/2025-06-06-webdev/blocking.png differ diff --git a/src/blog/2025-06-06-webdev/callback.jpg b/src/blog/2025-06-06-webdev/callback.jpg new file mode 100644 index 0000000..21057be Binary files /dev/null and b/src/blog/2025-06-06-webdev/callback.jpg differ diff --git a/src/blog/2025-06-06-webdev/callback2.jpg b/src/blog/2025-06-06-webdev/callback2.jpg new file mode 100644 index 0000000..c59aa7c Binary files /dev/null and b/src/blog/2025-06-06-webdev/callback2.jpg differ diff --git a/src/blog/2025-06-06-webdev/hello.png b/src/blog/2025-06-06-webdev/hello.png new file mode 100644 index 0000000..d10658e Binary files /dev/null and b/src/blog/2025-06-06-webdev/hello.png differ diff --git a/src/blog/2025-06-06-webdev/logos.png b/src/blog/2025-06-06-webdev/logos.png new file mode 100644 index 0000000..4c70d89 Binary files /dev/null and b/src/blog/2025-06-06-webdev/logos.png differ diff --git a/src/blog/2025-06-06-webdev/spectre.png b/src/blog/2025-06-06-webdev/spectre.png new file mode 100644 index 0000000..d86271e Binary files /dev/null and b/src/blog/2025-06-06-webdev/spectre.png differ diff --git a/src/blog/2025-06-06-webdev/storage.png b/src/blog/2025-06-06-webdev/storage.png new file mode 100644 index 0000000..aab5de8 Binary files /dev/null and b/src/blog/2025-06-06-webdev/storage.png differ diff --git a/src/blog/2025-06-06-webdev/threads.jpg b/src/blog/2025-06-06-webdev/threads.jpg new file mode 100644 index 0000000..80befcf Binary files /dev/null and b/src/blog/2025-06-06-webdev/threads.jpg differ diff --git a/src/blog/2025-06-06-webdev/wasm.png b/src/blog/2025-06-06-webdev/wasm.png new file mode 100644 index 0000000..c2222c7 Binary files /dev/null and b/src/blog/2025-06-06-webdev/wasm.png differ diff --git a/src/blog/2025-06-06-webdev/webdev.md b/src/blog/2025-06-06-webdev/webdev.md new file mode 100644 index 0000000..15bc282 --- /dev/null +++ b/src/blog/2025-06-06-webdev/webdev.md @@ -0,0 +1,1186 @@ +# A masochist's guide to web development + +## Table of contents + +* [Introduction](#introduction) +* [Setting things up](#setting-things-up) +* [Hello world](#hello-world) +* [Intermezzo I: What is WebAssembly?](#intermezzo-i-what-is-webassembly) +* [Building a library](#building-a-library) +* [Intermezzo II: JavaScript and the DOM](#intermezzo-ii-javascript-and-the-dom) +* [Loading the library and making it a module](#loading-the-library-and-making-it-a-module) +* [Multithreading](#multithreading) +* [Intermezzo III: Web Workers and Spectre](#intermezzo-iii-web-workers-and-spectre) +* [Don't block the main thread!](#dont-block-the-main-thread) +* [Callback functions](#callback-functions) +* [Persistent storage](#persistent-storage) +* [Closing thoughts](#closing-thoughts) + +## Introduction + +I have recently worked on making a web application out of +[my latest Rubik's cube optimal solver](https://git.tronto.net/nissy-core/file/README.md.html). +This involved building a rather complex C code base (with +multithreading, SIMD, callback functions and whatnot) to +[WebAssembly](https://en.wikipedia.org/wiki/WebAssembly) via +[Emscripten](https://emscripten.org/), and writing a minimal amount of +JavaScript and HTML for the frontend. + +This whole process was complex, tiring and at times frustrating - +but eventually [it was a success](https://tronto.net:48)! Not only +I accomplished my goal, but I have learnt a lot along the way. After +finishing the work, I decided to write down all that I have learnt and +share it with the world with this post. + +You may be wondering why one should do such a thing instead of either +rewriting their code base in a more web-friendly language, or distributing +their app using a native GUI framework. The main reason to use WebAssembly +is that it can provide near-native performance (or so they claim) while +running inside a web browser; this gives you all the portability of a +web app without too much of a performance drawback, something that would +not be possible with an interpreted language such as JavaScript. + +So, what is this blog post? A tutorial for web development? I am not sure +about this, but if it is, it is definitely not a normal one. As the title +suggests, you should not start from this guide unless you just *love* +banging your head against the wall. If you are looking for a *sane* +guide to web development, I strongly advise you head on to the +[Mozilla Developer Network tutorials page](https://developer.mozilla.org/en-US/docs/MDN/Tutorials) +and start from there. + +But if you are a C or C++ developer looking to port a program or library +to the web, then you are in the right place. With this post I am going +to walk you through the process of building an increasingly complex +library that can run in a web browser. Make sure you are +sitting comfortably and be ready to sweat, because I am not going to +shy away from the hard stuff and the complicated details. + +To follow this tutorial you won't need much experience with web +development, but some familiarity with HTML and an idea of what JavaScript +will be useful. It will also help to know that you can access your +browser's JavaScript console and other developer tools by pressing F12, +at least on Firefox or Chrome - but I guess I have literally just taught +you that, if you did not already know it. For all the rest, I'll make +sure to add many hyperlinks throughout the text, so you can follow them +if something is new to you. + +A little disclaimer: although I am a somewhat experienced C developer, +I had very little web development experience before embarking in +this adventure. If you are a web developer, you may find errors in +this post that are going to make you laugh at my ignorance. If you do, +I'd appreciate it if you could report them to me by sending an email to +`sebastiano@tronto.net`! + +With this out of the way, let's get started! + +## Setting things up + +The examples used in this tutorial are all contained in a git repository, +which you can find either on +[my git page](https://git.tronto.net/emscripten-tutorial/file/README.md.html) or +[on github](https://github.com/sebastianotronto/emscripten-tutorial). + +In order to follow them you are going to need: + +* A working installation of [Emscripten](https://emscripten.org/) + (which also includes Node.js). Refer to the official website for + installation instructions. +* A web server such [darkhttpd](https://github.com/emikulic/darkhttpd) + or the Python `http.server` package; the examples will use darkhttpd. + +I have only tested all of this on Linux, but everything should work +exactly the same on any UNIX system. If you are a Windows user, you can +either run everything inside +[WSL](https://learn.microsoft.com/en-us/windows/wsl/), or you can try and +adjust the examples to your system - if you choose this second option, +I'll happily accept patches or pull requests :) + +## Hello world + +Let's start with the classic Hello World program: + +``` +#include + +int main() { + printf("Hello, web!\n"); +} +``` + +You can compile the code above with + +``` +emcc -o index.html hello.c +``` + +And if you now start a web server in the current folder, for example with +`darkhttpd .` (the dot at the end is important), and open a web browser to +[localhost:8080](http://localhost:8080) (or whatever port your web server +uses), you should see something like this: + +![Hello world in a browser](hello.png) + +As you can see, the compiler generated a bunch of extra stuff around +you print statement. You may or may not want this, but for now we can +take it as a convenient way to check that our program works as expected. + +There are other ways to run this compiled code. With the command above, +the compiler should have generated for you 3 files: + +* `index.html` - the web page in the screenshot above. +* `index.wasm` - the actual compiled code of your program; this file contains + WebAssembly bytecode. +* `index.js` - some JavaScript *glue code* to make it possible for `index.wasm` + to actually run in a browser. + +If you don't specify `-o index.html`, or if your specify `-o` followed +by a filename ending in `.js`, the `.html` page is not going to be +generated. In this case (but also if you *do* generate the html page), +you can run the JavaScript code in your terminal with: + +``` +node index.js +``` + +In later examples, the same code may not work seamlessly in both a web +browser and in Node.js - for example, when dealing with persistent data +storage. But until then, we can generate all three files with a single +command and run our code in either way. + +It is also possible to ask Emscripten to generate only the `.wasm` file, +in case you want to write the JavaScript glue code by yourself. To do +this, you can pass the `-sSTANDALONE_WASM` option to `emcc`. However, +in some cases the `.js` file is going to be generated even when this +option is used, for example when building a source file without a `main()` +entry point. Since this is something we'll do soon, we can forget about +this option and just take it as a fact that the `.wasm` files generated +by emscripten require some glue JavaScript code to actually run, +but in case you are interested you can check out +[the official documentation](https://emscripten.org/docs/tools_reference/settings_reference.html#standalone-wasm). + +You can find the code for this example, as well as scripts to +build it and run the web server, in the directory `00_hello_world` +of the git repository +([git.tronto.net](https://git.tronto.net/emscripten-tutorial/file/README.md.html), +[github](https://github.com/sebastianotronto/emscripten-tutorial)). + +Anyway, now we can build our C code to run in a web page. But this is +probably not the way we want to run it. First of all, we don't want to +use the HTML template provided by Emscripten; but more importantly, we +probably don't want to write a program that just prints stuff to standard +output. More likely, we want to write some kind of library of functions +that can be called from the front-end, so that the user can interact with +our program via an HTML + JavaScript web page. Before going into that, +let's take a break to discuss what we are actually compiling our code to. + +## Intermezzo I: What is WebAssembly? + +![The logo of WebAssembly](wasm.png) + +[WebAssembly](https://en.wikipedia.org/wiki/WebAssembly) is a low-level +language meant to run in a virtual machine inside a web browser. The main +motivation behind it is running higher-performance web applications compared +to JavaScript; this is made possible, by its +compact bytecode and its stack-based virtual machine. + +WebAssembly (or WASM for short) is supported by all major browsers +since around 2017. Interestingly, Emscripten, the compiler we are +using to translate our C code to WASM, first appeared in 2011, +predating WASM by a few years. Early on, Emscripten would compile +C and C++ code into JavaScript, or rather a subset thereof called +[asm.js](https://en.wikipedia.org/wiki/Asm.js). + +Just like regular +[assembly](https://en.wikipedia.org/wiki/Assembly_language), WASM +also has a text-based representation. This means that one could write +WASM code directly, assemble it to bytecode, and then run it. We are +not going to do it, but if you are curious here is a simple example +(computing the factorial of a number, taken from Wikipedia): + +``` +(func (param i64) (result i64) + local.get 0 + i64.eqz + if (result i64) + i64.const 1 + else + local.get 0 + local.get 0 + i64.const 1 + i64.sub + call 0 + i64.mul + end) +``` + +As you can see, it looks like a strange mix of assembly and +[Lisp](https://en.wikipedia.org/wiki/Lisp_(programming_language)). +If you want to try and run WASM locally, outside of a web browser, +you could use something like [Wasmtime](https://wasmtime.dev/). + +Until early 2025, the WASM "architecture" was 32-bit only. One big +limitation that this brings is that you cannot use more that 4GB +(232 bytes) of memory, because pointers are only 32 bits +long; moreover, your C / C++ code may need some adjustments if it +relied on the assumption that e.g. `sizeof(size_t) == 8`. At the +time writing a new standard that enables 64 bit pointers, called +WASM64, is supported on Firefox and Chrome, but not on Webkit-based +browsers such as Safari yet. Depending on when you are reading this, +this may have changed - you can check the status of WASM64 support +[here](https://webassembly.org/features/). + +## Building a library + +Back to the main topic. Where were we? Oh yes, we wanted to build +a C *library* to WASM and call it from JavaScript. Our complex, +high-performance, math-heavy library probably looks something like this: + +library.h (actually, we are not going to need this): + +``` +int multiply(int, int); +``` + +library.c: + +``` +int multiply(int a, int b) { + return a * b; +} +``` + +Or maybe it is a bit more complicated than that. But we said we are +going to build up in complexity, and this is just the beginning, so +let's stick to `multiply()`. + +To build this library you can use: + +``` +emcc -o library.js library.c +``` + +As we saw before, this is going to generate both a `library.js` and a +`library.wasm` file. Now we would like to call our library function +with something like this + +program.js: + +``` +var library = require("./library.js"); +const result = library.multiply(6, 7); +console.log("The answer is " + result); +``` + +*(The `require()` syntax above is valid when running this code in Node.js, +but not, for example when running in a browser. We'll see in the next +session what to do in that case, but for now let's stick to this.)* + +Unfortunately, this will not work for a couple of reasons. The reason +first is that Emscripten is going to add an underscore `_` to all our +function names; so we'll have to call `library._multiply()`. But this +still won't work, because by default the compiler does not *export* all +the functions in your code - that is, it does not make them visible to +the outside. To specify which functions you want to +export, you can use the `-sEXPORTED_FUNCTIONS` flag, like so: + +``` +emcc -sEXPORTED_FUNCTION=_multiply -o library.js library.c +``` + +And now we finally have access to our `multiply()` function... + +``` +$ node program.js +Aborted(Assertion failed: native function `multiply` called before runtime initialization) +``` + +...or maybe not. If you are new to JavaScript like I was a few weeks +ago, you may find this error message surprising. Some runtime must be +initialized, but can't it just, like... initialize *before* trying to +run the next instruction? + +Things are not that simple. A lot of things in JavaScript happen +*asynchronously*, and in these situations you'll have to either use +[`await`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await) +or a +[*callback function*](https://developer.mozilla.org/en-US/docs/Glossary/Callback_function). +So we'll have to do something like this: + +``` +var library = require("./build/library.js"); + +library.onRuntimeInitialized = () => { + const result = library._multiply(6, 7); + console.log("The answer is " + result); +}; +``` + +And now we can finally run our program: + +``` +$ node program.js +The answer is 42 +``` + +The code for this example can be found in the `01_library` folder in +the git repository +([git.tronto.net](https://git.tronto.net/emscripten-tutorial/file/README.md.html), +[github](https://github.com/sebastianotronto/emscripten-tutorial)). + +## Intermezzo II: JavaScript and the DOM + +![The logos of HTML, CSS and JavaScript](logos.png) + +If we want to build an interactive web page using JavaScript, we'll +need a way for our script to communicate with the page, i.e. a way +to access the HTML structure from JavaScript code. What we are looking +for is called +*[Document Object Model](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model)*, +or DOM for short. + +For example, if you have a paragraph with some text in your HTML: + +``` +

Hello!

+``` + +you can access this text from JavaScript like this: + +``` +var paragraph = document.getElementById("myParagraph"); +paragraph.innerText = "New text!"; +``` + +Here we are selecting the paragraph HTML element using its ID, and we +are changing its text via its `innerText` property, all from JavaScript. + +Let's see a more complex example: + +HTML: + +``` + +``` + +JS: + +``` +var button = document.getElementById("theButton"); +var counter = 0; + +button.addEventListener("click", () => { + counter++; + button.innerText = "I have been pressed " + counter + " times!"; +}); +``` + +In the example above we add an +*[event listener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)* +to a button: the (anonymous) function we defined is going to be called +every time the button is clicked. And since this is a web page, I guess +I can show you what this actually looks like. + +Behold, the dynamic button: + +
+ +
+ + + +If you are completely new to web development, you may be wondering +where you should write this JavaScript code. One option is to write it +in the same HTML file as the rest of the page, inside a ` + + + +

+ x + + +

+ + + +``` + +Besides the `` element, the only important line for us is line +7, which loads the script from a file. Notice that we use the `defer` +keyword here: this is telling the browser to wait until the whole page +has been loaded before executing the script. If we did not do this, we +could run in the situation where we `document.getElementById()` returns +`null`, because the element we are trying to get is not loaded yet (yes, +this happened to me while I was writing this post). If you want to know +more, check out this +[MDN page](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/script#defer). + +Now to the JavaScript code. For now we are going to use the built-in +`*` operator to multiply the two numbers, but in the next section we +are going to replace it with our own library. + +script.js (in the same folder as index.html): + +``` +var aInput = document.getElementById("aInput"); +var bInput = document.getElementById("bInput"); +var button = document.getElementById("goButton"); +var resultText = document.getElementById("resultText"); + +button.addEventListener("click", () => { + var a = Number(aInput.value); + var b = Number(bInput.value); + resultText.innerText = a * b; +}); +``` + +The final result will look something like this: + +

+ x + + +

+ + + +In a real-world scenario you would probably want to check that the text +provided in the input fields is actually a number, or perhaps use the +[`type="number"`](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/number) +attribute for the input fields. But we'll ignore these issues here - +we are going to have more serious problems to deal with. + +## Loading the library and making it a module + +With what we have learned in the previous intermezzo (you are not skipping +those, right?) we can finally run our library code in a real web page. The +code is pretty much the same as above; we just need to include both the +library and the script file in the HTML: + +``` + + +``` + +and of course we have to change the line where we perform the multiplication: + +``` + resultText.innerText = Module._multiply(a, b); +``` + +Here `Module` is the default name given to our library by +Emscripten. Apart from being too generic a name, this leads to another +problem: we can't include more than one Emscripten-built library in our +page in this way - otherwise, both are going to be called `Module`. + +Luckily, there is another way: we can build a +[modularized](https://emscripten.org/docs/compiling/Modularized-Output.html) +library, i.e. obtain a +[JavaScript Module](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules). +This may sound a bit strange, because the name `Module` kind of implies +there is already a module. The way I understand it is that by default +Emscripten produces a *script* that *contains* a module named `Module`; +when building a modularized library, the whole resulting file is a module. + +Modularizing our build is not necessary right now, but +there are a couple of other advantages to it: + +* As mentioned above, we can change the name of our module and include + more than one Emscripten-built library, if we want. +* We will be able to use the module in the same way in Node.js and in + our web page script. This way we can minimize the differences between + the two versions of our code, which can be useful for testing. +* In case we want to build a more complex layer of JavaScript between + our library and our web page, with a modularized build we can easily + include the module in another file, which can then be included in the + main script. + +So let's go ahead and build our library like so: + +``` +emcc -sEXPORTED_FUNCTION=_multiply -sMODULARIZE -sEXPORT_NAME=MyLibrary \ + -o library.mjs library.c +``` + +Notice I have changed the extension from `.js` to `.mjs`. Don't worry, +either extension can be used. And you are going to run into issues with +either choice: + +* If you run your code in Node.js, it will understand that the library + file is a module only if you use the `.mjs` extension. Alternatively, + you can change some settings in a local configuration file to + enforce this. +* If you run your code in a web page, your web server may not be + configured to serve `.mjs` files as JavaScript files. This can + easily be changed by adding a configuration line somewhere. + +In my examples I chose to use the `.mjs` extensions to make Node.js +happy, and I changed the configuration of my web servers as needed. For +example, for darkhttpd I added a file called `mime.txt` with a single +line `text/javascript mjs`, and launched the server with the +`--mimetypes mime.txt` option. + +Now we have to make a couple of changes. Our `program.js`, for running +in node, becomes: + +``` +import MyLibrary from "./library.mjs" + +var myLibraryInstance = away MyLibrary(); + +const result = myLibraryInstance(6, 7); +console.log("The answer is " + result); +``` + +By the way, I have renamed this file to `program.mjs`. This is because +only modules can use the +[static `import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) +statement; alternatively, I could have used the +[dynamic `import()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import) +and kept the `.js` extension. + +Similary, we have to update our `script.js` (or `script.mjs`) to import +the module and create an instance. Moreover, we have to specify in the +HTML that the script is now a module: + +``` + +``` + +And we can get rid of the other `

- x + x

@@ -467,7 +467,7 @@ button.addEventListener("click", () => { The final result will look something like this:

- x + x

-- cgit v1.3 From ccc759c09c0738efce3d3f6f063b98fc55c27802 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Mon, 9 Jun 2025 09:33:40 +0200 Subject: Added note to old blog post due to feedback --- src/blog/2024-09-20-c-scripting/c-scripting.md | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src') diff --git a/src/blog/2024-09-20-c-scripting/c-scripting.md b/src/blog/2024-09-20-c-scripting/c-scripting.md index de70812..49ea366 100644 --- a/src/blog/2024-09-20-c-scripting/c-scripting.md +++ b/src/blog/2024-09-20-c-scripting/c-scripting.md @@ -75,6 +75,11 @@ systems! The command is also included in FreeBSD (since 4.3) and MacOS (since 13), and there are probably workarounds to make the same concept work without it. +*Edit 2025-06-09: as a reader points out, `realpath` is included +in the most recent POSIX standard, +[POSIX.1-2024](https://pubs.opengroup.org/onlinepubs/9799919799/utilities/realpath.html), +so it should be more widely available in the future.* + ## Credits I did not come up with this trick - I read about it in at least -- cgit v1.3 From 86059c69cdd5fc46fee8cb4a0c859d211f4a2058 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 13 Jun 2025 15:11:45 +0200 Subject: Blog post --- .../cargo-culture-shock.md | 332 +++++++++++++++++++++ 1 file changed, 332 insertions(+) create mode 100644 src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md (limited to 'src') diff --git a/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md new file mode 100644 index 0000000..e17f89d --- /dev/null +++ b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md @@ -0,0 +1,332 @@ +# Cargo culture shock 🦀 + +After a long adventure +[porting my cube solver to the web](../2025-06-06-webdev), I decided to +try out something completely different, like learning a new language. +Rust is one on my to-do list, and it has been there for more than 10 +years - I remember reading about it in my first year in university, +so it must have been 2013 or early 2014. + +So I started by quickly reading through the first few chapters of +[the book](https://doc.rust-lang.org/book/) to get an idea of the basic +syntax. Before I move on to implementing something, I thought I could +share my very early impression of the language and the tooling around it. + +*Note: this is a relaxed write-up and I have a very superficial +understanding of the topic. I am going to use strong words for the things +that I did not like, but there are many things I like about Rust so +far. In fact, my first impression of the language, the documentation and +the tools is very positive! Keep this in mind while reading this post.* + +## What is Rust about? + +Before getting started with the Rust book, my impression was that Rust +was mostly about *safety* as in *memory safety*, and that it achieved +this by enforcing strict rules, leading to more correct programs overall. + +But [the foreword](https://doc.rust-lang.org/book/foreword.html) says "the +Rust programming language is fundamentally about *empowerment*". Uh, that's +weird. I was expecting "something something *safety*". And actually, +I was hoping for "something something *correctness*". Definitely not +"something something *empowerment*". *Empowerment* sounds like one of +those meaningless words that managers use when they have nothing to say. + +Anyway, empowerement it is. Let's move on to actually using the thing. + +## Installation + +The officially endorsed way of installing Rust is the following: + +``` +curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh +``` + +The horror, the horror! Is this really what they suggest? The very thing +that *everyone* told you not to do in nerd forums until a few years ago, +even worse than copy-pasting commands from the internet, is now THE +suggested way of installing software? Seriously, piping a random web +page into `sh`? + +I don't know what this script does, is it going to download even more +random shit from the internet? (Answer: yes, it is!) Is it going to fuck +up my environment by puking configuration lines into my .bashrc? (Answer: +yes, it is!) + +But ok, what do I know. Maybe I am just leaving in the past, I should +embrace the future, because package managers and `make && make install` +*are so 1999, man*. So I took a deep breath an run the command. +Luckily the script kindly asked "do you want me to fuck up your +environment? [default: Yes]". I may be paraphrasing this, it probably +mentioned `.bash_rc` and `.profile`. Anyway, you can easily say "no" +and skip this fuckery. And then manually update a couple of environment +variables in your shell configuration file, which is what the script was +trying to do. I guess developers today are not expected to know how to +do this. + +The installation was quick and everything went fine. Moving on! + +## Cargo cult + +[Cargo](https://doc.rust-lang.org/book/ch01-03-hello-cargo.html) is +Rust's build system and all-in-one tool. It can create a new project +with a default folder structure, compile code (running `rustc` under +the hood`), run tests, and more. Oh and it is also a *package manager*, +which apparently is something modern programming languages decided they +needed - more on that later. + +I don't always like these kind of tools, becase they tend to do a lot of +things that you don't understand with the files in the current directory. +Like vomiting generated files that you are supposed to check into your +[VCS](https://en.wikipedia.org/wiki/Version_control) - which kinda +defeats the purpose of *generating* files in the first place, doesn't it? + +Luckily, Cargo does not do too much of this. It generates an `src` folder +with a simple "hello world" program, a pretty minimal `Cargo.toml` +configuration file, and it initializes a git repo. All reasonable, +and most importantly easy to understand. + +On the first run of `cargo build` it also generates a `target` folder +for the build artifacts (already in `.gitignore`) and it generates +only one of those vomit files that I am supposed to check into git +(`Cargo.lock`), which I promptly added to .gitignore. Apparently it is +mainly about dependencies, and I'd rather not use any for now. So all +in all I am satisfied with this process. + +About dependencies, you can specify some packages, or *crates*, that your +projects depends on. These *crates* are going to be downloaded as they are +needed from [crates.io](https://crates.io/). You can of course specify +some constraints on the version for each specific crate, like "at least +2.0" or "at least 0.8.5, but less than 0.9.0". Here is where `Cargo.lock` +comes into play: if there is more than one version available for a given +crate that satisfies the contraints you impose in `Cargo.toml`, the first +time a specific version is used it gets written to `Cargo.lock`, so that +you will keep using that version even if a new one becomes available. +You are supposed to check in this file to git so other developers working +on the same project will use exactly the same version of each dependency. + +I can't quite understand this. If I don't want to update to a later +(minor) version of the dependency, I can already specify this in +`Cargo.toml`. If instead I impose more relaxed requirements, then it +means that any version satisfying those requirements is fine, and I +in this case *I do want* to try different versions within the allowed +range, to make sure that my assumptions are correct. So I am confused +about why this Cargo.lock business is needed at all. But I guess if +the time ever comes that I need to include dependencies in my project - +probably in the far future, *right?* - then I can just specify an exact +version and happily ignore `Cargo.lock`. + +Anyway, coming from a mostly C and C++ background where there is no +standard way of including dependencies, all of this is certainly quite +interesting. + +## Dependencies? + +Chapter 2 contains a simple code example. +[This part](https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html#generating-a-secret-number) +caught my attention: + +"Rust doesn't yet include random number functionality in its standard library." + +Uh, ok. And then people complain about C having a small standard library. +It then continues: + +"However, the Rust team does provide a +[`rand` crate](https://crates.io/crates/rand) with said functionality." + +Ok, but... if this is provided by the Rust team, why not including it in +the standard library? Maybe it is still in beta, Rust is not a "finished" +project as far as I understand. I would think 15 years is enough to ship +a random number generator, though. + +The tutorial tell us to add `rand` to our dependencies in `Cargo.toml`. +Simple enough. But then, if we launch `cargo build` again: + +``` +cargo build + Updating crates.io index + Locking 15 packages to latest Rust 1.85.0 compatible versions + Adding rand v0.8.5 (available: v0.9.0) + Compiling proc-macro2 v1.0.93 + Compiling unicode-ident v1.0.17 + Compiling libc v0.2.170 + Compiling cfg-if v1.0.0 + Compiling byteorder v1.5.0 + Compiling getrandom v0.2.15 + Compiling rand_core v0.6.4 + Compiling quote v1.0.38 + Compiling syn v2.0.98 + Compiling zerocopy-derive v0.7.35 + Compiling zerocopy v0.7.35 + Compiling ppv-lite86 v0.2.20 + Compiling rand_chacha v0.3.1 + Compiling rand v0.8.5 + Compiling guessing_game v0.1.0 (file:///projects/guessing_game) + Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.48s +``` + +Woho wait a minute. I have only added one dependency! Just a random +number generator! Why is it building 15 packages now? Where does all +of this come from? Surely these are not dependencies dragged in by +the `rand` crate, *right?* + +Well, apparently they are. If we want to generate a random number, we +need 15 external packages. I would imagine this makes Rust completely +unusable in a professional setting, because nobody would want to audit +15 separate crates just to include a random number generator. And no +professional programmer would include dependencies in a serious project +without first auditing them, *right?* *RIGHT?!* + +I mean, each dependency introduces an extra liability in your project; +it is code that you can't control and you never know when it is going to +break. And this is why serious programmers, select dependencies carefully +and only use them when absolutely necessary... *right?* + +Ahah, of course they do not. Remember the +[letf-pad incident](https://en.wikipedia.org/wiki/Npm_left-pad_incident)? +Apparently Cargo is of the same breed as npm. And then we wonder why +the software industry is such a shitshow. *Just keep building on top +of the house of cards, man. It's going to be fine, man, don't bother +implementing low-level stuff, that's hard. Just trust random people on +the internet and ship their code, man.* + +Bleah. + +## The Rust language + +So far I talked mostly about the tooling around Rust, but I said nothing +about the language itself. I want to write some code before making a +more informed opinion about it, but the first impression is that it is +really nice! + +I love the type system, especially +[enums](https://doc.rust-lang.org/book/ch06-00-enums.html) +and `match`. I like that this and stuff like `Option` are +first-class citizens; you can do something similar in C++ with +[`std::variant`](https://doc.rust-lang.org/book/ch06-00-enums.html) and +[`std::optional`](https://en.cppreference.com/w/cpp/utility/optional.html), +but the syntax quickly gets messy. I guess this shows the advantage of +making a new language from scratch instead of being forced to live with +decades-old syntax for backwards compatibility. + +I especially like this mechanism - Rust's enums, or `std::variant`, or +tagged unions, whatever you like to call them - for error handling. I find +them a better solution than exception, because they enforce correctness: +if your function can fail, your coding must handle it; you can't just +let an error message bubble up from the depths of Hell, wreak havoc in +your control flow and face the user with an "Object reference not set +to an instance of an object". I think it is great that Rust endorses +this more thorough way of error handling from the start. + +On the less-nice side of things, apparently +[integer overflow](https://doc.rust-lang.org/book/ch03-02-data-types.html?highlight=overflow#integer-overflow) +is still an issue. Eh. At least when compiling in debug mode overflows +are caught, which is nice. But in release mode the program is +going to "panic", which I was not expecting. I mistakenly thought +this was one of the issues that Rust was solving at compile time, +or maybe even at the level of language specification. + +This brings me to another problem that I thought Rust would solve, +but it does not: accessing a out-of-bound index of an array also leads +to a panic. I was expecting "don't allow indexes out of bound" to be +included in Rust's compile-time checks, somehow. For example in Ada you +can declare an array to accept only values of a specific +[range type](https://en.wikibooks.org/wiki/Ada_Programming/Types/range), +so that out-of-bound errors are completely eliminated. Apparently a +"panic" is memory safe behavior, but it is definitely not *correct* +behavior. I guess this was a big misunderstanding from my side: memory +*safety* does not mean memory *correctness* - Rust still allows you to +make mistakes related to memory. + +## Documentation + +A quick note on the documentation: it is very nice. The book is well +written, and I am enjoying reading through it, even though it is very +basic for me. It is also available offline - at least when installing +rust via `rustup` - which is something I always appreciate. + +The compiler error messages, which I consider to be part of the +documentation as well, are simply amazing. Not only they are usually very +precise, not only they often suggest a fix, but they also point you out to +some piece of documentation so that you can learn why your code is wrong. +For example, if you try to compile this code with `rustc filename.rs`: + +``` +fn main() { + println("Hello, world!"); +} +``` + +You get: + +``` +error[E0423]: expected function, found macro `println` + --> hello.rs:2:2 + | +2 | println("Hello, world!"); + | ^^^^^^^ not a function + | +help: use `!` to invoke the macro + | +2 | println!("Hello, world!"); + | + + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0423`. +``` + +And if you run `rustc --explain E0423` as suggested: + +``` +An identifier was used like a function name or a value was expected and the identifier exists but it belongs to a different namespace. + +Erroneous code example: + +struct Foo { a: bool }; + +let f = Foo(); +// error: expected function, tuple struct or tuple variant, found `Foo` +// `Foo` is a struct name, but this expression uses it like a function name + +Please verify you didn't misspell the name of what you actually wanted to use here. Example: + +fn Foo() -> u32 { 0 } + +let f = Foo(); // ok! + +It is common to forget the trailing ! on macro invocations, which would also yield this error: + +println(""); +// error: expected function, tuple struct or tuple variant, +// found macro `println` +// did you mean `println!(...)`? (notice the trailing `!`) + +Another case where this error is emitted is when a value is expected, but something else is found: + +pub mod a { + pub const I: i32 = 1; +} + +fn h1() -> i32 { + a.I + //~^ ERROR expected value, found module `a` + // did you mean `a::I`? +} +``` + +I would not be surprised if the main reason why Rustaceans are so +enthusiastic about the language was actually how nice `rustc` is. +I expect working with this tool will be very pleasant. + +## Moving on! + +Apart from the +[culture shock](https://en.wikipedia.org/wiki/Culture_shock) of the +installation process and the dependency management, my first impression +of Rust is quite positive. But as I said, I am just getting started +and my judgement is very superficial. I do want to write some small +project in Rust, and I think I'll start from re-writing a simple [math +library for modular arithmetic](../2025-01-21-taming-cpp-templates) +that I wrote in C++ some time ago. + +Stay tuned for more 🦀 -- cgit v1.3 From 4473fea430fbaddaf67afca77ed331067882a638 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Fri, 13 Jun 2025 15:26:47 +0200 Subject: Update link and fix target --- src/blog/2025-01-21-taming-cpp-templates/taming-cpp-templates.md | 2 +- src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/blog/2025-01-21-taming-cpp-templates/taming-cpp-templates.md b/src/blog/2025-01-21-taming-cpp-templates/taming-cpp-templates.md index fe1ca5d..bce440f 100644 --- a/src/blog/2025-01-21-taming-cpp-templates/taming-cpp-templates.md +++ b/src/blog/2025-01-21-taming-cpp-templates/taming-cpp-templates.md @@ -269,7 +269,7 @@ A classic example is [`std::tuple`](https://en.cppreference.com/w/cpp/utility/tuple), which works similarly to `std::pair`, but accepts any number of items. -## Contraints and concepts +## Constraints and concepts To explain the last features I want to talk about, I am going to use a simlpe, albeit slightly unusual, example: let's implement a class diff --git a/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md index e17f89d..094c88c 100644 --- a/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md +++ b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md @@ -325,8 +325,8 @@ Apart from the installation process and the dependency management, my first impression of Rust is quite positive. But as I said, I am just getting started and my judgement is very superficial. I do want to write some small -project in Rust, and I think I'll start from re-writing a simple [math -library for modular arithmetic](../2025-01-21-taming-cpp-templates) +project in Rust, and I think I'll start from re-writing a simple +[math library for modular arithmetic](../2025-01-21-taming-cpp-templates/#constraints-and-concepts) that I wrote in C++ some time ago. Stay tuned for more 🦀 -- cgit v1.3 From 1b3e3705b83d49dafe67b325e314dfc83a493b98 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 14 Jun 2025 15:47:12 +0200 Subject: Fix typo --- src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md index 094c88c..270ceee 100644 --- a/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md +++ b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md @@ -52,7 +52,7 @@ random shit from the internet? (Answer: yes, it is!) Is it going to fuck up my environment by puking configuration lines into my .bashrc? (Answer: yes, it is!) -But ok, what do I know. Maybe I am just leaving in the past, I should +But ok, what do I know. Maybe I am just living in the past, I should embrace the future, because package managers and `make && make install` *are so 1999, man*. So I took a deep breath an run the command. Luckily the script kindly asked "do you want me to fuck up your -- cgit v1.3 From 5fe4b5bce18ede354b29620bbdfff179300710f1 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 14 Jun 2025 16:14:31 +0200 Subject: Remove highlight from link --- src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md index 270ceee..1c65e39 100644 --- a/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md +++ b/src/blog/2025-06-13-cargo-culture-shock/cargo-culture-shock.md @@ -218,7 +218,7 @@ to an instance of an object". I think it is great that Rust endorses this more thorough way of error handling from the start. On the less-nice side of things, apparently -[integer overflow](https://doc.rust-lang.org/book/ch03-02-data-types.html?highlight=overflow#integer-overflow) +[integer overflow](https://doc.rust-lang.org/book/ch03-02-data-types.html#integer-overflow) is still an issue. Eh. At least when compiling in debug mode overflows are caught, which is nice. But in release mode the program is going to "panic", which I was not expecting. I mistakenly thought -- cgit v1.3 From c225088f94f6efa3a6f670011596691b862448f4 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Thu, 26 Jun 2025 11:43:41 +0200 Subject: Blog post --- .../2025-06-26-borrow-checker/borrow-checker.md | 150 +++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 src/blog/2025-06-26-borrow-checker/borrow-checker.md (limited to 'src') diff --git a/src/blog/2025-06-26-borrow-checker/borrow-checker.md b/src/blog/2025-06-26-borrow-checker/borrow-checker.md new file mode 100644 index 0000000..b22d741 --- /dev/null +++ b/src/blog/2025-06-26-borrow-checker/borrow-checker.md @@ -0,0 +1,150 @@ +# Stunned by the borrow checker 🦀 + +As I mentioned in my [last post](../2025-06-13-cargo-culture-shock), +in the last couple of weeks I have been learning Rust. I have written +[a small library](https://git.tronto.net/zmodn-rs/file/README.md.html) for +[integers modulo N](https://en.wikipedia.org/wiki/Modular_arithmetic) +(the original C++ version was mentioned in +[this post](../2025-01-21-taming-cpp-templates), rewritten +[my implementation](https://git.tronto.net/ecm/file/README.md.html) +of the +[ECM algorithm](https://en.wikipedia.org/wiki/Lenstra_elliptic-curve_factorization) +(mentioned in [this other post](../2025-02-27-elliptic-curves-javascript)) +and I am now playing around with some past +[Advent of Code](https://adventofcode.com/) problems. + +But today I won't talk about any of the above. Instead, I just want to show +you a small example of code that kept me confused for a couple of hours. + +First, I need to very briefly explain Rust's concept of ownership. + +## The borrow checker + +The *borrow checker* is a unique feature of Rust that prevents certain +kinds of memory errors and data races. Without going into too much +detail, the borrow checker is a compile-time mechanism that ensures that, +at any given point, a given object is owned by at most one reference, +unless all references to it are *immutable* (that is, they don't allow +modifying the object). + +As a simple example, the following code is not valid: + +``` +fn main() { + let mut x = 2; // mut means mutable, without it x would be a constant + let y = &x; // & means reference + x = 3; + println!("{x} {y}"); +} +``` + +And the compiler gives a clear explanation: + +``` +error[E0506]: cannot assign to `x` because it is borrowed + --> t.rs:4:5 + | +3 | let y = &x; + | -- `x` is borrowed here +4 | x = 3; + | ^^^^^ `x` is assigned to here but it was already borrowed +5 | println!("{x} {y}"); + | --- borrow later used here +``` + +What happens is that creating a (mutable) reference `y` that refers to +`x`, *borrows* the object referred to by the name `x`, so `x` cannot be +used directly anymore until `y` goes out of scope. + +If you want to know more, check out the +[ownership chapter in the book](https://doc.rust-lang.org/book/ch04-00-understanding-ownership.html). + +## A tricky example + +Let's say we have a vector of vectors, and we want to copy an element from +one of the internal vectors to another. We could try something like this: + +``` +fn main() { + let mut v = vec![vec![23], vec![42]]; // v is now {{23}, {42}} + v[0].push(v[1][0]); +} +``` + +But this won't compile. Indeed we get: + +``` +error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable + --> a.rs:3:15 + | +3 | v[0].push(v[1][0]); + | - ---- ^ immutable borrow occurs here + | | | + | | mutable borrow later used by call + | mutable borrow occurs here + | + = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices +``` + +However, the following works just fine: + +``` +fn main() { + let mut v = vec![vec![23], vec![42]]; + let x = v[1][0]; + v[0].push(x); +} +``` + +And at this point I was very confused. Whatever the borrow checker does, +shouldn't the two pieces of code do exactly the same? I got stuck for +a while thinking that for some reason the function argument of `push()` +was passed by reference in the first case, while it was copied in the +second, but this is not where the problem lies. + +I was finally able to understand the problem when I realized that my first +piece of code is equivalent to the following, which also does not compile: + +``` +fn main() { + let mut v = vec![vec![23], vec![42]]; + let mut v0 = &mut v[0]; + let x = v[1][0]; + v0.push(x); +} +``` + +Can you see the issue now? + +## Explanation + +Like in C++ and many other languages, the square +bracket operator is a method on the vector object. +More precisely, in Rust it is syntactic sugar for either the +[`index()`](https://doc.rust-lang.org/std/ops/trait.Index.html) or the +[`index_mut()`](https://doc.rust-lang.org/std/ops/trait.IndexMut.html) +functions, depending if mutability is requested in our usage. In our +example, when we call `v[0].push(...)` this will be translated to a call +to `index_mut()`, because `push()` requires a mutable reference; when +we do e.g. `let x = v[1][0]`, the immutable version will be call instead. + +But the details of `[]` are not important for us. The cause of the problem +is that `let mut v0 = &mut v[0]` creates a mutable reference to *part +of* the object `v`. At this point, `v` is borrowed and cannot be used +directly anymore, even if we just want to immutably access some other +parts of it to make a copy. Thus, when we try to do `let x = v[1][0]`, +the borrow checker complains. + +In the first version of my code all of this happens in the same line, +and this makes it confusing, because the order in which the various +statements of that line are executed is very important. + +## Solution + +Solving the problem is easy, I can just use the second version of my code. +Alternatively I could also try to use `split_at_mut()` as suggested +by the compiler, but this seems overkill in this case; good to keep in +mind though. + +But sometimes understanding a problem is more important than finding +a solution. -- cgit v1.3 From de57a12e9a5daadedf649aba4b5c498983ff4347 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Thu, 26 Jun 2025 11:47:23 +0200 Subject: Added rust series to series page --- src/series/series.md | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src') diff --git a/src/series/series.md b/src/series/series.md index afbf3dd..a98b85c 100644 --- a/src/series/series.md +++ b/src/series/series.md @@ -50,3 +50,13 @@ My adventures in learning C++ as a C programmer. * Episode 1: [motivation](../blog/2024-04-30-taming-cpp-motivation) * Episode 2: [RAII](../blog/2024-12-26-taming-cpp-raii) * Episode 3: [templates, constraints and concepts](../blog/2025-01-21-taming-cpp-templates) + +## Learning Rust + +I have recently started learning Rust, documenting the process in a +small series of blog posts. These posts are all marked by the crab emoji +'🦀', which is something of a meme in the Rust community, as far as +I understand. + +* [Cargo culture shock](../blog/2025-06-13-cargo-culture-shock) +* [Stunned by the borrow checker](../blog/2025-06-26-borrow-checker) -- cgit v1.3 From afec8caa5b74e81e7427cdf1240711429e2d9ed8 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sat, 16 Aug 2025 20:35:54 +0200 Subject: New blog post --- .../alpine-declarative.md | 106 +++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/blog/2025-08-16-alpine-declarative/alpine-declarative.md (limited to 'src') diff --git a/src/blog/2025-08-16-alpine-declarative/alpine-declarative.md b/src/blog/2025-08-16-alpine-declarative/alpine-declarative.md new file mode 100644 index 0000000..f186ea2 --- /dev/null +++ b/src/blog/2025-08-16-alpine-declarative/alpine-declarative.md @@ -0,0 +1,106 @@ +# Declarative package management with Alpine Linux + +It has been almost two months since my last update, and it feels a +bit weird because I have done plenty of tinkering that would be a +good fit for this blog! But for one reason or another, I did not +feel like writing about any of this in the usual level of detail. + +However, one of the last things I did is quite simple to explain, so here +is a short post about it. + +## Alpine linux + +A couple of days ago I decided to try out +[Alpine Linux](https://www.alpinelinux.org), a lightweight distro that +uses [musl libc](https://www.musl-libc.org/) instead of GNU libc and +[busybox](https://busybox.net) instead of GNU coreutils. + +Alpine's package manager is called Alpine Package Keeper (APK, not to +be confused with Android Package, which also goes by APK). It is very +fast and simple to use, and it has an especially cool feature: the +list of all manually installed packages is kept in the plain text file +`/etc/apk/world`. This file can be edited by hand, and running `apk fix` +will then add or remove packages to satisfy the list in the file. Neat! + +## Declarative package management + +Unfortunately, APK will also overwrite `/etc/apk/world` by removing +empty lines and sorting the packages in alphabetical order, one per +line. Moreover, there is no option to write comments in this file. +So one cannot really use it as a (commented) list of the packages they +want to keep installed. + +At first I thought I could keep such a list in a separate file, and write +a script to parse this file, remove the comments, write the result to +`/etc/apk/world` and then run `apk fix`. + +But then I thought it would be even better to merge the two, and here +is the result: + +``` +#!/bin/sh + +# Make a backup copy of the previous /etc/apk/world +cp /etc/apk/world /etc/apk/world.backup + +echo " + +# Base system packages (installed by default) +alpine-base busybox-mdev-openrc doas grub-efi openssh openssl + +# Firmware (installed by default, system-dependent) +linux-firmware-i915 linux-firmware-intel linux-firmware-mediatek linux-firmware-other +linux-firmware-rtl_bt linux-firmware-rtl_nic linux-firmware-xe linux-lts + +# Documentation +docs mandoc-apropos + +# Wifi and other hardware control +iwd openresolv pciutils bluez + +# Audio +pulseaudio pulseaudio-bluez pulseaudio-alsa alsa-plugins-pulse pulseaudio-utils pulsemixer + +# Core tools (non-X) +coreutils-fmt curl imagemagick ffmpeg tmux ghostscript ncurses shellcheck +kbd # For console keyboard configuration +syncthing fzf sfeed yt-dlp mblaze msmtp oath-toolkit + +# Development tools +build-base git gdb valgrind clang20 python3 rust cargo hare +lowdown darkhttpd # Both used for updating my website +libx11-dev libxft-dev libxinerama-dev + +# Xorg xorg-server +xinit eudev mesa-dri-gallium xf86-video-intel xf86-input-libinput xf86-input-synaptics +setxkbmap xsel xbanish xsetroot xwallpaper xev slock + +# X applications +firefox libreoffice telegram-desktop vlc imv-x11 +zathura-djvu zathura-pdf-mupdf zathura-ps +arandr + +# Fonts, but like a gazillion of them +font-terminus font-noto font-noto-extra font-arabic-misc +font-misc-cyrillic font-mutt-misc font-screen-cyrillic +font-winitzki-cyrillic font-cronyx-cyrillic font-noto-arabic +font-noto-armenian font-noto-cherokee font-noto-devanagari +font-noto-ethiopic font-noto-georgian font-noto-hebrew font-noto-lao +font-noto-malayalam font-noto-tamil font-noto-thaana font-noto-thai + +" | sed 's/#.*//' | grep -v '^[:space:]*$' > /etc/apk/world +apk fix +``` + +The bulk of the file is a +[here document](https://en.wikipedia.org/wiki/Here_document) with a long +list of all the packages I want installed - Alpine is really minimal! The +few lines of code above and below this list are there to make a backup a +copy of the old `/etc/apk/world`, filter out the comment from the new list +using [sed](../2023-12-03-sed) and [grep](../2023-08-20-grep), +copy the new list to `/etc/apk/world` and finally run `apk fix`. + +Now when I want to add a new piece of software to my system +I edit this file and then run it as root. A dead simple +way to do declarative package management - take that, +[Nix](https://en.wikipedia.org/wiki/Nix_(package_manager))! -- cgit v1.3 From c192f8cde924377ffe4085a80f2baeb525658af1 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Sun, 21 Sep 2025 12:50:18 +0200 Subject: updated with new paper --- src/research/research.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/research/research.md b/src/research/research.md index fbacd09..9820074 100644 --- a/src/research/research.md +++ b/src/research/research.md @@ -33,11 +33,11 @@ for a list of slides and notes of my talks. * Tronto, Sebastiano. *Division in modules and Kummer theory.* - [arXiv preprint](https://arxiv.org/abs/2111.14363). + [Journal de Thórie des Nombres de Bordeaux (2025) - open access](https://jtnb.centre-mersenne.org/articles/10.5802/jtnb.1326) * Lombardo, Davide; Tronto, Sebastiano. *Some uniform bounds for elliptic curves over Q.* - [Pacific Journal of Mathematics, (2022)](https://msp.org/pjm/2022/320-1/p06.xhtml). + [Pacific Journal of Mathematics (2022)](https://msp.org/pjm/2022/320-1/p06.xhtml). * Lombardo, Davide; Tronto, Sebastiano. *Effective Kummer theory for elliptic curves.* -- cgit v1.3