Skip to content

Instantly share code, notes, and snippets.

@0e4ef622
Last active December 20, 2018 04:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0e4ef622/46051265facc5ccad0d311c345b60e1a to your computer and use it in GitHub Desktop.
Save 0e4ef622/46051265facc5ccad0d311c345b60e1a to your computer and use it in GitHub Desktop.
aoc day 16 2018
const OPERATIONS: [fn(usize, usize, usize, usize) -> usize; 16] = [
|a, ra, b, rb| ra+rb, // addr
|a, ra, b, rb| ra+b, // addi
|a, ra, b, rb| ra*rb, // mulr
|a, ra, b, rb| ra*b, // muli
|a, ra, b, rb| ra & rb, // banr
|a, ra, b, rb| ra & b, // bani
|a, ra, b, rb| ra | rb, // borr
|a, ra, b, rb| ra | b, // bori
|a, ra, _, rb| ra, // setr
|a, ra, _, rb| a, // seti
|a, ra, b, rb| (a > rb) as usize, // gtir
|a, ra, b, rb| (ra > b) as usize, // gtri
|a, ra, b, rb| (ra > rb) as usize, // gtrr
|a, ra, b, rb| (a == rb) as usize, // eqir
|a, ra, b, rb| (ra == b) as usize, // eqri
|a, ra, b, rb| (ra == rb) as usize, // eqrr
];
pub fn main() {
for i in 0..64 {
println!("{}", {
let mut n: u64 = 0;
for j in 0..64 {
let a = (i >> 4) & 3;
let b = (i >> 2) & 3;
let ra = i & 3;
let rb = j & 3;
let o = (j >> 2) & 15;
let mut c = 0;
for op in &OPERATIONS {
if op(a, ra, b, rb) == o {
c += 1;
if c >= 3 {
n |= 1 << j;
break;
}
}
}
}
n
});
}
}
const OPERATIONS: [fn(usize, usize, usize, usize) -> usize; 16] = [
|a, ra, b, rb| ra+rb, // addr
|a, ra, b, rb| ra+b, // addi
|a, ra, b, rb| ra*rb, // mulr
|a, ra, b, rb| ra*b, // muli
|a, ra, b, rb| ra & rb, // banr
|a, ra, b, rb| ra & b, // bani
|a, ra, b, rb| ra | rb, // borr
|a, ra, b, rb| ra | b, // bori
|a, ra, _, rb| ra, // setr
|a, ra, _, rb| a, // seti
|a, ra, b, rb| (a > rb) as usize, // gtir
|a, ra, b, rb| (ra > b) as usize, // gtri
|a, ra, b, rb| (ra > rb) as usize, // gtrr
|a, ra, b, rb| (a == rb) as usize, // eqir
|a, ra, b, rb| (ra == b) as usize, // eqri
|a, ra, b, rb| (ra == rb) as usize, // eqrr
];
pub fn main() {
for i in 0..4096 {
println!("{}", {
let a = (i >> 6) & 3;
let b = (i >> 4) & 3;
let ra = (i >> 2) & 3;
let rb = i & 3;
let o = (i >> 8) & 15;
let mut possible_ops: u16 = 0;
for (j, op) in OPERATIONS.iter().enumerate() {
if op(a, ra, b, rb) == o {
possible_ops |= 1 << j;
}
}
possible_ops
});
}
}
const OPERATIONS: [fn(&mut [usize; 4], usize, usize, usize); 16] = [
|r: &mut [usize; 4], a, b, o| r[o] = r[a]+r[b], // addr
|r: &mut [usize; 4], a, b, o| r[o] = r[a]+b, // addi
|r: &mut [usize; 4], a, b, o| r[o] = r[a]*r[b], // mulr
|r: &mut [usize; 4], a, b, o| r[o] = r[a]*b, // muli
|r: &mut [usize; 4], a, b, o| r[o] = r[a] & r[b], // banr
|r: &mut [usize; 4], a, b, o| r[o] = r[a] & b, // bani
|r: &mut [usize; 4], a, b, o| r[o] = r[a] | r[b], // borr
|r: &mut [usize; 4], a, b, o| r[o] = r[a] | b, // bori
|r: &mut [usize; 4], a, _, o| r[o] = r[a], // setr
|r: &mut [usize; 4], a, _, o| r[o] = a, // seti
|r: &mut [usize; 4], a, b, o| r[o] = (a > r[b]) as usize, // gtir
|r: &mut [usize; 4], a, b, o| r[o] = (r[a] > b) as usize, // gtri
|r: &mut [usize; 4], a, b, o| r[o] = (r[a] > r[b]) as usize, // gtrr
|r: &mut [usize; 4], a, b, o| r[o] = (a == r[b]) as usize, // eqir
|r: &mut [usize; 4], a, b, o| r[o] = (r[a] == b) as usize, // eqri
|r: &mut [usize; 4], a, b, o| r[o] = (r[a] == r[b]) as usize, // eqrr
];
const LOOKUP: [u64; 64] = [
63, 255, 3871, 61503,
63, 255, 44831, 61695,
1039, 49215, 266015, 61503,
32783, 49343, 12047, 61503,
63, 255, 3967, 61695,
255, 255, 44927, 61695,
1087, 49343, 266111, 61695,
32831, 49407, 12095, 61695,
1087, 255, 3967, 61567,
1151, 1791, 44927, 61695,
3887, 50751, 266111, 62591,
33839, 49407, 12047, 61567,
32831, 49407, 12159, 61695,
33023, 49407, 65407, 61695,
33839, 61631, 274303, 61695,
61487, 61695, 44815, 61695,
];
pub fn fryguy_part1_modified(input: &str) -> usize {
let mut input = input.as_bytes();
let mut ret = 0;
while input[0] == b'B' {
let re = &input[9..19];
input = &input[23 + (input[22] != b' ') as usize..];
let a = (input[0] & 3) as usize;
let b = (input[2] & 3) as usize;
let o = (input[4] & 3) as usize;
let rea = (re[3*a] & 3) as usize;
let reb = (re[3*b] & 3) as usize;
let afo = (input[15 + 3*o] & 15) as usize;
ret += ((LOOKUP[(a<<4) | (b<<2) | rea] >> ((afo << 2) | reb)) & 0x01) as usize;
input = &input[28..];
}
ret
}
#[inline(never)]
fn execute(mut input: &[u8], map: [usize; 16]) -> [usize; 4] {
let mut r = [0, 0, 0, 0];
while input.len() > 0 {
let mut ii: usize = (input[0] & 15) as usize;
if input[1] == b' ' {
input = &input[2..];
} else {
ii = ii*10 + (input[1] & 15) as usize;
input = &input[3..];
}
let a = (input[0] & 15) as usize;
let b = (input[2] & 15) as usize;
let o = (input[4] & 15) as usize;
OPERATIONS[map[ii]](&mut r, a, b, o);
input = &input[6..];
}
r
}
pub fn part2(input: &str) -> usize {
let mut input = input.as_bytes();
// index by opcode, returns set of possible indices into operations as a bitmask
let mut map = [65535u16; 16];
let mut newmap = [16usize; 16];
while input[0] == b'B' {
let re = &input[9..19];
let ii;
if input[22] == b' ' {
ii = (input[21] & 15) as usize;
input = &input[23..];
} else {
ii = 10*(input[21] & 15) as usize + (input[22] & 15) as usize;
input = &input[24..];
};
if map[ii] == 0 {
input = &input[28..];
continue;
}
let a = (input[0] & 3) as usize;
let b = (input[2] & 3) as usize;
let o = (input[4] & 3) as usize;
let rea = (re[3*a] & 3) as usize;
let reb = (re[3*b] & 3) as usize;
let afo = (input[15 + 3*o] & 15) as usize;
let possible_ops = PART2_LOOKUP[(afo << 8) | (a<<6) | (b<<4) | (rea<<2) | reb];
map[ii] &= possible_ops;
if map[ii].count_ones() == 1 {
let n = map[ii].trailing_zeros();
newmap[ii] = n as usize;
for v in &mut map {
*v &= !(1 << n);
}
}
input = &input[28..];
}
input = &input[2..]; // skip the 2 extra lines
let mut ct = true;
while ct { // just in case
ct = false;
for (n, m) in newmap.iter_mut().zip(map.clone().iter()) {
if *n != 16 {
if m.count_ones() == 1 {
let op = m.trailing_zeros();
for m in &mut map {
*m &= !(1 << op);
}
*n = op as usize;
ct = true;
}
}
}
}
execute(input, newmap)[0]
}
const PART2_LOOKUP: [u16; 2560] = [
8191, 49086, 49086, 49086, 50748, 30248, 63032, 63016, 50748, 58936, 30248, 63016, 50748, 58920, 58920, 30248,
24445, 65340, 65340, 65340, 36372, 15872, 48656, 48640, 50740, 58928, 30240, 63008, 50708, 58880, 58880, 30208,
24445, 65340, 65340, 65340, 52788, 32288, 65072, 65056, 36372, 44560, 15872, 48640, 50708, 58880, 58880, 30208,
24445, 65340, 65340, 65340, 52756, 32256, 65040, 65024, 52756, 60944, 32256, 65024, 36372, 44544, 44544, 15872,
14847, 40382, 48574, 48574, 57404, 21544, 62520, 62504, 57404, 50232, 29736, 62504, 57404, 50216, 58408, 29736,
31101, 56636, 64828, 64828, 43028, 7168, 48144, 48128, 57396, 50224, 29728, 62496, 57364, 50176, 58368, 29696,
31101, 56636, 64828, 64828, 59444, 23584, 64560, 64544, 43028, 35856, 15360, 48128, 57364, 50176, 58368, 29696,
31101, 56636, 64828, 64828, 59412, 23552, 64528, 64512, 59412, 52240, 31744, 64512, 43028, 35840, 44032, 15360,
14847, 47550, 40382, 48574, 57404, 28712, 54328, 62504, 57404, 57400, 21544, 62504, 57404, 57384, 50216, 29736,
31101, 63804, 56636, 64828, 43028, 14336, 39952, 48128, 57396, 57392, 21536, 62496, 57364, 57344, 50176, 29696,
31101, 63804, 56636, 64828, 59444, 30752, 56368, 64544, 43028, 43024, 7168, 48128, 57364, 57344, 50176, 29696,
31101, 63804, 56636, 64828, 59412, 30720, 56336, 64512, 59412, 59408, 23552, 64512, 43028, 43008, 35840, 15360,
14847, 47550, 47550, 40382, 57404, 28712, 61496, 54312, 57404, 57400, 28712, 54312, 57404, 57384, 57384, 21544,
31101, 63804, 63804, 56636, 43028, 14336, 47120, 39936, 57396, 57392, 28704, 54304, 57364, 57344, 57344, 21504,
31101, 63804, 63804, 56636, 59444, 30752, 63536, 56352, 43028, 43024, 14336, 39936, 57364, 57344, 57344, 21504,
31101, 63804, 63804, 56636, 59412, 30720, 63504, 56320, 59412, 59408, 30720, 56320, 43028, 43008, 43008, 7168,
57344, 16449, 16384, 16384, 14787, 35286, 2434, 2450, 14336, 6144, 34816, 2048, 14336, 6160, 6144, 34816,
41090, 195, 130, 130, 29161, 49660, 16808, 16824, 14336, 6144, 34816, 2048, 14368, 6192, 6176, 34848,
40960, 65, 0, 0, 12609, 33108, 256, 272, 28672, 20480, 49152, 16384, 14336, 6160, 6144, 34816,
40960, 65, 0, 0, 12641, 33140, 288, 304, 12288, 4096, 32768, 0, 28672, 20496, 20480, 49152,
50688, 25153, 16896, 16896, 8131, 43990, 2946, 2962, 7680, 14848, 35328, 2560, 7680, 14864, 6656, 35328,
34434, 8899, 642, 642, 22505, 58364, 17320, 17336, 7680, 14848, 35328, 2560, 7712, 14896, 6688, 35360,
34304, 8769, 512, 512, 5953, 41812, 768, 784, 22016, 29184, 49664, 16896, 7680, 14864, 6656, 35328,
34304, 8769, 512, 512, 5985, 41844, 800, 816, 5632, 12800, 33280, 512, 22016, 29200, 20992, 49664,
50176, 17473, 24576, 16384, 7619, 36310, 10626, 2450, 7168, 7168, 43008, 2048, 7168, 7184, 14336, 34816,
33922, 1219, 8322, 130, 21993, 50684, 25000, 16824, 7168, 7168, 43008, 2048, 7200, 7216, 14368, 34848,
33792, 1089, 8192, 0, 5441, 34132, 8448, 272, 21504, 21504, 57344, 16384, 7168, 7184, 14336, 34816,
33792, 1089, 8192, 0, 5473, 34164, 8480, 304, 5120, 5120, 40960, 0, 21504, 21520, 28672, 49152,
50176, 17473, 17408, 24576, 7619, 36310, 3458, 10642, 7168, 7168, 35840, 10240, 7168, 7184, 7168, 43008,
33922, 1219, 1154, 8322, 21993, 50684, 17832, 25016, 7168, 7168, 35840, 10240, 7200, 7216, 7200, 43040,
33792, 1089, 1024, 8192, 5441, 34132, 1280, 8464, 21504, 21504, 50176, 24576, 7168, 7184, 7168, 43008,
33792, 1089, 1024, 8192, 5473, 34164, 1312, 8496, 5120, 5120, 33792, 8192, 21504, 21520, 21504, 57344,
0, 0, 65, 0, 0, 1, 4, 0, 451, 390, 466, 402, 0, 0, 16, 0,
0, 0, 65, 0, 2, 3, 6, 2, 329, 268, 344, 280, 0, 0, 16, 0,
130, 130, 195, 130, 8, 9, 12, 8, 481, 420, 496, 432, 32, 32, 48, 32,
0, 0, 65, 0, 0, 1, 4, 0, 353, 292, 368, 304, 0, 0, 16, 0,
0, 0, 65, 0, 0, 1, 4, 0, 451, 390, 466, 402, 0, 0, 16, 0,
0, 0, 65, 0, 2, 3, 6, 2, 329, 268, 344, 280, 0, 0, 16, 0,
130, 130, 195, 130, 8, 9, 12, 8, 481, 420, 496, 432, 32, 32, 48, 32,
0, 0, 65, 0, 0, 1, 4, 0, 353, 292, 368, 304, 0, 0, 16, 0,
512, 512, 577, 512, 512, 513, 516, 512, 963, 902, 978, 914, 512, 512, 528, 512,
512, 512, 577, 512, 514, 515, 518, 514, 841, 780, 856, 792, 512, 512, 528, 512,
642, 642, 707, 642, 520, 521, 524, 520, 993, 932, 1008, 944, 544, 544, 560, 544,
512, 512, 577, 512, 512, 513, 516, 512, 865, 804, 880, 816, 512, 512, 528, 512,
0, 0, 65, 0, 0, 1, 4, 0, 451, 390, 466, 402, 0, 0, 16, 0,
0, 0, 65, 0, 2, 3, 6, 2, 329, 268, 344, 280, 0, 0, 16, 0,
130, 130, 195, 130, 8, 9, 12, 8, 481, 420, 496, 432, 32, 32, 48, 32,
0, 0, 65, 0, 0, 1, 4, 0, 353, 292, 368, 304, 0, 0, 16, 0,
0, 0, 0, 65, 0, 0, 65, 68, 0, 65, 0, 64, 451, 454, 450, 466,
0, 0, 0, 65, 0, 0, 65, 68, 130, 195, 130, 194, 457, 460, 456, 472,
0, 0, 0, 65, 130, 130, 195, 198, 0, 65, 0, 64, 449, 452, 448, 464,
130, 130, 130, 195, 136, 136, 201, 204, 128, 193, 128, 192, 481, 484, 480, 496,
0, 0, 0, 65, 0, 0, 65, 68, 0, 65, 0, 64, 451, 454, 450, 466,
0, 0, 0, 65, 0, 0, 65, 68, 130, 195, 130, 194, 457, 460, 456, 472,
0, 0, 0, 65, 130, 130, 195, 198, 0, 65, 0, 64, 449, 452, 448, 464,
130, 130, 130, 195, 136, 136, 201, 204, 128, 193, 128, 192, 481, 484, 480, 496,
0, 0, 0, 65, 0, 0, 65, 68, 0, 65, 0, 64, 451, 454, 450, 466,
0, 0, 0, 65, 0, 0, 65, 68, 130, 195, 130, 194, 457, 460, 456, 472,
0, 0, 0, 65, 130, 130, 195, 198, 0, 65, 0, 64, 449, 452, 448, 464,
130, 130, 130, 195, 136, 136, 201, 204, 128, 193, 128, 192, 481, 484, 480, 496,
512, 512, 512, 577, 512, 512, 577, 580, 512, 577, 512, 576, 963, 966, 962, 978,
512, 512, 512, 577, 512, 512, 577, 580, 642, 707, 642, 706, 969, 972, 968, 984,
512, 512, 512, 577, 642, 642, 707, 710, 512, 577, 512, 576, 961, 964, 960, 976,
642, 642, 642, 707, 648, 648, 713, 716, 640, 705, 640, 704, 993, 996, 992, 1008,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 2, 3, 2, 2,
0, 0, 0, 0, 0, 0, 0, 1, 10, 10, 15, 10, 0, 1, 0, 0,
0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 2, 3, 2, 2,
0, 0, 0, 0, 0, 0, 0, 1, 10, 10, 15, 10, 0, 1, 0, 0,
0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 2, 3, 2, 2,
0, 0, 0, 0, 0, 0, 0, 1, 10, 10, 15, 10, 0, 1, 0, 0,
0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 0, 2, 3, 2, 2,
0, 0, 0, 0, 0, 0, 0, 1, 10, 10, 15, 10, 0, 1, 0, 0,
0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 5, 0, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 2,
0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 2,
0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 2,
0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 2,
0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 8, 12, 9,
0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12, 2, 2, 6, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 8, 12, 9,
0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12, 2, 2, 6, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 8, 12, 9,
0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12, 2, 2, 6, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 4, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 8, 12, 9,
0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12, 2, 2, 6, 3,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8, 12,
];
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment