Add 2024 Quest 10
This commit is contained in:
parent
1c8def02c6
commit
403749e75d
9 changed files with 601 additions and 0 deletions
6
2024/day10_shrine_needs_to_shine/Cargo.toml
Normal file
6
2024/day10_shrine_needs_to_shine/Cargo.toml
Normal file
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "day10_shrine_needs_to_shine"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
206
2024/day10_shrine_needs_to_shine/challenge.txt
Normal file
206
2024/day10_shrine_needs_to_shine/challenge.txt
Normal file
|
@ -0,0 +1,206 @@
|
|||
Part I
|
||||
|
||||
The group of knights vying for entry into the Order of the Golden Duck now find themselves in the Memory Stack Desert, where construction has already begun on the shrine dedicated to the god, Nullpointer. It turns out that the shrine will be adorned with numerous runic symbols, adding to its magnificence!
|
||||
Most of the symbols are engraved by mages using a spell, but there are also spots marked with dots that still need to be filled in a very specific way. Knights receive their own samples to practice this process.
|
||||
Each sample is an 8 by 8 grid. The corners of the grid are marked with * , and these spots cannot contain runic symbols. The lines connecting the corners are engraved with runic symbols, leaving a 4 by 4 empty square in the centre. This empty area must be filled in with the missing runic symbols, but it must be done in a very specific manner.
|
||||
Each empty space marked with . must be filled with a runic symbol that appears both in the row and the column of the 8 by 8 grid to which the space belongs. There is always exactly one matching symbol. Once all the missing symbols are filled in, we can read a runic word by transcribing the symbols row by row from left to right, starting from the top. There cannot be two identical symbols in the runic word.
|
||||
Your goal is to find the runic word hidden in your sample grid: (your notes).
|
||||
Example based on the following notes:
|
||||
**PCBS**
|
||||
**RLNW**
|
||||
BV....PT
|
||||
CR....HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
For the first field marked with a dot, the corresponding row contains symbols BVPT, and the column contains PRFG. The only symbol that appears in both the row and the column is P:
|
||||
**PCBS**
|
||||
**RLNW**
|
||||
BVP...PT
|
||||
CR....HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
By following the same rules, you can find other missing symbols:
|
||||
**PCBS**
|
||||
**RLNW**
|
||||
BVPT..PT
|
||||
CR....HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
**PCBS**
|
||||
**RLNW**
|
||||
BVPTB.PT
|
||||
CR....HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
**PCBS**
|
||||
**RLNW**
|
||||
BVPTBVPT
|
||||
CR....HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
**PCBS**
|
||||
**RLNW**
|
||||
BVPTBVPT
|
||||
CRR...HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
... **PCBS**
|
||||
**RLNW**
|
||||
BVPTBVPT
|
||||
CRRCZHHZ
|
||||
FLFLJWJW
|
||||
SGGMNSMN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
Finally, you can read the runic word: PTBVRCZHFLJWGMNS
|
||||
**PCBS**
|
||||
**RLNW**
|
||||
BVPTBVPT
|
||||
CRRCZHHZ
|
||||
FLFLJWJW
|
||||
SGGMNSMN
|
||||
**FTZV**
|
||||
**GMJH**
|
||||
What runic word will be formed upon solving your sample grid?
|
||||
|
||||
Part II
|
||||
|
||||
You find the runic word, which allows you to proceed with the training on constructing a shrine.
|
||||
Each runic word obtained in the manner described above has its own power, which is calculated as follows:
|
||||
Each symbol has a base power, determined alphabetically: A:1, B:2, C:3, D:4, E:5, F:6, G:7, H:8, I:9, J:10, K:11, L:12, M:13, N:14, O:15, P:16, Q:17, R:18, S:19, T:20, U:21, V:22, W:23, X:24, Y:25, Z:26.
|
||||
Each symbol occupies an individual position in the word, starting from 1.
|
||||
The effective power of a symbol is equal to its base power multiplied by its position in the word.
|
||||
The power of the entire word is the sum of the effective powers of all the symbols.
|
||||
In the second round of the task, the challengers receive a stack of training samples (your notes). Your goal is to identify all the runic words and calculate the sum of their powers.
|
||||
Example:
|
||||
For the example runic word from the previous part, PTBVRCZHFLJWGMNS , the power is calculated as follows:
|
||||
1 * 16 (P) + 2 * 20 (T) + 3 * 2 (B) + ... + 16 * 19 (S) = 1851.
|
||||
What is the total power of all the runic words on your training samples?
|
||||
|
||||
Part III
|
||||
|
||||
Your training is complete, so you can join the builders of the shrine!
|
||||
It turns out that covering the shrine with runic words serves not only a decorative purpose but they are also a functional feature. In the construction, each individual platinum block contains a 6 by 6 grid of symbols on one side, the centre part of the 8 by 8 grid you worked on. The remaining symbols are placed on adjacent blocks. Thus, the previous 8 by 8 grids have shared parts between multiple blocks. The runic words that you obtain permanently bind together all nine blocks covered with at least one symbol from the 8 by 8 grid that produced them, ensuring the entire structure is securely held by the ancient power of the runes!
|
||||
The task still involves calculating the total power of all the runic words, but this time you are provided with a section of an actual wall of blocks from the shrine to deal with (your notes). Not every 8 by 8 block will yield a runic word, but it is certain that securing the entire wall of blocks into a cohesive structure is possible.
|
||||
An additional challenge is the presence of ? signs that represent runic symbols that you must deduce during your work. For each ? symbol, there is always only one runic symbol that matches. Identify all possible runic words and provide their combined power.
|
||||
Example based on the following notes:
|
||||
**XFZB**DCST**
|
||||
**LWQK**GQJH**
|
||||
?G....WL....DQ
|
||||
BS....H?....CN
|
||||
P?....KJ....TV
|
||||
NM....Z?....SG
|
||||
**NSHM**VKWZ**
|
||||
**PJGV**XFNL**
|
||||
WQ....?L....YS
|
||||
FX....DJ....HV
|
||||
?Y....WM....?J
|
||||
TJ....YK....LP
|
||||
**XRTK**BMSP**
|
||||
**DWZN**GCJV**
|
||||
If we were to separate the given section into individual platinum blocks, it would look as follows:
|
||||
* *XFZB* *DCST* *
|
||||
|
||||
* *LWQK* *GQJH* *
|
||||
? G....W L....D Q
|
||||
B S....H ?....C N
|
||||
P ?....K J....T V
|
||||
N M....Z ?....S G
|
||||
* *NSHM* *VKWZ* *
|
||||
|
||||
* *PJGV* *XFNL* *
|
||||
W Q....? L....Y S
|
||||
F X....D J....H V
|
||||
? Y....W M....? J
|
||||
T J....Y K....L P
|
||||
* *XRTK* *BMSP* *
|
||||
|
||||
* *DWZN* *GCJV* *
|
||||
Solving the top-left block using the previously learned rules unlocks almost all of the symbols you need:
|
||||
**XFZB**
|
||||
**LWQK**
|
||||
?GLWG.WL
|
||||
BS.SHBH?
|
||||
P?PJ.KKJ
|
||||
NMN.ZMZ?
|
||||
**NSHM**
|
||||
**PJGV**
|
||||
For the first dot from the top, the only symbol that does not yet have a pair in the associated row and column is V , so the dot must be replaced with the symbol V, as must the associated question mark.
|
||||
**XFZB**
|
||||
**LWQK**
|
||||
VGLWGVWL
|
||||
BS.SHBH?
|
||||
P?PJ.KKJ
|
||||
NMN.ZMZ?
|
||||
**NSHM**
|
||||
**PJGV**
|
||||
Based on the same reasoning, the second dot must be an X , the third must be a Q , and the last must be an F .
|
||||
**XFZB**
|
||||
**LWQK**
|
||||
VGLWGVWL
|
||||
BSXSHBHX
|
||||
P?PJ.KKJ
|
||||
NMN.ZMZ?
|
||||
**NSHM**
|
||||
**PJGV**
|
||||
**XFZB**
|
||||
**LWQK**
|
||||
VGLWGVWL
|
||||
BSXSHBHX
|
||||
PQPJQKKJ
|
||||
NMN.ZMZ?
|
||||
**NSHM**
|
||||
**PJGV**
|
||||
**XFZB**
|
||||
**LWQK**
|
||||
VGLWGVWL
|
||||
BSXSHBHX
|
||||
PQPJQKKJ
|
||||
NMNFZMZF
|
||||
**NSHM**
|
||||
**PJGV**
|
||||
|
||||
Solving the next block to the right is now simple, as we have already found the missing symbol represented by the ? sign. The completed words are highlighted below:
|
||||
**XFZB**DCST**
|
||||
**LWQK**GQJH**
|
||||
VGLWGVWL....DQ
|
||||
BSXSHBHX....CN
|
||||
PQPJQKKJ....TV
|
||||
NMNFZMZF....SG
|
||||
**NSHM**VKWZ**
|
||||
**PJGV**XFNL**
|
||||
WQ....?L....YS
|
||||
FX....DJ....HV
|
||||
?Y....WM....?J
|
||||
TJ....YK....LP
|
||||
**XRTK**BMSP**
|
||||
**DWZN**GCJV**
|
||||
**XFZB**DCST**
|
||||
**LWQK**GQJH**
|
||||
VGLWGVWLDQWLDQ
|
||||
BSXSHBHXXCNHCN
|
||||
PQPJQKKJVKJTTV
|
||||
NMNFZMZFGFSZSG
|
||||
**NSHM**VKWZ**
|
||||
**PJGV**XFNL**
|
||||
WQ....?L....YS
|
||||
FX....DJ....HV
|
||||
?Y....WM....?J
|
||||
TJ....YK....LP
|
||||
**XRTK**BMSP**
|
||||
**DWZN**GCJV**
|
||||
You could try solving the bottom blocks to add more brilliance to the shrine, but unfortunately, they are not solvable. The section of the wall is stable anyway, as the two blocks with runic words securely hold all the neighbouring blocks together.
|
||||
In summary, we have 2 runic words with powers 1900 and 1989 so the total power for this part is 1900 + 1989 = 3889.
|
||||
Find as many runic words as possible on your wall section. What is the sum of their total power?
|
227
2024/day10_shrine_needs_to_shine/src/lib.rs
Normal file
227
2024/day10_shrine_needs_to_shine/src/lib.rs
Normal file
|
@ -0,0 +1,227 @@
|
|||
use core::fmt::Display;
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum ParseError {
|
||||
GridMalformed,
|
||||
ParseCharError(char),
|
||||
}
|
||||
|
||||
impl Display for ParseError {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
Self::GridMalformed => write!(f, "Grid must be 8*8 characters"),
|
||||
Self::ParseCharError(e) => write!(f, "Unable to parse character {e}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
struct Grid {
|
||||
columns: Vec<Vec<char>>,
|
||||
rows: Vec<Vec<char>>,
|
||||
runic_word: Vec<Vec<char>>,
|
||||
solved: bool,
|
||||
}
|
||||
|
||||
impl TryFrom<&str> for Grid {
|
||||
type Error = ParseError;
|
||||
|
||||
fn try_from(value: &str) -> Result<Self, Self::Error> {
|
||||
let lines: Vec<_> = value.lines().collect();
|
||||
if !lines.len() == 8 || lines.iter().any(|line| line.len() != 8) {
|
||||
return Err(Self::Error::GridMalformed);
|
||||
}
|
||||
let rows = lines[2..6].iter().map(|line| line.chars().take(2).chain(line.chars().skip(6)).collect::<Vec<char>>()).collect();
|
||||
let columns = (2..6).map(|col| [0, 1, 6, 7].iter().map(|row| lines[*row].chars().nth(col).unwrap()).collect::<Vec<char>>()).collect();
|
||||
|
||||
Ok(Self { columns, rows, runic_word: vec![vec!['.'; 4]; 4], solved: false, })
|
||||
}
|
||||
}
|
||||
|
||||
impl Grid {
|
||||
fn fill(&mut self) {
|
||||
let mut solved = true;
|
||||
(0..4).for_each(|row| {
|
||||
(0..4).for_each(|col| {
|
||||
if let Some(c) = self.columns[col].iter().find(|c| **c != '?' && self.rows[row].contains(*c)) {
|
||||
self.runic_word[row][col] = *c;
|
||||
} else {
|
||||
solved = false;
|
||||
}
|
||||
});
|
||||
});
|
||||
self.solved = false;
|
||||
}
|
||||
|
||||
fn runic_word(&mut self) -> String {
|
||||
if !self.solved {
|
||||
self.fill();
|
||||
}
|
||||
self.runic_word.iter().flatten().collect()
|
||||
}
|
||||
|
||||
fn effective_power(&mut self) -> usize {
|
||||
self.runic_word().chars().enumerate().map(|(idx, c)| (idx+1)*(c as usize - b'@' as usize)).sum()
|
||||
}
|
||||
}
|
||||
|
||||
fn into_grids_split(input: &str) -> Vec<Vec<String>> {
|
||||
let rows: Vec<_> = input.split("\n\n").collect();
|
||||
rows
|
||||
.iter()
|
||||
.map(|row| {
|
||||
let lines: Vec<&str> = row.lines().collect();
|
||||
let cells: Vec<Vec<&str>> = lines
|
||||
.iter()
|
||||
.map(|s| s.split(' ')
|
||||
.collect::<Vec<&str>>())
|
||||
.collect();
|
||||
(0..cells[0].len())
|
||||
.map(|idx| cells
|
||||
.iter()
|
||||
.map(|line| line[idx])
|
||||
.collect()
|
||||
).collect::<Vec<Vec<&str>>>()
|
||||
.iter()
|
||||
.map(|s| s.join("\n"))
|
||||
.collect::<Vec<String>>()
|
||||
}).collect()
|
||||
}
|
||||
|
||||
fn into_grids_shared(input: &str) -> Vec<Vec<String>> {
|
||||
let lines: Vec<_> = input.lines().collect();
|
||||
(0..lines.len()-7)
|
||||
.step_by(6)
|
||||
.map(|first_row| {
|
||||
(0..lines[first_row].len()-7)
|
||||
.step_by(6)
|
||||
.map(|first_col| {
|
||||
lines[first_row..first_row+8]
|
||||
.iter()
|
||||
.map(|line| line.chars().skip(first_col).take(8).collect::<String>())
|
||||
.collect::<Vec<String>>()
|
||||
.join("\n")
|
||||
}).collect::<Vec<String>>()
|
||||
}).collect()
|
||||
}
|
||||
|
||||
fn into_grids(input: &str) -> Vec<Vec<String>> {
|
||||
match input.lines().nth(8) {
|
||||
None => vec![vec![input.to_string()]],
|
||||
Some("") => into_grids_split(input),
|
||||
_ => into_grids_shared(input),
|
||||
}
|
||||
}
|
||||
fn solve_grids(grids: &mut [Vec<Grid>]) -> bool {
|
||||
let mut any_solved = false;
|
||||
for grid_y in 0..grids.len() {
|
||||
for grid_x in 0..grids[grid_y].len() {
|
||||
if grids[grid_y][grid_x].solved {
|
||||
continue;
|
||||
}
|
||||
let mut this_grid = grids[grid_y][grid_x].clone();
|
||||
this_grid.fill();
|
||||
if !this_grid.solved {
|
||||
let open: Vec<(usize, usize)> = this_grid.runic_word
|
||||
.iter()
|
||||
.enumerate()
|
||||
.flat_map(|(row, row_vec)| row_vec
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter(|(_col, c)| **c == '.')
|
||||
.map(|(col, _c)| (row, col))
|
||||
.collect::<Vec<(usize, usize)>>()
|
||||
).collect();
|
||||
let mut to_solve = open.len();
|
||||
for (y, x) in open {
|
||||
let row: Vec<char> = this_grid.rows[y].to_vec();
|
||||
let col: Vec<char> = this_grid.columns[x].to_vec();
|
||||
if !this_grid.rows[y].contains(&'?') {
|
||||
let to_find: Vec<usize> = col.iter().enumerate().filter(|(_idx, c)| **c == '?').map(|(idx, _c)| idx).collect();
|
||||
if to_find.len() == 1 {
|
||||
let col_idx = to_find[0];
|
||||
let to_insert: Vec<char> = row.iter().filter(|c| !this_grid.runic_word[y].contains(c)).cloned().collect();
|
||||
if to_insert.len() == 1 {
|
||||
let found = to_insert[0];
|
||||
this_grid.runic_word[y][x] = found;
|
||||
this_grid.columns[x][col_idx] = found;
|
||||
match col_idx {
|
||||
0 | 1 if grid_y > 0 => grids[grid_y-1][grid_x].columns[x][col_idx+2] = found,
|
||||
2 | 3 if grid_y < grids.len()-1 => grids[grid_y+1][grid_x].columns[x][col_idx-2] = found,
|
||||
_ => (),
|
||||
}
|
||||
to_solve -= 1;
|
||||
}
|
||||
}
|
||||
} else if !col.contains(&'?') {
|
||||
let to_find: Vec<usize> = row.iter().enumerate().filter(|(_idx, c)| **c == '?').map(|(idx, _c)| idx).collect();
|
||||
if to_find.len() == 1 {
|
||||
let row_idx = to_find[0];
|
||||
let to_insert: Vec<char> = col.iter().filter(|c| !this_grid.runic_word.iter().any(|rw_row| rw_row[x] == **c)).cloned().collect();
|
||||
if to_insert.len() == 1 {
|
||||
let found = to_insert[0];
|
||||
this_grid.runic_word[y][x] = found;
|
||||
this_grid.rows[y][row_idx] = found;
|
||||
match row_idx {
|
||||
0 | 1 if grid_x > 0 => grids[grid_y][grid_x-1].rows[y][row_idx+2] = found,
|
||||
2 | 3 if grid_x < grids[grid_y].len()-1 => grids[grid_y][grid_x+1].rows[y][row_idx-2] = found,
|
||||
_ => (),
|
||||
}
|
||||
to_solve -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if to_solve == 0 {
|
||||
this_grid.solved = true;
|
||||
any_solved = true;
|
||||
}
|
||||
grids[grid_y][grid_x] = this_grid;
|
||||
} else {
|
||||
grids[grid_y][grid_x].runic_word = this_grid.runic_word;
|
||||
}
|
||||
}
|
||||
}
|
||||
any_solved
|
||||
}
|
||||
|
||||
pub fn run(input: &str, part: usize) -> Result<String, ParseError> {
|
||||
let mut grids = into_grids(input).iter().map(|row| row.iter().map(|g| Grid::try_from(&g[..])).collect::<Result<Vec<_>, _>>()).collect::<Result<Vec<Vec<_>>, _>>()?;
|
||||
match part {
|
||||
1 => Ok(grids[0][0].runic_word()),
|
||||
2 => Ok(format!("{}", grids.iter_mut().flatten().map(|g| g.effective_power()).sum::<usize>())),
|
||||
3 => {
|
||||
while solve_grids(&mut grids) {}
|
||||
Ok(format!("{}", grids.iter_mut().flatten().filter(|g| g.solved).map(|g| g.effective_power()).sum::<usize>()))
|
||||
},
|
||||
_ => panic!("Illegal part number"),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::fs::read_to_string;
|
||||
|
||||
fn read_file(name: &str) -> String {
|
||||
read_to_string(name).expect(&format!("Unable to read file: {name}")[..]).trim().to_string()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_sample() {
|
||||
let expected = ["PTBVRCZHFLJWGMNS", "1851", "3889"];
|
||||
for part in 1..=expected.len() {
|
||||
let sample_input = read_file(&format!("tests/sample{part}"));
|
||||
assert_eq!(run(&sample_input, part), Ok(expected[part-1].to_string()));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_challenge() {
|
||||
let expected = ["LWZNDSRFXMPTQVBG", "197973", "213343"];
|
||||
for part in 1..=expected.len() {
|
||||
let challenge_input = read_file(&format!("tests/challenge{part}"));
|
||||
assert_eq!(run(&challenge_input, part), Ok(expected[part-1].to_string()));
|
||||
}
|
||||
}
|
||||
}
|
8
2024/day10_shrine_needs_to_shine/tests/challenge1
Normal file
8
2024/day10_shrine_needs_to_shine/tests/challenge1
Normal file
|
@ -0,0 +1,8 @@
|
|||
**XWBG**
|
||||
**DSPT**
|
||||
NZ....LW
|
||||
DR....SF
|
||||
TX....PM
|
||||
BV....QG
|
||||
**QVZF**
|
||||
**LMRN**
|
62
2024/day10_shrine_needs_to_shine/tests/challenge2
Normal file
62
2024/day10_shrine_needs_to_shine/tests/challenge2
Normal file
|
@ -0,0 +1,62 @@
|
|||
**MQNJ** **PXKD** **QSHX** **FMPT** **KWQH** **QHFK** **LCJR** **RWCK** **GPFB** **NKFD** **VBWL** **QPVT** **ZSHQ** **QVJX** **ZJXV**
|
||||
**KTDB** **FWRS** **VPBC** **RXVH** **ZSCM** **MGLT** **MPGQ** **SQZF** **QKJZ** **QPVC** **TGQK** **ZBHS** **TBWK** **NPTC** **LBGP**
|
||||
KB....SX PL....TM FD....SQ LH....BQ WC....XP LX....QH RM....BP NX....VL VB....CJ QC....FT SB....TW SV....WQ DM....WX XS....KG PX....JL
|
||||
NM....RC CQ....XD BP....RJ ZM....KD QZ....VT SJ....PK CQ....JL KJ....QS FP....GL HX....GP HR....CV PN....RZ QZ....SV VJ....NH RT....KC
|
||||
FV....TZ WF....RH CH....TW FX....VT SK....GH NG....TM TH....KZ CR....WT TZ....RK ND....SR MQ....LG KL....GX LK....BC LD....PR NF....BS
|
||||
DQ....JL JK....NS VZ....KX RJ....PS DF....MJ VD....ZF VX....FG FH....DZ NQ....SW LV....ZK ZX....KJ HT....BF JH....RT TC....QF VZ....MG
|
||||
**ZRVC** **NJQT** **WKFJ** **LQBJ** **DTGV** **VPSX** **HVZT** **DXJT** **RWTN** **LTRZ** **MHRS** **FGXL** **DJVX** **GFRD** **RKTC**
|
||||
**LXSF** **CLMH** **RTZD** **ZSDK** **PJFX** **JZND** **XKBF** **LHVN** **CVSL** **XSGH** **JZXC** **KWRN** **LMCR** **LSKH** **SMFN**
|
||||
|
||||
**GRVZ** **HPZS** **JKPT** **PGNK** **PBNG** **LBSZ** **GWDH** **SJDV** **SDLJ** **JSMR** **RSVD** **QHJZ** **VMBW** **DKQH** **VPSB**
|
||||
**PMBK** **QFTD** **GCDH** **TRVX** **DHXC** **JTWX** **VKZF** **NBLK** **RTBM** **LHFW** **MBJQ** **WKPF** **SKNP** **GSNX** **NTRK**
|
||||
FM....ZG SG....WV NZ....LB XQ....PR JD....NG LB....NC TZ....LH PF....CL TC....VB RC....BN ZB....QP PK....SZ RB....TF TJ....ZK VM....RP
|
||||
VK....WR QD....KN XG....RK WT....GV FW....LH TG....ZF KS....BJ SB....GV DM....LW JV....XK RS....TV QL....TJ PK....VN GP....CN KQ....ST
|
||||
JB....XP TR....PL JW....HD LK....BZ QP....XM RH....PW QW....VR XD....HK SJ....HF FH....DW DH....MF CV....HX MS....WC DV....FH WH....JX
|
||||
CS....DL MZ....FH TP....CF CJ....HN KS....BC DJ....SX CF....GD WJ....QN ZN....RP LM....ZS JX....NW FW....GN LJ....QG WQ....SX FN....DB
|
||||
**WLDX** **WVNM** **NLZR** **LHBW** **LJFQ** **FDGC** **LTQR** **HXGP** **VPHC** **BXCZ** **ZNPT** **CGVL** **TGCQ** **WPJZ** **QDHW**
|
||||
**SJFC** **LKGR** **FWXB** **JZQC** **SMKW** **RHNP** **JCSB** **FCWQ** **WFNZ** **DNVK** **XFHW** **STNX** **JRLF** **TVFC** **JXFM**
|
||||
|
||||
**KFZM** **SKGR** **CZBH** **WBGV** **LMFD** **RCZF** **ZBLP** **XJTQ** **JSLZ** **GHSW** **MDRT** **PNCG** **FCJW** **JPGQ** **WVFS**
|
||||
**PSCJ** **ZDTV** **FWKL** **KRTZ** **VCKT** **KSVT** **WGKH** **KHRM** **KWHP** **JDQR** **VBXL** **JZRQ** **DMXB** **WMVC** **GBQX**
|
||||
VD....SJ GK....FM MV....NB QK....GR PT....VM CF....NZ BQ....ZK XG....PH PJ....TS KH....FP MB....SL LN....RG QB....PM RM....VH RC....JT
|
||||
QM....BT PV....ZD HX....RJ MP....FB KQ....CH TM....WV CR....ND JM....KF MD....RH ZQ....XM VD....TR CX....QJ XD....CT FZ....DC ZD....XQ
|
||||
PG....CF TN....CW WS....FK WX....SV JR....WB XG....QK PM....WG ST....LN WQ....GK DR....SJ QG....XF PH....TK VF....JG QL....KJ SV....KG
|
||||
RZ....HK XR....SJ ZQ....LC TJ....ZL LZ....DF JB....SR HT....LJ QR....CW CX....ZL VW....TG HN....CZ ZV....MW WZ....LK PG....SW WL....FB
|
||||
**QBDR** **MNPC** **XVQM** **LJFQ** **QZJH** **NGXQ** **TDCQ** **NCPG** **CXQG** **MZPX** **FZSQ** **WXVM** **KVPG** **HDZS** **JDKT**
|
||||
**VHTG** **WXJF** **NRJS** **MSXP** **WRPB** **WMBJ** **RJMN** **WLFS** **MDTR** **FTVK** **CGHN** **LTKH** **QLZT** **FLKR** **ZCRL**
|
||||
|
||||
**VMQF** **DCLP** **MSCZ** **CGZD** **NLRD** **LJPB** **HZVF** **XBMK** **QJMB** **FTDQ** **ZDMX** **HGRN** **JXST** **HXRK** **ZWPR**
|
||||
**KRXH** **VSZT** **WFBR** **XKNF** **QJPT** **GZQC** **XJGR** **QTJF** **VGWK** **LRGW** **RFBK** **DLFB** **DMRK** **JSWC** **FCBN**
|
||||
DT....LN ZC....RP BL....MZ KF....RT CX....VQ NG....MV FZ....HV WK....MX BV....SJ HS....MT FM....XT HR....BL LD....VF XC....RQ WL....VK
|
||||
VF....MQ VH....WT JP....CW ZC....DM LN....PB LP....CJ GX....TJ TG....QS PC....WG RL....DW QB....KG QZ....KV XJ....WT ZK....JS TN....FX
|
||||
HB....ZJ LD....JQ SQ....GR XN....GH DJ....FH QK....DB LC....RN NR....FD RK....ZM QG....JF HW....JR GX....DM BR....PH VD....BW RP....CZ
|
||||
KX....CR SG....MF NK....FT QL....PB SR....GT ZW....HR SM....KQ JC....ZB DL....QX XC....KZ DV....ZP FW....SN SN....KM HT....NP MJ....BG
|
||||
**ZBJC** **MHWF** **GLQJ** **TMRB** **GVCX** **WMHN** **MLCK** **ZWDG** **ZDSL** **KJMX** **TQWH** **KZMX** **PBWH** **QTNV** **VTXM**
|
||||
**LTDN** **RQGJ** **NPKT** **QLPH** **HSFB** **DKVR** **NQST** **NRSC** **CRXP** **SCZH** **GJVP** **SWVQ** **NLFV** **BDZP** **GJLK**
|
||||
|
||||
**GZKT** **SDRW** **ZGQJ** **ZTPK** **CZLB** **FMNC** **ZJDH** **BGPV** **STBK** **NCWQ** **QBCS** **MHSJ** **KGCD** **MZBF** **DGHJ**
|
||||
**VWCH** **BLVN** **RXLN** **SJFL** **XSPM** **RGZH** **CXMT** **XCLF** **VPLZ** **TLXV** **TGHX** **KXGP** **TNSR** **TSPK** **KRZC**
|
||||
SZ....TD VM....PN NP....HK SP....JW GB....NK MJ....LV DJ....BZ DT....LV RK....SQ KQ....HN RG....MC KV....PR KC....DH XB....HM RT....FC
|
||||
GC....FX KF....LZ GJ....VQ QV....ND RP....XH KD....RS TW....FS GP....XZ PV....BJ XP....CD ZH....XP HJ....NW ML....TW TF....RQ HM....KP
|
||||
WP....MB DR....SW DW....RS FZ....HL CF....SW BG....NH MG....XQ BR....FM GF....TM VL....TM QB....JD DF....SX RF....NX VS....JG QX....NV
|
||||
HV....NK XT....BC ZL....CX TC....MK MZ....QL CZ....QF KP....CH NC....WJ CZ....LD WJ....FS FS....TK TC....GM PG....SQ PN....KZ DZ....GJ
|
||||
**SFPB** **MTCZ** **KSDC** **MHQW** **NRWH** **LSVK** **GPWB** **NMRZ** **MCQJ** **PJHD** **ZPJM** **NTRF** **QHLW** **NQRH** **FPVM**
|
||||
**MNDX** **KPFX** **VPHW** **VDCN** **QGKF** **BQDJ** **SFKQ** **DTWJ** **DRFG** **FKMS** **RFKD** **DVWC** **XMFP** **GXVJ** **QXTN**
|
||||
|
||||
**SVTW** **GCPF** **CPBN** **PCBW** **VTNF** **HSJK** **BWKD** **XNBR** **ZJNM** **DFSQ** **MKTG** **TRND** **SPJW** **QFXT** **TGCN**
|
||||
**ZQJR** **TXQV** **RXHG** **KMNS** **KSMG** **LCDP** **ZQNT** **HSPD** **SQFV** **ZKVT** **ZXWD** **PXMJ** **ZBXR** **NRDG** **QZSR**
|
||||
BN....CK XN....FG MR....LZ XN....HP ND....BS TN....JW BG....WF ND....BK SP....QR RV....TD MD....XW PD....HQ XM....LZ SF....QG KG....CL
|
||||
HQ....WL QV....JT HN....TK VF....SG TV....HQ KF....QB TK....ML XG....ZS JZ....BV KX....PG GN....CT RF....KB KR....GC NW....JZ ZT....BR
|
||||
XT....RS MP....ZC DX....BC MW....KQ GX....ZP SH....RX JS....DR VP....TC LM....HN LB....NZ SK....BL WV....SN SV....BT XR....HL SQ....NH
|
||||
DZ....VJ KH....DB PQ....FG BZ....DC FW....MK PL....DC XZ....QN RH....JL WF....TC CF....SQ PQ....RZ JT....XM WP....JN KT....VD MF....PX
|
||||
**BXLN** **KDHB** **QMFD** **GXQD** **XWPB** **BFRW** **LMRF** **TJGC** **CHBP** **PBLG** **LNBS** **VWKS** **NLCT** **HWJZ** **MXFL**
|
||||
**HCKD** **MJNZ** **KTLZ** **ZVFH** **DZQH** **TNQX** **SJGX** **KVLZ** **LTRW** **CRXN** **CRPQ** **FQHB** **KGVM** **KVSL** **KHBP**
|
||||
|
||||
**DXPC** **MZHF** **VZRJ** **CWLT** **CSQF** **BPVM** **FMHN** **MBXV** **LHFZ** **WHQM** **VPWN** **GWPZ** **NKRG** **JLWS** **ZTHF**
|
||||
**BLWH** **NLQG** **QGWT** **XQMV** **ZRKM** **GXDW** **JRKL** **PSQH** **SVND** **VRFG** **BDXG** **VFJR** **DLBC** **HGNT** **LWMG**
|
||||
QG....NC RL....GV ZB....FW JB....WR PG....WD JM....KG KP....SR BT....PV MS....DH BP....SC KZ....GV DV....NF TG....BN MG....TH ZW....JV
|
||||
LW....MB SM....ZK SL....RJ KX....LN XC....RM XF....NQ DH....NV ZG....KH VZ....XN JV....LH TH....BC QK....LH PD....XM SZ....JN DX....MR
|
||||
DX....JZ FW....HX DK....TQ ZH....TM ZJ....KB PS....DW WZ....JX DJ....WX QC....RJ FG....WN SD....XL PC....ZB SK....ZC VP....WD TF....HL
|
||||
HF....VP CT....NQ XC....VG VC....QP SF....QV BH....VZ TF....ML MQ....RS GW....LF MR....QD NQ....PW GR....JW LW....VR BL....FQ SK....GN
|
||||
**QVGM** **RTKS** **SLXB** **HNJB** **VBGJ** **SKJQ** **VXWZ** **DZTW** **XJMQ** **SPCB** **LHKS** **QHLN** **WPZM** **QZFV** **XRVJ**
|
||||
**FNZJ** **WXVC** **FDKC** **RZPK** **WDXP** **NZFH** **SDTP** **GJKR** **RWCG** **DNJL** **QZCT** **CBDK** **STXV** **PDMB** **SKND**
|
62
2024/day10_shrine_needs_to_shine/tests/challenge3
Normal file
62
2024/day10_shrine_needs_to_shine/tests/challenge3
Normal file
|
@ -0,0 +1,62 @@
|
|||
**BXT?**BHSD**HZBD**FQPZ**VKBH**PMTD**VHDB**TPZR**VHJG**FPWR**LBDV**JWKS**HMGK**NPJZ**MFTL**XFVJ**LTGD**XZNV**JTGC**KNGZ**
|
||||
**L?RH**RNPF**LFVK**SMJC**JWQG**QXJR**PTWF**LMKH**QCKM**QCXZ**XWHG**CRDM**CZTV**RFMD**DCZH**RKLZ**BCPV**CTKB**QRZX**XHDJ**
|
||||
ZF....QL....NS....?B....S?....WJ....SM....?D....?L....QH....PT....?G....K?....LM....?K....MW....KX....P?....MZ....C?....KN
|
||||
SC....XB....?F....HJ....GM....B?....PX....?B....M?....CD....?W....DN....SP....T?....B?....ZC....F?....TW....KF....?Q....HM
|
||||
RP....HK....R?....VK....FQ....?D....ZT....N?....?T....KV....?X....BM....?F....HG....NP....T?....?R....HL....NV....J?....DF
|
||||
MV....TW....?P....ZT....R?....HK....RQ....H?....JZ....N?....?F....HV....W?....VQ....D?....LG....JS....D?....?B....LT....ZX
|
||||
**MK?V**LCMK**PMCS**RTVG**MFSC**ZKBN**RSNQ**JVFS**NRDL**SKNT**NZRM**GBFV**PFRJ**LVHK**JGWB**SHWM**SJFK**FHDW**BMLF**QLPC**
|
||||
**?ZQS**TWXQ**RNTJ**HLBK**RNPD**WVHS**MKXZ**BWND**SZPT**VGHD**FTPS**NPHL**LWQS**BTQG**PNRK**CGBT**XRHW**LGPM**PKNV**FRTM**
|
||||
HD....MZ....?C....DP....?M....TY....PS....?Y....BY....D?....S?....QW....NY....J?....QT....V?....D?....VB....GJ....PY....GK
|
||||
GL....VP....ZF....RV....KQ....GP....Z?....GH....KL....NY....NX....?D....D?....QP....KN....MX....FQ....?G....WY....TD....?P
|
||||
TC....KW....DK....?Y....LY....?K....XH....XJ....?G....VK....YH....HY....ZL....KB....H?....KH....YB....PQ....?X....FZ....YN
|
||||
RS....NQ....NY....FH....CP....BW....YC....VP....TP....XC....VJ....SG....KW....YT....ZY....FY....ZH....YT....RF....M?....JS
|
||||
**NLHW**CZXM**PBRC**NDZB**CSGM**SQNV**FSJW**MKCH**LHGM**VBXZ**XWCH**ZDLM**CPXJ**MSPB**QRFP**MSCR**DPKG**BCVN**QFKH**WQTS**
|
||||
**TR?D**KLTV**GJSH**MXPT**PQDF**DMBR**PRXZ**BRWT**NXWP**QKSP**GFRB**VXBF**HMTQ**GCDT**WTHV**KNVX**ZNFL**HKSW**XDVN**LMXJ**
|
||||
KM....NL....VW....?J....X?....LC....?R....JG....MR....X?....Z?....HT....?L....TJ....?C....TZ....X?....ZK....LB....K?....NS
|
||||
XG....TF....?Z....LB....ZK....?P....?X....TZ....QC....?L....QM....?W....M?....XF....?M....VQ....?N....GQ....?V....HP....WJ
|
||||
WC....HB....?M....RQ....TN....?S....M?....FW....?V....NW....B?....XJ....KV....?Q....DG....P?....R?....DP....NS....?D....LM
|
||||
SQ....DR....?X....HP....D?....FH....V?....SP....HB....J?....V?....RF....?C....PN....R?....HK....?L....FH....?W....FQ....TZ
|
||||
**CXQF**NHBR**ZMWV**KLGJ**VXLZ**XHGK**GKNV**QSPG**BKRJ**TCMJ**ZTJQ**RWJK**LKDB**RQWX**GDCB**WHPL**QHWX**GMLQ**SBRL**KPRD**
|
||||
**??M?**SDWF**QKXL**HRQV**NHKT**FCLP**BTMD**FZJV**TCQV**NLGW**VSMK**GHCT**FZVN**JNFH**KSMZ**FZTQ**CMRS**DPFZ**PCWM**ZNHF**
|
||||
ZK....TQ....GP....KZ....YL....VC....GW....V?....DY....JZ....?J....QG....SV....FJ....?F....L?....RN....CY....?N....RY....RS
|
||||
JP....FB....NT....XQ....DS....KB....KX....SY....NP....Y?....CG....J?....L?....WY....WR....DH....?J....TD....RP....?M....?Q
|
||||
NG....SX....RW....LD....B?....Y?....?H....QM....LS....GN....ZY....KY....CW....K?....QY....RM....ZY....?L....WG....NW....YG
|
||||
MR....CL....SV....CM....PH....PD....SY....KG....?B....RK....MB....HR....YJ....VS....GH....YW....CP....NZ....YT....JH....FV
|
||||
**ZRGL**HD?P**DRCG**QHMZ**WLHF**MLJT**QZWV**XLHT**WRBN**PBVM**CZJS**QWMX**GJPS**TQXB**ZTKS**XTHD**LNTG**LKNH**DPFS**TNJV**
|
||||
**?T??**RTLY**STPN**PCBX**MVRG**NXHR**SCGP**FMCP**JSKZ**HJWT**NRHP**DHZN**ZDRV**KLJD**NFJR**MGSZ**PWRQ**FJTM**WCQM**MKZH**
|
||||
TX....JD....NL....?R....?P....VF....?M....VS....LT....J?....V?....NR....?T....BP....?X....NS....DC....?N....?B....QC....MK
|
||||
SH....RP....ZH....D?....HX....L?....?N....CD....?B....RC....PB....?F....WQ....?R....DT....?B....?H....SW....KM....?D....GN
|
||||
KB....GL....K?....CS....MN....R?....X?....GF....ZH....?D....HM....?S....H?....SG....L?....FW....?M....ZR....JF....V?....JF
|
||||
FZ....WN....PW....G?....Q?....GW....TJ....?W....XP....?W....?L....JZ....X?....JF....QM....?J....?K....QL....GT....W?....HT
|
||||
**KWDX**JNKF**LWVZ**DRVG**PJZX**WVZP**DJHT**BGQZ**MTXC**QKDC**LBFT**GVFC**FHXB**FZSG**DCBQ**NJWF**HXDS**WPZQ**JKZT**FWCG**
|
||||
**S?FH**Y?LC**BKHQ**SJTN**DNQK**KGDF**XMNF**VWSD**DHLP**SLRN**MGQV**JRTS**TQMW**CPRM**WMXL**RCKB**ZMKC**BGSR**HVGB**DSPQ**
|
||||
ZB....LX....FD....HQ....BL....ND....JG....NC....XM....ZG....NG....NG....BS....WY....VB....CQ....BY....XP....FY....JY....YZ
|
||||
MH....FT....LG....ZJ....QF....RJ....?R....YR....?Z....YC....QY....YX....?W....G?....YT....YB....PK....?G....V?....XM....TQ
|
||||
RN....KD....KN....BR....HW....KP....YH....F?....YT....J?....T?....ZW....GY....CT....SF....KG....GF....YV....JM....?F....XF
|
||||
JP....WS....XC....WV....GX....TZ....CS....BG....BK....SK....KJ....?M....LJ....MR....X?....?D....?L....TS....PL....BS....?V
|
||||
**MT?R**KT?M**DJRC**?JKF**FGWR**SDJM**NWSM**JKCP**NQSK**FLSW**WFQK**VQCJ**TZXS**LFTD**ZJGQ**MTLB**GQHL**JCFM**LRCX**GVXC**
|
||||
**L?Z?**VPYH**XFGN**MYLC**THBL**QPHG**BXGK**RHZF**FHXG**VBPJ**MHBN**GPFD**RQLB**MHPB**WVXL**FSXP**RXKN**HRZS**TPBH**MQNL**
|
||||
KB....NL....W?....NF....Z?....TK....QM....?N....TJ....G?....J?....KH....?J....QB....?K....ZG....?F....GZ....VJ....?R....CV
|
||||
JC....MF....?K....RM....D?....GF....CJ....?W....R?....MK....VB....?D....PS....N?....?L....XN....?P....XK....?S....WL....NZ
|
||||
QZ....RV....BG....H?....M?....HB....?L....GX....H?....NW....C?....QX....LF....T?....?V....BQ....?T....NB....?M....KX....GS
|
||||
GW....PT....PZ....?X....WJ....?R....DS....K?....LC....?X....PL....?W....GC....R?....DM....W?....MS....R?....FD....B?....QM
|
||||
**GVFW**BPHQ**WBPZ**FKVP**SVKD**BTVR**DVJC**VTXN**JTWC**GZCQ**CDZX**SHKL**PNGC**WZNV**BNFP**CZHJ**CFSP**QKXD**FKJD**TZBS**
|
||||
**?CBK**L?DY**KMQH**Y?ZC**JZPM**CFKL**LQZP**GBWL**LMRP**XNMK**JLPV**XWMN**VFJW**KQRX**HKDM**QNWG**TBZM**NVBG**MSWV**WKRP**
|
||||
MX....BG....TL....BP....WB....VS....PW....FJ....WB....SV....V?....?Y....GZ....VY....?V....YT....VP....GY....VH....V?....FC
|
||||
WT....VP....MS....WR....PR....ZC....SM....CL....RH....?K....TZ....SP....VH....XR....KZ....QV....RN....CX....N?....YQ....QX
|
||||
RJ....QK....DK....HG....DX....GK....BN....DQ....?C....BX....XY....RL....YR....MS....YJ....HD....GY....?Q....BY....SD....LT
|
||||
HC....FL....CV....QZ....TF....MJ....ZH....VK....YP....TY....SM....GM....?C....?C....SC....C?....S?....JP....JP....ZB....Y?
|
||||
**PMRL**QFTW**CGRL**?LXG**GTWC**BLVQ**HSMK**ZVJC**WCHM**RCGK**SHCF**LZNT**HSDG**LQGX**CPZT**VQHT**CPMV**FBGD**MWST**DFMN**
|
||||
**HJTX**ZV?Y**TVDS**YBVM**RXFB**Z?YS**FWBN**KGLB**QSXG**MXLP**JWVR**RPSF**WXVP**NMCR**WNKH**JDNG**WRTK**ZXTJ**VNQL**GRWB**
|
||||
QF....TX....XD....V?....?Z....FC....LR....?M....VK....?Q....?V....FM....QR....H?....LV....?P....VD....T?....?M....PS....FM
|
||||
HN....ZL....J?....CR....D?....JG....Q?....HJ....GP....?N....LP....C?....ZL....S?....N?....BW....?J....KR....J?....WV....QB
|
||||
VM....PS....MP....T?....R?....BK....?Z....NC....XL....D?....?B....HJ....NP....J?....?M....ST....N?....PW....DF....L?....DX
|
||||
BD....JR....BG....L?....?Q....TW....DT....?S....ZB....S?....RK....?S....VT....?K....F?....HZ....MQ....?C....GQ....?T....GR
|
||||
**??N?**NDHM**BFWJ**LYGP**VZJD**BYQX**RQDT**HSMW**BDNK**NWSB**LKDP**DVQJ**LKJR**JHDS**FRBQ**ZSPM**GSFN**RCPQ**FGXB**PLTC**
|
||||
**BQ?V**BYW?**ZMPX**QMJ?**QKPH**HJ?N**ZCJL**XNFP**LPVZ**VHDQ**GMBX**HMWC**TNQZ**KFVW**VSML**FBWK**DQJZ**MWKS**CPDJ**VQXS**
|
||||
FC....HN....TN....PZ....PW....DX....PV....CZ....RX....KL....CR....MD....FD....KT....HR....TB....WV....QD....XM....GQ....YH
|
||||
SJ....LV....FH....BR....KG....TJ....JM....QH....ZJ....NT....FH....XB....HQ....RS....WD....ML....FP....GR....KV....FP....VK
|
||||
TX....DZ....XC....MD....BS....HV....TG....WD....VF....DC....KT....LQ....XZ....ML....FP....NS....CN....BJ....TL....CB....F?
|
||||
WM....QB....SV....JW....MN....ZQ....XB....LR....MH....PB....GN....PV....GV....NJ....CK....VQ....KX....ZS....SJ....ND....BS
|
||||
**TJMW**YMH?**CVHR**CBFK**WBNM**YDT?**WBXP**CV?N**TJHC**HXMF**FVQT**?SFL**GSDF**YPWX**TWPN**SDY?**XPWR**?LCQ**NTKQ**TYW?**
|
||||
**LHXC**GNQT**STDN**Y?SV**TXSG**PJVW**MGVH**ZMYW**FRXM**YN?Q**CHNR**WMYG**HXMV**K?DH**DCKH**HNZK**CBKV**TYHN**MSLV**GCMH**
|
8
2024/day10_shrine_needs_to_shine/tests/sample1
Normal file
8
2024/day10_shrine_needs_to_shine/tests/sample1
Normal file
|
@ -0,0 +1,8 @@
|
|||
**PCBS**
|
||||
**RLNW**
|
||||
BV....PT
|
||||
CR....HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
8
2024/day10_shrine_needs_to_shine/tests/sample2
Normal file
8
2024/day10_shrine_needs_to_shine/tests/sample2
Normal file
|
@ -0,0 +1,8 @@
|
|||
**PCBS**
|
||||
**RLNW**
|
||||
BV....PT
|
||||
CR....HZ
|
||||
FL....JW
|
||||
SG....MN
|
||||
**FTZV**
|
||||
**GMJH**
|
14
2024/day10_shrine_needs_to_shine/tests/sample3
Normal file
14
2024/day10_shrine_needs_to_shine/tests/sample3
Normal file
|
@ -0,0 +1,14 @@
|
|||
**XFZB**DCST**
|
||||
**LWQK**GQJH**
|
||||
?G....WL....DQ
|
||||
BS....H?....CN
|
||||
P?....KJ....TV
|
||||
NM....Z?....SG
|
||||
**NSHM**VKWZ**
|
||||
**PJGV**XFNL**
|
||||
WQ....?L....YS
|
||||
FX....DJ....HV
|
||||
?Y....WM....?J
|
||||
TJ....YK....LP
|
||||
**XRTK**BMSP**
|
||||
**DWZN**GCJV**
|
Loading…
Add table
Add a link
Reference in a new issue