Add 9 first days
This commit is contained in:
1
1-report_repair/.gitignore
vendored
Normal file
1
1-report_repair/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
13
1-report_repair/.vscode/tasks.json
vendored
Normal file
13
1-report_repair/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"type": "cargo",
|
||||
"command": "run",
|
||||
"problemMatcher": [
|
||||
"$rustc"
|
||||
],
|
||||
"label": "rust: cargo run"
|
||||
}
|
||||
]
|
||||
}
|
||||
239
1-report_repair/Cargo.lock
generated
Normal file
239
1-report_repair/Cargo.lock
generated
Normal file
@@ -0,0 +1,239 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "ansi_term"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
|
||||
dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
version = "0.2.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
|
||||
dependencies = [
|
||||
"hermit-abi",
|
||||
"libc",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "2.33.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002"
|
||||
dependencies = [
|
||||
"ansi_term",
|
||||
"atty",
|
||||
"bitflags",
|
||||
"strsim",
|
||||
"textwrap",
|
||||
"unicode-width",
|
||||
"vec_map",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205"
|
||||
dependencies = [
|
||||
"unicode-segmentation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.81"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
|
||||
dependencies = [
|
||||
"proc-macro-error-attr",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-error-attr"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "report_repair"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"itertools",
|
||||
"structopt",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||
|
||||
[[package]]
|
||||
name = "structopt"
|
||||
version = "0.3.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5277acd7ee46e63e5168a80734c9f6ee81b1367a7d8772a2d765df2a3705d28c"
|
||||
dependencies = [
|
||||
"clap",
|
||||
"lazy_static",
|
||||
"structopt-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "structopt-derive"
|
||||
version = "0.4.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro-error",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "textwrap"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
|
||||
dependencies = [
|
||||
"unicode-width",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "1.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-width"
|
||||
version = "0.1.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
|
||||
[[package]]
|
||||
name = "vec_map"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
|
||||
|
||||
[[package]]
|
||||
name = "version_check"
|
||||
version = "0.9.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
11
1-report_repair/Cargo.toml
Normal file
11
1-report_repair/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "report_repair"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
itertools = "0.9.0"
|
||||
structopt = "0.3.20"
|
||||
200
1-report_repair/data/input.txt
Normal file
200
1-report_repair/data/input.txt
Normal file
@@ -0,0 +1,200 @@
|
||||
1749
|
||||
1897
|
||||
881
|
||||
1736
|
||||
1161
|
||||
1720
|
||||
1676
|
||||
305
|
||||
264
|
||||
1904
|
||||
1880
|
||||
1173
|
||||
483
|
||||
1978
|
||||
1428
|
||||
1635
|
||||
1386
|
||||
1858
|
||||
1602
|
||||
1916
|
||||
1906
|
||||
1212
|
||||
1730
|
||||
1777
|
||||
1698
|
||||
1845
|
||||
1812
|
||||
1922
|
||||
1729
|
||||
1803
|
||||
1761
|
||||
1901
|
||||
1748
|
||||
1188
|
||||
1964
|
||||
1935
|
||||
1919
|
||||
1810
|
||||
1567
|
||||
1849
|
||||
1417
|
||||
1452
|
||||
54
|
||||
1722
|
||||
1784
|
||||
1261
|
||||
1744
|
||||
1594
|
||||
1526
|
||||
1771
|
||||
1762
|
||||
1894
|
||||
1717
|
||||
1716
|
||||
51
|
||||
1955
|
||||
1143
|
||||
1741
|
||||
1999
|
||||
1775
|
||||
1944
|
||||
1983
|
||||
1962
|
||||
1198
|
||||
1553
|
||||
1835
|
||||
1867
|
||||
1662
|
||||
1461
|
||||
1811
|
||||
1764
|
||||
1726
|
||||
1927
|
||||
1179
|
||||
1468
|
||||
1948
|
||||
1813
|
||||
1213
|
||||
1905
|
||||
1371
|
||||
1751
|
||||
1215
|
||||
1392
|
||||
1798
|
||||
1823
|
||||
1815
|
||||
1923
|
||||
1942
|
||||
1987
|
||||
1887
|
||||
1838
|
||||
1395
|
||||
2007
|
||||
1479
|
||||
1752
|
||||
1945
|
||||
1621
|
||||
1538
|
||||
1937
|
||||
565
|
||||
1969
|
||||
1493
|
||||
1291
|
||||
1438
|
||||
1578
|
||||
1770
|
||||
2005
|
||||
1703
|
||||
1712
|
||||
1943
|
||||
2003
|
||||
1499
|
||||
1903
|
||||
1760
|
||||
1950
|
||||
1990
|
||||
1185
|
||||
1809
|
||||
1337
|
||||
1358
|
||||
1743
|
||||
1707
|
||||
1671
|
||||
1788
|
||||
1785
|
||||
1972
|
||||
1863
|
||||
1690
|
||||
1512
|
||||
1963
|
||||
1825
|
||||
1460
|
||||
1828
|
||||
1902
|
||||
1874
|
||||
1755
|
||||
1951
|
||||
1830
|
||||
1767
|
||||
1787
|
||||
1373
|
||||
1709
|
||||
1514
|
||||
1807
|
||||
1791
|
||||
1724
|
||||
1859
|
||||
1590
|
||||
1976
|
||||
1572
|
||||
1947
|
||||
1913
|
||||
1995
|
||||
1728
|
||||
1624
|
||||
1731
|
||||
1706
|
||||
1782
|
||||
1994
|
||||
1851
|
||||
1843
|
||||
1773
|
||||
1982
|
||||
1685
|
||||
2001
|
||||
1346
|
||||
1200
|
||||
1746
|
||||
1520
|
||||
972
|
||||
1834
|
||||
1909
|
||||
2008
|
||||
1733
|
||||
1960
|
||||
1280
|
||||
1879
|
||||
1203
|
||||
1979
|
||||
1133
|
||||
1647
|
||||
1282
|
||||
1684
|
||||
860
|
||||
1444
|
||||
1780
|
||||
1989
|
||||
1795
|
||||
1819
|
||||
1797
|
||||
1842
|
||||
1796
|
||||
1457
|
||||
1839
|
||||
1853
|
||||
1711
|
||||
1883
|
||||
1146
|
||||
1734
|
||||
1389
|
||||
66
1-report_repair/src/main.rs
Normal file
66
1-report_repair/src/main.rs
Normal file
@@ -0,0 +1,66 @@
|
||||
use std::io::{BufRead, BufReader};
|
||||
use std::path::{PathBuf, Path};
|
||||
use std::fs::File;
|
||||
use itertools::Itertools;
|
||||
|
||||
use structopt::StructOpt;
|
||||
|
||||
|
||||
#[derive(StructOpt, Debug)]
|
||||
struct Opt {
|
||||
/// Input file
|
||||
#[structopt(parse(from_os_str))]
|
||||
input_file: PathBuf,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
// Check argv
|
||||
let opts = Opt::from_args();
|
||||
// eprintln!("opts = {:?}", opts);
|
||||
// Load file if possible
|
||||
let file_path = Path::new(&opts.input_file);
|
||||
let input = File::open(file_path).unwrap();
|
||||
let buffered_input = BufReader::new(input);
|
||||
let lines: Vec<String> = buffered_input.lines().filter_map(Result::ok).collect();
|
||||
// eprintln!("lines_iter = {:?}", lines_iter);
|
||||
|
||||
/* First, naïve solution */
|
||||
// while let Some(line) = lines_iter.next() {
|
||||
// let iter_clone = lines_iter.clone();
|
||||
// // eprintln!("iter_clone = {:#?}", iter_clone);
|
||||
// for line2 in iter_clone {
|
||||
// let l1: i64 = line.parse().unwrap();
|
||||
// let l2: i64 = line2.parse().unwrap();
|
||||
// if l1 + l2 == 2020 {
|
||||
// eprintln!("l1 = {:#?}", l1);
|
||||
// eprintln!("l2 = {:#?}", l2);
|
||||
// dbg!(l1 + l2);
|
||||
// dbg!(l1 * l2);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
let res_two = find_2_sum_to_2020(lines.iter().filter_map(|x| Result::ok(x.parse::<i64>())).collect());
|
||||
let res_three = find_3_sum_to_2020(lines.iter().filter_map(|x| Result::ok(x.parse::<i64>())).collect());
|
||||
//let res_three = find_sum_to_2020(3);
|
||||
}
|
||||
|
||||
fn find_3_sum_to_2020(numbers: Vec<i64>) -> Option<(i64,i64, i64)> {
|
||||
for (i,j, k) in numbers.into_iter().tuple_combinations() {
|
||||
if i + j + k == 2020 {
|
||||
println!("Found {} and {} and {} whose sum is {} and whose product is {}", i, j, k, i+j+k, i*j*k);
|
||||
return Some((i,j,k));
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
|
||||
fn find_2_sum_to_2020(numbers: Vec<i64>) -> Option<(i64,i64)> {
|
||||
for (i,j) in numbers.iter().tuple_combinations() {
|
||||
if i + j == 2020 {
|
||||
println!("Found {} and {} whose sum is {} and whose product is {}", i, j, i+j, i*j);
|
||||
return Some((*i,*j));
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
1
2-password_philosophy/.gitignore
vendored
Normal file
1
2-password_philosophy/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
70
2-password_philosophy/Cargo.lock
generated
Normal file
70
2-password_philosophy/Cargo.lock
generated
Normal file
@@ -0,0 +1,70 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2c0df63cb2955042487fad3aefd2c6e3ae7389ac5dc1beb28921de0b69f779d4"
|
||||
|
||||
[[package]]
|
||||
name = "password_philosophy"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
11
2-password_philosophy/Cargo.toml
Normal file
11
2-password_philosophy/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "password_philosophy"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.35"
|
||||
thiserror = "1.0.22"
|
||||
1000
2-password_philosophy/data/input.txt
Normal file
1000
2-password_philosophy/data/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
111
2-password_philosophy/src/main.rs
Normal file
111
2-password_philosophy/src/main.rs
Normal file
@@ -0,0 +1,111 @@
|
||||
use std::ops::RangeInclusive;
|
||||
use anyhow::Result;
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
struct PasswordPolicy {
|
||||
char: u8,
|
||||
range: RangeInclusive<usize>,
|
||||
}
|
||||
|
||||
impl PasswordPolicy {
|
||||
fn check_password(&self, password: &str) -> bool {
|
||||
self.range.contains(
|
||||
&password
|
||||
.as_bytes()
|
||||
.iter().
|
||||
filter(|&&c| c == self.char)
|
||||
.count()
|
||||
)
|
||||
}
|
||||
|
||||
fn check_password_newpolicy(&self, password: &str) -> bool {
|
||||
(password.chars().nth(self.range.start()-1).unwrap() as u8 == self.char) ^ (password.chars().nth(self.range.end()-1).unwrap() as u8 == self.char)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
enum ParseError {
|
||||
#[error("Expected {0}")]
|
||||
Expected(&'static str)
|
||||
}
|
||||
|
||||
fn parse_line(line: &str) -> Result<(PasswordPolicy,String)> {
|
||||
let (policy_s, password) = {
|
||||
let mut tokens = line.split(": ");
|
||||
(
|
||||
tokens.next().ok_or(ParseError::Expected("Coucou"))?,
|
||||
tokens.next().ok_or(ParseError::Expected("Coincoin"))?,
|
||||
)
|
||||
};
|
||||
let policy = {
|
||||
let (range_s, char_s) = {
|
||||
let mut tokens = policy_s.split(' ');
|
||||
(
|
||||
tokens.next().ok_or(ParseError::Expected("Range"))?,
|
||||
tokens.next().ok_or(ParseError::Expected("Char"))?,
|
||||
)
|
||||
};
|
||||
let (min_s, max_s) = {
|
||||
let mut tokens = range_s.split('-');
|
||||
(
|
||||
tokens.next().ok_or(ParseError::Expected("Min"))?,
|
||||
tokens.next().ok_or(ParseError::Expected("Max"))?,
|
||||
)
|
||||
};
|
||||
PasswordPolicy {
|
||||
char: if char_s.len() == 1 {
|
||||
char_s.as_bytes()[0]
|
||||
} else {
|
||||
// return Err(ParseError::Expected("policy byte to be exactly one byte"));
|
||||
return Err(ParseError::Expected("password policy byte to be exactly 1 byte").into());
|
||||
},
|
||||
range: (min_s.parse()?)..=(max_s.parse()?),
|
||||
}
|
||||
};
|
||||
Ok((policy, password.to_string()))
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let count = include_str!("../data/input.txt")
|
||||
.lines()
|
||||
.map(parse_line)
|
||||
.map(Result::unwrap)
|
||||
.filter(|(policy,password)| policy.check_password(password))
|
||||
.count();
|
||||
println!("{} passes are valid", count);
|
||||
let count_new_policy = include_str!("../data/input.txt")
|
||||
.lines()
|
||||
.map(parse_line)
|
||||
.map(Result::unwrap)
|
||||
.filter(|(policy,password)| policy.check_password_newpolicy(password))
|
||||
.count();
|
||||
println!("{} passes are valid with new policy", count_new_policy);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_is_valid() {
|
||||
let policy = PasswordPolicy{ char: b'b', range: 1..=4 };
|
||||
assert_eq!(policy.check_password("boumbaby"), true);
|
||||
assert_eq!(policy.check_password("b-b-b-boumbaby"), false);
|
||||
assert_eq!(policy.check_password("oumay"), false);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_parse_line() {
|
||||
assert_eq!(
|
||||
parse_line("1-5 b: boulbi").unwrap(),
|
||||
(
|
||||
PasswordPolicy {
|
||||
char: b'b',
|
||||
range: 1..=5,
|
||||
},
|
||||
"boulbi".to_owned(),
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
1
3-toboggan_trajectory/.gitignore
vendored
Normal file
1
3-toboggan_trajectory/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
5
3-toboggan_trajectory/Cargo.lock
generated
Normal file
5
3-toboggan_trajectory/Cargo.lock
generated
Normal file
@@ -0,0 +1,5 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "toboggan_trajectory"
|
||||
version = "0.1.0"
|
||||
9
3-toboggan_trajectory/Cargo.toml
Normal file
9
3-toboggan_trajectory/Cargo.toml
Normal file
@@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "toboggan_trajectory"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
323
3-toboggan_trajectory/data/input.txt
Normal file
323
3-toboggan_trajectory/data/input.txt
Normal file
@@ -0,0 +1,323 @@
|
||||
.#.#....##.......#..........#..
|
||||
...#...........##...#..#.......
|
||||
#.####......##.#...#......#.#..
|
||||
##.....#.#.#..#.#............#.
|
||||
##.....#....#.........#...##...
|
||||
###..#.....#....#..............
|
||||
..........#..#.#..#.#....#.....
|
||||
##.....#....#.#...#.##.........
|
||||
#...#......#....##....#..#.#...
|
||||
.##.##...#....##..#.#.....#...#
|
||||
.....#.#..........##.#........#
|
||||
.##..................#..#..##.#
|
||||
#.#..........##....#.####......
|
||||
.#......#.#......#.........#...
|
||||
#....#..##.##..##........#.#...
|
||||
##..#.##..#...#..####.#..#.....
|
||||
###....#.###.##...........##..#
|
||||
.....#.##.....##.#..#####....##
|
||||
....#.###....#..##....##...#...
|
||||
..###.#...##.....#.##..#..#.#..
|
||||
#...#..#..#.........#..#.......
|
||||
##..#.#.....#.#.#.......#...#.#
|
||||
...#...##.#........#...#.......
|
||||
..#..#.#..#...#...#...........#
|
||||
........#.....#......#...##....
|
||||
#........##.##.#.#...#...#.....
|
||||
####.......#.##.###.#....#.....
|
||||
...#...........#...#......#...#
|
||||
##...#...#............#.......#
|
||||
....#...........##.......#.....
|
||||
###......#.....#....#...#.#...#
|
||||
.....##..........#.......#.#...
|
||||
##.##.##...#......#....#.......
|
||||
##..#.#..#......#...#..#.......
|
||||
....#....##.##............####.
|
||||
..#.###..#.##.###..#.##.......#
|
||||
#.##..#.#.....#..#.....##......
|
||||
..##..#.....##.#.##........#...
|
||||
.#..#.#......#..#............#.
|
||||
.....#..#.#...#....#.##.#......
|
||||
.#...##.#..#.#...##...##..##...
|
||||
###............#.#..#..#...#...
|
||||
..#..##.####.#.....#.....##.###
|
||||
#....#.##..##....#..#...#.##.#.
|
||||
.....#.##.........##...##......
|
||||
.........####.#....#.#......#.#
|
||||
.........#.#..#...#.#..#.#....#
|
||||
.#.....#..##.##..##....#.......
|
||||
..........##......#.##.###....#
|
||||
.##...###..##.#...#........##..
|
||||
..............#.#....#.#.###.##
|
||||
..##.##.......#.#......##...#..
|
||||
.#.....#..##..#.###...#..#.##.#
|
||||
#.....#.#..#...#........#...#..
|
||||
.#......#....#.#.....###...#..#
|
||||
..##.#....#..##......#.....#...
|
||||
..#.#.##..#.....#.####..###....
|
||||
.........#......#..#...........
|
||||
..#........#.##.#.....##.##..#.
|
||||
.......#.........#....#...#.#..
|
||||
.##.....#.#....#.#.......#.....
|
||||
..........#.##........##...##..
|
||||
###..###.#.#..#..#####.##.#.##.
|
||||
..##..##.#.#...#..#.#.#......#.
|
||||
#..#..#..#..##..#.....#......#.
|
||||
..#....#.##..#......##.........
|
||||
..#.##......#...##.#......#....
|
||||
.......#..#.##.#.....#.........
|
||||
.......#.#.#.###...##......#...
|
||||
.....#.#..........#..#...#.....
|
||||
....##..........#..........##..
|
||||
..#......#.....#.##.#..#...#.#.
|
||||
....#.....#..#...#..#.#.##..###
|
||||
.####....#........#...#........
|
||||
...##.#.##.#..#...##...#.##....
|
||||
....#...#...#.#.#.#...#..#.....
|
||||
.....#...#.#.....#.#........##.
|
||||
..#.#.......###.#.....##.......
|
||||
......#.........##....#....#..#
|
||||
.............##.....##.........
|
||||
.........##...##.......#.....#.
|
||||
##.........#..........#.###..##
|
||||
...#.....#......#....#..##.....
|
||||
##..#...#...##.#.....#.#......#
|
||||
..#...##.#.......#.#......#.##.
|
||||
......#.......#.#...........#..
|
||||
..........#.....##............#
|
||||
#........#...#..#.......###.##.
|
||||
.##...........#.#........#.#.#.
|
||||
...#..##...#.#....#####.#......
|
||||
.....##...###...#..#.##...####.
|
||||
...#....#.....#..#.......#.....
|
||||
#....#....#...#..#..#.######..#
|
||||
#.###...........#......#...#..#
|
||||
.#.#.#.#..#....#....#...##.#...
|
||||
.#..#.........#.#....###...#...
|
||||
......#..##.##..........#....##
|
||||
.....#......##....##.....#...#.
|
||||
.#...#.#.#....##....#..#....#.#
|
||||
..................#..###.#..##.
|
||||
..#.........#......#....#..###.
|
||||
#.#.....#..#..#....###..###....
|
||||
..##..##.#..##........##...##..
|
||||
##..#........##..###..#.....#.#
|
||||
..#..###..#......#....#...#...#
|
||||
#..#.#..............##.#..#.#..
|
||||
.....####....#...####.....#.#..
|
||||
.....#....##.#......###........
|
||||
##.##...#.#.#.#.......#....##..
|
||||
.#......#...#.#....#..##.#.##.#
|
||||
#.#.##.#.#......#..##........##
|
||||
...##.....#.....#...#..###...#.
|
||||
........###.....#.....#...##..#
|
||||
.....#.##.##......#.#....#...#.
|
||||
.#....##.......#..#.####.......
|
||||
.#..#....#..........#......#.#.
|
||||
.#.##.##.....###.#.#...........
|
||||
.........#......#..##..........
|
||||
....#...##.#.#.#..#.#.........#
|
||||
..#.....#.##...#..#..#.###....#
|
||||
...#.##......#.....##....#.....
|
||||
###............#.#....#...#....
|
||||
.......#.....#..#.#.#....#..#.#
|
||||
...#......#.#..##..#....#...#.#
|
||||
............##........##..##...
|
||||
..#..#.##..#......###..#.......
|
||||
........#.........#............
|
||||
..#...#.#########.#...##..###..
|
||||
#....#......#.......#.#.....#..
|
||||
#.#..#....###.###....#...#.#...
|
||||
#...###.#.#.......#.##......#..
|
||||
.................#...#.#.#.....
|
||||
##....#...#........#....#.#..#.
|
||||
......#.....#...#..........#.#.
|
||||
##..........#...#..........#.##
|
||||
..#.#.##.#....#.#......#...##..
|
||||
.....#.......#..#.....#........
|
||||
#.##.#..##..#.......##.........
|
||||
....#......#..#..#.#...#.......
|
||||
...#....#................###...
|
||||
.##.....#.#....#.#..........##.
|
||||
...#..#....#.##.##......#......
|
||||
..#.#....#.......#.#..##.......
|
||||
....#.....#..........##.#.#####
|
||||
#.....................##..#..#.
|
||||
.###..#.##.......##.#...#..#...
|
||||
...###.......#..#...#......#..#
|
||||
#..#...#.#..#.#..#..#.##.......
|
||||
#...##.......#..#..#.##..###...
|
||||
......#....#.#.#........#.##..#
|
||||
..##..#....#....#..#.#..#......
|
||||
..##.#...#.#######..#...#.....#
|
||||
..#....#..#.........#..##......
|
||||
...#....#.#......#..#..#.#.....
|
||||
#..#....#........#.#..##....###
|
||||
#....#..##......##.##.....#.###
|
||||
...#.#..........#..#.#.#.#.##..
|
||||
......##..#.#..#.#....#....#...
|
||||
##....#....#..#..#.##......#...
|
||||
....#.#..##.#.#...###....##.#..
|
||||
...#.......##..#.......#...#...
|
||||
......##.......#..##.....#...#.
|
||||
...#.#...#...........#...#.....
|
||||
.#....#...#......##.##..###..#.
|
||||
.#..........#...#...#...##.##..
|
||||
.....###..#.....#..##....#.####
|
||||
..#.###..#..##..##.....#.#.....
|
||||
.............#.###...##.#.....#
|
||||
....###.......###.#.....#..#.#.
|
||||
........##.#.........#.....###.
|
||||
.....###.#..#.....#...#..#.....
|
||||
.#....#..##.#..#.#....#.......#
|
||||
........#......#.#..#.#..#...##
|
||||
...#.##.##......#..............
|
||||
.#.....##.#.....#..#......##...
|
||||
#..#..#.....#.....#.....###....
|
||||
.##...........#..#.##.....#....
|
||||
..#.#......#.#...#.##.#..#...##
|
||||
...#..........#.....#..........
|
||||
#.#.#.#.#...#....#...#.....##..
|
||||
#......##...#...#..........#.#.
|
||||
....##........#.#..............
|
||||
#..#.#.#..#........##......#.##
|
||||
........####...##.#.....#......
|
||||
....#........#.#..#..##..#.#...
|
||||
.#.....#..###...#..#.....#..#..
|
||||
#......###.#..#....#..#.#......
|
||||
....#.....##.##..#...#.#..##.#.
|
||||
..##..#...#.#......#....#...#.#
|
||||
#..##...##..#...###...#..#.....
|
||||
.......#.....#...........##....
|
||||
#..##....#........#....##..#.#.
|
||||
.#........#..##...###.#..#.....
|
||||
.#.#....#..##...#...##.#..###..
|
||||
#.........#.......#.....#.#....
|
||||
#..#.....#.#.###.#..#......#...
|
||||
....#..#.#....#..##..###....###
|
||||
###.##.#.#..#...........#.#.#..
|
||||
..##.#.......#......#..##....#.
|
||||
.....#.#.#.......##.......#...#
|
||||
...........#.##....##.##....#.#
|
||||
...#.......#..#.##..#......#..#
|
||||
#.#.#...#......##.#...........#
|
||||
##........#...........###.#..#.
|
||||
..........#.#.#....#.#..##.#.#.
|
||||
...#.#.#....#..........#..#....
|
||||
#.#....###.#.#..#.......###...#
|
||||
.#....#......#.#.#..#..#.......
|
||||
......##.............#....#.#.#
|
||||
.#..........#.........#.##.....
|
||||
##....#....##....#..#.......#..
|
||||
#.##.##.#..#..#.....#..#.##.#..
|
||||
.#..#.......##..#.....##.##....
|
||||
.......#..........#.#.##..#.##.
|
||||
....#.....#.#...##....##.......
|
||||
.......#.........#...##....##.#
|
||||
#.....#......#..........#...#..
|
||||
...#.#.......#.#..#....###..#..
|
||||
.....#.#.#.........#...........
|
||||
.#..###.#.#........#.#.........
|
||||
.........#..#......##...##....#
|
||||
...###..#.....##.....#.###....#
|
||||
.##...#...#........###.#..#....
|
||||
.##........#..#.###.######.##.#
|
||||
##.#...#.#....#..##.#....##....
|
||||
.......##.....##.#..###.#......
|
||||
..##...##........#.......#....#
|
||||
#..##...#.####...###......#...#
|
||||
.##.....#.##.#.#.....###.#..##.
|
||||
..###....#.#.###.#....#........
|
||||
....#..###..#...#....#..#..#.#.
|
||||
#.#.##....##...##.......#......
|
||||
.........#...#....#..#.........
|
||||
.............#...#..##.#.......
|
||||
...#.##.......#...#.#..##.##...
|
||||
.####.#.##..#.#......#.##...#.#
|
||||
.#..#.#.....#.................#
|
||||
..#.##..###....#...#......####.
|
||||
..##..##...........#....#...#..
|
||||
....#...#...#...#.......#....#.
|
||||
#.#...###...#...#.#...#....##.#
|
||||
......#...#.#.......#.....#...#
|
||||
....##...#.#.#....#....#.#....#
|
||||
.....#.....#...##..#...#....##.
|
||||
#.....#....#......##.##....#...
|
||||
...#.#....#...#....#.#....##..#
|
||||
...#.#..#...##....###..#.......
|
||||
...##......###...###.#...#..#..
|
||||
##.......#.......###.......#..#
|
||||
..##.##..###.#............#...#
|
||||
#.....##..#..##....##..#.......
|
||||
......#.#...#......#.....#.....
|
||||
#...........#....#..##.##.#....
|
||||
.......#..#......#...#....#...#
|
||||
.#...##...........#......#...#.
|
||||
#........#....##...###.#....#..
|
||||
.....#.......##.........#.##...
|
||||
.#.###..#....#..##.#..#.#..#...
|
||||
#.......#.##.#.#....#.#..#....#
|
||||
###.....#.#.......#..#......#.#
|
||||
#..#.#.......#.#..##..##.#.#...
|
||||
#..#.#.#.###........#.....#...#
|
||||
#.#.#..#..##.....#...........#.
|
||||
..#.#..#.....#...#...#...##....
|
||||
...#.##......#...##.#...#.#.#.#
|
||||
#..#.#.#.#.......####..........
|
||||
..#......#.#......##.###.....##
|
||||
..#...##..#.........##....#.##.
|
||||
##.##.##.#.#.....#..........##.
|
||||
.#.....###.#..#....#..#.###...#
|
||||
#...##.......###....#.#..#.....
|
||||
..#....##.........##.........##
|
||||
......#....#.##.......#........
|
||||
..#.#.#..#...#...#...##.#...#..
|
||||
......#..##.#.#.#...##...#.#.##
|
||||
#..#...##.#.....#...#.##.......
|
||||
..#..#.........##.#...#.##...##
|
||||
##.##.#....#.......#.##..#.....
|
||||
.....##...##.##...##.........##
|
||||
#......#...#.......#...#...#...
|
||||
...##...........#...#..#.......
|
||||
.#.##.#..#........#....#.......
|
||||
#.#...#..#......##...#.#.##....
|
||||
##........####..#.#...#.#.##.##
|
||||
#..#.#.##......##.#.#..#.......
|
||||
.....#.........#..#.####....#..
|
||||
......##..#....#...#.#....#....
|
||||
#...##........#.........#.....#
|
||||
.#.#...#.#.#..#............##.#
|
||||
.#..#....#....#.....#...#.....#
|
||||
..###...#..#.....#.##.###...#.#
|
||||
.#.###..#..#...#.#...#.#......#
|
||||
#...#####......###........##...
|
||||
.....#.....#..#.#....#..##.....
|
||||
....##...#.#.##.#####...#....#.
|
||||
.#.#.........##.#.......#..##..
|
||||
.#...#.#...#...#....#.#...##.#.
|
||||
.##...#..#.#..#......#.#.#..##.
|
||||
..#.....#..#.....##.....#......
|
||||
..#........#..##...#.......###.
|
||||
.#....#.......#....#....#..#...
|
||||
....#......#.#.#.........#.....
|
||||
..##...#.#.#...#.#........#....
|
||||
.#.....####...##.#..#...##.....
|
||||
...#.....#...#...#....#....#...
|
||||
.........#..#.#.....#..#.#..#..
|
||||
.........##...........#.......#
|
||||
......#..#.....##...#.##.#.....
|
||||
.#......##........##...#.#.##..
|
||||
.....#.#..##...........#..#..#.
|
||||
...#.......#...#.#..#.##..#.##.
|
||||
...#.......#.....#.#...#.##.#..
|
||||
#.....#.............##.#..####.
|
||||
.#...#......#...##.#....#.#....
|
||||
.##..##.##....#.#.....#.......#
|
||||
...#...#....#....##.#..#....##.
|
||||
..............##....#.......#.#
|
||||
.#.#.#...##..#..#...###.#..#...
|
||||
.#.#...#.#..#.#..#...######..#.
|
||||
........#......#.#..#.#....#...
|
||||
..###.....###.#.##....#...##...
|
||||
.##.#.....#.......##.......#...
|
||||
..#..##...#..........#.#....#.#
|
||||
133
3-toboggan_trajectory/src/lib.rs
Normal file
133
3-toboggan_trajectory/src/lib.rs
Normal file
@@ -0,0 +1,133 @@
|
||||
use std::{fmt};
|
||||
|
||||
#[derive(Clone, Copy, PartialEq)]
|
||||
pub enum Terrain {
|
||||
Plain,
|
||||
Tree,
|
||||
}
|
||||
|
||||
impl Default for Terrain {
|
||||
fn default() -> Self {
|
||||
Terrain::Plain
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Terrain {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(f, "{}", match self {
|
||||
Terrain::Plain => '.',
|
||||
Terrain::Tree => '#',
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone, PartialEq, Default)]
|
||||
pub struct Vec2 {
|
||||
pub x: i64,
|
||||
pub y: i64,
|
||||
}
|
||||
|
||||
impl From<(i64, i64)> for Vec2 {
|
||||
fn from((x,y): (i64, i64)) -> Self {
|
||||
Self { x, y }
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Map {
|
||||
size: Vec2,
|
||||
tiles: Vec<Terrain>
|
||||
}
|
||||
|
||||
impl fmt::Debug for Map {
|
||||
fn fmt(&self,f: &mut fmt::Formatter) -> fmt::Result {
|
||||
// A most honourable moment, but chaining debugs means lots of spare ""[]
|
||||
//let dd: Vec<String> = self.tiles.chunks_exact(self.size.x as usize).map(|x| format!("{:?}", x)).collect();
|
||||
for line in self.tiles.chunks_exact(self.size.x as usize) {
|
||||
let line_s: String = line.iter().map(|x| format!("{:?}", x)).collect();
|
||||
writeln!(f, "{}", line_s)?
|
||||
}
|
||||
// let banana = self.tiles
|
||||
// .chunks_exact(self.size.x as usize)
|
||||
// .map(|x| format!("{:?}", x))
|
||||
// .collect::<Vec<String>>()
|
||||
// .join("\n");
|
||||
// writeln!(f, "{}", banana)
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Map {
|
||||
pub fn new(size: Vec2) -> Self {
|
||||
Self {
|
||||
size,
|
||||
tiles: vec![Default::default();(size.x*size.y) as usize]
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get(&self, pos: Vec2) -> Terrain {
|
||||
self.tiles[self.idx(pos).unwrap_or_default()]
|
||||
}
|
||||
|
||||
pub fn set(&mut self, pos: Vec2, tile: Terrain) {
|
||||
if let Some(idx) = self.idx(pos) {
|
||||
self.tiles[idx] = tile;
|
||||
}
|
||||
}
|
||||
|
||||
fn wrap_coords(&self, pos: Vec2) -> Option<Vec2> {
|
||||
if !(0..=self.size.y).contains(&pos.y) {
|
||||
None
|
||||
} else {
|
||||
Some(Vec2{
|
||||
x: pos.x % self.size.x,
|
||||
y: pos.y})
|
||||
}
|
||||
}
|
||||
|
||||
fn idx(&self, pos: Vec2) -> Option<usize> {
|
||||
self.wrap_coords(pos).map(|pos| (pos.x + pos.y * self.size.x) as usize)
|
||||
}
|
||||
|
||||
pub fn from_bytes(s: &[u8]) -> Self {
|
||||
let rows = s.iter().filter(|&&x| x == b'\n').count();
|
||||
let cols = (s.len() - rows) / rows;
|
||||
println!("Size : {} {}", rows, cols);
|
||||
let mut res = Self::new((cols as i64,rows as i64).into());
|
||||
|
||||
let mut pos = Vec2 { x: 0, y: 0 };
|
||||
for tile in s {
|
||||
match tile {
|
||||
b'\n' => {
|
||||
pos.y += 1;
|
||||
pos.x = 0;
|
||||
}
|
||||
b'#' => {
|
||||
res.set(pos, Terrain::Tree);
|
||||
pos.x += 1;
|
||||
}
|
||||
_ => {
|
||||
res.set(pos, Terrain::Plain);
|
||||
pos.x += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
pub fn solve(&self, slope: (i64, i64)) -> i64 {
|
||||
let mut seek_pos = Vec2 { x: 0, y: 0};
|
||||
let mut tree_count = 0;
|
||||
loop {
|
||||
if self.get(seek_pos) == Terrain::Tree {
|
||||
tree_count += 1;
|
||||
}
|
||||
if seek_pos.y + slope.1 >= self.size.y {
|
||||
break;
|
||||
}
|
||||
seek_pos.y += slope.1;
|
||||
seek_pos.x += slope.0;
|
||||
}
|
||||
tree_count
|
||||
}
|
||||
}
|
||||
17
3-toboggan_trajectory/src/main.rs
Normal file
17
3-toboggan_trajectory/src/main.rs
Normal file
@@ -0,0 +1,17 @@
|
||||
use toboggan_trajectory::*;
|
||||
|
||||
fn main() {
|
||||
let map_str = include_str!("../data/input.txt");
|
||||
// println!("{}", map_str);
|
||||
let map: Map = Map::from_bytes(map_str.as_bytes());
|
||||
// println!("{:#?}", map);
|
||||
eprintln!("First part solution = {}", map.solve((3,1)));
|
||||
let sols: i64 = vec![
|
||||
(1, 1),
|
||||
(3, 1),
|
||||
(5, 1),
|
||||
(7, 1),
|
||||
(1, 2),
|
||||
].iter().map(|slope| map.solve(*slope)).product();
|
||||
println!("Second part solution = {}", sols);
|
||||
}
|
||||
54
3-toboggan_trajectory/src/tests.rs
Normal file
54
3-toboggan_trajectory/src/tests.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_vec2_from_tuple() {
|
||||
// let v: Vec2 = (32, 75).into();
|
||||
let v = Vec2::from((32, 75));
|
||||
assert_eq!(v, Vec2 {x: 32, y: 75})
|
||||
}
|
||||
#[test]
|
||||
fn test_format_map() {
|
||||
let m = Map{
|
||||
size: Vec2{x: 2, y:2},
|
||||
tiles: vec!(Terrain::Tree, Terrain::Plain, Terrain::Plain, Terrain::Plain)
|
||||
};
|
||||
assert_eq!(format!("{:?}", m), "#.\n..\n")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_normalize_pos() {
|
||||
let m = Map::new((2, 2).into());
|
||||
assert_eq!(m.normalize_pos((0, 0).into()), Some((0, 0).into()));
|
||||
assert_eq!(m.normalize_pos((1, 0).into()), Some((1, 0).into()));
|
||||
assert_eq!(m.normalize_pos((2, 0).into()), Some((0, 0).into()));
|
||||
assert_eq!(m.normalize_pos((-1, 0).into()), Some((1, 0).into()));
|
||||
assert_eq!(m.normalize_pos((-2, 0).into()), Some((0, 0).into()));
|
||||
assert_eq!(m.normalize_pos((0, -1).into()), None);
|
||||
assert_eq!(m.normalize_pos((0, 2).into()), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_index() {
|
||||
let m = Map::new((3, 5).into());
|
||||
assert_eq!(m.index((0, 0).into()), Some(0));
|
||||
assert_eq!(m.index((2, 0).into()), Some(2));
|
||||
assert_eq!(m.index((0, 1).into()), Some(3));
|
||||
assert_eq!(m.index((2, 1).into()), Some(5));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_create_map() {
|
||||
let mut map = Map::new(Vec2{x:5,y:5});
|
||||
let trees: Vec<Vec2> = vec![
|
||||
(1,2).into(),
|
||||
(2,1).into(),
|
||||
(3,3).into(),
|
||||
(1,4).into(),
|
||||
(5,1).into(),
|
||||
];
|
||||
trees.iter().for_each(|pos| map.set(*pos, Terrain::Tree));
|
||||
println!("{:?}", map)
|
||||
}
|
||||
}
|
||||
1
4-passport_processing/.gitignore
vendored
Normal file
1
4-passport_processing/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
119
4-passport_processing/Cargo.lock
generated
Normal file
119
4-passport_processing/Cargo.lock
generated
Normal file
@@ -0,0 +1,119 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.36"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68803225a7b13e47191bab76f2687382b60d259e8cf37f6e1893658b84bb9479"
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.3.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
|
||||
|
||||
[[package]]
|
||||
name = "passport_processing"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"regex",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
"thread_local",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
10
4-passport_processing/Cargo.toml
Normal file
10
4-passport_processing/Cargo.toml
Normal file
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "passport_processing"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.36"
|
||||
regex = "1.4.2"
|
||||
thiserror = "1.0.22"
|
||||
953
4-passport_processing/data/input.txt
Normal file
953
4-passport_processing/data/input.txt
Normal file
@@ -0,0 +1,953 @@
|
||||
ecl:amb
|
||||
pid:690616023
|
||||
byr:1994 iyr:2014 hgt:172cm hcl:#c0946f eyr:2022
|
||||
|
||||
eyr:1980 cid:97
|
||||
hcl:z ecl:#102145 iyr:2011 byr:1945
|
||||
pid:187cm hgt:179in
|
||||
|
||||
ecl:amb
|
||||
iyr:2011
|
||||
cid:113
|
||||
eyr:2021 hcl:#b6652a pid:004682943 byr:1940
|
||||
hgt:173cm
|
||||
|
||||
iyr:2023
|
||||
cid:146 byr:2022 ecl:dne hgt:76in eyr:2040 hcl:z
|
||||
|
||||
hcl:#f97e30
|
||||
cid:73 iyr:2013 byr:1929 hgt:157cm
|
||||
eyr:2024 ecl:blu pid:673398662
|
||||
|
||||
hcl:5343fe
|
||||
hgt:152 byr:2018
|
||||
eyr:1992 pid:85999926 iyr:1938 ecl:#15bd97
|
||||
|
||||
byr:1975 hcl:z eyr:1988 pid:#c36f52
|
||||
iyr:2018
|
||||
hgt:184cm
|
||||
|
||||
byr:1954 eyr:2023 hgt:170cm iyr:2012 ecl:blu pid:299556897 hcl:#b6652a
|
||||
|
||||
hgt:191cm ecl:oth hcl:#7d3b0c
|
||||
iyr:2016 pid:187567535
|
||||
byr:1999 eyr:2023
|
||||
|
||||
pid:814358147 eyr:2022 iyr:2000 byr:2001 hcl:#18171d
|
||||
ecl:blu
|
||||
hgt:76in
|
||||
|
||||
ecl:hzl
|
||||
hgt:163cm byr:1955 iyr:2018 eyr:2024 hcl:#6b5442 pid:343362099
|
||||
|
||||
eyr:2020 pid:185090160 ecl:#21a5e6
|
||||
iyr:1928 byr:2006 hcl:a2ebbf hgt:104
|
||||
|
||||
hgt:153cm
|
||||
hcl:#a97842 ecl:blu eyr:2028 byr:1969 iyr:2019
|
||||
pid:729700590
|
||||
|
||||
iyr:2019 byr:1981 hgt:150cm pid:606092356 hcl:#18171d eyr:2026
|
||||
ecl:grn
|
||||
|
||||
pid:760899887
|
||||
eyr:2023 hcl:#866857 hgt:185cm iyr:2017
|
||||
byr:1976 ecl:gry
|
||||
|
||||
byr:1965 eyr:2026
|
||||
hcl:#623a2f
|
||||
ecl:blu pid:483363116 iyr:2010 hgt:178cm cid:204
|
||||
|
||||
ecl:oth eyr:2022
|
||||
pid:268557763 byr:1965 iyr:2015 hcl:#c0946f hgt:164cm
|
||||
|
||||
ecl:gry hgt:168cm hcl:#623a2f eyr:2020 cid:163 pid:124082663 iyr:2016 byr:1996
|
||||
|
||||
hcl:4c44fb iyr:1957 eyr:2039 ecl:grt hgt:63cm byr:2012 cid:104
|
||||
|
||||
byr:2024 iyr:2023
|
||||
ecl:gry
|
||||
eyr:2007 pid:170cm hgt:68 hcl:d57b67 cid:333
|
||||
|
||||
byr:1956
|
||||
hgt:169cm iyr:2013 pid:370491367
|
||||
ecl:gry hcl:#5bc41d
|
||||
|
||||
eyr:2023 iyr:2028 byr:1969 ecl:lzr hcl:1989b1 hgt:71cm pid:#12c226
|
||||
|
||||
cid:304 pid:866132461
|
||||
byr:2022
|
||||
hcl:z hgt:191in ecl:lzr iyr:2029 eyr:1989
|
||||
|
||||
ecl:brn hcl:#9a45a7
|
||||
hgt:176cm
|
||||
byr:1974 pid:758747330 iyr:2014 eyr:2020
|
||||
|
||||
cid:190 ecl:hzl iyr:2014 byr:1990 hgt:69in eyr:2037 pid:384015829 hcl:#ceb3a1
|
||||
|
||||
byr:1998 eyr:2022 iyr:2018 hgt:153cm
|
||||
hcl:#733820 pid:424512443
|
||||
ecl:blu
|
||||
|
||||
hcl:27c41f byr:1972 eyr:1994 pid:777840405
|
||||
ecl:gry
|
||||
hgt:179cm
|
||||
iyr:2021
|
||||
|
||||
hgt:166cm eyr:2032 ecl:gry byr:1936
|
||||
pid:41703652
|
||||
|
||||
hcl:#efcc98 iyr:2019 byr:1936 pid:985830958 eyr:2021
|
||||
hgt:175cm ecl:brn
|
||||
|
||||
eyr:2025 pid:972163513 hgt:155cm ecl:brn cid:169 iyr:2015
|
||||
hcl:#6b5442
|
||||
|
||||
eyr:2026
|
||||
hgt:173cm
|
||||
byr:1984
|
||||
cid:191
|
||||
pid:791209101 hcl:#341e13 iyr:2020 ecl:hzl
|
||||
|
||||
hgt:64cm
|
||||
iyr:2010 byr:1978
|
||||
pid:618891746 hcl:#d6ac23 eyr:2023 ecl:brn
|
||||
|
||||
eyr:2021 hcl:#341e13 iyr:2018 pid:502081929
|
||||
ecl:blu
|
||||
|
||||
ecl:amb
|
||||
iyr:2018 pid:8933462515
|
||||
hgt:160cm hcl:e330f0 eyr:2030 byr:2007
|
||||
|
||||
ecl:gry byr:1980 hcl:#341e13 iyr:2015 pid:830724822 hgt:167cm cid:156
|
||||
eyr:2023
|
||||
|
||||
ecl:gry hcl:#c39b75 byr:1995 hgt:153cm
|
||||
eyr:2029 pid:83056475 iyr:2013
|
||||
|
||||
byr:1965 cid:250
|
||||
ecl:oth iyr:2016
|
||||
pid:242792947 eyr:2025 hcl:#efcc98
|
||||
|
||||
byr:2011 ecl:#62fe2d hcl:#2b434a hgt:190cm
|
||||
eyr:2031 iyr:1964 pid:7096872943
|
||||
|
||||
cid:258 hcl:#c0946f pid:698224453 eyr:2029 hgt:189cm iyr:2012 ecl:blu byr:1963
|
||||
|
||||
eyr:2028 byr:1942 hgt:156cm pid:836243052 iyr:2016
|
||||
hcl:#888785 cid:310 ecl:brn
|
||||
|
||||
hcl:#a97842 pid:740164307 ecl:oth byr:1997
|
||||
hgt:166cm
|
||||
iyr:2015 eyr:2026
|
||||
|
||||
hcl:4ee9da iyr:2020
|
||||
eyr:1933 hgt:136 ecl:#8dee29 pid:44266010 byr:1966 cid:82
|
||||
|
||||
ecl:amb byr:1921 hgt:182cm eyr:2026
|
||||
hcl:#c0946f iyr:2010
|
||||
|
||||
hgt:178cm cid:343 eyr:2023 pid:197119382 hcl:#623a2f iyr:2017
|
||||
ecl:brn byr:2002
|
||||
|
||||
eyr:2030 byr:1967 ecl:blu hgt:166cm iyr:2017
|
||||
pid:655602762 hcl:#6b5442
|
||||
|
||||
cid:143 hgt:152cm eyr:2026 iyr:2018 byr:1950 ecl:grn hcl:#866857 pid:067535973
|
||||
|
||||
byr:2019 ecl:#e3c288 iyr:1948 hgt:72cm hcl:7da71b eyr:1956
|
||||
|
||||
hcl:#cfa07d
|
||||
pid:688405238 cid:200 byr:1950
|
||||
iyr:2020 ecl:hzl hgt:170cm
|
||||
|
||||
eyr:2026 hgt:164cm iyr:2010 hcl:#b6652a pid:404835595 byr:1924 ecl:blu
|
||||
|
||||
iyr:2016 hcl:#866857
|
||||
ecl:gry
|
||||
eyr:2023 pid:986813245 cid:247 byr:1977
|
||||
hgt:173cm
|
||||
|
||||
ecl:#a59335 eyr:2023
|
||||
hcl:033f22 byr:1947 hgt:152
|
||||
iyr:2029 pid:#1e686a cid:305
|
||||
|
||||
byr:2005
|
||||
ecl:amb hcl:#a97842
|
||||
iyr:1972
|
||||
eyr:1967 pid:274884869
|
||||
|
||||
eyr:2038 iyr:2018
|
||||
pid:181cm ecl:xry hgt:185in
|
||||
hcl:109b28 cid:287
|
||||
|
||||
ecl:amb byr:1943 pid:002483342 hgt:178cm
|
||||
hcl:#c0946f eyr:2030
|
||||
iyr:2014
|
||||
|
||||
iyr:2020 byr:1963 cid:131 hcl:#18171d hgt:181cm pid:146726616 eyr:2021
|
||||
|
||||
pid:062629370 byr:1931 hgt:188cm eyr:2021 ecl:gry
|
||||
hcl:#166b3d
|
||||
|
||||
pid:007028786 ecl:blu hgt:156cm byr:1981 hcl:#888785 cid:53 iyr:2019
|
||||
|
||||
iyr:2014 hcl:#623a2f
|
||||
ecl:hzl eyr:2029 byr:1988
|
||||
pid:849096536 hgt:167cm cid:322
|
||||
|
||||
pid:160824363
|
||||
hcl:#19bed3
|
||||
eyr:2024 hgt:171cm
|
||||
byr:1968 iyr:2019
|
||||
|
||||
eyr:2024 hcl:#dd66d0
|
||||
byr:1986
|
||||
cid:105 pid:816153574 ecl:hzl iyr:2013
|
||||
hgt:173cm
|
||||
|
||||
hcl:#ceb3a1 hgt:62in ecl:gry
|
||||
iyr:2017 cid:234 byr:1963
|
||||
eyr:2029
|
||||
pid:514406488
|
||||
|
||||
hcl:#fffffd ecl:blu
|
||||
eyr:2020 iyr:2010
|
||||
pid:544347103 hgt:164cm byr:1939
|
||||
|
||||
eyr:2021
|
||||
pid:999479324 hgt:164in ecl:brn iyr:2016
|
||||
hcl:#a97842 byr:2020
|
||||
|
||||
pid:053149570 byr:1920 eyr:2027 hgt:190cm iyr:2011 hcl:#fffffd ecl:oth
|
||||
|
||||
hgt:165cm
|
||||
hcl:#cfa07d
|
||||
ecl:oth
|
||||
eyr:2023
|
||||
pid:186cm
|
||||
byr:1937 iyr:2012
|
||||
|
||||
eyr:2026 hgt:64cm hcl:#ac426a byr:1969
|
||||
cid:345 iyr:1960
|
||||
pid:#df648a ecl:blu
|
||||
|
||||
byr:1923 iyr:2017
|
||||
eyr:2027 pid:798497862 hgt:182cm
|
||||
hcl:#ceb3a1 ecl:oth
|
||||
|
||||
hgt:182cm eyr:1990 ecl:grn hcl:#efcc98 byr:1968
|
||||
pid:005962011
|
||||
iyr:2010
|
||||
|
||||
cid:74 eyr:2020 hgt:71in
|
||||
iyr:2015 pid:487940408 byr:1952
|
||||
hcl:#733820
|
||||
|
||||
hgt:75cm cid:249
|
||||
ecl:hzl
|
||||
hcl:#6b5442 pid:4860441 eyr:2020
|
||||
|
||||
ecl:hzl eyr:2025 hgt:183cm
|
||||
iyr:2020 byr:1993 pid:572766871 hcl:#866857
|
||||
|
||||
hcl:#888785 pid:200125941 hgt:155cm byr:1923
|
||||
eyr:2021 iyr:2010 ecl:gry
|
||||
|
||||
pid:502547835 iyr:2014 hcl:#b6652a
|
||||
byr:1985 hgt:189cm eyr:2024
|
||||
|
||||
eyr:2024 hcl:#fffffd ecl:amb byr:1952
|
||||
pid:724639818
|
||||
iyr:2013 hgt:183cm
|
||||
|
||||
byr:2023
|
||||
iyr:2026 ecl:gry eyr:2032 hcl:3e0fc4 pid:5620497552
|
||||
hgt:84
|
||||
|
||||
cid:79
|
||||
hgt:68cm
|
||||
iyr:2021
|
||||
pid:#365b83 byr:1928
|
||||
ecl:#79a6b3 eyr:2027 hcl:54130e
|
||||
|
||||
hgt:74cm byr:1953
|
||||
cid:263 iyr:2018
|
||||
ecl:zzz
|
||||
hcl:#efcc98
|
||||
pid:154cm eyr:1951
|
||||
|
||||
cid:272 pid:0638528559 hcl:z hgt:63cm byr:2029 ecl:zzz
|
||||
eyr:2033
|
||||
|
||||
iyr:2016
|
||||
hgt:193cm hcl:#6b5442 pid:715518898 ecl:brn cid:195
|
||||
eyr:2025
|
||||
|
||||
ecl:oth
|
||||
eyr:2025 hgt:166cm byr:1944
|
||||
iyr:2017 pid:814141652
|
||||
|
||||
eyr:2025 cid:140 ecl:hzl hcl:#c0946f pid:824866056 iyr:2011 hgt:65in byr:1947
|
||||
|
||||
iyr:2016
|
||||
ecl:brn eyr:2021
|
||||
hgt:161cm
|
||||
byr:1984 hcl:#602927 pid:821539320
|
||||
|
||||
hgt:175cm cid:190 hcl:#ceb3a1 ecl:brn byr:1927 iyr:2017 eyr:2029 pid:836598854
|
||||
|
||||
eyr:2026 ecl:brn hgt:157cm pid:038645205 byr:1995
|
||||
iyr:2019 cid:339
|
||||
|
||||
ecl:brn hgt:70in hcl:#c0946f
|
||||
pid:535498918 cid:153
|
||||
iyr:2012 eyr:2030
|
||||
|
||||
byr:1995
|
||||
hcl:#efcc98 hgt:174cm eyr:2030 pid:180839761
|
||||
ecl:grn iyr:2010
|
||||
|
||||
hgt:59cm eyr:2035 byr:2021 iyr:2012 ecl:hzl pid:219328725 hcl:#888785
|
||||
|
||||
ecl:oth hgt:184cm byr:1984 iyr:2016
|
||||
hcl:#cfa07d
|
||||
|
||||
iyr:1998 byr:2024 ecl:lzr hgt:187 hcl:z eyr:1935 pid:#789b56
|
||||
|
||||
iyr:1967 hcl:z pid:828930046 hgt:59in
|
||||
cid:153
|
||||
byr:2021
|
||||
ecl:grn
|
||||
eyr:1935
|
||||
|
||||
byr:1991
|
||||
hcl:#341e13 ecl:gry iyr:2018
|
||||
hgt:67in pid:157970631 eyr:2021
|
||||
|
||||
byr:1941 hgt:169cm pid:322510952 hcl:#cfa07d cid:75 ecl:oth
|
||||
eyr:2021 iyr:2020
|
||||
|
||||
hcl:#7d3b0c iyr:2013 cid:78 hgt:167cm ecl:brn byr:1974 pid:237404828
|
||||
|
||||
pid:1567157833
|
||||
hcl:#7d3b0c iyr:2025 eyr:2023
|
||||
byr:2002 ecl:oth hgt:191cm
|
||||
|
||||
ecl:amb iyr:2014 hgt:182cm pid:526612838
|
||||
cid:287 eyr:2025 byr:1988
|
||||
hcl:#866857
|
||||
|
||||
hcl:#866857 hgt:174cm byr:1992 eyr:2028 iyr:2015
|
||||
|
||||
eyr:2029
|
||||
hgt:190cm
|
||||
hcl:#18171d
|
||||
cid:245
|
||||
ecl:oth pid:3636033742 byr:2024
|
||||
iyr:2019
|
||||
|
||||
byr:1972 hgt:163cm eyr:2020 hcl:#b6652a
|
||||
pid:360516396 iyr:2019 ecl:grn
|
||||
|
||||
iyr:1997 ecl:#be02d2
|
||||
eyr:2020 cid:259 byr:1953
|
||||
hcl:#6b5442
|
||||
hgt:177cm pid:978155362
|
||||
|
||||
pid:377596476 cid:153
|
||||
eyr:2025 byr:2000 hgt:181cm iyr:2014 hcl:#abc5cb ecl:hzl
|
||||
|
||||
cid:171 ecl:lzr iyr:2013 eyr:1973 byr:2004
|
||||
pid:#267099 hgt:101
|
||||
|
||||
hcl:#623a2f
|
||||
pid:029193661
|
||||
hgt:183cm
|
||||
ecl:hzl eyr:2029 iyr:2013
|
||||
byr:1977
|
||||
|
||||
ecl:amb eyr:2021 hgt:159cm byr:1970 cid:152
|
||||
hcl:#b6652a iyr:2020 pid:180512119
|
||||
|
||||
eyr:2025
|
||||
ecl:grn
|
||||
hgt:60in iyr:2013 pid:697352361
|
||||
hcl:#18171d byr:1989
|
||||
|
||||
byr:1934 hgt:165cm pid:703537570 ecl:hzl iyr:2015
|
||||
hcl:#888785
|
||||
|
||||
ecl:gmt
|
||||
hcl:6dd6a5
|
||||
byr:1951
|
||||
pid:#7ab761 cid:304 iyr:1924 eyr:1953 hgt:71in
|
||||
|
||||
ecl:amb hcl:#733820 eyr:2030 hgt:178cm
|
||||
pid:692422832 iyr:2019
|
||||
cid:276
|
||||
|
||||
iyr:2012 ecl:oth
|
||||
pid:674969358
|
||||
eyr:2027 hgt:157cm cid:247 hcl:#a97842
|
||||
|
||||
byr:2017 eyr:2031 hgt:180cm hcl:#ceb3a1 pid:372071110
|
||||
iyr:2015 ecl:amb
|
||||
|
||||
hgt:165cm iyr:2015
|
||||
eyr:2021 ecl:amb byr:2000 cid:235
|
||||
|
||||
eyr:2027 hcl:#623a2f pid:595874068
|
||||
ecl:amb
|
||||
hgt:177cm iyr:2019 byr:1929
|
||||
|
||||
pid:8150929412 hgt:191in eyr:2031 cid:233 byr:2027
|
||||
iyr:2026 ecl:#e94348 hcl:z
|
||||
|
||||
hgt:65 byr:2009 iyr:2029 hcl:#fffffd eyr:1950 pid:950012410 cid:212 ecl:#5a6042
|
||||
|
||||
ecl:#44c561 hgt:178cm eyr:2021 pid:753771724
|
||||
iyr:2014
|
||||
hcl:#70adb2 byr:1989
|
||||
|
||||
iyr:2018 pid:809109448 ecl:amb hcl:#b6652a hgt:63in byr:1976 cid:96
|
||||
|
||||
byr:2021 ecl:grn pid:9284377919 iyr:2011 hgt:75cm hcl:#18171d eyr:2026
|
||||
|
||||
ecl:oth
|
||||
byr:1926
|
||||
hgt:63 iyr:1948 cid:61 hcl:a528d1 eyr:2034
|
||||
|
||||
byr:1978 pid:150503169 iyr:2015 ecl:grn hgt:172cm cid:70 eyr:2022 hcl:#7d3b0c
|
||||
|
||||
byr:1957 hcl:#cfa07d iyr:2010 ecl:amb eyr:2025 pid:921901279
|
||||
|
||||
ecl:utc pid:154cm
|
||||
byr:1964 eyr:1978 hgt:114 hcl:z
|
||||
|
||||
byr:1929 ecl:amb eyr:2028 iyr:2013
|
||||
hcl:#fffffd pid:479814281
|
||||
cid:105 hgt:64in
|
||||
|
||||
pid:949640425
|
||||
cid:205 hcl:#341e13 ecl:amb
|
||||
hgt:171cm byr:1998
|
||||
|
||||
hgt:190cm cid:113 ecl:grn eyr:2037
|
||||
hcl:#ceb3a1 pid:7994792779 iyr:2011
|
||||
|
||||
hgt:152cm iyr:2010
|
||||
byr:1992 eyr:2020
|
||||
hcl:#602927
|
||||
cid:66
|
||||
pid:604149642
|
||||
|
||||
eyr:2028
|
||||
byr:1961 hgt:71in
|
||||
iyr:2013 cid:135
|
||||
pid:534090716 hcl:#ceb3a1 ecl:oth
|
||||
|
||||
iyr:1937 byr:1995 cid:200
|
||||
eyr:2037 pid:#daf9af
|
||||
hcl:052017 ecl:zzz hgt:73cm
|
||||
|
||||
ecl:amb
|
||||
hcl:#a97842
|
||||
iyr:2018
|
||||
hgt:153cm
|
||||
cid:149 eyr:2023 pid:533403632
|
||||
|
||||
cid:275 ecl:brn iyr:2017 pid:087665205 byr:1945 hcl:#7d3b0c
|
||||
eyr:2025
|
||||
|
||||
eyr:2030 hgt:177cm hcl:#cfa07d iyr:2018 pid:734113761
|
||||
byr:1965
|
||||
|
||||
hgt:163cm byr:1924 ecl:blu cid:125
|
||||
eyr:2027 hcl:#fffffd pid:137238888
|
||||
|
||||
hgt:174cm hcl:#623a2f eyr:2023 ecl:gry pid:585758460
|
||||
iyr:2011
|
||||
|
||||
cid:183
|
||||
byr:1928 pid:471385060
|
||||
hgt:192cm
|
||||
ecl:oth iyr:2010 hcl:#623a2f eyr:2020
|
||||
|
||||
hgt:177cm
|
||||
cid:273 ecl:oth eyr:2020
|
||||
hcl:#efcc98
|
||||
iyr:2012 pid:246299733
|
||||
byr:1954
|
||||
|
||||
pid:052203766 cid:146 ecl:hzl byr:1974 hcl:#6b5442
|
||||
eyr:2030 hgt:173cm
|
||||
iyr:2011
|
||||
|
||||
hgt:167cm
|
||||
byr:1972 iyr:2010
|
||||
pid:783359411 ecl:hzl hcl:#9f8cc9 eyr:2028
|
||||
|
||||
iyr:2020 hcl:#18171d ecl:grn
|
||||
byr:1992
|
||||
hgt:189cm
|
||||
eyr:2023 pid:736882272
|
||||
|
||||
cid:230 ecl:utc iyr:2022
|
||||
pid:170cm
|
||||
byr:2015 hcl:#c0946f
|
||||
eyr:2031
|
||||
|
||||
cid:261
|
||||
byr:1922 hgt:170cm ecl:brn eyr:2021
|
||||
pid:593276915 hcl:#18171d
|
||||
iyr:2017
|
||||
|
||||
hcl:#341e13 pid:038417039 hgt:61in eyr:2025 iyr:2017
|
||||
cid:117
|
||||
|
||||
iyr:2017 eyr:2026 pid:441484223
|
||||
hgt:155cm byr:1968 hcl:#ceb3a1 ecl:hzl
|
||||
|
||||
eyr:2021
|
||||
hgt:64in
|
||||
ecl:oth hcl:#b6652a byr:1954 pid:204959612 iyr:2016
|
||||
|
||||
hcl:z eyr:1969
|
||||
pid:162cm ecl:#944b0f
|
||||
iyr:2030 byr:2029
|
||||
|
||||
hgt:114 eyr:2034 byr:2026 hcl:84fa1a
|
||||
pid:47909473
|
||||
iyr:2028
|
||||
ecl:utc
|
||||
|
||||
eyr:2025 ecl:blu hgt:157cm iyr:2014 hcl:#a97842 byr:1974 pid:702610675 cid:241
|
||||
|
||||
pid:732388109
|
||||
hcl:#6b5442 cid:272 eyr:2026 hgt:193cm
|
||||
ecl:amb byr:1982
|
||||
|
||||
eyr:2030 byr:1994
|
||||
hgt:177in ecl:amb pid:1589147420 iyr:2011 hcl:#4bf920
|
||||
cid:252
|
||||
|
||||
ecl:oth eyr:2022
|
||||
byr:1948
|
||||
pid:177cm cid:90 hgt:102 hcl:z iyr:2028
|
||||
|
||||
hgt:157cm pid:233347213
|
||||
hcl:z
|
||||
byr:2009 eyr:2027 cid:235 ecl:blu
|
||||
iyr:1965
|
||||
|
||||
ecl:blu iyr:2030 eyr:2028 hcl:#18171d pid:322593908 byr:1954
|
||||
cid:215 hgt:63in
|
||||
|
||||
hgt:72cm
|
||||
cid:345 pid:911728732 eyr:2025
|
||||
byr:2004 ecl:#0c4af7 hcl:3bb675
|
||||
|
||||
pid:171714794 byr:2019
|
||||
hcl:#866857
|
||||
cid:290 hgt:183in ecl:#d0c30f eyr:2032
|
||||
|
||||
iyr:2016 pid:905945155 hcl:#ceb3a1 byr:1958 hgt:159cm eyr:2028 cid:180 ecl:oth
|
||||
|
||||
hcl:efb614
|
||||
eyr:2022 hgt:177cm pid:46962273
|
||||
byr:1974
|
||||
ecl:#089bdd iyr:1988
|
||||
|
||||
pid:662993164 iyr:2011 eyr:2025 ecl:hzl
|
||||
byr:1942 hcl:#fffffd
|
||||
hgt:175cm
|
||||
|
||||
hcl:#7d3b0c iyr:2016 hgt:175cm eyr:2022 pid:953132241
|
||||
byr:1963 cid:261 ecl:grn
|
||||
|
||||
iyr:2013 hgt:180cm cid:318
|
||||
ecl:amb
|
||||
byr:1985 pid:439097817 eyr:2029 hcl:#602927
|
||||
|
||||
hgt:162cm ecl:blu
|
||||
pid:675749832 cid:73
|
||||
byr:1940 hcl:#888785
|
||||
eyr:2026
|
||||
|
||||
pid:275352007 iyr:2012 eyr:2020
|
||||
ecl:amb hcl:#623a2f hgt:175cm cid:317 byr:1988
|
||||
|
||||
hcl:z hgt:164in
|
||||
iyr:2026 eyr:1961 ecl:#2df35e pid:#5c9ed5 cid:341
|
||||
|
||||
pid:848086119 ecl:oth eyr:2021 iyr:2011 hgt:180cm byr:1923 hcl:#93461b
|
||||
|
||||
eyr:2028
|
||||
iyr:2014
|
||||
byr:1978
|
||||
hgt:184cm
|
||||
pid:966277564 ecl:hzl
|
||||
cid:176
|
||||
|
||||
hcl:#888785 ecl:amb cid:329 pid:835961958 byr:1927 eyr:2028 iyr:2016
|
||||
|
||||
pid:160cm eyr:2026 hcl:#08714b
|
||||
ecl:hzl iyr:1961
|
||||
hgt:156cm byr:1984
|
||||
|
||||
ecl:gry cid:302
|
||||
byr:1965
|
||||
iyr:2019 hcl:#ceb3a1 eyr:2027 pid:458192010 hgt:156cm
|
||||
|
||||
pid:058273969 byr:1942 eyr:2027
|
||||
hcl:#c0946f iyr:2013 hgt:179cm
|
||||
|
||||
iyr:2019 hgt:193in pid:52144528 eyr:2036
|
||||
cid:169 ecl:grt hcl:7e7039
|
||||
|
||||
hgt:192cm ecl:blu iyr:2015 pid:544936486 eyr:2024
|
||||
byr:1972 hcl:#c0946f
|
||||
|
||||
eyr:2000
|
||||
hcl:78de23 byr:2020
|
||||
hgt:171in pid:160cm cid:68
|
||||
iyr:1956 ecl:gmt
|
||||
|
||||
hcl:#733820 ecl:grn iyr:2018
|
||||
byr:2001 pid:770957230
|
||||
|
||||
cid:103 ecl:grn iyr:2018
|
||||
pid:068344094
|
||||
eyr:2023 hgt:69in byr:1984 hcl:#6b5442
|
||||
|
||||
hgt:193cm eyr:2021 ecl:grn hcl:#602927 byr:1938 iyr:2011
|
||||
|
||||
iyr:1931
|
||||
hcl:c0a318
|
||||
pid:99195939
|
||||
byr:2028 ecl:grt hgt:164 eyr:2017
|
||||
|
||||
eyr:1980
|
||||
ecl:zzz
|
||||
hgt:98 cid:161
|
||||
pid:#96fe01 hcl:z
|
||||
iyr:1974
|
||||
|
||||
byr:1936 hgt:176cm pid:56797167 iyr:2015
|
||||
ecl:#07ad47
|
||||
hcl:z
|
||||
|
||||
pid:48720181 hcl:270e76
|
||||
byr:2022
|
||||
hgt:180cm ecl:#dde399
|
||||
eyr:2035 iyr:2023
|
||||
|
||||
eyr:2030 byr:2022 iyr:2018 hgt:162in ecl:gry
|
||||
hcl:#63e2ec pid:615812600
|
||||
|
||||
ecl:grn
|
||||
cid:56 hcl:#623a2f eyr:2020 hgt:167cm byr:1971 iyr:2012
|
||||
pid:262692066
|
||||
|
||||
hgt:61 hcl:#efcc98 iyr:2011 eyr:2026
|
||||
byr:1938
|
||||
ecl:amb pid:385025739
|
||||
|
||||
pid:972423724 hcl:#602927 eyr:2027 ecl:oth iyr:2015
|
||||
hgt:158cm byr:1956
|
||||
|
||||
pid:530035096
|
||||
ecl:hzl
|
||||
iyr:2017
|
||||
eyr:2024 hcl:#888785 byr:1962 hgt:64in
|
||||
|
||||
byr:1935 eyr:2022 ecl:grn hcl:#7d3b0c pid:294714199
|
||||
|
||||
eyr:2029
|
||||
iyr:2013
|
||||
byr:1927 hgt:175cm pid:058261075 hcl:#cfa07d ecl:amb
|
||||
|
||||
ecl:blu pid:188764763 hgt:155cm byr:1921
|
||||
iyr:2018 eyr:2029 hcl:#b6652a
|
||||
|
||||
byr:1975 hcl:930e76 iyr:2019
|
||||
pid:169cm eyr:2009 hgt:191
|
||||
ecl:#d28c56
|
||||
|
||||
hcl:z
|
||||
pid:3190617557
|
||||
hgt:160cm cid:80 ecl:oth iyr:2022 eyr:2008
|
||||
byr:2016
|
||||
|
||||
hcl:#888785 byr:1999 ecl:blu cid:238 iyr:2018 hgt:160cm
|
||||
eyr:2028 pid:174517111
|
||||
|
||||
eyr:2035
|
||||
hcl:z byr:2020
|
||||
pid:262135957 cid:324 iyr:2016 hgt:161cm ecl:grn
|
||||
|
||||
byr:1936
|
||||
ecl:grn
|
||||
iyr:2013 hcl:#623a2f eyr:2029 hgt:166cm
|
||||
|
||||
hcl:#cfa07d hgt:159cm eyr:2021
|
||||
ecl:hzl
|
||||
iyr:2014 pid:816039817 byr:1935
|
||||
|
||||
pid:596634790 hgt:161cm
|
||||
eyr:2036 iyr:2016
|
||||
hcl:#7d3b0c byr:2015 ecl:brn
|
||||
|
||||
byr:1952
|
||||
hgt:157cm eyr:2024 cid:60 pid:876160626
|
||||
ecl:blu iyr:2011 hcl:z
|
||||
|
||||
hgt:193cm iyr:2020 eyr:2026
|
||||
pid:0136642346 ecl:hzl hcl:#efcc98 byr:1995
|
||||
|
||||
byr:1934 hgt:177cm
|
||||
pid:445993865
|
||||
ecl:brn iyr:2018
|
||||
eyr:2030
|
||||
hcl:#733820
|
||||
|
||||
eyr:2021 hgt:71in
|
||||
pid:918630878
|
||||
hcl:#602927 iyr:2017 byr:1943
|
||||
ecl:gry
|
||||
|
||||
ecl:#81de2c iyr:2021 hgt:176cm eyr:1947 hcl:#888785 pid:1370052400
|
||||
|
||||
ecl:amb
|
||||
byr:1922 iyr:2012 eyr:2022 pid:098866466 hcl:#18171d hgt:63in
|
||||
|
||||
eyr:2028 iyr:2010 hcl:184355
|
||||
byr:1968 pid:337089458 ecl:brn hgt:181cm
|
||||
|
||||
hcl:#733820 pid:225958483 ecl:gry eyr:2030 hgt:62in iyr:2012 byr:1987
|
||||
|
||||
eyr:1955
|
||||
hcl:03199c
|
||||
pid:#3e832e
|
||||
byr:2014 ecl:#453931 hgt:70cm
|
||||
|
||||
byr:1975
|
||||
ecl:blu hcl:#7d3b0c
|
||||
cid:169 pid:582470437 hgt:151cm
|
||||
iyr:2019 eyr:2027
|
||||
|
||||
iyr:2017 byr:1971 pid:343492418 hgt:150cm hcl:#fffffd eyr:2024
|
||||
|
||||
byr:1997
|
||||
eyr:2026
|
||||
cid:257 hcl:#7d3b0c ecl:blu hgt:166cm iyr:2016 pid:117625518
|
||||
|
||||
iyr:2014 cid:248 hgt:165cm hcl:#18171d pid:294270262
|
||||
byr:1925 ecl:amb
|
||||
eyr:2028
|
||||
|
||||
hgt:167in ecl:dne pid:174cm iyr:2019 byr:2005 hcl:b29331 cid:86
|
||||
|
||||
hcl:#733820 pid:259969636 eyr:2023
|
||||
ecl:hzl cid:317
|
||||
hgt:185cm byr:2025
|
||||
iyr:2012
|
||||
|
||||
hcl:#cfa07d hgt:152cm pid:807755992 iyr:2020
|
||||
byr:1922 ecl:grn eyr:2025 cid:241
|
||||
|
||||
pid:997807107 byr:1958 ecl:dne iyr:2013 eyr:2023 hcl:#18171d
|
||||
hgt:152cm
|
||||
|
||||
ecl:blu hgt:170cm
|
||||
byr:1932
|
||||
pid:775223495 eyr:2024 iyr:2015
|
||||
|
||||
iyr:2011
|
||||
ecl:grn hcl:#ceb3a1 pid:190577415
|
||||
hgt:63in
|
||||
eyr:2021
|
||||
byr:1986
|
||||
|
||||
ecl:oth eyr:2025 hgt:180cm
|
||||
pid:258195402 iyr:2017
|
||||
byr:1961
|
||||
cid:109 hcl:#888785
|
||||
|
||||
hgt:178cm byr:1952 eyr:2023 hcl:#733820
|
||||
pid:106939563 ecl:brn iyr:2012
|
||||
|
||||
hgt:188cm iyr:2012 hcl:#fffffd byr:1942
|
||||
ecl:brn pid:804371742
|
||||
|
||||
byr:1978 cid:120
|
||||
eyr:2026 pid:405714523 hgt:60in
|
||||
hcl:#a97842 ecl:blu
|
||||
iyr:2017
|
||||
|
||||
iyr:2015 byr:1958 ecl:grn
|
||||
hcl:#b6652a pid:#9e8af3
|
||||
eyr:2026 hgt:167cm
|
||||
|
||||
hgt:171cm hcl:#888785
|
||||
cid:274
|
||||
ecl:grn pid:919263460 eyr:2023 iyr:2020
|
||||
|
||||
pid:606726472 eyr:2022
|
||||
byr:2008
|
||||
ecl:zzz cid:72 hgt:173in
|
||||
|
||||
eyr:2032 byr:2004
|
||||
hcl:z iyr:2011 ecl:hzl
|
||||
pid:523494728
|
||||
hgt:70cm
|
||||
|
||||
hgt:169cm pid:755822781 byr:1984 ecl:hzl hcl:#6b5442 iyr:2014
|
||||
|
||||
eyr:2020
|
||||
byr:1942 cid:85
|
||||
hgt:157cm pid:558287447 hcl:#efcc98
|
||||
ecl:hzl
|
||||
|
||||
byr:1980 cid:225 pid:367501996 iyr:2016 ecl:grn hcl:#efcc98
|
||||
hgt:175cm eyr:2029
|
||||
|
||||
pid:264780775 hgt:182cm ecl:grn
|
||||
hcl:#18171d
|
||||
eyr:2024
|
||||
byr:1926 iyr:2013
|
||||
|
||||
byr:1969 iyr:2015
|
||||
eyr:2026 ecl:blu
|
||||
hcl:#fffffd
|
||||
pid:005695878 cid:273
|
||||
|
||||
ecl:brn byr:2006 hgt:152cm
|
||||
hcl:#888785
|
||||
pid:171cm cid:249 iyr:2026
|
||||
eyr:2022
|
||||
|
||||
byr:2011 iyr:2020 ecl:zzz hcl:z pid:412624100
|
||||
eyr:2031
|
||||
|
||||
cid:111 hcl:df9bd0
|
||||
iyr:2022 ecl:#32fdf9
|
||||
byr:2017 eyr:2000
|
||||
hgt:166in pid:0654651026
|
||||
|
||||
eyr:2021
|
||||
ecl:gry pid:587324819 hgt:187cm byr:1951 hcl:#6b5442
|
||||
|
||||
iyr:2011
|
||||
pid:180780096 hcl:#623a2f ecl:amb hgt:160cm byr:1991 eyr:2026
|
||||
|
||||
byr:2022 hgt:152cm eyr:2023 cid:70 ecl:grn
|
||||
hcl:e0a24e
|
||||
iyr:1959 pid:77110462
|
||||
|
||||
pid:251982311 byr:1994 ecl:gry hgt:165cm eyr:2021
|
||||
hcl:#623a2f
|
||||
iyr:2019
|
||||
|
||||
ecl:blu byr:1945
|
||||
cid:241
|
||||
pid:732768808 hcl:#efcc98
|
||||
hgt:171cm eyr:2020 iyr:2012
|
||||
|
||||
cid:243 eyr:2001
|
||||
hcl:01a022
|
||||
hgt:162 pid:507703455
|
||||
byr:2003 ecl:#c6a07b
|
||||
iyr:1941
|
||||
|
||||
hcl:#733820 cid:150
|
||||
ecl:hzl pid:843607639 hgt:190cm
|
||||
byr:1958
|
||||
eyr:2025
|
||||
|
||||
eyr:2030
|
||||
pid:489370607 iyr:2014 ecl:oth hcl:#cfa07d byr:1995 hgt:193cm
|
||||
|
||||
hgt:68in
|
||||
byr:1933
|
||||
iyr:2010 ecl:brn
|
||||
pid:380075958
|
||||
hcl:#623a2f cid:279
|
||||
eyr:2025
|
||||
|
||||
iyr:2019
|
||||
byr:2001
|
||||
hcl:#cfa07d ecl:brn pid:349877352
|
||||
hgt:161cm eyr:2029
|
||||
|
||||
hgt:171cm
|
||||
eyr:2040 ecl:dne hcl:#6b5442 iyr:2020 byr:1990
|
||||
|
||||
hcl:#fffffd
|
||||
hgt:154cm
|
||||
byr:1979 eyr:2020 iyr:2018
|
||||
pid:118713281 cid:174
|
||||
|
||||
hcl:#7d3b0c eyr:2030 ecl:brn iyr:2017
|
||||
cid:184 hgt:180cm pid:504181498 byr:1925
|
||||
|
||||
hgt:150cm
|
||||
eyr:2020 byr:1999 hcl:#a97842 iyr:2011 ecl:grn pid:620166468
|
||||
|
||||
hcl:#602927
|
||||
iyr:2015
|
||||
byr:1928
|
||||
pid:083747352
|
||||
eyr:2027 hgt:193cm
|
||||
ecl:hzl
|
||||
|
||||
byr:1938 ecl:gry
|
||||
pid:511669464 eyr:1973 hgt:70cm
|
||||
cid:262 iyr:2015 hcl:#c0946f
|
||||
|
||||
eyr:2029
|
||||
byr:1923 hgt:160cm hcl:#7d3b0c iyr:2013 pid:525837692 ecl:gry
|
||||
|
||||
hcl:#602927 eyr:2025
|
||||
pid:232338168 hgt:174cm cid:322 iyr:2010 ecl:oth
|
||||
|
||||
hgt:192in cid:126 hcl:#6b5442
|
||||
pid:101406211 byr:1922 ecl:hzl eyr:2022 iyr:2013
|
||||
|
||||
eyr:2026 ecl:amb
|
||||
byr:1921
|
||||
cid:336
|
||||
iyr:2020 hgt:182cm pid:533626984
|
||||
|
||||
pid:411943955 ecl:amb eyr:2025 hgt:166cm byr:1964 hcl:#341e13 cid:285
|
||||
iyr:2010
|
||||
|
||||
ecl:grn byr:1933 eyr:2024
|
||||
hgt:153cm
|
||||
hcl:#5cfb31 iyr:2019 pid:773885967
|
||||
|
||||
ecl:hzl pid:426060511
|
||||
hgt:159cm
|
||||
byr:1922 hcl:#6ffd04 iyr:2017
|
||||
|
||||
byr:2025 pid:#097d1b iyr:2020 eyr:2029 hcl:73d113 hgt:69cm ecl:utc
|
||||
|
||||
ecl:amb hgt:170cm eyr:2025 byr:1930 iyr:2018 hcl:#733820
|
||||
cid:262
|
||||
|
||||
iyr:2019
|
||||
eyr:2021
|
||||
cid:65 pid:258615618
|
||||
ecl:oth byr:1987
|
||||
hcl:#efcc98
|
||||
hgt:178cm
|
||||
|
||||
hcl:z eyr:1980 ecl:#1c5fd1 hgt:65cm byr:2014
|
||||
cid:222 pid:#c69fd5 iyr:2020
|
||||
|
||||
cid:271 pid:#4b8380 hcl:80fab0
|
||||
byr:2024 ecl:#20e25f
|
||||
iyr:1945
|
||||
eyr:1935 hgt:159cm
|
||||
191
4-passport_processing/src/main.rs
Normal file
191
4-passport_processing/src/main.rs
Normal file
@@ -0,0 +1,191 @@
|
||||
use std::{collections::HashMap, str::FromStr};
|
||||
use anyhow::Result;
|
||||
use regex::Regex;
|
||||
|
||||
#[derive(Debug,thiserror::Error)]
|
||||
enum ParseError {
|
||||
#[error("Expected {0}")]
|
||||
Expected(String)
|
||||
}
|
||||
|
||||
#[derive(Debug,PartialEq, Eq, Hash)]
|
||||
enum EntryType {
|
||||
Byr,
|
||||
Iyr,
|
||||
Eyr,
|
||||
Hgt,
|
||||
Hcl,
|
||||
Ecl,
|
||||
Pid,
|
||||
Cid,
|
||||
}
|
||||
|
||||
impl FromStr for EntryType {
|
||||
type Err = ParseError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
"byr" => Ok(Self::Byr),
|
||||
"iyr" => Ok(Self::Iyr),
|
||||
"eyr" => Ok(Self::Eyr),
|
||||
"hgt" => Ok(Self::Hgt),
|
||||
"hcl" => Ok(Self::Hcl),
|
||||
"ecl" => Ok(Self::Ecl),
|
||||
"pid" => Ok(Self::Pid),
|
||||
"cid" => Ok(Self::Cid),
|
||||
_ => Err(ParseError::Expected(format!("byr, iyr, eyr, hgt, hcl, ecl, pid, cid, but got {}", s)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl EntryType {
|
||||
pub fn is_valid(&self, value: &Option<&str>) -> bool {
|
||||
match (*value, self) {
|
||||
(Some(value), EntryType::Byr) => {
|
||||
// four digits; at least 1920 and at most 2002.
|
||||
|
||||
match str::parse::<i64>(value) {
|
||||
Ok(number) => {
|
||||
(1920..=2002).contains(&number)
|
||||
}
|
||||
Err(_) => { false }
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Iyr) => {
|
||||
// four digits; at least 2010 and at most 2020.
|
||||
match str::parse::<i64>(value) {
|
||||
Ok(number) => {
|
||||
(2010..=2020).contains(&number)
|
||||
}
|
||||
Err(_) => { false }
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Eyr) => {
|
||||
// four digits; at least 2020 and at most 2030.
|
||||
match str::parse::<i64>(value) {
|
||||
Ok(number) if (2020..=2030)
|
||||
.contains(&number) => true,
|
||||
_ => false
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Hgt) => {
|
||||
// a number followed by either cm or in:
|
||||
// if cm, the number must be at least 150 and at most 193.
|
||||
// if in, the number must be at least 59 and at most 76.
|
||||
let rex_cm = Regex::new(r"(\d*)cm").unwrap();
|
||||
let rex_in = Regex::new(r"(\d*)in").unwrap();
|
||||
if rex_cm.is_match(value) {
|
||||
let m = rex_cm.captures(value);
|
||||
// At least "None" fails the test
|
||||
match str::parse::<i64>(m.unwrap().get(1).unwrap().as_str()) {
|
||||
Ok(height) if (150..=193).contains(&height) => true,
|
||||
_ => false
|
||||
}
|
||||
} else if rex_in.is_match(value) {
|
||||
let m = rex_in.captures(value);
|
||||
// At least "None" fails the test
|
||||
match str::parse::<i64>(m.unwrap().get(1).unwrap().as_str()) {
|
||||
Ok(height) if (59..=76).contains(&height) => true,
|
||||
_ => false
|
||||
}
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
(Some(value), EntryType::Hcl) => {
|
||||
// a # followed by exactly six characters 0-9 or a-f.
|
||||
//probably ok as long as we deal with ascii right ?
|
||||
let rex = Regex::new(r"([a-z]|[0-9]){6}").unwrap();
|
||||
value.starts_with('#') && rex.is_match(&(value.chars().skip(1).collect::<String>()))
|
||||
}
|
||||
(Some(value), EntryType::Ecl) => {
|
||||
// exactly one of: amb blu brn gry grn hzl oth.
|
||||
let valid_values = vec!["amb", "blu", "brn", "gry", "grn", "hzl", "oth"];
|
||||
valid_values.contains(&value)
|
||||
}
|
||||
(Some(value), EntryType::Pid) => {
|
||||
// a nine-digit number, including leading zeroes.
|
||||
// probably ok if we deal only with ascii right ?
|
||||
value.as_bytes().len() == 9 && str::parse::<i64>(value).is_ok()
|
||||
}
|
||||
(_, EntryType::Cid) => {
|
||||
// ignored, missing or not
|
||||
true
|
||||
}
|
||||
_ => false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Passport<'a> {
|
||||
fields: HashMap<EntryType, Option<&'a str>>
|
||||
}
|
||||
|
||||
impl<'a> Passport<'a> {
|
||||
fn new() -> Self {
|
||||
let mut res = Self {
|
||||
fields: HashMap::new()
|
||||
};
|
||||
res.fields.insert(EntryType::Byr, None);
|
||||
res.fields.insert(EntryType::Iyr, None);
|
||||
res.fields.insert(EntryType::Eyr, None);
|
||||
res.fields.insert(EntryType::Hgt, None);
|
||||
res.fields.insert(EntryType::Hcl, None);
|
||||
res.fields.insert(EntryType::Ecl, None);
|
||||
res.fields.insert(EntryType::Pid, None);
|
||||
res.fields.insert(EntryType::Cid, None);
|
||||
res
|
||||
}
|
||||
fn parse(&mut self, s: &'static str) {
|
||||
for entry_s in s.split(&[' ', '\n'][..]) {
|
||||
let mut tokens = entry_s.split(':');
|
||||
if let Ok(etype) = EntryType::from_str(tokens.next().unwrap()) {
|
||||
self.fields.insert(etype, tokens.next());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_valid_legacy(&self, mandatory_cid: bool) -> bool {
|
||||
self.fields.iter().all(|(key, value)| {
|
||||
(!mandatory_cid && *key == EntryType::Cid) ||
|
||||
*value != None
|
||||
})
|
||||
}
|
||||
|
||||
fn is_valid(&self) -> bool {
|
||||
self.fields.iter().all(|(key, value)| {
|
||||
key.is_valid(value)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let data = include_str!("../data/input.txt");
|
||||
// eprintln!("data = {}", data);
|
||||
//eprintln!("data.split() = {:?}", data.split("\n\n").collect::<Vec<&str>>());
|
||||
let passports: Vec<Passport> = data.split("\n\n").map(|pass_str| {
|
||||
let mut res = Passport::new();
|
||||
res.parse(pass_str);
|
||||
res
|
||||
}).collect();
|
||||
// eprintln!("passports = {:#?}", passports);
|
||||
// eprintln!("passports.size() = {:#?}", passports.len());
|
||||
let nb_valid = passports.iter().filter(|p| (*p).is_valid_legacy(false)).count();
|
||||
eprintln!("nb_valid = {:#?}", nb_valid);
|
||||
let nb_valid_secondpass = passports.iter().filter(|p| p.is_valid()).count();
|
||||
eprintln!("nb_valid_secondpass = {:#?}", nb_valid_secondpass);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_validation() {
|
||||
let mut pass = Passport::new();
|
||||
pass.parse("cid:271 pid:009457684 hcl:#80fab0\nbyr:1999 ecl:blu\niyr:2015\neyr:2029 hgt:159cm");
|
||||
eprintln!("pass = {:#?}", pass);
|
||||
assert_eq!(pass.is_valid(), true)
|
||||
}
|
||||
}
|
||||
1
5-binary_boarding/.gitignore
vendored
Normal file
1
5-binary_boarding/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
70
5-binary_boarding/Cargo.lock
generated
Normal file
70
5-binary_boarding/Cargo.lock
generated
Normal file
@@ -0,0 +1,70 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.36"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68803225a7b13e47191bab76f2687382b60d259e8cf37f6e1893658b84bb9479"
|
||||
|
||||
[[package]]
|
||||
name = "binary_boarding"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.55"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a571a711dddd09019ccc628e1b17fe87c59b09d513c06c026877aa708334f37a"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
11
5-binary_boarding/Cargo.toml
Normal file
11
5-binary_boarding/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "binary_boarding"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.36"
|
||||
thiserror = "1.0.22"
|
||||
932
5-binary_boarding/data/input.txt
Normal file
932
5-binary_boarding/data/input.txt
Normal file
@@ -0,0 +1,932 @@
|
||||
FFBBFFFLRL
|
||||
FFBBFBBRRL
|
||||
FBBBFFBLRL
|
||||
BBFBFFBLRR
|
||||
BFBBBFFLLL
|
||||
BFBBBBBLLR
|
||||
FBFBFBFLLR
|
||||
BFBFBBFLLR
|
||||
FBBFBFBLLL
|
||||
BBBFBFBRLL
|
||||
BFBBBFBLRL
|
||||
FBBFFFBLLR
|
||||
BFFBFBFLRL
|
||||
FBBBBFBRLR
|
||||
FFBBBBBRRL
|
||||
FBBFBFFLRL
|
||||
FBBBBBBLLR
|
||||
FBBFBBBRRL
|
||||
FBBFFBFRLL
|
||||
FBFBBBBRRR
|
||||
BFFBFBFRRL
|
||||
BFBFBBBLLR
|
||||
FFFFBFBLRL
|
||||
FBFFBFFLRL
|
||||
FFBFBBBRRR
|
||||
FFBFFFFLRR
|
||||
FBBBFFFLLR
|
||||
FFFFFBFLLL
|
||||
BFFFFFFLRL
|
||||
FBBBBBFRLR
|
||||
BBBFFBBRRR
|
||||
FFFFBBBRLL
|
||||
FBFFBBBRLR
|
||||
BFBBBFFRRL
|
||||
BBFBBFBLRL
|
||||
BFBFBFFRRR
|
||||
BBFBFFFLLL
|
||||
FBFBFBFRRR
|
||||
BFBFBFFRRL
|
||||
BBFBBFBRRL
|
||||
FFBBFBFLRL
|
||||
FBFFFFFRLR
|
||||
FBBFFFBLLL
|
||||
FBBBBFFRLL
|
||||
FFBBBBBLLL
|
||||
BFFBBFFRLR
|
||||
FFFBBFBRRR
|
||||
FBBBFFFRLL
|
||||
FFFBFBFLRL
|
||||
BFFBBFFLRL
|
||||
BFBBBBBLRL
|
||||
BFFFFFBRRR
|
||||
FFFBBFBLRL
|
||||
FBBBFBFRLL
|
||||
FBBFBFBLRR
|
||||
BBFBBFFLRR
|
||||
FBFFBBFLLL
|
||||
FFFFFBBRLL
|
||||
FFBBFFBRLR
|
||||
BBFFFFFLLL
|
||||
BFFFFBFLRR
|
||||
FBFBBFFRRL
|
||||
BFBFFBBLLR
|
||||
FBBBFBBRLR
|
||||
BBBFBFFRLL
|
||||
BBFFBBFRLR
|
||||
FFBFFBBRLR
|
||||
FFBBBFBRLR
|
||||
BBBFFFBLRR
|
||||
BBFBFBFLRR
|
||||
BFBBBBBRLR
|
||||
BFFFFFBLLR
|
||||
FBFFBFFRLL
|
||||
BBBFFBBRLR
|
||||
FFBBBFBRRR
|
||||
BFBBBFBRLR
|
||||
FBFFFBBLRL
|
||||
FFFBFFFRLL
|
||||
BBFFBFFLLL
|
||||
BFFBBFFRRR
|
||||
FFBFBFBRRL
|
||||
FFBBBFBRRL
|
||||
FBBFFBBRLR
|
||||
FBFFBBFRLR
|
||||
BFBFFBBRRR
|
||||
BBFBFBBRLR
|
||||
FFBFFFFRRL
|
||||
BBFFBFFLLR
|
||||
FBBFBFBRRR
|
||||
BFBFBBBRRL
|
||||
FBFBFFBRRL
|
||||
FFFBBFFRLL
|
||||
BFBFFFFRRR
|
||||
FBBFFBFLLR
|
||||
FFBFBFFRLL
|
||||
FBFFBFBLLL
|
||||
FBFBFFFLRL
|
||||
BBFFFFFRRR
|
||||
FBFFBBFLRR
|
||||
FBFFFBFLRL
|
||||
FBBBFBBRRL
|
||||
BFFBFFFRLR
|
||||
FFBBBBFLLR
|
||||
BFFFFBFLRL
|
||||
BFFBFFBRRR
|
||||
FFBFBFBLRL
|
||||
BBFFFBBRLL
|
||||
FFBFBBFRRR
|
||||
FFFBFBFRRL
|
||||
FBFFBFBRRR
|
||||
FBBBBFBRRL
|
||||
FBFFFFFLLR
|
||||
FFBFFFFLLR
|
||||
FBBBBFFRLR
|
||||
BBBFFBBLRR
|
||||
BBBFFBFLRR
|
||||
FBBFBBBLRR
|
||||
FBBFBBFRRL
|
||||
FFFBFFBLLL
|
||||
FBFFFFBLLL
|
||||
BBFFFFBLLL
|
||||
FBFFFBFLRR
|
||||
FFBFBFFLRR
|
||||
BBFBFFFRLL
|
||||
FFFBBBFRLR
|
||||
FFBFFBBRLL
|
||||
BBBFBFFRRL
|
||||
BFFBBBBLRR
|
||||
BFFFFFFLLL
|
||||
BBBFFFBLLL
|
||||
FBBBBBFRLL
|
||||
FBBFBBBLLR
|
||||
BBFBFFFRRR
|
||||
BBFFFBBLLL
|
||||
FBBFFBFLRL
|
||||
BBFBFFFLRR
|
||||
BFBFFBFRLL
|
||||
BFFFBFBLLR
|
||||
BBBFBFBLLL
|
||||
BBBFFBFRLR
|
||||
FBFFBFBRLR
|
||||
BFBBFFFLLL
|
||||
BBFFFFBLRR
|
||||
BBFFFBBRRL
|
||||
BBBFBFFLLL
|
||||
BFBFFBFLLL
|
||||
FBBBBFFLLR
|
||||
FFBFFFFRLR
|
||||
FFBBBFBRLL
|
||||
BFFFFFFRRL
|
||||
BFBFFBBLRL
|
||||
BBFBBBFRLL
|
||||
BFFFBFFLLR
|
||||
BBFBFFBRLL
|
||||
BFBBFFFRLL
|
||||
BBFBBFBRLR
|
||||
FFFBBFBRLR
|
||||
BFFFBBFLRL
|
||||
FFBFFBFRLL
|
||||
FFFBFFBLRL
|
||||
BFBBBFFRLR
|
||||
BBBFFBBLRL
|
||||
BFFBBBBRRL
|
||||
FFBBFFFRLL
|
||||
BFBFFBFLRL
|
||||
BFFBBBBRRR
|
||||
BBFBFBFRRL
|
||||
BBBFFBFRRL
|
||||
BFFFBFBLRL
|
||||
FFFBFBFRLR
|
||||
FBFFBBBLRR
|
||||
FFFFBBBLLL
|
||||
BBBFBBFLLR
|
||||
BFFBFBFRRR
|
||||
BFBFFFBRRR
|
||||
BBFBBBBLLR
|
||||
FFBBBBBLRL
|
||||
FFBFFBFLRR
|
||||
FFBBBFBLRR
|
||||
BBFBBFBRRR
|
||||
FFFFFFBRRR
|
||||
BFBFBFBRRL
|
||||
BBFFBBBLRR
|
||||
BBFBFFFRLR
|
||||
FBBFBFBLLR
|
||||
BFBBFFBRLL
|
||||
FFFFBFBLLR
|
||||
BFBFFBBRLR
|
||||
FBFFFBFRRR
|
||||
BFFBFFFRLL
|
||||
FBBBFFFRRR
|
||||
FFFBBBFLLL
|
||||
FBBBBBBRRL
|
||||
FBBFFBBLLR
|
||||
BBBFBFFLRR
|
||||
BFBBFBFLRR
|
||||
FFFBBBBRRR
|
||||
BFFFBBFRLR
|
||||
FBFFBBFLLR
|
||||
FBFFFFFRRL
|
||||
BBBFBBFLLL
|
||||
BBBFFFFRLR
|
||||
FFFFBBBRRR
|
||||
FBBBFBBLLL
|
||||
BFFBFFBLLL
|
||||
FBFBBFBRLR
|
||||
FFBFFBBLLR
|
||||
FFFFBFFLRR
|
||||
FBBFFBFLLL
|
||||
FBFBBFBRRR
|
||||
BBBFBFBLLR
|
||||
BBFFBFBLLL
|
||||
FFBFFBFRLR
|
||||
FBBBFBBLRR
|
||||
BBFBBFBLLL
|
||||
FFBFFBFRRR
|
||||
FBBBBFFLRL
|
||||
BFBBFBFLLR
|
||||
FBFBBBFRLR
|
||||
BFBBFFBLLR
|
||||
FFFBBBFLLR
|
||||
FFFBBBFRRL
|
||||
BFFFBFBRLR
|
||||
BBBFBBFLRR
|
||||
BBFBBFFLLR
|
||||
BBFBBBBRLR
|
||||
FBBFFFFLRR
|
||||
FBFBBFFRLL
|
||||
FFBFFFFRRR
|
||||
FFFBBFFRRL
|
||||
FFFBBFBRRL
|
||||
FFFBFBFLLR
|
||||
FFBBBBFRRR
|
||||
BFFFFBBRRL
|
||||
BFFFFBFRRR
|
||||
BFBBBFBLRR
|
||||
FFBBFFFRRL
|
||||
FBBBBBBRRR
|
||||
BBFBFFBLLR
|
||||
FBFFFFBRLL
|
||||
BFBBFBFLLL
|
||||
FBFFFBBRLL
|
||||
FBBBFFBLLR
|
||||
BBFBBBFRLR
|
||||
FBFBBFBLRR
|
||||
FFFFFBFLLR
|
||||
FBFBBBFLRL
|
||||
FFBFFFBRRR
|
||||
FFFBBFFLRL
|
||||
BBBFFFFLLR
|
||||
BFBFFFFRRL
|
||||
FBFBFBBLLR
|
||||
FBBBFBFRRL
|
||||
BBFBBBBRRL
|
||||
BFBBFBFLRL
|
||||
BFFBBFFLLR
|
||||
BFBFFBBRLL
|
||||
FBFFBFFRLR
|
||||
FBFBFBFLRR
|
||||
BFBFBBFRRR
|
||||
FBBBBFBLRL
|
||||
FFBBBFFRRR
|
||||
FFBBFFBRLL
|
||||
FFBBBBBRLL
|
||||
FBFFFBFRRL
|
||||
FFFBBBFLRL
|
||||
BBBFBFFRRR
|
||||
FFFBFFFRRR
|
||||
FBFFBFFLLL
|
||||
FFBBFFBRRL
|
||||
BFFBFFBRRL
|
||||
FFBBBFFRLR
|
||||
BBBFFFFRRR
|
||||
BBFBFBBRRR
|
||||
FBFBBBBLRR
|
||||
BFBFBFBLLL
|
||||
FFBBFFBLLR
|
||||
BFFFBBBRLR
|
||||
BFBBFBBRLR
|
||||
BFFFFBBLLR
|
||||
FBFBFBBRLR
|
||||
BFFBBBFLLR
|
||||
FBFFBFBLRL
|
||||
BFBFBBBRLL
|
||||
BFBBBFFLRL
|
||||
FFFBFFFLRR
|
||||
BFFBBFBRLL
|
||||
FFBBBBFRLL
|
||||
BBFFFBBLLR
|
||||
FBFBFBFRLR
|
||||
BBBFFFBRLR
|
||||
BFFFFFBRLR
|
||||
BBBFFFFLLL
|
||||
FFFBBFBRLL
|
||||
BFFFFFBRRL
|
||||
FBFFBBBRRL
|
||||
FBFBFBBLLL
|
||||
FBFBBFBRRL
|
||||
FBBFBBBRRR
|
||||
BFBFFBBRRL
|
||||
FBBBBFBLLL
|
||||
FBBBBBBRLR
|
||||
BBFFFBFRRL
|
||||
FFFFBFBLLL
|
||||
FFFFBBFLRR
|
||||
FFFFBFFLRL
|
||||
BFFFBBFRLL
|
||||
BBFFFFBRRR
|
||||
BFBFFFFRLL
|
||||
BFFFFBFLLR
|
||||
BBBFFBBRRL
|
||||
BBFBBFBLLR
|
||||
BFFFFBFRLR
|
||||
FBBBFBFLLR
|
||||
FFFFFBBLRR
|
||||
BFBFFFFLRR
|
||||
FBFBBFFLRL
|
||||
FBFFFBBRRR
|
||||
BBFBBBFLRL
|
||||
BFBBBFFLLR
|
||||
BFBFBBFRRL
|
||||
FBFFFFBLRL
|
||||
FBBFBFFRLR
|
||||
BFBFBBBLRR
|
||||
BFBFBBFLRL
|
||||
BBFFBFFRLL
|
||||
FBFFBBBLRL
|
||||
BFBFBFFLLR
|
||||
FFFBFFBLLR
|
||||
FFFBFBBRRR
|
||||
BBFBFFFLLR
|
||||
FBBBFBFRLR
|
||||
FBFFBBBLLL
|
||||
FFBFBBFLRR
|
||||
FBFBFFFLLL
|
||||
BBFFFFFLRL
|
||||
FBFBBFBLRL
|
||||
BBFFFBFLLR
|
||||
BBFBBBBRRR
|
||||
BFBBBFFRRR
|
||||
FFFBFFBRLL
|
||||
FBBBFFFRLR
|
||||
BBBFBFBLRL
|
||||
FBFFFFBRLR
|
||||
BFFFFFBLLL
|
||||
FBFFFFBLLR
|
||||
BFBBFFBLRR
|
||||
BFBFBBBRRR
|
||||
BBBFBFBRRR
|
||||
FFFBBFFRRR
|
||||
FBBBFFFLRR
|
||||
BBFBFFFRRL
|
||||
BFBFBBFRLR
|
||||
BFFFBFBRLL
|
||||
FBFFFFFLLL
|
||||
FFFBBBBLRL
|
||||
FFFBBFFLLL
|
||||
FBFFFFBRRR
|
||||
FFBFBFBRLR
|
||||
BFBFFFBLRR
|
||||
BFFFBFBLLL
|
||||
FBBFBFFRLL
|
||||
FBFBFFFRLL
|
||||
FBBBFFBRRR
|
||||
FBBBFFBRLL
|
||||
FFBBFBBLLL
|
||||
FBBBBFBRRR
|
||||
BFBBBFBLLR
|
||||
FBBBBBFLLR
|
||||
FFBBFBFLRR
|
||||
BFFBBFBLLR
|
||||
FBFFFFBLRR
|
||||
BFFBFFFRRR
|
||||
BFFFBBBRLL
|
||||
FBFBBBFRLL
|
||||
BFBBBFBRRL
|
||||
FFBFFFBRRL
|
||||
FBBFFFFRLR
|
||||
BFBFBFFLLL
|
||||
FFBFBFBLLL
|
||||
FBFBBFBRLL
|
||||
FBFBFFBRLR
|
||||
BFFFFFBLRR
|
||||
FBBBFFBRLR
|
||||
BFBBFBBLLL
|
||||
BBFFBFBRRR
|
||||
FFFBFBBRRL
|
||||
FFBBBFFRLL
|
||||
BFFFFFFRLL
|
||||
BFBFFFBRLL
|
||||
FFFFFBFRLL
|
||||
BBBFFFBRRL
|
||||
FFBBBBFRRL
|
||||
BFFFBBBLRL
|
||||
FFFFFBBLLR
|
||||
BFFFFBBLRR
|
||||
BFBFFFBLLL
|
||||
FFFFFBBRLR
|
||||
BBFBFBFLLL
|
||||
FBFBBBBRLR
|
||||
FBBFBFBRRL
|
||||
FFBFBFBRRR
|
||||
FBBBBBFLRL
|
||||
BBFBFFBLLL
|
||||
BBFFFFBRLL
|
||||
BBBFBFBRLR
|
||||
BBFBFBBLLL
|
||||
BFBBBBBLRR
|
||||
BBFFFBFRRR
|
||||
FFFBFBFRLL
|
||||
BFFBBFBLLL
|
||||
FBFFBBBRRR
|
||||
FFFBFBFLLL
|
||||
BBFFBBFLRL
|
||||
BBFFFFBRLR
|
||||
BFBFBBBRLR
|
||||
BBBFBFFLLR
|
||||
FFBBBBFRLR
|
||||
BBFFBFFRRL
|
||||
BBFBFFBRRR
|
||||
BFBFFBFLLR
|
||||
FBFFBBFRLL
|
||||
BBFFFFBLLR
|
||||
FBFBFFFRLR
|
||||
FFBFBFBLLR
|
||||
BFBBFFBRRL
|
||||
FBBFFBBRRL
|
||||
BBFFBFBRLR
|
||||
FFFFBFBLRR
|
||||
FFFFBBBLRR
|
||||
FFBFBFFLLL
|
||||
FFBBBFFRRL
|
||||
BBFFFBFRLL
|
||||
FBFBBBFLRR
|
||||
FBBFBFFRRR
|
||||
FBBFBFFLLR
|
||||
BFFBBBFLRR
|
||||
FBBFBBFRLR
|
||||
BFFBBBFLLL
|
||||
BBFBBFBRLL
|
||||
BBBFFBBLLR
|
||||
BBBFBFBRRL
|
||||
FBFBBBFRRL
|
||||
FBBFFFBRLR
|
||||
BFBBFBBLRL
|
||||
FFBBFFFRRR
|
||||
BFBFFFFRLR
|
||||
BBFFFFFLLR
|
||||
BBFBFFBRLR
|
||||
BBFBFBFLRL
|
||||
FBFFFFFLRL
|
||||
FFBBBFFLRL
|
||||
FBFBFBBLRR
|
||||
FFBFBBBRLL
|
||||
FFBFBFFRLR
|
||||
FBBBFBFLRR
|
||||
FBFFBFFLRR
|
||||
BBFFBFBRRL
|
||||
FBBFFFFLRL
|
||||
FFFFBBFLRL
|
||||
FFBBFFBLRR
|
||||
BFBFFFBLLR
|
||||
BFBFBBFLRR
|
||||
BFBFBFBLLR
|
||||
BFBBFBFRLL
|
||||
BFBBFFBRLR
|
||||
FBFFFBBLLL
|
||||
FFFBBBBRRL
|
||||
FBBFBFFLLL
|
||||
FBFFBFBRLL
|
||||
BFFBFFFRRL
|
||||
FBFBFFBLLR
|
||||
BBFFBBFLLL
|
||||
FFBBBFBLLR
|
||||
BFBBFFFLLR
|
||||
FBBBFBFRRR
|
||||
FBBBFFBRRL
|
||||
FFFFBBFRRR
|
||||
FFBFFFFLRL
|
||||
FBBFBBFLRR
|
||||
FFBBBFBLLL
|
||||
FBFFFBFRLR
|
||||
FFBFFBBRRL
|
||||
FFFFBBFRRL
|
||||
BBBFFFFLRL
|
||||
FBBFFFBLRL
|
||||
FFBFBFBLRR
|
||||
FFFFBFFRRR
|
||||
FFFBFBFRRR
|
||||
BBFBBBBLLL
|
||||
FFBBFFBRRR
|
||||
FBBFFBBLRR
|
||||
FBBFBBFLLL
|
||||
BBFBBBFRRL
|
||||
FFFBBBBLLR
|
||||
FFBFFBBLRR
|
||||
BBFBBFFRLL
|
||||
BFBBBBFRLL
|
||||
BBFBFFBRRL
|
||||
BFFFBBFRRL
|
||||
FBBBBBBLLL
|
||||
FFBBFFBLLL
|
||||
FFBBFBBLRR
|
||||
BFBFBFBLRR
|
||||
FBBBFBBLLR
|
||||
BBFBFBFRLL
|
||||
FBBFBFFLRR
|
||||
FBBBFBFLLL
|
||||
FFBBFFFLRR
|
||||
BFFBBBFRLL
|
||||
FBBBBFBLLR
|
||||
BFBFFFFLRL
|
||||
FFBFBBBLLL
|
||||
FFBFFFBLRR
|
||||
BFBFBFBRLL
|
||||
FBFBFBFRLL
|
||||
BFBBBBBLLL
|
||||
FFBFBFBRLL
|
||||
BFBFFFFLLR
|
||||
BFFBBBBLLL
|
||||
FFBBFBBRLL
|
||||
FFFFBFBRLR
|
||||
FBFBBFFLLR
|
||||
BFBFBBFRLL
|
||||
FFBFFFFLLL
|
||||
FBBFFBFLRR
|
||||
FFBFFFBRLL
|
||||
FFFFBBBLLR
|
||||
BFBBBBBRLL
|
||||
FBBFBBBLRL
|
||||
FBFFBBBRLL
|
||||
FBFFFBBLLR
|
||||
FFBBBFBLRL
|
||||
FFFFBFFRLL
|
||||
BBFFFBBLRL
|
||||
BFFFBFFRRL
|
||||
BFFBFBFLLL
|
||||
BBFFFBFLLL
|
||||
FFFFFBFLRL
|
||||
FBBFFFFRRR
|
||||
FBBBBBFLRR
|
||||
FFBFFFBRLR
|
||||
FBBBFFFLLL
|
||||
FFBFBBBLRL
|
||||
FFBFFFBLLL
|
||||
FBFFBBBLLR
|
||||
BBBFBFFRLR
|
||||
FFFBFFFRLR
|
||||
BBFBBBFLLR
|
||||
FFBBFFFRLR
|
||||
FFFFFBFRLR
|
||||
FBBFFFBRRL
|
||||
BFFBBBBRLR
|
||||
BFFBFFBRLL
|
||||
BFBBBFBRLL
|
||||
FBFFBBFRRR
|
||||
FBFBBFFLLL
|
||||
BBFBFBBLRL
|
||||
BBBFBBFLRL
|
||||
FBFBFFBLRR
|
||||
FBFFFFFRLL
|
||||
BFBBFBFRRR
|
||||
BFBFBBBLLL
|
||||
FFBBBFFLRR
|
||||
BFBBFBBLLR
|
||||
FBBBBFFRRR
|
||||
BFFFBFFLRL
|
||||
FFFFBFBRLL
|
||||
BFFFFBBLLL
|
||||
BFFBFBBLLL
|
||||
BFFBFBBRRL
|
||||
BBBFFFBLRL
|
||||
BBBFFFBRRR
|
||||
BFFFBBFLRR
|
||||
FFBBFBFRLL
|
||||
BFFBBFBRLR
|
||||
FFBFFBFLLR
|
||||
FBFBBBBLRL
|
||||
BFFBBFFRRL
|
||||
BBFFFBBRRR
|
||||
FBBBFBBRRR
|
||||
BFFFFBFRRL
|
||||
FFBFBBBRRL
|
||||
BFFFBBBRRR
|
||||
BFBBBFBRRR
|
||||
BFBFBFFRLR
|
||||
FFFFFBBRRR
|
||||
FBFBFBFLRL
|
||||
FFBBBBBLRR
|
||||
BBFFFFBLRL
|
||||
FFFBFFFLLR
|
||||
FFFBFFFRRL
|
||||
FBBBFBBLRL
|
||||
BBFFBBFLLR
|
||||
BBFFBFFLRR
|
||||
BFFFFFFRLR
|
||||
FBBFBBFRLL
|
||||
BFBBBBFRRR
|
||||
FBFBBBBLLR
|
||||
FFFBBFFRLR
|
||||
FBBFBBBRLR
|
||||
FBBFBFBRLR
|
||||
FBBBFFFLRL
|
||||
FFBBFBBRLR
|
||||
BFFFBBBLLL
|
||||
BBFBBFFRRR
|
||||
FBFBFFFLRR
|
||||
BBFFBBFRRR
|
||||
FBBFBFFRRL
|
||||
BFFFFBFLLL
|
||||
BBBFFBBLLL
|
||||
BFBBBBFRRL
|
||||
FBBFFFBRRR
|
||||
BFBBBBFLLL
|
||||
FFFBFFBRRL
|
||||
BFFBFFBLLR
|
||||
FFBBFBFRRL
|
||||
FBFFFBBRLR
|
||||
BFFFBBBLRR
|
||||
FFBFBFFRRR
|
||||
FBFBFFBRLL
|
||||
BFBBBBFLRL
|
||||
BFBBFFFRRR
|
||||
FBFBFBFRRL
|
||||
BBFBBFFLRL
|
||||
FBBFFFFLLL
|
||||
BBBFFBBRLL
|
||||
FBFFFBBRRL
|
||||
FFBFBFFLRL
|
||||
FBFFBBFLRL
|
||||
BFFBFBFLRR
|
||||
BFFFFBBLRL
|
||||
BBFBBBBLRL
|
||||
FFBFBBFRLL
|
||||
FBFFFBFLLL
|
||||
BFFBFFBLRL
|
||||
FBBFFFBLRR
|
||||
FFFFBFFRRL
|
||||
FBBFFBFRLR
|
||||
BFFFBFFRRR
|
||||
FFFFBFBRRL
|
||||
BBFFBFBLRL
|
||||
FBBFBFBRLL
|
||||
BFBBFFFLRL
|
||||
FFFBBBFRRR
|
||||
BFFFFFFLLR
|
||||
FBFBBFFRRR
|
||||
BFFFFFBRLL
|
||||
FFFFBBBRRL
|
||||
BFFBFBFLLR
|
||||
FFFFBFFRLR
|
||||
BFFBBBFRRL
|
||||
BFBBFBBRLL
|
||||
FFFFFBFRRL
|
||||
FFBBBBFLRL
|
||||
FFBBFBFLLR
|
||||
BBFFBBBRLL
|
||||
BFFBFFFLLR
|
||||
BBFBBBBRLL
|
||||
BFFBFBBRLR
|
||||
FFBFBFFRRL
|
||||
FBBFBBFLRL
|
||||
FFBFFBBLRL
|
||||
BFBFFFBRLR
|
||||
BFFBFFFLRR
|
||||
BFFBBBBLRL
|
||||
FFFBFBBRLR
|
||||
FBBBBBFRRR
|
||||
BFBFBFFLRL
|
||||
BFBFFFBLRL
|
||||
FBBBFBBRLL
|
||||
FBFBFBFLLL
|
||||
FBBFFBFRRR
|
||||
FFFBFBBLRR
|
||||
FFFBFFFLRL
|
||||
BFBFBFBRRR
|
||||
BFFBBFFLLL
|
||||
BFFBFBBRRR
|
||||
FFBFFBFRRL
|
||||
FBFFFBFRLL
|
||||
FFBFBBFLLL
|
||||
FFBBFFBLRL
|
||||
FBFBBBBRRL
|
||||
BFFBBFBRRL
|
||||
FBFBFBBLRL
|
||||
BBFBFBFRLR
|
||||
FBFFFFFLRR
|
||||
BBBFFBFRLL
|
||||
BFBFBFFRLL
|
||||
FBBFFBBLRL
|
||||
FBFBFBBRRL
|
||||
FFBBBBBRLR
|
||||
FBBFBBFLLR
|
||||
FFFBFBBRLL
|
||||
BBFFFFBRRL
|
||||
BFBFBFBLRL
|
||||
FBFBBFBLLR
|
||||
BBBFBFBLRR
|
||||
FFFFBBFRLL
|
||||
FFBBBBBRRR
|
||||
BFBBFFBRRR
|
||||
BFFFBBBLLR
|
||||
FBBBBBBRLL
|
||||
FFBFBBFRLR
|
||||
BBFFBBFRLL
|
||||
BFFBFFFLRL
|
||||
FFBBFFFLLL
|
||||
BFFBFBBLRL
|
||||
BBBFFFFRLL
|
||||
BBFBBBFRRR
|
||||
FBFFBFFRRR
|
||||
FBBFFFFRLL
|
||||
BFFFBBBRRL
|
||||
FBFBBBFLLL
|
||||
FFFFBBFLLR
|
||||
FBBFBBFRRR
|
||||
BBFFBBBRLR
|
||||
BBFBBFBLRR
|
||||
BFFFBFFLLL
|
||||
BBFBFBFRRR
|
||||
FFBFFFBLRL
|
||||
BBFFFBBRLR
|
||||
FBFBFBBRRR
|
||||
BFBBFFBLRL
|
||||
BFFFFBFRLL
|
||||
BBFBFBBRLL
|
||||
BFFFFBBRLL
|
||||
FFFFBFFLLR
|
||||
FFBBBBFLRR
|
||||
FBFBFFFRRR
|
||||
FFFBBFBLLR
|
||||
FFBBFBFRRR
|
||||
BFBBFBBRRR
|
||||
FFBFBBBLLR
|
||||
FFBFFBFLLL
|
||||
FFFFBBBLRL
|
||||
FFBFBFFLLR
|
||||
BFBBBFFLRR
|
||||
FBBFFFFLLR
|
||||
FBFFFFBRRL
|
||||
BFFBBFFLRR
|
||||
FFBBFBBRRR
|
||||
FFFFBFBRRR
|
||||
BFBBBBFLLR
|
||||
FBBFFBBRRR
|
||||
BBFBFBBLRR
|
||||
FFFBBBBLRR
|
||||
FBFFFBBLRR
|
||||
BFFBFBFRLR
|
||||
BFBFFBFRLR
|
||||
BFBBFFFRLR
|
||||
FFBBFFFLLR
|
||||
FFFFFBFLRR
|
||||
BFFBBFBLRR
|
||||
FFFFBBFRLR
|
||||
BFFFBBFLLR
|
||||
FBFBFFBRRR
|
||||
BBFBFBBRRL
|
||||
FBFBBFFLRR
|
||||
BFBFFBFLRR
|
||||
BBFFFBBLRR
|
||||
FBFFBBFRRL
|
||||
FBBBBBBLRL
|
||||
FBBFFBBLLL
|
||||
BFBFBBBLRL
|
||||
BBBFFFBLLR
|
||||
BFFFBFFLRR
|
||||
BBFFBBFRRL
|
||||
BFBFBBFLLL
|
||||
FFBBBFFLLR
|
||||
BFBBFBFRRL
|
||||
FBFFBFFRRL
|
||||
BFFFBFBLRR
|
||||
BFBBFBBRRL
|
||||
BBFBFFBLRL
|
||||
BFFBBBFRRR
|
||||
FBFBBFBLLL
|
||||
BBFFBFFRRR
|
||||
BBFFBFBRLL
|
||||
BBBFFBFLLR
|
||||
FFFBBFBLLL
|
||||
FBBBFFFRRL
|
||||
BFFBFFBLRR
|
||||
BBFBFBBLLR
|
||||
FFBBFBFRLR
|
||||
BBFFFFFRLR
|
||||
FBFFBFBLRR
|
||||
BFFFFFFRRR
|
||||
FFBBFBFLLL
|
||||
BFBBFBBLRR
|
||||
BBFFFBFRLR
|
||||
BBBFFBFRRR
|
||||
FFFFBBFLLL
|
||||
BBFFBFBLRR
|
||||
BFFBFBBRLL
|
||||
FBFFFBFLLR
|
||||
BFFFBBFRRR
|
||||
FFBFBBFRRL
|
||||
BFBFFBBLRR
|
||||
FBBFFBFRRL
|
||||
FFBBBBBLLR
|
||||
BFBFFBBLLL
|
||||
BFBBBBFLRR
|
||||
FFFFBBBRLR
|
||||
BFFBBBBLLR
|
||||
BFFFFFFLRR
|
||||
BFFFFBBRLR
|
||||
FFFBBBBRLL
|
||||
BFBBFFFLRR
|
||||
BFFBBBFRLR
|
||||
BFFBBFFRLL
|
||||
FBFBBBBLLL
|
||||
BFBFBFBRLR
|
||||
BBFBBFFLLL
|
||||
BBFBBBBLRR
|
||||
FFBBFBBLLR
|
||||
FBBFFFBRLL
|
||||
FBBBBFFRRL
|
||||
FFFBBFBLRR
|
||||
FFFBFBBLLR
|
||||
FFFFFBBRRL
|
||||
FBFBBBFRRR
|
||||
BBFFFBFLRL
|
||||
FBFBFFBLLL
|
||||
FBFBFFFRRL
|
||||
BFBFFFBRRL
|
||||
BBFFBFFRLR
|
||||
BBFFBFBLLR
|
||||
FFFBFBFLRR
|
||||
BBFBBBFLLL
|
||||
BFBBBFFRLL
|
||||
BFFFBFBRRL
|
||||
FFFFBFFLLL
|
||||
FBBBBBFRRL
|
||||
FBFBFFBLRL
|
||||
FBBBBBBLRR
|
||||
FFFBBBBRLR
|
||||
BFFBFBBLLR
|
||||
BBFFBBFLRR
|
||||
BFFFFFBLRL
|
||||
FFBBBBFLLL
|
||||
BFFBFBBLRR
|
||||
FFFBBBFLRR
|
||||
FFBFBBFLRL
|
||||
FBBFBFBLRL
|
||||
BBBFFFFRRL
|
||||
BBFBFBFLLR
|
||||
BFBBBFBLLL
|
||||
FFBFBBBLRR
|
||||
BFFBFFBRLR
|
||||
FFFBBBBLLL
|
||||
BFFFBFFRLR
|
||||
BFFFBBFLLL
|
||||
FBBBBFBLRR
|
||||
FBBFBBBRLL
|
||||
BFBFFBFRRL
|
||||
BFFFFBBRRR
|
||||
BBFFBBBLRL
|
||||
FBBBBFBRLL
|
||||
BFBBFFFRRL
|
||||
BBBFFBFLLL
|
||||
BFBFFBFRRR
|
||||
FFBFFBBRRR
|
||||
FFBFBBBRLR
|
||||
FBBBBFFLRR
|
||||
BFBFBFFLRR
|
||||
BFBBBBFRLR
|
||||
FFFFFBFRRR
|
||||
BFFBBFBRRR
|
||||
BFBBBBBRRL
|
||||
BFFBBFBLRL
|
||||
FFFBFBBLRL
|
||||
FFFBFBBLLL
|
||||
FFBBFBBLRL
|
||||
BBBFFFFLRR
|
||||
FFFFFBBLRL
|
||||
FBFFBFBLLR
|
||||
FBFBBBBRLL
|
||||
BFFBFBFRLL
|
||||
BFFFBFFRLL
|
||||
BFFFBFBRRR
|
||||
BBBFBFFLRL
|
||||
BFFBFFFLLL
|
||||
BBFFFFFRRL
|
||||
FBFBFFFLLR
|
||||
FFBFFBBLLL
|
||||
BBFFBFFLRL
|
||||
BBFFBBBLLL
|
||||
FFFFFBBLLL
|
||||
BFBBFFBLLL
|
||||
FFFBFFBRLR
|
||||
FBBFFBBRLL
|
||||
FBFBFBBRLL
|
||||
BFFBBBFLRL
|
||||
FFFBFFBLRR
|
||||
FBFBBFFRLR
|
||||
FFFBBFFLLR
|
||||
FBFBBBFLLR
|
||||
FBBFFFFRRL
|
||||
BBFBBBFLRR
|
||||
BFBBFBFRLR
|
||||
FFBFFFBLLR
|
||||
FFBFFBFLRL
|
||||
BBFFBBBRRR
|
||||
BBFFFFFLRR
|
||||
FBFFBFBRRL
|
||||
FBFFBFFLLR
|
||||
FBBBFFBLLL
|
||||
FBBBFFBLRR
|
||||
BFBBBBBRRR
|
||||
BBBFFFBRLL
|
||||
FBFFFFFRRR
|
||||
BBFBBFFRLR
|
||||
BBFFBBBLLR
|
||||
BBBFFBFLRL
|
||||
BBFFFBFLRR
|
||||
FFFBFFFLLL
|
||||
FFBFBBFLLR
|
||||
BBFFFFFRLL
|
||||
BBFBBFFRRL
|
||||
FBBFBBBLLL
|
||||
FFFBFFBRRR
|
||||
FBBBBFFLLL
|
||||
FFFBBFFLRR
|
||||
BBFFBBBRRL
|
||||
FFBBBFFLLL
|
||||
FBBBFBFLRL
|
||||
BBFBFFFLRL
|
||||
FFBFFFFRLL
|
||||
FFFBBBFRLL
|
||||
FBBBBBFLLL
|
||||
BFBFFFFLLL
|
||||
82
5-binary_boarding/src/main.rs
Normal file
82
5-binary_boarding/src/main.rs
Normal file
@@ -0,0 +1,82 @@
|
||||
use std::convert::TryFrom;
|
||||
use std::str::FromStr;
|
||||
use anyhow::Result;
|
||||
|
||||
struct Plane {
|
||||
cols: usize,
|
||||
rows: usize,
|
||||
}
|
||||
const my_plane: Plane = Plane { cols: 8, rows: 128};
|
||||
|
||||
#[derive(Debug, thiserror::Error, PartialEq)]
|
||||
enum ParseError {
|
||||
#[error("Expected {0}")]
|
||||
Expected(&'static str),
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
struct Seat {
|
||||
col: usize,
|
||||
row: usize,
|
||||
}
|
||||
|
||||
impl FromStr for Seat {
|
||||
type Err = ParseError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
if s.len() != 10 { return Err(ParseError::Expected("10-char string")) }
|
||||
|
||||
// split_at not supposed to fail as we are only working with ASCII chars here
|
||||
let s_bit = s
|
||||
.replace("F", "0")
|
||||
.replace("B", "1")
|
||||
.replace("R","1")
|
||||
.replace("L", "0")
|
||||
.chars()
|
||||
.collect::<String>();
|
||||
let (rowcode, colcode) = s_bit.split_at(7);
|
||||
Ok(Self {
|
||||
row: usize::from_str_radix(&rowcode, 2).unwrap(),
|
||||
col: usize::from_str_radix(&colcode, 2).unwrap(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl Seat {
|
||||
fn seat_id(&self) -> usize {
|
||||
8 * self.row + self.col
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let input = include_str!("../data/input.txt");
|
||||
let mut seat_ids: Vec<usize> = input.lines().map(|l| Seat::from_str(l).unwrap().seat_id()).collect();
|
||||
seat_ids.sort();
|
||||
println!("Max seat id: {:?}", seat_ids.iter().max());
|
||||
let banana = seat_ids
|
||||
.windows(2)
|
||||
.flat_map(<&[usize;2]>::try_from) // Because windows() makes no promise on slice size
|
||||
.find(|[a, b]| *b == *a + 2);
|
||||
eprintln!("banana = {:#?}", banana);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
const AOC_INPUT: &str = "FBFBBFFRLR";
|
||||
#[test]
|
||||
fn test_build_seat() {
|
||||
assert_eq!(
|
||||
Seat::from_str(AOC_INPUT),
|
||||
Ok(Seat { row: 44, col: 5 })
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_seat_id() {
|
||||
assert_eq!(
|
||||
Seat::from_str(AOC_INPUT).unwrap().seat_id(),
|
||||
357
|
||||
);
|
||||
}
|
||||
}
|
||||
1
6-custom_customs/.gitignore
vendored
Normal file
1
6-custom_customs/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
23
6-custom_customs/Cargo.lock
generated
Normal file
23
6-custom_customs/Cargo.lock
generated
Normal file
@@ -0,0 +1,23 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "custom_customs"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"itertools",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "either"
|
||||
version = "1.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
|
||||
|
||||
[[package]]
|
||||
name = "itertools"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
|
||||
dependencies = [
|
||||
"either",
|
||||
]
|
||||
10
6-custom_customs/Cargo.toml
Normal file
10
6-custom_customs/Cargo.toml
Normal file
@@ -0,0 +1,10 @@
|
||||
[package]
|
||||
name = "custom_customs"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
itertools = "0.9.0"
|
||||
2199
6-custom_customs/data/input.txt
Normal file
2199
6-custom_customs/data/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
1
6-custom_customs/element
Normal file
1
6-custom_customs/element
Normal file
@@ -0,0 +1 @@
|
||||
[1;31mE: [0mYou must give at least one search pattern[0m
|
||||
1
6-custom_customs/riot
Normal file
1
6-custom_customs/riot
Normal file
@@ -0,0 +1 @@
|
||||
[1;31mE: [0mYou must give at least one search pattern[0m
|
||||
81
6-custom_customs/src/main.rs
Normal file
81
6-custom_customs/src/main.rs
Normal file
@@ -0,0 +1,81 @@
|
||||
use std::{collections::HashSet, todo};
|
||||
|
||||
use itertools::Itertools;
|
||||
|
||||
fn count_scores(input: &str) -> Vec<usize> {
|
||||
input
|
||||
.split("\n\n")
|
||||
.map(|l| l.chars()
|
||||
.unique()
|
||||
.filter(|&c| c != '\n')
|
||||
.count())
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn count_scores_v2(input: &str) -> Vec<usize> {
|
||||
input
|
||||
.split("\n\n")
|
||||
.map(|group| {
|
||||
group
|
||||
.lines()
|
||||
.map(|l| l.chars().collect::<HashSet<char>>())
|
||||
.fold1(|acc: HashSet<char>, hset| {
|
||||
acc.intersection(&hset).cloned().collect()
|
||||
})
|
||||
.unwrap()
|
||||
.len()
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let input = include_str!("../data/input.txt");
|
||||
let scores = count_scores(input);
|
||||
println!("Sum of scores : {}", scores.iter().sum::<usize>());
|
||||
println!("Sum of scores v2 : {}", count_scores_v2(input).iter().sum::<usize>())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_count_scores() {
|
||||
let input = r#"abc
|
||||
|
||||
a
|
||||
b
|
||||
c
|
||||
|
||||
ab
|
||||
ac
|
||||
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
|
||||
b"#;
|
||||
assert_eq!(count_scores(input).iter().sum::<usize>(), 11)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_count_scores_v2() {
|
||||
let input = r#"abc
|
||||
|
||||
a
|
||||
b
|
||||
c
|
||||
|
||||
ab
|
||||
ac
|
||||
|
||||
a
|
||||
a
|
||||
a
|
||||
a
|
||||
|
||||
b"#;
|
||||
assert_eq!(count_scores_v2(input).iter().sum::<usize>(), 6);
|
||||
}
|
||||
}
|
||||
1
7-handy_haversacs/.gitignore
vendored
Normal file
1
7-handy_haversacs/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
75
7-handy_haversacs/Cargo.lock
generated
Normal file
75
7-handy_haversacs/Cargo.lock
generated
Normal file
@@ -0,0 +1,75 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "handy_haversacs"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"multimap",
|
||||
"peg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "multimap"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1255076139a83bb467426e7f8d0134968a8118844faa755985e077cf31850333"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "peg"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9f76678828272f177ac33b7e2ac2e3e73cc6c1cd1e3e387928aa69562fa51367"
|
||||
dependencies = [
|
||||
"peg-macros",
|
||||
"peg-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "peg-macros"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "636d60acf97633e48d266d7415a9355d4389cea327a193f87df395d88cd2b14d"
|
||||
dependencies = [
|
||||
"peg-runtime",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "peg-runtime"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9555b1514d2d99d78150d3c799d4c357a3e2c2a8062cd108e93a06d9057629c5"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.118"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
11
7-handy_haversacs/Cargo.toml
Normal file
11
7-handy_haversacs/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "handy_haversacs"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
multimap = "0.8.2"
|
||||
peg = "0.6.3"
|
||||
594
7-handy_haversacs/data/input
Normal file
594
7-handy_haversacs/data/input
Normal file
@@ -0,0 +1,594 @@
|
||||
plaid fuchsia bags contain 5 light violet bags, 1 light yellow bag.
|
||||
striped aqua bags contain 2 striped teal bags.
|
||||
clear coral bags contain 2 plaid green bags, 5 mirrored gold bags.
|
||||
dull tan bags contain 4 faded blue bags, 3 faded olive bags, 5 dull salmon bags.
|
||||
plaid green bags contain 3 faded green bags.
|
||||
light tomato bags contain 1 drab chartreuse bag, 1 dotted tomato bag, 3 striped red bags, 2 vibrant violet bags.
|
||||
dim tomato bags contain 4 striped gold bags, 5 bright lavender bags, 1 pale beige bag, 4 pale tan bags.
|
||||
vibrant green bags contain 4 faded teal bags.
|
||||
shiny crimson bags contain 2 dull green bags.
|
||||
vibrant black bags contain 5 dark beige bags, 3 dark bronze bags.
|
||||
light tan bags contain 1 striped tomato bag.
|
||||
vibrant teal bags contain 1 shiny silver bag.
|
||||
pale chartreuse bags contain 2 dotted plum bags.
|
||||
plaid coral bags contain 2 pale green bags, 2 faded tomato bags, 2 dark salmon bags, 1 vibrant magenta bag.
|
||||
dull gray bags contain 1 dark tan bag, 3 dotted tan bags.
|
||||
muted gray bags contain 5 bright indigo bags, 5 dotted purple bags.
|
||||
vibrant red bags contain 4 bright tomato bags, 4 shiny orange bags.
|
||||
faded tan bags contain 1 dull crimson bag, 5 faded red bags.
|
||||
pale magenta bags contain 3 posh chartreuse bags, 4 vibrant purple bags.
|
||||
shiny gray bags contain 2 wavy purple bags.
|
||||
light crimson bags contain 5 clear teal bags.
|
||||
striped turquoise bags contain 3 pale tomato bags, 2 posh teal bags.
|
||||
striped purple bags contain 4 dark silver bags, 4 vibrant gray bags, 2 dim bronze bags, 2 clear aqua bags.
|
||||
muted magenta bags contain 4 striped tomato bags.
|
||||
light teal bags contain 2 faded brown bags, 2 posh purple bags, 1 faded olive bag.
|
||||
clear cyan bags contain 1 clear coral bag, 5 clear aqua bags.
|
||||
dull cyan bags contain 5 wavy crimson bags, 1 pale orange bag.
|
||||
shiny tan bags contain 2 bright red bags, 4 plaid cyan bags.
|
||||
light brown bags contain 3 dim yellow bags, 4 dull orange bags, 1 vibrant yellow bag.
|
||||
pale tan bags contain 2 striped orange bags, 5 dull plum bags.
|
||||
wavy salmon bags contain 2 dark blue bags, 5 dim plum bags.
|
||||
mirrored cyan bags contain 2 plaid turquoise bags, 5 dull plum bags, 3 muted indigo bags, 2 plaid white bags.
|
||||
dark aqua bags contain 3 bright red bags, 2 wavy purple bags, 2 plaid tan bags.
|
||||
wavy purple bags contain 5 wavy brown bags.
|
||||
clear magenta bags contain 4 muted green bags, 3 dull cyan bags, 4 striped teal bags, 2 faded blue bags.
|
||||
bright red bags contain 5 vibrant tomato bags, 2 dull orange bags.
|
||||
pale purple bags contain 3 plaid turquoise bags, 4 light tan bags, 1 faded black bag, 5 light yellow bags.
|
||||
bright orange bags contain 1 mirrored orange bag, 2 faded bronze bags, 1 wavy turquoise bag, 1 bright yellow bag.
|
||||
faded lavender bags contain 1 plaid brown bag.
|
||||
dark salmon bags contain 3 dotted crimson bags, 1 posh bronze bag.
|
||||
mirrored coral bags contain 3 dark red bags, 1 dull fuchsia bag, 2 drab magenta bags, 4 dull indigo bags.
|
||||
clear black bags contain 5 mirrored salmon bags, 3 drab gold bags, 3 muted fuchsia bags.
|
||||
faded fuchsia bags contain 1 shiny silver bag, 2 posh orange bags, 5 plaid bronze bags.
|
||||
dotted red bags contain 4 faded yellow bags, 5 dull brown bags, 3 clear red bags.
|
||||
light purple bags contain 2 plaid magenta bags, 3 vibrant coral bags, 2 wavy black bags.
|
||||
faded beige bags contain no other bags.
|
||||
dull fuchsia bags contain 3 dim lavender bags, 1 dull aqua bag, 2 pale fuchsia bags.
|
||||
wavy olive bags contain 5 dotted cyan bags, 1 dull lime bag.
|
||||
dim teal bags contain 1 dull green bag.
|
||||
dull orange bags contain 5 striped tomato bags, 5 drab blue bags, 5 faded blue bags, 2 pale brown bags.
|
||||
muted brown bags contain 3 dotted orange bags, 1 bright tan bag.
|
||||
vibrant coral bags contain 2 wavy turquoise bags.
|
||||
clear aqua bags contain 5 posh bronze bags, 5 dim orange bags, 5 posh chartreuse bags.
|
||||
dull plum bags contain 4 drab tan bags.
|
||||
wavy tomato bags contain 4 wavy cyan bags, 1 bright silver bag, 3 dotted gray bags, 1 dark tomato bag.
|
||||
shiny fuchsia bags contain 1 dotted silver bag, 5 dull lime bags, 3 drab teal bags.
|
||||
pale fuchsia bags contain 3 pale beige bags.
|
||||
plaid plum bags contain 4 dotted plum bags, 1 mirrored brown bag, 3 dim yellow bags, 2 vibrant bronze bags.
|
||||
posh green bags contain 5 plaid indigo bags, 1 wavy red bag, 5 dim indigo bags, 4 wavy indigo bags.
|
||||
muted aqua bags contain 3 bright tan bags, 3 dull yellow bags, 1 faded blue bag.
|
||||
mirrored white bags contain 5 dark coral bags, 1 plaid red bag, 4 dull violet bags, 5 clear gray bags.
|
||||
dotted aqua bags contain 4 drab aqua bags, 3 faded tomato bags.
|
||||
bright indigo bags contain 4 faded tan bags, 3 clear turquoise bags, 1 plaid indigo bag, 4 bright gray bags.
|
||||
posh silver bags contain 5 striped red bags, 3 faded blue bags, 3 dim plum bags, 3 vibrant beige bags.
|
||||
bright olive bags contain 3 dull silver bags, 5 drab tomato bags.
|
||||
muted beige bags contain 1 drab crimson bag.
|
||||
shiny beige bags contain 3 clear blue bags.
|
||||
wavy brown bags contain 2 striped coral bags, 2 light purple bags.
|
||||
wavy black bags contain 4 faded beige bags, 2 striped red bags, 2 pale brown bags, 3 dull yellow bags.
|
||||
faded salmon bags contain 1 light indigo bag, 5 plaid cyan bags, 2 pale salmon bags.
|
||||
dark gold bags contain 1 mirrored plum bag, 2 dark tomato bags, 5 dull green bags, 2 light lime bags.
|
||||
mirrored lavender bags contain 5 muted brown bags, 1 shiny blue bag, 5 dull blue bags, 3 wavy indigo bags.
|
||||
wavy beige bags contain 3 mirrored purple bags, 3 posh yellow bags, 4 plaid green bags.
|
||||
striped fuchsia bags contain 5 drab bronze bags, 4 posh tomato bags, 1 drab maroon bag, 1 dim beige bag.
|
||||
faded blue bags contain 1 striped tomato bag, 3 dark olive bags, 2 drab tan bags.
|
||||
drab gray bags contain 1 posh teal bag.
|
||||
dim cyan bags contain 4 dark fuchsia bags, 3 wavy maroon bags, 5 posh silver bags, 4 posh chartreuse bags.
|
||||
dotted purple bags contain 3 wavy white bags.
|
||||
shiny brown bags contain 5 light silver bags, 4 light turquoise bags, 4 posh bronze bags.
|
||||
vibrant tomato bags contain 3 dotted cyan bags, 3 posh teal bags, 1 clear magenta bag, 5 dull lime bags.
|
||||
dark bronze bags contain 2 vibrant maroon bags, 2 mirrored olive bags.
|
||||
wavy silver bags contain 4 striped magenta bags, 3 dim fuchsia bags.
|
||||
striped yellow bags contain 5 faded black bags, 5 light beige bags, 1 vibrant beige bag, 2 mirrored beige bags.
|
||||
faded chartreuse bags contain 4 clear gray bags, 5 dotted gray bags.
|
||||
faded tomato bags contain 5 faded gray bags, 4 faded fuchsia bags, 3 drab teal bags.
|
||||
dull gold bags contain 1 dark plum bag, 4 striped black bags.
|
||||
muted turquoise bags contain 1 mirrored bronze bag, 5 shiny aqua bags, 1 clear plum bag.
|
||||
dotted lime bags contain 1 dark black bag, 5 pale brown bags.
|
||||
vibrant violet bags contain 5 faded lime bags, 1 pale fuchsia bag, 5 dull plum bags.
|
||||
faded black bags contain 2 striped teal bags, 5 faded beige bags, 4 wavy black bags, 1 striped lavender bag.
|
||||
drab teal bags contain 1 clear gold bag, 4 muted crimson bags, 1 light teal bag.
|
||||
dull purple bags contain 1 posh crimson bag, 2 clear blue bags.
|
||||
dotted teal bags contain 2 dark tan bags.
|
||||
dark red bags contain 3 dotted cyan bags, 3 posh red bags, 2 bright red bags, 3 faded magenta bags.
|
||||
light black bags contain 5 dull yellow bags.
|
||||
light salmon bags contain 3 faded beige bags.
|
||||
dull brown bags contain 1 light indigo bag, 4 mirrored yellow bags, 5 faded silver bags.
|
||||
dark black bags contain 5 dull yellow bags, 3 dull lime bags, 5 posh aqua bags.
|
||||
faded crimson bags contain 3 light fuchsia bags, 5 muted chartreuse bags.
|
||||
drab yellow bags contain 5 drab indigo bags, 2 shiny brown bags, 4 muted lime bags.
|
||||
muted tomato bags contain 3 posh salmon bags, 2 plaid indigo bags, 5 striped aqua bags.
|
||||
pale teal bags contain 2 muted red bags, 5 mirrored brown bags, 4 mirrored tan bags.
|
||||
posh violet bags contain 4 posh tomato bags.
|
||||
dim plum bags contain 1 faded magenta bag, 5 drab silver bags, 1 pale brown bag.
|
||||
light fuchsia bags contain 2 dotted silver bags, 3 dotted lavender bags, 3 shiny gold bags, 5 clear magenta bags.
|
||||
vibrant orange bags contain 5 shiny blue bags, 5 dull maroon bags.
|
||||
shiny white bags contain 5 mirrored yellow bags, 2 pale fuchsia bags, 4 shiny turquoise bags.
|
||||
drab green bags contain 1 mirrored lavender bag, 3 posh tan bags.
|
||||
faded silver bags contain 5 vibrant coral bags, 3 striped lavender bags, 4 dotted cyan bags, 5 plaid turquoise bags.
|
||||
faded gold bags contain 4 faded magenta bags.
|
||||
dark coral bags contain 3 light maroon bags, 1 drab silver bag.
|
||||
striped olive bags contain 4 dotted maroon bags, 3 wavy brown bags, 1 wavy crimson bag, 5 shiny silver bags.
|
||||
wavy lavender bags contain 3 mirrored yellow bags, 5 shiny crimson bags, 4 dark indigo bags.
|
||||
bright fuchsia bags contain 2 vibrant green bags, 5 drab blue bags.
|
||||
dotted turquoise bags contain 3 striped red bags.
|
||||
drab black bags contain 1 faded tan bag.
|
||||
pale silver bags contain 1 faded yellow bag, 1 drab tan bag, 5 muted salmon bags, 3 shiny white bags.
|
||||
striped magenta bags contain 4 dark turquoise bags, 4 shiny blue bags, 3 shiny crimson bags.
|
||||
dotted beige bags contain 2 mirrored black bags, 2 faded brown bags, 1 bright red bag, 2 clear coral bags.
|
||||
clear maroon bags contain 5 bright bronze bags.
|
||||
shiny olive bags contain 2 dull blue bags.
|
||||
pale violet bags contain 1 light purple bag, 1 pale tomato bag, 4 plaid aqua bags, 4 light magenta bags.
|
||||
dotted white bags contain 3 bright purple bags, 4 dull orange bags, 2 plaid salmon bags.
|
||||
plaid blue bags contain 5 faded blue bags, 4 muted green bags, 4 bright bronze bags.
|
||||
mirrored lime bags contain 1 faded green bag, 4 striped black bags, 1 mirrored purple bag.
|
||||
wavy violet bags contain 1 muted bronze bag.
|
||||
light silver bags contain 2 dull cyan bags, 1 drab tan bag.
|
||||
dark tomato bags contain 1 vibrant tomato bag, 1 striped tomato bag.
|
||||
wavy teal bags contain 5 wavy red bags, 2 drab brown bags, 1 posh olive bag.
|
||||
dim green bags contain 2 striped teal bags, 1 drab blue bag.
|
||||
wavy crimson bags contain no other bags.
|
||||
mirrored aqua bags contain 3 posh tan bags, 5 muted teal bags, 3 light violet bags.
|
||||
light cyan bags contain 4 vibrant chartreuse bags, 1 faded lime bag, 2 drab purple bags, 2 shiny white bags.
|
||||
shiny gold bags contain 4 drab blue bags, 4 posh purple bags, 2 drab silver bags, 4 wavy turquoise bags.
|
||||
plaid chartreuse bags contain 5 mirrored olive bags, 2 vibrant orange bags, 2 shiny purple bags.
|
||||
dim yellow bags contain 1 faded green bag, 4 wavy fuchsia bags.
|
||||
pale turquoise bags contain 1 drab turquoise bag.
|
||||
clear red bags contain 1 pale bronze bag, 4 drab tan bags.
|
||||
shiny teal bags contain 3 bright aqua bags.
|
||||
dotted tomato bags contain 3 dotted orange bags, 5 light silver bags, 2 dull green bags, 5 wavy chartreuse bags.
|
||||
striped tan bags contain 1 light turquoise bag, 2 dotted salmon bags, 4 shiny orange bags, 2 clear red bags.
|
||||
dim bronze bags contain 1 wavy gold bag.
|
||||
posh crimson bags contain 4 posh aqua bags.
|
||||
plaid salmon bags contain 2 dull tan bags.
|
||||
mirrored salmon bags contain 2 muted aqua bags, 5 muted salmon bags.
|
||||
striped blue bags contain 3 wavy white bags, 4 drab blue bags, 1 drab chartreuse bag, 4 dull orange bags.
|
||||
pale red bags contain 1 striped red bag.
|
||||
muted black bags contain 4 faded gold bags.
|
||||
clear orange bags contain 2 faded red bags.
|
||||
mirrored maroon bags contain 2 plaid tan bags.
|
||||
dull aqua bags contain 4 pale gold bags.
|
||||
posh coral bags contain 3 striped gold bags.
|
||||
posh purple bags contain 4 pale orange bags, 5 dull salmon bags, 2 striped teal bags.
|
||||
muted tan bags contain 3 clear coral bags, 4 pale salmon bags.
|
||||
mirrored orange bags contain 5 pale bronze bags.
|
||||
striped teal bags contain no other bags.
|
||||
dark blue bags contain no other bags.
|
||||
clear bronze bags contain 4 vibrant gray bags.
|
||||
light magenta bags contain 4 dim green bags.
|
||||
drab coral bags contain 5 dotted chartreuse bags, 4 vibrant crimson bags, 2 muted green bags.
|
||||
drab brown bags contain 2 dull tomato bags, 5 vibrant bronze bags.
|
||||
bright coral bags contain 1 posh plum bag, 1 wavy gold bag, 2 drab lavender bags, 2 muted lavender bags.
|
||||
dim white bags contain 4 shiny aqua bags.
|
||||
plaid bronze bags contain 4 drab tan bags, 3 plaid salmon bags, 4 striped coral bags.
|
||||
faded teal bags contain 1 vibrant white bag, 5 wavy purple bags.
|
||||
drab turquoise bags contain 3 pale tomato bags, 1 bright indigo bag.
|
||||
muted white bags contain 3 striped brown bags, 1 light blue bag.
|
||||
clear crimson bags contain 1 dark magenta bag.
|
||||
shiny magenta bags contain 4 wavy tomato bags, 4 shiny bronze bags, 4 vibrant coral bags, 5 bright lime bags.
|
||||
bright magenta bags contain 3 wavy brown bags.
|
||||
bright tomato bags contain 4 vibrant fuchsia bags, 1 clear aqua bag.
|
||||
wavy coral bags contain 4 striped gold bags, 1 light purple bag, 4 vibrant purple bags.
|
||||
muted indigo bags contain 2 posh purple bags, 2 light gold bags, 3 striped lavender bags.
|
||||
clear violet bags contain 2 wavy cyan bags, 5 pale brown bags, 4 faded magenta bags, 2 bright purple bags.
|
||||
dull white bags contain 4 wavy olive bags, 3 mirrored olive bags, 3 faded magenta bags, 4 dull green bags.
|
||||
dull magenta bags contain 4 dim beige bags.
|
||||
dotted blue bags contain 4 posh beige bags, 1 pale purple bag, 4 shiny red bags.
|
||||
dotted lavender bags contain 3 posh purple bags.
|
||||
light white bags contain 4 striped lavender bags.
|
||||
dark turquoise bags contain 5 light teal bags.
|
||||
faded turquoise bags contain 5 striped violet bags, 4 dull crimson bags, 2 dim purple bags, 1 light silver bag.
|
||||
striped chartreuse bags contain 3 pale white bags, 3 dim fuchsia bags.
|
||||
pale gold bags contain 2 clear teal bags, 3 wavy turquoise bags, 5 light gold bags.
|
||||
posh blue bags contain 4 muted yellow bags, 1 dull crimson bag, 3 wavy violet bags, 5 mirrored fuchsia bags.
|
||||
dotted gray bags contain 3 wavy fuchsia bags.
|
||||
plaid magenta bags contain 3 plaid black bags.
|
||||
pale beige bags contain 1 pale white bag, 2 dim salmon bags, 5 mirrored gold bags.
|
||||
striped bronze bags contain 2 dull yellow bags, 2 dark blue bags.
|
||||
dark lime bags contain 2 pale magenta bags, 4 clear cyan bags.
|
||||
bright turquoise bags contain 2 light white bags, 3 plaid salmon bags, 2 clear aqua bags, 5 dull silver bags.
|
||||
posh salmon bags contain 1 drab turquoise bag.
|
||||
muted bronze bags contain 1 pale bronze bag, 3 clear maroon bags.
|
||||
faded coral bags contain 1 clear gray bag, 5 plaid gray bags, 3 bright silver bags, 4 posh yellow bags.
|
||||
mirrored gray bags contain 1 dark coral bag, 2 plaid blue bags, 4 mirrored coral bags, 1 mirrored olive bag.
|
||||
vibrant olive bags contain 5 pale chartreuse bags, 4 plaid green bags, 4 dark coral bags.
|
||||
dotted magenta bags contain 4 light chartreuse bags, 3 plaid indigo bags, 2 dull tan bags.
|
||||
light violet bags contain 2 muted green bags.
|
||||
dim fuchsia bags contain 5 dim tan bags, 5 faded black bags, 1 drab white bag.
|
||||
dotted black bags contain 3 bright gold bags, 2 faded gold bags.
|
||||
striped indigo bags contain 3 posh aqua bags.
|
||||
posh cyan bags contain 5 dull fuchsia bags.
|
||||
vibrant turquoise bags contain 2 muted chartreuse bags, 2 clear magenta bags, 5 drab chartreuse bags.
|
||||
mirrored magenta bags contain 1 dull lime bag.
|
||||
mirrored violet bags contain 2 posh magenta bags, 1 plaid white bag, 4 wavy turquoise bags, 5 dull salmon bags.
|
||||
pale tomato bags contain 4 wavy maroon bags, 3 clear aqua bags, 2 striped lavender bags.
|
||||
clear fuchsia bags contain 5 dark cyan bags, 1 plaid cyan bag.
|
||||
drab orange bags contain 3 mirrored purple bags, 1 striped orange bag.
|
||||
bright blue bags contain 1 bright cyan bag, 4 plaid green bags.
|
||||
muted chartreuse bags contain 4 faded beige bags, 3 faded green bags.
|
||||
plaid teal bags contain 2 mirrored orange bags, 5 plaid plum bags.
|
||||
light blue bags contain 4 faded silver bags, 3 light turquoise bags, 2 dim aqua bags, 5 posh silver bags.
|
||||
bright tan bags contain 4 striped coral bags, 1 dark fuchsia bag.
|
||||
shiny black bags contain 1 light green bag.
|
||||
plaid violet bags contain 1 faded magenta bag, 1 shiny bronze bag, 2 vibrant tomato bags.
|
||||
posh bronze bags contain 4 shiny gold bags, 1 bright yellow bag, 1 dull cyan bag.
|
||||
light red bags contain 3 dotted black bags, 5 pale coral bags.
|
||||
striped red bags contain no other bags.
|
||||
clear tan bags contain 2 faded brown bags, 1 bright brown bag, 2 bright gold bags.
|
||||
dull turquoise bags contain 5 mirrored yellow bags, 3 wavy red bags, 5 faded purple bags, 4 clear green bags.
|
||||
plaid yellow bags contain 4 dark red bags, 3 dull tomato bags, 5 faded violet bags.
|
||||
dotted gold bags contain 2 dotted lime bags, 2 faded gray bags, 3 clear coral bags.
|
||||
dull bronze bags contain 2 pale red bags, 3 dim indigo bags.
|
||||
shiny green bags contain 2 pale red bags, 1 mirrored silver bag, 4 bright lime bags, 5 pale indigo bags.
|
||||
bright black bags contain 2 striped plum bags, 1 clear black bag, 4 clear olive bags.
|
||||
bright gold bags contain 3 wavy cyan bags, 1 dotted magenta bag, 1 muted salmon bag, 4 light maroon bags.
|
||||
muted violet bags contain 5 wavy cyan bags, 4 dim tan bags, 1 posh gray bag, 5 vibrant brown bags.
|
||||
dim turquoise bags contain 1 pale tomato bag, 2 dotted silver bags, 5 mirrored coral bags.
|
||||
drab lime bags contain 5 shiny gold bags.
|
||||
wavy bronze bags contain 1 shiny red bag, 4 dotted cyan bags.
|
||||
vibrant purple bags contain 4 drab chartreuse bags, 4 dotted yellow bags.
|
||||
plaid purple bags contain 2 drab beige bags, 3 pale aqua bags, 3 muted magenta bags.
|
||||
faded brown bags contain 3 faded beige bags, 1 light chartreuse bag, 4 mirrored gold bags.
|
||||
pale lavender bags contain 1 mirrored tomato bag, 5 wavy maroon bags, 4 wavy lime bags.
|
||||
posh fuchsia bags contain 5 posh orange bags.
|
||||
drab fuchsia bags contain 1 dim plum bag, 1 dark coral bag, 3 dark red bags.
|
||||
striped crimson bags contain 5 pale orange bags, 5 faded beige bags, 5 faded brown bags.
|
||||
wavy lime bags contain 5 dull crimson bags.
|
||||
vibrant fuchsia bags contain 2 wavy white bags.
|
||||
vibrant plum bags contain 4 dim salmon bags, 2 plaid tan bags, 3 dull blue bags.
|
||||
muted cyan bags contain 3 striped beige bags.
|
||||
clear teal bags contain 2 wavy aqua bags, 3 dotted plum bags.
|
||||
dark maroon bags contain 1 light violet bag, 3 clear plum bags, 5 dotted fuchsia bags, 2 vibrant tomato bags.
|
||||
dull black bags contain 5 muted olive bags.
|
||||
light yellow bags contain 1 dull white bag, 5 dark aqua bags, 3 light purple bags, 4 dim green bags.
|
||||
pale bronze bags contain 1 wavy aqua bag.
|
||||
plaid red bags contain 5 pale plum bags, 2 muted brown bags, 2 dull bronze bags.
|
||||
dim gray bags contain 2 muted lavender bags.
|
||||
plaid gray bags contain 5 muted aqua bags.
|
||||
vibrant blue bags contain 4 light tomato bags, 1 plaid beige bag.
|
||||
clear blue bags contain 5 clear plum bags, 5 drab chartreuse bags.
|
||||
dotted green bags contain 5 plaid white bags, 5 vibrant turquoise bags, 1 drab silver bag.
|
||||
dull crimson bags contain 3 mirrored yellow bags, 3 posh red bags, 3 faded brown bags.
|
||||
striped maroon bags contain 1 shiny magenta bag, 2 light brown bags, 4 dull green bags.
|
||||
dark yellow bags contain 4 faded silver bags, 5 shiny lavender bags, 4 dim crimson bags, 2 plaid bronze bags.
|
||||
pale indigo bags contain 4 plaid salmon bags, 3 striped purple bags, 5 pale magenta bags, 1 dotted lime bag.
|
||||
faded maroon bags contain 5 light silver bags, 5 dim bronze bags, 4 faded tan bags, 5 striped crimson bags.
|
||||
pale green bags contain 4 vibrant white bags.
|
||||
muted maroon bags contain 2 light black bags, 2 mirrored fuchsia bags.
|
||||
pale yellow bags contain 2 dull bronze bags, 4 bright maroon bags, 5 wavy cyan bags, 4 dotted lavender bags.
|
||||
posh white bags contain 3 mirrored turquoise bags, 3 shiny aqua bags, 2 striped blue bags, 4 faded coral bags.
|
||||
wavy orange bags contain 4 wavy crimson bags, 2 bright brown bags, 3 bright magenta bags, 1 dotted gold bag.
|
||||
dark beige bags contain 3 muted white bags.
|
||||
dotted salmon bags contain 5 dim bronze bags, 5 striped orange bags.
|
||||
dotted fuchsia bags contain 1 striped red bag, 4 bright purple bags.
|
||||
pale cyan bags contain 1 dull blue bag.
|
||||
mirrored purple bags contain 5 light turquoise bags, 2 faded silver bags.
|
||||
drab violet bags contain 1 vibrant turquoise bag, 2 muted chartreuse bags, 5 pale bronze bags.
|
||||
wavy gray bags contain 1 dark purple bag, 4 muted green bags.
|
||||
wavy magenta bags contain 5 dark white bags, 4 vibrant black bags, 4 muted coral bags.
|
||||
pale plum bags contain 5 mirrored brown bags, 2 pale red bags.
|
||||
light plum bags contain 4 dark tomato bags, 4 wavy gold bags.
|
||||
pale aqua bags contain 1 striped red bag, 2 dim crimson bags, 3 mirrored orange bags.
|
||||
muted green bags contain 1 mirrored yellow bag.
|
||||
bright purple bags contain 5 light violet bags, 5 clear magenta bags, 1 faded lime bag.
|
||||
dark green bags contain 2 shiny aqua bags.
|
||||
dark orange bags contain 3 striped coral bags.
|
||||
dotted chartreuse bags contain 1 bright lime bag, 1 light olive bag, 4 muted red bags, 1 posh chartreuse bag.
|
||||
shiny chartreuse bags contain 1 bright salmon bag, 1 plaid indigo bag.
|
||||
clear gold bags contain 5 dull lime bags, 4 shiny brown bags, 1 dull plum bag, 4 dull salmon bags.
|
||||
shiny salmon bags contain 2 muted salmon bags, 2 dotted lavender bags.
|
||||
striped cyan bags contain 3 drab tan bags, 5 dotted cyan bags, 1 posh aqua bag, 1 plaid magenta bag.
|
||||
dark plum bags contain 1 clear orange bag, 2 striped black bags.
|
||||
vibrant magenta bags contain 1 plaid tan bag, 3 muted bronze bags, 3 bright chartreuse bags.
|
||||
clear beige bags contain 4 muted tan bags, 1 clear turquoise bag, 4 mirrored turquoise bags, 2 bright silver bags.
|
||||
drab lavender bags contain 1 dotted cyan bag, 4 clear plum bags.
|
||||
shiny coral bags contain 2 drab beige bags.
|
||||
light bronze bags contain 2 mirrored plum bags, 2 light black bags.
|
||||
vibrant yellow bags contain 4 vibrant coral bags, 5 mirrored olive bags, 1 light lime bag, 2 muted crimson bags.
|
||||
vibrant salmon bags contain 4 faded beige bags, 2 faded olive bags, 1 pale brown bag.
|
||||
dim tan bags contain 3 faded beige bags, 4 light tan bags.
|
||||
vibrant silver bags contain 1 dark tomato bag.
|
||||
striped salmon bags contain 5 faded brown bags.
|
||||
shiny purple bags contain 1 pale lavender bag, 3 plaid black bags, 1 drab indigo bag.
|
||||
light turquoise bags contain 4 dark silver bags.
|
||||
dark chartreuse bags contain 5 dark silver bags.
|
||||
mirrored indigo bags contain 5 mirrored gold bags, 1 dotted white bag.
|
||||
faded olive bags contain 1 pale brown bag, 3 faded beige bags, 2 light chartreuse bags.
|
||||
mirrored black bags contain 5 posh purple bags.
|
||||
clear green bags contain 2 dark magenta bags, 5 faded gold bags, 4 striped teal bags, 4 dark purple bags.
|
||||
bright beige bags contain 3 light olive bags, 3 wavy orange bags, 4 dotted lavender bags.
|
||||
plaid brown bags contain 4 dull lavender bags, 3 drab gold bags.
|
||||
vibrant chartreuse bags contain 1 bright bronze bag, 5 wavy crimson bags.
|
||||
posh aqua bags contain 5 muted green bags, 2 dim green bags, 1 dim crimson bag, 1 posh red bag.
|
||||
vibrant gold bags contain 5 wavy chartreuse bags, 3 drab gold bags, 2 striped blue bags, 3 posh yellow bags.
|
||||
posh tan bags contain 1 shiny chartreuse bag, 2 drab bronze bags.
|
||||
bright violet bags contain 1 pale lavender bag, 5 mirrored olive bags, 1 posh turquoise bag.
|
||||
faded lime bags contain 5 pale brown bags, 4 faded black bags, 1 faded beige bag.
|
||||
vibrant gray bags contain 3 vibrant chartreuse bags, 3 bright purple bags.
|
||||
dull silver bags contain 5 pale tomato bags, 5 shiny turquoise bags, 2 mirrored yellow bags.
|
||||
pale maroon bags contain 3 posh red bags, 1 plaid bronze bag, 5 striped red bags.
|
||||
dull lavender bags contain 4 vibrant violet bags, 1 bright yellow bag, 3 bright aqua bags.
|
||||
light aqua bags contain 5 vibrant turquoise bags.
|
||||
striped violet bags contain 4 drab silver bags, 3 posh magenta bags, 3 wavy turquoise bags.
|
||||
bright green bags contain 3 drab teal bags.
|
||||
light coral bags contain 5 dotted violet bags, 4 pale chartreuse bags.
|
||||
muted salmon bags contain 4 vibrant turquoise bags, 5 clear chartreuse bags, 1 dark fuchsia bag, 5 bright bronze bags.
|
||||
wavy cyan bags contain 4 dim orange bags, 1 dull orange bag, 4 plaid indigo bags, 4 dim salmon bags.
|
||||
shiny red bags contain 1 dim blue bag, 4 clear plum bags.
|
||||
vibrant beige bags contain 3 posh red bags.
|
||||
shiny maroon bags contain 3 striped tomato bags, 2 faded lime bags.
|
||||
shiny aqua bags contain 3 bright yellow bags.
|
||||
bright aqua bags contain 5 wavy lavender bags, 4 striped coral bags, 5 dotted cyan bags, 3 drab cyan bags.
|
||||
dim olive bags contain 2 posh blue bags, 5 vibrant violet bags, 3 drab brown bags, 1 dull purple bag.
|
||||
shiny silver bags contain 5 dim green bags, 4 dull cyan bags.
|
||||
dim brown bags contain 1 wavy brown bag, 3 drab black bags.
|
||||
dotted brown bags contain 3 drab crimson bags, 1 shiny red bag.
|
||||
striped coral bags contain 4 striped red bags, 1 dotted cyan bag.
|
||||
dotted plum bags contain 3 faded lime bags, 2 striped lavender bags, 2 wavy crimson bags, 2 faded brown bags.
|
||||
light gold bags contain 1 light silver bag, 3 posh teal bags, 3 dark orange bags, 4 bright bronze bags.
|
||||
dark tan bags contain 5 drab black bags, 2 plaid cyan bags, 3 faded yellow bags, 1 dim blue bag.
|
||||
posh olive bags contain 4 drab olive bags, 5 dull tan bags, 1 wavy chartreuse bag, 5 muted magenta bags.
|
||||
dull red bags contain 1 vibrant teal bag, 4 dim salmon bags, 1 bright violet bag, 1 dark lavender bag.
|
||||
plaid turquoise bags contain 3 faded green bags, 5 wavy crimson bags.
|
||||
plaid cyan bags contain 2 dull yellow bags, 2 dotted cyan bags, 1 light chartreuse bag, 2 faded green bags.
|
||||
dull indigo bags contain 2 faded silver bags.
|
||||
pale brown bags contain no other bags.
|
||||
striped plum bags contain 5 dull lime bags, 2 muted white bags, 3 striped teal bags.
|
||||
dotted coral bags contain 4 faded silver bags, 2 wavy aqua bags, 2 light chartreuse bags, 5 posh indigo bags.
|
||||
mirrored beige bags contain 1 plaid black bag, 2 plaid tan bags, 2 pale bronze bags.
|
||||
vibrant cyan bags contain 4 wavy beige bags, 1 shiny orange bag.
|
||||
wavy fuchsia bags contain 5 pale maroon bags, 3 drab violet bags, 2 shiny orange bags.
|
||||
drab silver bags contain 2 dark blue bags, 3 light chartreuse bags, 3 mirrored gold bags.
|
||||
wavy turquoise bags contain 5 posh red bags, 4 striped teal bags.
|
||||
bright cyan bags contain 4 bright silver bags, 1 muted gray bag, 5 faded aqua bags, 3 wavy aqua bags.
|
||||
wavy green bags contain 4 clear violet bags, 4 dark olive bags, 2 clear magenta bags, 1 mirrored black bag.
|
||||
mirrored gold bags contain 2 dark olive bags.
|
||||
wavy gold bags contain 4 plaid indigo bags.
|
||||
dotted yellow bags contain 3 dull orange bags, 2 faded green bags.
|
||||
light beige bags contain 4 dull cyan bags.
|
||||
bright crimson bags contain 1 faded tan bag, 1 faded chartreuse bag, 5 vibrant brown bags.
|
||||
dotted bronze bags contain 5 striped white bags.
|
||||
mirrored yellow bags contain 3 wavy crimson bags, 4 dark olive bags, 5 drab tan bags.
|
||||
plaid lavender bags contain 1 light tomato bag, 5 dull blue bags, 2 wavy indigo bags, 3 bright gray bags.
|
||||
drab purple bags contain 3 dotted plum bags, 5 drab olive bags, 1 drab tan bag, 3 dark black bags.
|
||||
shiny lime bags contain 2 plaid bronze bags, 1 shiny gold bag.
|
||||
drab chartreuse bags contain 2 bright bronze bags, 4 light teal bags, 1 mirrored yellow bag.
|
||||
bright plum bags contain 3 drab turquoise bags.
|
||||
light orange bags contain 1 shiny lavender bag, 2 dark fuchsia bags, 1 muted olive bag, 4 wavy olive bags.
|
||||
striped beige bags contain 4 dull crimson bags, 5 dotted fuchsia bags.
|
||||
wavy chartreuse bags contain 2 bright salmon bags, 5 faded green bags, 1 mirrored black bag.
|
||||
striped tomato bags contain no other bags.
|
||||
plaid aqua bags contain 1 light magenta bag, 3 pale white bags, 3 clear blue bags, 4 dull crimson bags.
|
||||
plaid tan bags contain 3 dull green bags, 1 light silver bag, 5 dim orange bags, 1 dark blue bag.
|
||||
dotted cyan bags contain 2 wavy black bags, 3 striped teal bags.
|
||||
dull green bags contain 1 plaid magenta bag, 3 dull plum bags, 4 dim green bags.
|
||||
faded purple bags contain 5 mirrored cyan bags, 1 dull beige bag, 4 vibrant purple bags.
|
||||
dotted maroon bags contain 1 vibrant beige bag, 3 plaid magenta bags.
|
||||
faded aqua bags contain 4 plaid gold bags, 1 plaid yellow bag, 2 bright lime bags.
|
||||
pale lime bags contain 1 light blue bag.
|
||||
dark indigo bags contain 1 light gold bag.
|
||||
shiny orange bags contain 2 plaid black bags, 2 faded brown bags, 4 plaid indigo bags.
|
||||
muted olive bags contain 1 wavy chartreuse bag.
|
||||
muted purple bags contain 4 dotted silver bags.
|
||||
plaid black bags contain 3 drab silver bags.
|
||||
striped lavender bags contain 5 wavy crimson bags.
|
||||
posh chartreuse bags contain 5 drab chartreuse bags.
|
||||
clear purple bags contain 3 faded green bags, 2 bright gold bags.
|
||||
dark crimson bags contain 4 plaid teal bags, 4 muted cyan bags.
|
||||
clear silver bags contain 3 pale beige bags, 2 mirrored tomato bags.
|
||||
dotted indigo bags contain 2 dark plum bags, 2 clear magenta bags, 3 light olive bags.
|
||||
dull chartreuse bags contain 2 light turquoise bags, 3 drab brown bags.
|
||||
bright brown bags contain 4 light purple bags, 1 vibrant coral bag.
|
||||
dim salmon bags contain 2 dull salmon bags.
|
||||
muted lime bags contain 4 muted violet bags, 5 shiny white bags.
|
||||
vibrant lime bags contain 2 mirrored bronze bags, 1 dotted crimson bag, 5 dim yellow bags, 2 mirrored gold bags.
|
||||
muted silver bags contain 1 striped orange bag, 3 drab purple bags.
|
||||
mirrored bronze bags contain 4 dull bronze bags.
|
||||
light olive bags contain 4 mirrored olive bags, 2 dim lime bags, 1 clear magenta bag.
|
||||
vibrant tan bags contain 2 shiny teal bags.
|
||||
posh red bags contain 2 bright bronze bags, 5 striped teal bags, 5 faded beige bags, 4 faded olive bags.
|
||||
faded red bags contain 4 striped lavender bags, 4 posh red bags.
|
||||
mirrored brown bags contain 3 dim salmon bags, 4 drab chartreuse bags, 1 wavy tomato bag.
|
||||
dark gray bags contain 1 muted tan bag, 4 faded blue bags, 2 dim chartreuse bags.
|
||||
dark white bags contain 4 vibrant lime bags, 4 pale olive bags.
|
||||
striped silver bags contain 4 dim cyan bags.
|
||||
clear salmon bags contain 5 pale magenta bags, 1 mirrored salmon bag.
|
||||
pale white bags contain 5 wavy crimson bags, 4 plaid indigo bags, 5 striped crimson bags, 3 drab violet bags.
|
||||
vibrant indigo bags contain 1 mirrored gold bag, 1 striped turquoise bag, 3 posh beige bags.
|
||||
drab aqua bags contain 5 faded crimson bags, 3 wavy gold bags, 3 striped tomato bags.
|
||||
clear brown bags contain 5 bright lavender bags.
|
||||
posh indigo bags contain 5 mirrored red bags, 5 clear coral bags.
|
||||
posh black bags contain 4 dim fuchsia bags, 5 muted olive bags, 3 mirrored red bags.
|
||||
shiny lavender bags contain 2 muted aqua bags, 3 striped black bags, 3 wavy salmon bags, 3 mirrored purple bags.
|
||||
vibrant bronze bags contain 1 bright tan bag, 5 faded beige bags, 5 pale red bags, 1 plaid cyan bag.
|
||||
clear chartreuse bags contain 2 shiny gold bags, 1 wavy turquoise bag, 2 muted crimson bags.
|
||||
drab tan bags contain no other bags.
|
||||
posh gold bags contain 5 dotted beige bags, 1 striped crimson bag, 5 drab purple bags, 1 bright gray bag.
|
||||
clear olive bags contain 3 dark tomato bags.
|
||||
dim aqua bags contain 4 wavy black bags, 5 clear chartreuse bags, 5 clear aqua bags.
|
||||
pale coral bags contain 2 shiny orange bags, 5 dark black bags, 3 vibrant coral bags.
|
||||
drab blue bags contain 5 dull salmon bags.
|
||||
vibrant white bags contain 2 mirrored yellow bags.
|
||||
faded indigo bags contain 5 clear aqua bags.
|
||||
posh turquoise bags contain 1 light purple bag, 4 mirrored salmon bags.
|
||||
dotted orange bags contain 5 dark blue bags, 1 shiny lavender bag, 2 dim plum bags, 3 clear violet bags.
|
||||
muted crimson bags contain 4 wavy crimson bags, 1 light magenta bag, 3 clear plum bags.
|
||||
dim coral bags contain 1 vibrant red bag, 2 vibrant magenta bags.
|
||||
mirrored plum bags contain 5 light olive bags.
|
||||
dull violet bags contain 2 dim aqua bags.
|
||||
faded violet bags contain 5 clear violet bags, 5 muted indigo bags, 3 clear red bags, 1 posh tan bag.
|
||||
vibrant crimson bags contain 1 shiny crimson bag.
|
||||
muted plum bags contain 3 drab beige bags, 4 posh maroon bags.
|
||||
dim orange bags contain 5 bright salmon bags.
|
||||
dim blue bags contain 1 mirrored black bag, 3 faded blue bags.
|
||||
mirrored tan bags contain 5 plaid plum bags.
|
||||
pale crimson bags contain 4 dim green bags, 2 pale fuchsia bags.
|
||||
bright white bags contain 2 drab gold bags, 2 shiny maroon bags, 5 mirrored lime bags.
|
||||
dim indigo bags contain 1 mirrored cyan bag, 1 wavy purple bag, 1 drab brown bag.
|
||||
dotted violet bags contain 4 bright teal bags, 2 vibrant plum bags.
|
||||
wavy indigo bags contain 2 drab silver bags, 1 muted chartreuse bag, 1 drab aqua bag, 3 mirrored teal bags.
|
||||
dark cyan bags contain 1 muted magenta bag, 3 vibrant violet bags, 4 mirrored aqua bags, 5 drab violet bags.
|
||||
posh maroon bags contain 5 muted chartreuse bags, 4 dark olive bags.
|
||||
drab tomato bags contain 2 plaid tan bags, 2 posh purple bags, 2 posh beige bags.
|
||||
wavy tan bags contain 5 light cyan bags, 5 muted brown bags, 5 mirrored coral bags, 5 light chartreuse bags.
|
||||
faded bronze bags contain 4 dotted magenta bags.
|
||||
pale blue bags contain 5 pale purple bags.
|
||||
dim magenta bags contain 5 posh aqua bags, 5 dim crimson bags, 4 wavy gold bags, 2 shiny orange bags.
|
||||
dark fuchsia bags contain 2 drab silver bags.
|
||||
wavy white bags contain 4 vibrant turquoise bags, 2 clear violet bags, 1 dull salmon bag.
|
||||
drab maroon bags contain 3 pale tomato bags, 2 dim chartreuse bags, 5 mirrored orange bags, 4 drab violet bags.
|
||||
muted fuchsia bags contain 4 muted bronze bags, 4 plaid brown bags, 1 faded white bag.
|
||||
plaid gold bags contain 3 vibrant bronze bags, 5 striped chartreuse bags.
|
||||
faded green bags contain 2 dull cyan bags, 5 posh purple bags.
|
||||
light indigo bags contain 5 mirrored tomato bags.
|
||||
striped white bags contain 5 clear plum bags.
|
||||
posh magenta bags contain 5 wavy crimson bags, 3 striped coral bags.
|
||||
drab olive bags contain 4 striped orange bags.
|
||||
plaid indigo bags contain 1 plaid turquoise bag.
|
||||
dark brown bags contain 2 faded tan bags, 5 wavy green bags.
|
||||
faded cyan bags contain 2 bright violet bags, 3 mirrored salmon bags.
|
||||
dim lavender bags contain 2 mirrored fuchsia bags, 3 pale magenta bags, 2 dotted tan bags, 4 posh bronze bags.
|
||||
dull maroon bags contain 3 dark silver bags, 5 dim plum bags.
|
||||
dull teal bags contain 3 pale green bags.
|
||||
shiny yellow bags contain 4 dotted fuchsia bags.
|
||||
mirrored crimson bags contain 5 dotted plum bags.
|
||||
drab beige bags contain 3 faded orange bags, 3 dark orange bags, 4 clear orange bags.
|
||||
dull olive bags contain 2 vibrant bronze bags, 4 shiny chartreuse bags.
|
||||
wavy red bags contain 2 wavy brown bags, 1 wavy olive bag, 3 striped cyan bags.
|
||||
light gray bags contain 1 pale salmon bag, 2 plaid bronze bags, 5 dull yellow bags.
|
||||
faded gray bags contain 4 muted green bags, 5 faded red bags, 3 muted magenta bags, 5 bright magenta bags.
|
||||
drab indigo bags contain 1 posh gold bag, 2 dull lime bags, 1 pale orange bag.
|
||||
bright yellow bags contain 4 posh red bags, 4 shiny gold bags.
|
||||
drab bronze bags contain 4 dark indigo bags.
|
||||
striped gold bags contain 3 faded yellow bags, 2 mirrored tomato bags, 1 bright lime bag.
|
||||
muted gold bags contain 4 dim violet bags.
|
||||
plaid olive bags contain 3 wavy fuchsia bags.
|
||||
bright gray bags contain 4 bright bronze bags, 1 plaid white bag, 1 pale bronze bag.
|
||||
clear turquoise bags contain 2 mirrored purple bags, 2 light gold bags, 4 dim cyan bags, 5 wavy olive bags.
|
||||
wavy plum bags contain 4 bright yellow bags.
|
||||
dull blue bags contain 4 dotted lavender bags.
|
||||
posh gray bags contain 4 faded blue bags, 2 dull brown bags, 1 clear cyan bag.
|
||||
pale black bags contain 5 dim cyan bags, 4 bright white bags.
|
||||
wavy blue bags contain 3 faded olive bags, 5 bright lavender bags, 1 wavy black bag, 2 posh magenta bags.
|
||||
posh beige bags contain 2 light cyan bags, 1 wavy violet bag, 1 muted olive bag.
|
||||
clear plum bags contain 3 dull cyan bags.
|
||||
drab cyan bags contain 5 plaid green bags.
|
||||
vibrant aqua bags contain 5 posh maroon bags.
|
||||
dim silver bags contain 5 shiny gold bags, 5 posh magenta bags, 1 light white bag.
|
||||
posh brown bags contain 4 plaid salmon bags, 2 vibrant blue bags, 2 posh olive bags.
|
||||
dark teal bags contain 1 faded brown bag.
|
||||
clear white bags contain 5 vibrant tan bags, 5 light purple bags, 3 posh tan bags, 4 faded beige bags.
|
||||
dim maroon bags contain 2 plaid chartreuse bags, 1 dim gray bag, 2 drab gold bags, 5 light white bags.
|
||||
dull salmon bags contain 5 striped teal bags, 3 dark blue bags, 3 drab tan bags, 5 wavy crimson bags.
|
||||
dull coral bags contain 1 faded red bag, 2 shiny teal bags, 3 bright gray bags, 1 pale brown bag.
|
||||
dark violet bags contain 1 clear cyan bag, 4 mirrored beige bags, 2 vibrant turquoise bags.
|
||||
vibrant maroon bags contain 1 muted magenta bag, 3 muted olive bags, 2 shiny turquoise bags.
|
||||
posh orange bags contain 5 dark black bags, 3 pale maroon bags, 5 dull plum bags.
|
||||
clear indigo bags contain 4 faded tan bags, 3 clear orange bags, 1 vibrant aqua bag.
|
||||
clear gray bags contain 4 dull salmon bags, 5 dark magenta bags.
|
||||
shiny turquoise bags contain 4 muted green bags, 4 vibrant beige bags, 5 mirrored cyan bags, 4 striped blue bags.
|
||||
pale salmon bags contain 1 dark silver bag, 4 dim green bags.
|
||||
striped gray bags contain 3 dark lavender bags.
|
||||
dull yellow bags contain 2 dark blue bags, 4 striped tomato bags, 2 striped red bags, 3 pale brown bags.
|
||||
posh yellow bags contain 1 dull green bag, 1 dull plum bag.
|
||||
plaid white bags contain 3 plaid turquoise bags, 4 dotted cyan bags, 3 shiny gold bags, 5 clear plum bags.
|
||||
faded orange bags contain 1 dull silver bag, 4 clear gray bags, 1 posh tomato bag, 2 wavy yellow bags.
|
||||
dim violet bags contain 4 drab silver bags, 1 dull yellow bag, 3 faded blue bags.
|
||||
light green bags contain 3 drab gold bags, 4 wavy purple bags.
|
||||
dark magenta bags contain 2 light gold bags, 5 drab violet bags.
|
||||
dark purple bags contain 5 plaid beige bags.
|
||||
mirrored blue bags contain 2 plaid tan bags.
|
||||
dim lime bags contain 1 dotted beige bag, 2 striped white bags, 5 dim blue bags, 5 wavy blue bags.
|
||||
bright chartreuse bags contain 3 clear orange bags.
|
||||
vibrant brown bags contain 3 mirrored violet bags, 5 dull green bags, 2 pale magenta bags.
|
||||
drab salmon bags contain 4 muted magenta bags.
|
||||
muted teal bags contain 5 dark black bags, 5 light gold bags.
|
||||
striped lime bags contain 1 dim orange bag.
|
||||
plaid crimson bags contain 4 dim teal bags, 3 dull salmon bags.
|
||||
posh plum bags contain 5 pale gray bags.
|
||||
light maroon bags contain 4 drab violet bags, 2 faded brown bags, 2 striped black bags, 3 striped coral bags.
|
||||
pale gray bags contain 1 dark aqua bag, 3 mirrored tomato bags.
|
||||
light chartreuse bags contain no other bags.
|
||||
dim crimson bags contain 5 faded blue bags, 1 dark blue bag, 2 striped teal bags.
|
||||
dim beige bags contain 5 wavy silver bags, 1 wavy orange bag, 1 dim lime bag, 2 mirrored lime bags.
|
||||
bright teal bags contain 1 dull violet bag, 1 faded beige bag, 3 faded orange bags.
|
||||
striped green bags contain 2 drab gold bags, 5 posh olive bags, 4 light indigo bags, 1 clear yellow bag.
|
||||
striped black bags contain 4 striped crimson bags, 1 pale red bag.
|
||||
plaid beige bags contain 3 pale tomato bags.
|
||||
drab plum bags contain 4 striped coral bags, 3 dotted crimson bags.
|
||||
plaid orange bags contain 4 bright aqua bags.
|
||||
wavy maroon bags contain 1 dim orange bag, 1 dim violet bag, 4 posh chartreuse bags, 5 plaid tan bags.
|
||||
dim purple bags contain 1 mirrored black bag, 1 plaid plum bag, 4 striped teal bags, 1 posh aqua bag.
|
||||
mirrored red bags contain 2 shiny salmon bags, 3 bright salmon bags, 1 vibrant salmon bag.
|
||||
striped brown bags contain 3 light lime bags, 1 drab black bag, 2 dull white bags, 5 drab lavender bags.
|
||||
dim red bags contain 2 mirrored black bags.
|
||||
clear lavender bags contain 5 pale fuchsia bags.
|
||||
bright bronze bags contain 2 striped teal bags, 4 clear plum bags, 3 dim crimson bags, 5 faded black bags.
|
||||
shiny violet bags contain 2 dark gold bags, 3 posh maroon bags.
|
||||
bright lime bags contain 2 clear magenta bags, 3 dark blue bags, 4 striped lavender bags, 1 dull crimson bag.
|
||||
mirrored silver bags contain 1 vibrant tomato bag, 4 dull salmon bags, 5 plaid green bags, 4 wavy brown bags.
|
||||
dotted olive bags contain 5 faded beige bags.
|
||||
posh tomato bags contain 2 faded purple bags.
|
||||
posh teal bags contain 2 drab tan bags, 3 striped red bags, 3 dull salmon bags, 1 striped lavender bag.
|
||||
shiny tomato bags contain 3 posh indigo bags.
|
||||
dotted crimson bags contain 1 pale gray bag.
|
||||
shiny indigo bags contain 1 pale beige bag.
|
||||
plaid lime bags contain 1 light maroon bag.
|
||||
mirrored turquoise bags contain 5 faded bronze bags.
|
||||
drab crimson bags contain 1 vibrant plum bag.
|
||||
dim black bags contain 3 muted tan bags, 3 drab silver bags, 4 dull white bags.
|
||||
faded yellow bags contain 5 faded black bags.
|
||||
faded white bags contain 2 wavy lavender bags, 1 shiny orange bag.
|
||||
plaid tomato bags contain 2 shiny brown bags, 3 clear red bags.
|
||||
drab white bags contain 5 dark yellow bags.
|
||||
mirrored tomato bags contain 2 light gold bags, 1 mirrored gold bag, 4 dim plum bags.
|
||||
plaid maroon bags contain 2 mirrored lime bags, 3 plaid salmon bags, 2 shiny chartreuse bags.
|
||||
drab gold bags contain 1 dim plum bag, 2 mirrored violet bags.
|
||||
muted orange bags contain 3 mirrored lime bags, 1 muted maroon bag, 5 drab violet bags, 2 posh green bags.
|
||||
mirrored fuchsia bags contain 3 dim plum bags, 2 muted olive bags, 2 wavy white bags, 1 dotted cyan bag.
|
||||
plaid silver bags contain 3 pale violet bags, 5 striped purple bags, 5 dull purple bags.
|
||||
dotted silver bags contain 2 vibrant coral bags.
|
||||
shiny cyan bags contain 4 mirrored teal bags, 4 faded magenta bags, 4 bright lime bags, 1 vibrant teal bag.
|
||||
clear yellow bags contain 1 muted brown bag, 5 wavy lime bags.
|
||||
muted red bags contain 5 muted coral bags, 2 light violet bags, 2 muted indigo bags, 4 dotted tan bags.
|
||||
dull beige bags contain 5 plaid black bags, 2 pale white bags, 2 light violet bags, 1 pale crimson bag.
|
||||
vibrant lavender bags contain 3 dark chartreuse bags, 4 bright lavender bags.
|
||||
posh lime bags contain 1 shiny cyan bag, 4 dotted blue bags, 3 mirrored chartreuse bags.
|
||||
shiny blue bags contain 1 dotted magenta bag.
|
||||
muted yellow bags contain 4 plaid salmon bags, 4 dull tomato bags.
|
||||
muted blue bags contain 5 wavy magenta bags, 3 vibrant gray bags.
|
||||
dotted tan bags contain 1 wavy green bag, 1 dim plum bag.
|
||||
drab red bags contain 2 dark olive bags, 5 mirrored tan bags, 3 dull coral bags, 4 plaid yellow bags.
|
||||
dull tomato bags contain 2 clear aqua bags, 2 dark fuchsia bags, 2 light teal bags.
|
||||
bright salmon bags contain 5 dark blue bags.
|
||||
pale olive bags contain 1 light violet bag, 3 shiny bronze bags, 2 dotted magenta bags, 4 posh silver bags.
|
||||
mirrored teal bags contain 4 posh chartreuse bags, 5 vibrant bronze bags.
|
||||
mirrored chartreuse bags contain 3 striped olive bags, 3 mirrored maroon bags, 5 faded black bags, 3 pale plum bags.
|
||||
pale orange bags contain 4 mirrored gold bags, 3 faded brown bags, 2 dark olive bags.
|
||||
dark olive bags contain no other bags.
|
||||
faded plum bags contain 5 bright green bags, 5 shiny beige bags, 2 vibrant indigo bags, 1 mirrored orange bag.
|
||||
drab magenta bags contain 5 dark fuchsia bags, 5 striped salmon bags.
|
||||
dark lavender bags contain 5 mirrored red bags, 4 vibrant aqua bags, 2 dotted tan bags.
|
||||
shiny bronze bags contain 2 clear aqua bags, 2 dull salmon bags, 1 plaid turquoise bag, 3 plaid bronze bags.
|
||||
faded magenta bags contain 2 mirrored gold bags, 5 dim orange bags.
|
||||
light lavender bags contain 3 striped magenta bags, 5 light yellow bags.
|
||||
clear tomato bags contain 3 dark bronze bags, 5 plaid aqua bags, 2 faded lime bags, 2 bright salmon bags.
|
||||
clear lime bags contain 1 mirrored lavender bag, 3 bright silver bags, 3 pale teal bags.
|
||||
light lime bags contain 4 dim crimson bags, 2 vibrant tomato bags, 4 posh red bags.
|
||||
wavy yellow bags contain 3 muted chartreuse bags, 3 drab teal bags, 4 striped tomato bags.
|
||||
dark silver bags contain 5 posh magenta bags, 1 plaid black bag, 3 faded brown bags.
|
||||
bright maroon bags contain 5 dotted turquoise bags, 3 wavy silver bags, 2 dotted lime bags.
|
||||
striped orange bags contain 5 striped coral bags, 3 posh teal bags.
|
||||
bright silver bags contain 3 mirrored violet bags, 5 striped gold bags, 1 striped white bag, 4 clear chartreuse bags.
|
||||
mirrored olive bags contain 4 light silver bags, 1 muted crimson bag.
|
||||
dim gold bags contain 3 clear magenta bags.
|
||||
shiny plum bags contain 5 muted olive bags, 5 dark turquoise bags, 2 dull green bags, 1 plaid magenta bag.
|
||||
mirrored green bags contain 5 striped magenta bags, 1 light lime bag, 2 dim cyan bags.
|
||||
wavy aqua bags contain 4 dull tan bags, 5 vibrant beige bags.
|
||||
posh lavender bags contain 4 muted black bags.
|
||||
dull lime bags contain 2 plaid black bags.
|
||||
dim chartreuse bags contain 4 bright red bags.
|
||||
muted lavender bags contain 5 faded red bags, 5 drab brown bags, 5 clear bronze bags.
|
||||
muted coral bags contain 4 clear red bags, 3 vibrant maroon bags.
|
||||
bright lavender bags contain 4 striped blue bags.
|
||||
138
7-handy_haversacs/src/main.rs
Normal file
138
7-handy_haversacs/src/main.rs
Normal file
@@ -0,0 +1,138 @@
|
||||
use std::fmt;
|
||||
|
||||
use multimap::MultiMap;
|
||||
|
||||
fn main() {
|
||||
let input = include_str!("../data/input");
|
||||
let rules = parse_rules(input);
|
||||
print!("{}", FmtRules(rules.clone()));
|
||||
|
||||
let mut reverted_rules: Rules = Default::default();
|
||||
rules.iter_all().for_each(|(container, contained)| {
|
||||
for c in contained {
|
||||
reverted_rules.insert(c.1, (1, *container));
|
||||
}
|
||||
});
|
||||
// dbg!(reverted_rules.clone());
|
||||
|
||||
let shiny_gold_spec = ("shiny", "gold");
|
||||
let mut shiny_gold_containers = find_containers(
|
||||
&reverted_rules,
|
||||
&shiny_gold_spec
|
||||
);
|
||||
shiny_gold_containers.0.sort();
|
||||
shiny_gold_containers.0.dedup();
|
||||
// shiny_gold_containers also contain shiny_gold sadly...
|
||||
dbg!(&shiny_gold_containers);
|
||||
println!("Number of bags that can contain shiny gold ones : {}", shiny_gold_containers.0.len()-1);
|
||||
|
||||
|
||||
//////// PART 2 /////////
|
||||
let shiny_gold_contained = find_containers(&rules, &shiny_gold_spec);
|
||||
// Remove 1 because the shiny gold bag actually doesn't contain itself ;)
|
||||
println!("Number of bags contained by shiny gold bags : {}", shiny_gold_contained.1 - 1);
|
||||
}
|
||||
|
||||
type BagSpec<'a> = (&'a str, &'a str);
|
||||
|
||||
type Rules<'a> = MultiMap<BagSpec<'a>, (usize, BagSpec<'a>)>;
|
||||
// Needed as you cannot implement a trait for an abstract type if not in current mod...
|
||||
struct FmtRules<'a>(Rules<'a>);
|
||||
|
||||
impl<'a> fmt::Display for FmtRules<'a> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
for ((adjective,colour), rules) in self.0.iter_all() {
|
||||
write!(f, "{} {} bags contain ", adjective, colour)?;
|
||||
if rules.is_empty() {
|
||||
write!(f, "no other bags.")?;
|
||||
} else {
|
||||
for (idx, (nb, (adj, colour))) in rules.iter().enumerate() {
|
||||
if idx > 0 { write!(f, ", ")? }
|
||||
write!(f, "{} {} {} {}", nb, adj, colour, if *nb > 1 { "bags" } else { "bag" })?;
|
||||
}
|
||||
writeln!(f, ".")?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
fn parse_rules(input: &str) -> Rules<'_> {
|
||||
let mut rules: Rules = Default::default();
|
||||
|
||||
peg::parser! {
|
||||
pub(crate) grammar parser() for str {
|
||||
pub(crate) rule root(r: &mut Rules<'input>)
|
||||
= (line(r) "." whitespace()*)* ![_]
|
||||
|
||||
rule line(r: &mut Rules<'input>)
|
||||
= bag:bag_spec() " contain " rules:rules() {
|
||||
if let Some(rules) = rules {
|
||||
for rule in rules {
|
||||
r.insert(bag, rule);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rule bag_spec() -> BagSpec<'input>
|
||||
= adjective:name() " " colour:name() " bag" "s"? {
|
||||
(adjective, colour)
|
||||
}
|
||||
|
||||
rule rules() -> Option<Vec<(usize, BagSpec<'input>)>>
|
||||
= rules:rules1()+ {Some(rules)}
|
||||
/ "no other bags" { None }
|
||||
|
||||
rule rules1() -> (usize, BagSpec<'input>)
|
||||
= n:number() " " bag:bag_spec() ", "? {
|
||||
(n, bag)
|
||||
}
|
||||
|
||||
rule name() -> &'input str
|
||||
= $((!whitespace()[_])+)
|
||||
|
||||
rule number() -> usize
|
||||
= n:$(['0'..='9']+) { n.parse().unwrap() }
|
||||
|
||||
rule whitespace() = quiet!{[' ' | '\n' | '\t']+}
|
||||
}
|
||||
}
|
||||
|
||||
parser::root(input, &mut rules).unwrap();
|
||||
rules
|
||||
}
|
||||
|
||||
fn find_containers<'a>(rr: &'a Rules, start: &'a BagSpec)
|
||||
-> (Vec<BagSpec<'a>>, usize) {
|
||||
let mut res = vec![*start];
|
||||
let mut count = 0;
|
||||
let containers = rr.get_vec(start);
|
||||
|
||||
// for c in containers.iter().flat_map(|&v|v) {
|
||||
for c in containers.into_iter().flatten().collect::<Vec<&(usize, (&str, &str))>>() {
|
||||
let mut b = find_containers(rr, &(c.1));
|
||||
res.append(&mut b.0);
|
||||
count += c.0 * b.1;
|
||||
}
|
||||
(res, count + 1)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_phase2() {
|
||||
let input = r"shiny gold bags contain 2 dark red bags.
|
||||
dark red bags contain 2 dark orange bags.
|
||||
dark orange bags contain 2 dark yellow bags.
|
||||
dark yellow bags contain 2 dark green bags.
|
||||
dark green bags contain 2 dark blue bags.
|
||||
dark blue bags contain 2 dark violet bags.
|
||||
dark violet bags contain no other bags.";
|
||||
let rules = parse_rules(input);
|
||||
let shiny_gold_spec = ("shiny", "gold");
|
||||
let shiny_gold_contained = find_containers(&rules, &shiny_gold_spec);
|
||||
assert_eq!(shiny_gold_contained.1 - 1, 126);
|
||||
}
|
||||
}
|
||||
1
8-handheld_halting/.gitignore
vendored
Normal file
1
8-handheld_halting/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
70
8-handheld_halting/Cargo.lock
generated
Normal file
70
8-handheld_halting/Cargo.lock
generated
Normal file
@@ -0,0 +1,70 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee67c11feeac938fae061b232e38e0b6d94f97a9df10e6271319325ac4c56a86"
|
||||
|
||||
[[package]]
|
||||
name = "handheld_halting"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.57"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||
11
8-handheld_halting/Cargo.toml
Normal file
11
8-handheld_halting/Cargo.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[package]
|
||||
name = "handheld_halting"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.37"
|
||||
thiserror = "1.0.23"
|
||||
623
8-handheld_halting/data/input
Normal file
623
8-handheld_halting/data/input
Normal file
@@ -0,0 +1,623 @@
|
||||
acc -17
|
||||
nop +318
|
||||
jmp +1
|
||||
acc -10
|
||||
jmp +394
|
||||
acc +43
|
||||
acc +47
|
||||
nop +570
|
||||
jmp +176
|
||||
acc -9
|
||||
jmp +322
|
||||
jmp +73
|
||||
acc +4
|
||||
acc -4
|
||||
jmp +460
|
||||
jmp +228
|
||||
acc +25
|
||||
acc +39
|
||||
jmp +50
|
||||
acc -12
|
||||
acc -14
|
||||
nop +275
|
||||
jmp +489
|
||||
acc -11
|
||||
jmp +338
|
||||
acc +21
|
||||
acc +10
|
||||
jmp +1
|
||||
acc +20
|
||||
jmp +445
|
||||
acc +7
|
||||
jmp +419
|
||||
acc -8
|
||||
acc +32
|
||||
jmp +181
|
||||
acc +19
|
||||
acc +5
|
||||
acc +46
|
||||
jmp +417
|
||||
acc +28
|
||||
acc +23
|
||||
acc +16
|
||||
jmp +225
|
||||
jmp +317
|
||||
jmp +309
|
||||
jmp +69
|
||||
acc -6
|
||||
acc -6
|
||||
jmp +127
|
||||
acc +49
|
||||
nop -38
|
||||
jmp +467
|
||||
acc +0
|
||||
acc -12
|
||||
acc -14
|
||||
jmp -46
|
||||
acc +14
|
||||
acc +2
|
||||
acc +2
|
||||
jmp +311
|
||||
acc +33
|
||||
jmp +364
|
||||
nop +234
|
||||
acc +24
|
||||
acc +37
|
||||
acc +18
|
||||
jmp +22
|
||||
jmp +303
|
||||
jmp +414
|
||||
jmp +318
|
||||
acc +22
|
||||
acc +27
|
||||
jmp +1
|
||||
jmp +150
|
||||
acc +34
|
||||
acc +15
|
||||
nop +200
|
||||
acc +6
|
||||
jmp +320
|
||||
nop +534
|
||||
acc +29
|
||||
jmp +147
|
||||
nop -20
|
||||
jmp +255
|
||||
jmp +10
|
||||
acc -15
|
||||
acc +3
|
||||
jmp +338
|
||||
nop +362
|
||||
acc -4
|
||||
jmp +1
|
||||
jmp +286
|
||||
acc -1
|
||||
jmp +497
|
||||
acc -4
|
||||
acc +23
|
||||
acc +4
|
||||
jmp +400
|
||||
acc +35
|
||||
acc +50
|
||||
jmp +133
|
||||
acc -17
|
||||
jmp -90
|
||||
jmp +7
|
||||
acc -17
|
||||
jmp +472
|
||||
acc +20
|
||||
jmp +280
|
||||
jmp +133
|
||||
jmp -15
|
||||
jmp +16
|
||||
acc -19
|
||||
acc -2
|
||||
jmp -64
|
||||
acc -17
|
||||
jmp +1
|
||||
jmp +385
|
||||
acc -5
|
||||
acc +34
|
||||
jmp +382
|
||||
acc +24
|
||||
acc -17
|
||||
acc +0
|
||||
acc +15
|
||||
jmp +466
|
||||
jmp +300
|
||||
acc +16
|
||||
jmp +302
|
||||
nop +479
|
||||
acc +16
|
||||
jmp +71
|
||||
acc +23
|
||||
jmp +1
|
||||
acc +8
|
||||
jmp +154
|
||||
jmp +410
|
||||
acc -8
|
||||
jmp +402
|
||||
acc +48
|
||||
acc +42
|
||||
acc +22
|
||||
acc +35
|
||||
jmp +50
|
||||
jmp -7
|
||||
acc -13
|
||||
acc +37
|
||||
acc +24
|
||||
jmp +243
|
||||
jmp +410
|
||||
acc -3
|
||||
acc +45
|
||||
jmp +416
|
||||
acc +2
|
||||
acc +25
|
||||
jmp -109
|
||||
jmp -41
|
||||
jmp +318
|
||||
acc -8
|
||||
acc -12
|
||||
jmp +169
|
||||
nop +393
|
||||
acc +7
|
||||
acc -12
|
||||
acc +35
|
||||
jmp +381
|
||||
acc +41
|
||||
nop -98
|
||||
acc +15
|
||||
acc -19
|
||||
jmp +218
|
||||
acc +24
|
||||
acc +47
|
||||
jmp +65
|
||||
acc +29
|
||||
jmp -129
|
||||
acc +23
|
||||
acc -13
|
||||
nop +60
|
||||
jmp -26
|
||||
nop -4
|
||||
acc -5
|
||||
acc +13
|
||||
nop -12
|
||||
jmp -13
|
||||
jmp -53
|
||||
acc +21
|
||||
jmp +276
|
||||
nop -27
|
||||
jmp +165
|
||||
acc +42
|
||||
nop +43
|
||||
jmp +1
|
||||
acc +26
|
||||
acc +22
|
||||
acc -3
|
||||
jmp +405
|
||||
acc +29
|
||||
nop -118
|
||||
acc +21
|
||||
nop -190
|
||||
jmp +217
|
||||
acc -1
|
||||
nop +223
|
||||
acc -8
|
||||
acc +45
|
||||
jmp +49
|
||||
acc +8
|
||||
acc +22
|
||||
jmp +209
|
||||
acc +44
|
||||
jmp +66
|
||||
acc +7
|
||||
acc -7
|
||||
acc +48
|
||||
jmp +318
|
||||
nop +398
|
||||
acc +2
|
||||
jmp +16
|
||||
nop +207
|
||||
nop +358
|
||||
acc +45
|
||||
acc +48
|
||||
jmp +267
|
||||
nop +248
|
||||
acc +26
|
||||
jmp +307
|
||||
acc +27
|
||||
jmp -197
|
||||
jmp -68
|
||||
acc +34
|
||||
acc +25
|
||||
acc -13
|
||||
jmp +133
|
||||
jmp -77
|
||||
acc -13
|
||||
acc +10
|
||||
jmp -193
|
||||
jmp -62
|
||||
acc +4
|
||||
acc -14
|
||||
jmp +261
|
||||
jmp +151
|
||||
jmp +208
|
||||
acc -10
|
||||
jmp +40
|
||||
acc +31
|
||||
jmp -216
|
||||
acc +23
|
||||
acc +34
|
||||
jmp +364
|
||||
nop +205
|
||||
acc -3
|
||||
acc +14
|
||||
jmp +59
|
||||
nop +359
|
||||
acc -4
|
||||
jmp +1
|
||||
jmp -248
|
||||
acc +47
|
||||
acc +35
|
||||
jmp +184
|
||||
acc +16
|
||||
nop -92
|
||||
acc -12
|
||||
jmp +354
|
||||
acc +27
|
||||
jmp -152
|
||||
acc -14
|
||||
acc -16
|
||||
acc +43
|
||||
jmp +147
|
||||
acc +45
|
||||
acc +24
|
||||
acc +6
|
||||
nop -46
|
||||
jmp +21
|
||||
acc +26
|
||||
jmp +1
|
||||
jmp +293
|
||||
acc -8
|
||||
acc +12
|
||||
acc -19
|
||||
acc -9
|
||||
jmp +94
|
||||
jmp +299
|
||||
acc +10
|
||||
acc -2
|
||||
jmp +75
|
||||
acc -7
|
||||
acc +3
|
||||
acc +47
|
||||
jmp +171
|
||||
acc +16
|
||||
acc +44
|
||||
acc -3
|
||||
jmp +14
|
||||
acc +30
|
||||
acc +34
|
||||
jmp -178
|
||||
acc +35
|
||||
nop -238
|
||||
acc +39
|
||||
jmp +1
|
||||
jmp -133
|
||||
acc +34
|
||||
acc -6
|
||||
jmp -276
|
||||
acc +1
|
||||
jmp -207
|
||||
acc +10
|
||||
jmp -43
|
||||
jmp -302
|
||||
acc -1
|
||||
nop -29
|
||||
jmp +1
|
||||
acc +17
|
||||
jmp -281
|
||||
acc +17
|
||||
jmp -109
|
||||
jmp +1
|
||||
acc +13
|
||||
nop -9
|
||||
jmp +245
|
||||
acc +5
|
||||
nop -15
|
||||
acc +3
|
||||
acc +7
|
||||
jmp +65
|
||||
acc -11
|
||||
jmp -313
|
||||
acc +47
|
||||
jmp +29
|
||||
jmp -289
|
||||
acc +18
|
||||
acc -17
|
||||
nop +73
|
||||
acc -12
|
||||
jmp +80
|
||||
acc +32
|
||||
acc -4
|
||||
acc +3
|
||||
jmp -126
|
||||
acc +16
|
||||
jmp -275
|
||||
nop -188
|
||||
acc -3
|
||||
acc +14
|
||||
jmp -155
|
||||
acc +33
|
||||
acc -19
|
||||
nop -166
|
||||
acc +20
|
||||
jmp +30
|
||||
nop -169
|
||||
acc +49
|
||||
nop +168
|
||||
jmp -24
|
||||
nop -345
|
||||
acc +34
|
||||
jmp -40
|
||||
jmp -56
|
||||
jmp +29
|
||||
jmp +191
|
||||
acc +24
|
||||
jmp +219
|
||||
acc +34
|
||||
acc +27
|
||||
acc +11
|
||||
jmp -260
|
||||
jmp -339
|
||||
acc +15
|
||||
nop +16
|
||||
jmp +1
|
||||
jmp +138
|
||||
jmp +1
|
||||
jmp +1
|
||||
jmp +14
|
||||
acc -11
|
||||
acc +45
|
||||
jmp -19
|
||||
acc +0
|
||||
jmp +27
|
||||
acc +0
|
||||
nop +128
|
||||
jmp -65
|
||||
nop -23
|
||||
jmp -318
|
||||
jmp -325
|
||||
jmp +1
|
||||
jmp -229
|
||||
jmp -270
|
||||
jmp -137
|
||||
acc +34
|
||||
acc +7
|
||||
jmp +1
|
||||
jmp -346
|
||||
acc +18
|
||||
jmp +37
|
||||
acc +40
|
||||
acc -16
|
||||
nop -146
|
||||
acc +35
|
||||
jmp -12
|
||||
acc +1
|
||||
acc +27
|
||||
acc +44
|
||||
acc +8
|
||||
jmp -276
|
||||
acc +16
|
||||
acc +42
|
||||
nop -342
|
||||
acc +13
|
||||
jmp -165
|
||||
acc -11
|
||||
acc -17
|
||||
acc -10
|
||||
jmp -26
|
||||
acc +10
|
||||
acc +43
|
||||
jmp -276
|
||||
acc +5
|
||||
acc +34
|
||||
acc +17
|
||||
acc -9
|
||||
jmp +99
|
||||
acc +29
|
||||
jmp -370
|
||||
acc -11
|
||||
jmp -412
|
||||
acc +47
|
||||
acc +21
|
||||
acc -12
|
||||
jmp -136
|
||||
jmp -124
|
||||
acc +12
|
||||
acc +0
|
||||
acc +25
|
||||
acc +27
|
||||
jmp -290
|
||||
acc +5
|
||||
acc +49
|
||||
acc +32
|
||||
nop +29
|
||||
jmp -202
|
||||
nop -296
|
||||
acc -12
|
||||
acc +9
|
||||
acc +21
|
||||
jmp +23
|
||||
jmp -345
|
||||
acc +26
|
||||
nop -123
|
||||
jmp -373
|
||||
nop +118
|
||||
jmp +43
|
||||
acc -15
|
||||
jmp -386
|
||||
jmp +1
|
||||
nop -370
|
||||
acc +47
|
||||
nop -141
|
||||
jmp -426
|
||||
acc +42
|
||||
acc +12
|
||||
acc +4
|
||||
nop -103
|
||||
jmp -122
|
||||
acc +23
|
||||
acc -4
|
||||
acc +11
|
||||
jmp -314
|
||||
jmp -73
|
||||
nop -1
|
||||
jmp -411
|
||||
acc +13
|
||||
acc +9
|
||||
nop -372
|
||||
jmp -293
|
||||
acc +46
|
||||
acc +3
|
||||
acc -1
|
||||
jmp +86
|
||||
acc +36
|
||||
jmp +100
|
||||
acc +27
|
||||
acc +49
|
||||
nop -4
|
||||
acc +47
|
||||
jmp -445
|
||||
acc +31
|
||||
acc +47
|
||||
acc -11
|
||||
acc +14
|
||||
jmp -181
|
||||
nop -438
|
||||
acc +31
|
||||
jmp -428
|
||||
nop -115
|
||||
nop -244
|
||||
jmp -464
|
||||
jmp -29
|
||||
nop -240
|
||||
jmp -241
|
||||
acc -12
|
||||
jmp -329
|
||||
nop +78
|
||||
acc +6
|
||||
jmp +1
|
||||
acc +49
|
||||
jmp -322
|
||||
jmp -133
|
||||
acc +20
|
||||
nop -83
|
||||
acc +35
|
||||
acc +29
|
||||
jmp -41
|
||||
acc +15
|
||||
jmp -46
|
||||
jmp -29
|
||||
acc +45
|
||||
acc -14
|
||||
acc +21
|
||||
jmp -366
|
||||
nop +84
|
||||
acc -6
|
||||
acc +25
|
||||
acc -17
|
||||
jmp -326
|
||||
acc -5
|
||||
nop -159
|
||||
acc +5
|
||||
jmp -171
|
||||
acc +42
|
||||
jmp -28
|
||||
acc +42
|
||||
acc -11
|
||||
acc +45
|
||||
acc +19
|
||||
jmp -305
|
||||
acc +38
|
||||
acc -13
|
||||
acc -16
|
||||
jmp -134
|
||||
acc +45
|
||||
jmp -256
|
||||
acc -15
|
||||
acc -18
|
||||
acc +28
|
||||
jmp -114
|
||||
acc -11
|
||||
acc +47
|
||||
nop -420
|
||||
jmp -90
|
||||
nop -330
|
||||
jmp +13
|
||||
acc -15
|
||||
acc +9
|
||||
jmp -159
|
||||
acc -12
|
||||
acc +0
|
||||
acc +0
|
||||
jmp -538
|
||||
acc +31
|
||||
acc +24
|
||||
acc +32
|
||||
acc -16
|
||||
jmp -95
|
||||
jmp -466
|
||||
acc +19
|
||||
acc +2
|
||||
jmp -172
|
||||
acc -12
|
||||
jmp -207
|
||||
acc +39
|
||||
acc +18
|
||||
acc +5
|
||||
jmp -211
|
||||
nop -507
|
||||
jmp +1
|
||||
jmp -197
|
||||
nop -227
|
||||
acc +28
|
||||
jmp -494
|
||||
acc +22
|
||||
acc +2
|
||||
acc -14
|
||||
jmp -377
|
||||
acc +8
|
||||
acc +29
|
||||
jmp -573
|
||||
acc -17
|
||||
acc +14
|
||||
acc +29
|
||||
acc +11
|
||||
jmp -351
|
||||
acc +9
|
||||
nop -540
|
||||
acc +30
|
||||
nop -344
|
||||
jmp -564
|
||||
acc -4
|
||||
nop -465
|
||||
jmp -293
|
||||
acc -18
|
||||
acc +5
|
||||
acc +29
|
||||
jmp -302
|
||||
acc -17
|
||||
acc +14
|
||||
acc +2
|
||||
acc -11
|
||||
jmp -527
|
||||
jmp -563
|
||||
acc +14
|
||||
acc +10
|
||||
jmp -505
|
||||
acc +43
|
||||
jmp -188
|
||||
nop -448
|
||||
acc +44
|
||||
acc +3
|
||||
acc +16
|
||||
jmp +1
|
||||
246
8-handheld_halting/src/main.rs
Normal file
246
8-handheld_halting/src/main.rs
Normal file
@@ -0,0 +1,246 @@
|
||||
use std::str::FromStr;
|
||||
use anyhow::Result;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
enum ISet {
|
||||
Acc,
|
||||
Jmp,
|
||||
Nop,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
struct Instruction {
|
||||
execd: bool,
|
||||
instr: ISet,
|
||||
arg: i64
|
||||
}
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
enum ParseError {
|
||||
#[error("Expected {0}")]
|
||||
Expected(&'static str)
|
||||
}
|
||||
|
||||
|
||||
impl FromStr for Instruction {
|
||||
type Err = ParseError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
let mut tokens = s.lines()
|
||||
.next()
|
||||
.ok_or(ParseError::Expected("one line"))?
|
||||
.split_whitespace();
|
||||
match tokens.next().ok_or(ParseError::Expected("instruction"))? {
|
||||
"acc" => {
|
||||
let arg = tokens
|
||||
.next()
|
||||
.ok_or(ParseError::Expected("acc argument"))?
|
||||
.parse()
|
||||
.unwrap();
|
||||
Ok(Instruction {
|
||||
execd: false,
|
||||
instr: ISet::Acc,
|
||||
arg,
|
||||
|
||||
})
|
||||
},
|
||||
"nop" => {
|
||||
let arg = tokens
|
||||
.next()
|
||||
.ok_or(ParseError::Expected("acc argument"))?
|
||||
.parse()
|
||||
.unwrap();
|
||||
Ok(Instruction {
|
||||
execd: false,
|
||||
instr: ISet::Nop,
|
||||
arg, // For part 1 at least NOP args are useless
|
||||
})
|
||||
},
|
||||
"jmp" => {
|
||||
let arg = tokens
|
||||
.next()
|
||||
.ok_or(ParseError::Expected("acc argument"))?
|
||||
.parse()
|
||||
.unwrap();
|
||||
Ok(Instruction {
|
||||
execd: false,
|
||||
instr: ISet::Jmp,
|
||||
arg,
|
||||
})
|
||||
},
|
||||
_ => Err(ParseError::Expected("acc, nop or jmp instruction"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Instruction {
|
||||
fn exec(&mut self, pc: &mut usize, acc: &mut i64) {
|
||||
self.execd = true;
|
||||
match self.instr {
|
||||
ISet::Acc => {
|
||||
*acc += self.arg;
|
||||
*pc += 1;
|
||||
}
|
||||
ISet::Jmp => {
|
||||
// Expect this to panic hard if you underflow :3
|
||||
*pc = ((*pc as i64) + self.arg) as usize;
|
||||
}
|
||||
ISet::Nop => {
|
||||
*pc += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
struct Program {
|
||||
prog: Vec<Instruction>,
|
||||
pc: usize,
|
||||
acc: i64,
|
||||
}
|
||||
|
||||
impl Program {
|
||||
fn load(s: &str) -> Result<Program, ParseError> {
|
||||
let loaded_program: Vec<Instruction> = s
|
||||
.lines()
|
||||
.map(|l| Instruction::from_str(l))
|
||||
.collect::<Result<Vec<Instruction>, ParseError>>()?;
|
||||
Ok(
|
||||
Self {
|
||||
prog: loaded_program,
|
||||
pc: 0,
|
||||
acc: 0,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fn reset(&mut self) {
|
||||
self.pc = 0;
|
||||
self.acc = 0;
|
||||
for mut i in self.prog.iter_mut() {
|
||||
i.execd = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns whether execution finished :
|
||||
/// Normally (true) - executing one instruction after the last one
|
||||
/// Or abnormalaly (false) - looping forever or executing random
|
||||
/// instructions
|
||||
fn exec_until_loop(&mut self) -> bool {
|
||||
let pc_stop = self.prog.len();
|
||||
loop {
|
||||
// Terminate on infinite loop
|
||||
if self.prog[self.pc].execd {
|
||||
println!("Infinite loop !");
|
||||
return false;
|
||||
}
|
||||
|
||||
self.prog[self.pc].exec(&mut self.pc, &mut self.acc);
|
||||
|
||||
// Terminate on success
|
||||
if self.pc == pc_stop {
|
||||
println!("Good pc !");
|
||||
return true;
|
||||
}
|
||||
// Terminate on corrupted pc
|
||||
else if !(0..=pc_stop).contains(&(self.pc)) {
|
||||
println!("Corrupted pc !");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn find_corrupted_instruction(&mut self) -> Option<i64> {
|
||||
// Test jmps -> nops
|
||||
self.reset();
|
||||
for j in (0..self.prog.len())
|
||||
.filter(|&i| self.prog[i].instr == ISet::Jmp)
|
||||
{
|
||||
println!("Switch jmp-nop at pos {}", j);
|
||||
let mut pclone = self.clone();
|
||||
pclone.prog[j].instr = ISet::Nop;
|
||||
if pclone.exec_until_loop() {
|
||||
return Some(pclone.acc);
|
||||
}
|
||||
}
|
||||
// Test nops -> jmps
|
||||
for n in (0..self.prog.len())
|
||||
.filter(|&i| self.prog[i].instr == ISet::Nop)
|
||||
{
|
||||
println!("Switch nop-jmp at pos {}", n);
|
||||
let mut pclone = self.clone();
|
||||
pclone.prog[n].instr = ISet::Jmp;
|
||||
if pclone.exec_until_loop() {
|
||||
return Some(pclone.acc);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let input = include_str!("../data/input");
|
||||
let mut prog = Program::load(input).unwrap();
|
||||
prog.exec_until_loop();
|
||||
println!("Acc before program gets into second loop : {}", prog.acc);
|
||||
println!("Acc after the program is set to terminate : {}", prog.find_corrupted_instruction().unwrap());
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_nop() {
|
||||
let input = r"nop +0";
|
||||
let mut prog = Program::load(input).unwrap();
|
||||
prog.exec_until_loop();
|
||||
assert_eq!(prog.acc, 0)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_acc() {
|
||||
let input = r"acc +5";
|
||||
let mut prog = Program::load(input).unwrap();
|
||||
prog.exec_until_loop();
|
||||
assert_eq!(prog.acc, 5)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_jmp() {
|
||||
let input = r"jmp +2
|
||||
acc +1
|
||||
acc +1";
|
||||
let mut prog = Program::load(input).unwrap();
|
||||
prog.exec_until_loop();
|
||||
assert_eq!(prog.acc, 1)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_short_loop() {
|
||||
let input = r"acc +1
|
||||
jmp +2
|
||||
acc +1
|
||||
acc +1
|
||||
jmp -4";
|
||||
let mut prog = Program::load(input).unwrap();
|
||||
prog.exec_until_loop();
|
||||
assert_eq!(prog.acc, 2)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_exec() {
|
||||
let input = r"nop +0
|
||||
acc +1
|
||||
jmp +4
|
||||
acc +3
|
||||
jmp -3
|
||||
acc -99
|
||||
acc +1
|
||||
jmp -4
|
||||
acc +6";
|
||||
let mut prog = Program::load(input).unwrap();
|
||||
prog.exec_until_loop();
|
||||
assert_eq!(prog.acc, 5)
|
||||
}
|
||||
}
|
||||
1
9-encoding_error/.gitignore
vendored
Normal file
1
9-encoding_error/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/target
|
||||
9
9-encoding_error/Cargo.toml
Normal file
9
9-encoding_error/Cargo.toml
Normal file
@@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "encoding_error"
|
||||
version = "0.1.0"
|
||||
authors = ["Guilhem MARION <gmarion@netc.fr>"]
|
||||
edition = "2018"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
1000
9-encoding_error/data/input
Normal file
1000
9-encoding_error/data/input
Normal file
File diff suppressed because it is too large
Load Diff
3
9-encoding_error/src/main.rs
Normal file
3
9-encoding_error/src/main.rs
Normal file
@@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
||||
Reference in New Issue
Block a user