Skip to content

Commit 9d9cbc4

Browse files
committed
Solve day 24
Goddamnit
1 parent 379bdb3 commit 9d9cbc4

File tree

7 files changed

+706
-0
lines changed

7 files changed

+706
-0
lines changed

2021/24/Main.hs

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import qualified Data.IntMap.Strict as M
2+
3+
fn (a,b,c) w z = let x = fromEnum $ z `mod` 26 + b /= w
4+
in z `div` a * (25 * x + 1) + (w + c) * x
5+
6+
param = [ (1,13,3)
7+
, (1,11,12)
8+
, (1,15,9)
9+
, (26,-6,12)
10+
, (1,15,2)
11+
, (26,-8,1)
12+
, (26,-4,1)
13+
, (1,15,13)
14+
, (1,10,1)
15+
, (1,11,6)
16+
, (26,-11,2)
17+
, (26,0,11)
18+
, (26,-8,10)
19+
, (26,-7,3)
20+
]
21+
22+
branchingEval h = best . (flip loop) (M.singleton 0 [])
23+
where
24+
loop :: [(Int,Int,Int)] -> M.IntMap [Int] -> M.IntMap [Int]
25+
loop [] = id
26+
loop (p:ps) = loop ps . M.fromListWith h . M.foldMapWithKey g
27+
where
28+
g :: Int -> [Int] -> [(Int, [Int])]
29+
g z l = [(fn p w z, w:l) | w <- [1..9]]
30+
best s | z == 0 = l
31+
| z /= 0 = best s'
32+
where
33+
(Just ((z, l), s')) = M.maxViewWithKey s
34+
35+
main = f max >> putStrLn "" >> f min >> putStrLn ""
36+
where f h = mapM_ (putStr . show) (reverse $ branchingEval h param)

2021/24/analysis.txt

+168
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
inp w
2+
3+
inp w
4+
ld y w
5+
add y 12
6+
ld z y
7+
8+
inp w
9+
ld x z
10+
add x 15
11+
nql x w
12+
ld y 25
13+
mul y x
14+
add y 1
15+
mul z y
16+
ld y w
17+
add y 9
18+
mul y x
19+
add z y
20+
21+
inp w
22+
ld x z
23+
mod x 26
24+
div z 26
25+
add x -6
26+
nql x w
27+
ld y 25
28+
mul y x
29+
add y 1
30+
mul z y
31+
ld y w
32+
add y 12
33+
mul y x
34+
add z y
35+
inp w
36+
ld x z
37+
mod x 26
38+
add x 15
39+
nql x w
40+
ld y 25
41+
mul y x
42+
add y 1
43+
mul z y
44+
ld y w
45+
add y 2
46+
mul y x
47+
add z y
48+
inp w
49+
ld x z
50+
mod x 26
51+
div z 26
52+
add x -8
53+
nql x w
54+
ld y 25
55+
mul y x
56+
add y 1
57+
mul z y
58+
ld y w
59+
add y 1
60+
mul y x
61+
add z y
62+
inp w
63+
ld x z
64+
mod x 26
65+
div z 26
66+
add x -4
67+
nql x w
68+
ld y 25
69+
mul y x
70+
add y 1
71+
mul z y
72+
ld y w
73+
add y 1
74+
mul y x
75+
add z y
76+
inp w
77+
ld x z
78+
mod x 26
79+
add x 15
80+
nql x w
81+
ld y 25
82+
mul y x
83+
add y 1
84+
mul z y
85+
ld y w
86+
add y 13
87+
mul y x
88+
add z y
89+
inp w
90+
ld x z
91+
mod x 26
92+
add x 10
93+
nql x w
94+
ld y 25
95+
mul y x
96+
add y 1
97+
mul z y
98+
ld y w
99+
add y 1
100+
mul y x
101+
add z y
102+
inp w
103+
ld x z
104+
mod x 26
105+
add x 11
106+
nql x w
107+
ld y 25
108+
mul y x
109+
add y 1
110+
mul z y
111+
ld y w
112+
add y 6
113+
mul y x
114+
add z y
115+
inp w
116+
ld x z
117+
mod x 26
118+
div z 26
119+
add x -11
120+
nql x w
121+
ld y 25
122+
mul y x
123+
add y 1
124+
mul z y
125+
ld y w
126+
add y 2
127+
mul y x
128+
add z y
129+
inp w
130+
ld x z
131+
mod x 26
132+
div z 26
133+
add x 0
134+
nql x w
135+
ld y 25
136+
mul y x
137+
add y 1
138+
mul z y
139+
ld y w
140+
add y 11
141+
mul y x
142+
add z y
143+
144+
inp w
145+
ld x z
146+
mod x 26
147+
div z 26
148+
add x -8
149+
nql x w
150+
ld y 25
151+
mul y x
152+
add y 1
153+
mul z y
154+
ld y w
155+
add y 10
156+
mul y x
157+
add z y
158+
159+
inp w
160+
ld x z # z in [8..17]
161+
mod x 26
162+
div z 26 # z in [0..25]
163+
add x -7 # x in [8..17]
164+
nql x w # get x == w
165+
ld y w # y in [1..9]
166+
add y 3 # forget about y == 0
167+
mul y x # Get x to be 0
168+
add z y # Get z to be 0 too

2021/24/brute/Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2021/24/brute/Cargo.toml

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[package]
2+
name = "brute"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+

2021/24/brute/src/main.rs

+171
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
use std::sync::atomic::{AtomicUsize, Ordering};
2+
3+
#[inline(always)]
4+
fn f(a: i64, b: i64, c: i64, w: i64, z: i64) -> i64 {
5+
let x = i64::from(z % 26 + b != w);
6+
return z / a * (25 * x + 1) + (w + c) * x;
7+
}
8+
9+
/*
10+
fn main() {
11+
let z = 0;
12+
for a in (1..=9).rev() {
13+
// 0
14+
let z = f(1, 13, 3, a, z);
15+
for b in (1..=9).rev() {
16+
// 1
17+
let z = f(1, 11, 12, b, z);
18+
println!("{}{}", a, b);
19+
for c in (1..=9).rev() {
20+
// 2
21+
let z = f(1, 15, 9, c, z);
22+
for d in (1..=9).rev() {
23+
// 3
24+
let z = f(26, -6, 12, d, z);
25+
for e in (1..=9).rev() {
26+
// 4
27+
let z = f(1, 15, 2, e, z);
28+
for o in (1..=9).rev() {
29+
// 5
30+
let z = f(26, -8, 1, o, z);
31+
for g in (1..=9).rev() {
32+
// 6
33+
let z = f(26, -4, 1, g, z);
34+
for h in (1..=9).rev() {
35+
// 7
36+
let z = f(1, 15, 13, h, z);
37+
for i in (1..=9).rev() {
38+
// 8
39+
let z = f(1, 10, 1, i, z);
40+
for j in (1..=9).rev() {
41+
// 9
42+
let z = f(1, 11, 6, j, z);
43+
for k in (1..=9).rev() {
44+
// 10
45+
let z = f(26, -11, 2, k, z);
46+
for l in (1..=9).rev() {
47+
// 11
48+
let z = f(26, 0, 11, l, z);
49+
for m in (1..=9).rev() {
50+
// 12
51+
let z = f(26, -8, 10, m, z);
52+
for n in (1..=9).rev() {
53+
// 13
54+
let z = f(26, -7, 3, n, z);
55+
if z == 0 {
56+
println!(
57+
"{}{}{}{}{}{}{}{}{}{}{}{}{}{}",
58+
a,
59+
b,
60+
c,
61+
d,
62+
e,
63+
o,
64+
g,
65+
h,
66+
i,
67+
j,
68+
k,
69+
l,
70+
m,
71+
n
72+
);
73+
return;
74+
}
75+
}
76+
}
77+
}
78+
}
79+
}
80+
}
81+
}
82+
}
83+
}
84+
}
85+
}
86+
}
87+
}
88+
}
89+
}
90+
*/
91+
92+
fn main() {
93+
let z = 0;
94+
for a in 1..=9 {
95+
// 0
96+
let z = f(1, 13, 3, a, z);
97+
for b in 8..=9 {
98+
// 1
99+
let z = f(1, 11, 12, b, z);
100+
println!("{}{}", a, b);
101+
for c in 1..=9 {
102+
// 2
103+
let z = f(1, 15, 9, c, z);
104+
for d in 1..=9 {
105+
// 3
106+
let z = f(26, -6, 12, d, z);
107+
for e in 1..=9 {
108+
// 4
109+
let z = f(1, 15, 2, e, z);
110+
for o in 1..=9 {
111+
// 5
112+
let z = f(26, -8, 1, o, z);
113+
for g in 1..=9 {
114+
// 6
115+
let z = f(26, -4, 1, g, z);
116+
for h in 1..=9 {
117+
// 7
118+
let z = f(1, 15, 13, h, z);
119+
for i in 1..=9 {
120+
// 8
121+
let z = f(1, 10, 1, i, z);
122+
for j in 1..=9 {
123+
// 9
124+
let z = f(1, 11, 6, j, z);
125+
for k in 1..=9 {
126+
// 10
127+
let z = f(26, -11, 2, k, z);
128+
for l in 1..=9 {
129+
// 11
130+
let z = f(26, 0, 11, l, z);
131+
for m in 1..=9 {
132+
// 12
133+
let z = f(26, -8, 10, m, z);
134+
for n in 1..=9 {
135+
// 13
136+
let z = f(26, -7, 3, n, z);
137+
if z == 0 {
138+
println!(
139+
"{}{}{}{}{}{}{}{}{}{}{}{}{}{}",
140+
a,
141+
b,
142+
c,
143+
d,
144+
e,
145+
o,
146+
g,
147+
h,
148+
i,
149+
j,
150+
k,
151+
l,
152+
m,
153+
n
154+
);
155+
return;
156+
}
157+
}
158+
}
159+
}
160+
}
161+
}
162+
}
163+
}
164+
}
165+
}
166+
}
167+
}
168+
}
169+
}
170+
}
171+
}

0 commit comments

Comments
 (0)