Make 2020 a single cargo project
This commit is contained in:
parent
f0968f0dff
commit
18ea3c01cb
|
@ -1,10 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day01"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
itertools = "0.9.0"
|
|
|
@ -1,15 +0,0 @@
|
||||||
from itertools import combinations
|
|
||||||
|
|
||||||
with open('input') as f:
|
|
||||||
lines = list(map(int, f.readlines()))
|
|
||||||
|
|
||||||
def p1(lines):
|
|
||||||
a, b = filter(lambda t: t[0] + t[1] == 2020, combinations(lines, 2)).__next__()
|
|
||||||
return a * b
|
|
||||||
|
|
||||||
def p2(lines):
|
|
||||||
a, b, c = filter(lambda t: t[0] + t[1] + t[2] == 2020, combinations(lines, 3)).__next__()
|
|
||||||
return a * b * c
|
|
||||||
|
|
||||||
print(p1(lines))
|
|
||||||
print(p2(lines))
|
|
|
@ -1,11 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day02"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
itertools = "0.9.0"
|
|
||||||
text_io = "0.1.8"
|
|
|
@ -1,10 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day03"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
itertools = "0.9.0"
|
|
|
@ -1,10 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day05"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
itertools = "0.9.0"
|
|
|
@ -1,11 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day06"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
itertools = "0.9.0"
|
|
||||||
reduce = "0.1.3"
|
|
|
@ -1,9 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day07"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
|
@ -1,9 +0,0 @@
|
||||||
[package]
|
|
||||||
name = "day08"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
|
||||||
edition = "2018"
|
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[dependencies]
|
|
|
@ -1,5 +1,5 @@
|
||||||
[package]
|
[package]
|
||||||
name = "day04"
|
name = "aoc2020"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["kageru <kageru@encode.moe>"]
|
authors = ["kageru <kageru@encode.moe>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
@ -7,7 +7,10 @@ edition = "2018"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
itertools = "0.9.0"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
regex = "1.4.2"
|
regex = "1.4.2"
|
||||||
|
text_io = "0.1.8"
|
||||||
|
# for the day 4 meme solution
|
||||||
serde = { version = "1.0.117", features = ["derive"] }
|
serde = { version = "1.0.117", features = ["derive"] }
|
||||||
serde_yaml = "0.8.14"
|
serde_yaml = "0.8.14"
|
|
@ -1,16 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
today=$(date +%d)
|
today=$(date +%d)
|
||||||
mkdir "$today"
|
|
||||||
cd "$today"
|
|
||||||
cargo init --name "day$today"
|
|
||||||
echo 'Initialized cargo project'
|
|
||||||
cargo add itertools
|
|
||||||
|
|
||||||
# this assumes that your puzzle input is already in your clipboard
|
# this assumes that your puzzle input is already in your clipboard
|
||||||
xsel -b > input
|
xsel -b > inputs/$today
|
||||||
# add trailing newline if necessary
|
# add trailing newline if necessary
|
||||||
sed -i -e '$a\' input
|
sed -i -e '$a\' inputs/$today
|
||||||
|
|
||||||
echo '
|
echo '
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
|
@ -18,7 +12,7 @@ extern crate test;
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
||||||
fn read_input() -> String {
|
fn read_input() -> String {
|
||||||
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("input"))).unwrap()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day'$today'"))).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_input(raw: &str) -> Vec<!> {
|
fn parse_input(raw: &str) -> Vec<!> {
|
||||||
|
@ -38,4 +32,4 @@ mod tests {
|
||||||
|
|
||||||
const TEST_INPUT: &str = "";
|
const TEST_INPUT: &str = "";
|
||||||
|
|
||||||
}' > src/main.rs
|
}' > src/day$today.rs
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
#![feature(test,bool_to_option)]
|
#![feature(test, bool_to_option)]
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
use std::env;
|
||||||
|
|
||||||
fn read_input() -> Vec<usize> {
|
fn read_input() -> Vec<usize> {
|
||||||
std::fs::read_to_string("input")
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day01")))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.lines()
|
.lines()
|
||||||
.filter_map(|l| l.parse().ok())
|
.filter_map(|l| l.parse().ok())
|
|
@ -1,7 +1,7 @@
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use std::ops::RangeInclusive;
|
use std::{env, ops::RangeInclusive};
|
||||||
use text_io::scan;
|
use text_io::scan;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -37,12 +37,16 @@ impl PasswordVerification {
|
||||||
let pw = self.password.as_bytes();
|
let pw = self.password.as_bytes();
|
||||||
let (first, second) = (*self.required_quantity.start(), *self.required_quantity.end());
|
let (first, second) = (*self.required_quantity.start(), *self.required_quantity.end());
|
||||||
// 1-based indexing :reeeeeee:
|
// 1-based indexing :reeeeeee:
|
||||||
(pw[first-1] == self.required_char as u8) ^ (pw[second-1] == self.required_char as u8)
|
(pw[first - 1] == self.required_char as u8) ^ (pw[second - 1] == self.required_char as u8)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input() -> Vec<PasswordVerification> {
|
fn read_input() -> Vec<PasswordVerification> {
|
||||||
std::fs::read_to_string("input").unwrap().lines().map_into().collect()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day02")))
|
||||||
|
.unwrap()
|
||||||
|
.lines()
|
||||||
|
.map_into()
|
||||||
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -71,11 +75,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_part2() {
|
fn test_part2() {
|
||||||
let pws: Vec<PasswordVerification> = TEST_INPUT.lines().map_into().collect_vec();
|
let pws: Vec<PasswordVerification> = TEST_INPUT.lines().map_into().collect_vec();
|
||||||
let pws = pws
|
let pws = pws.into_iter().filter(|pw| pw.is_valid_part2()).map(|pw| pw.password).collect_vec();
|
||||||
.into_iter()
|
|
||||||
.filter(|pw| pw.is_valid_part2())
|
|
||||||
.map(|pw| pw.password)
|
|
||||||
.collect_vec();
|
|
||||||
assert_eq!(pws, vec![String::from("abcde")]);
|
assert_eq!(pws, vec![String::from("abcde")]);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use std::iter;
|
use std::{env, iter};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Copy, Clone)]
|
#[derive(Debug, PartialEq, Copy, Clone)]
|
||||||
enum Tile {
|
enum Tile {
|
||||||
|
@ -29,7 +29,7 @@ impl From<u8> for Tile {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input() -> String {
|
fn read_input() -> String {
|
||||||
std::fs::read_to_string("input").unwrap()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day03"))).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_input(raw: &str) -> Forest {
|
fn parse_input(raw: &str) -> Forest {
|
||||||
|
@ -50,7 +50,7 @@ fn count_trees(forest: &Forest, step_right: usize, step_down: usize) -> usize {
|
||||||
y + step_down,
|
y + step_down,
|
||||||
Some(x + step_right)
|
Some(x + step_right)
|
||||||
.filter(|&it| it < forest[0].len())
|
.filter(|&it| it < forest[0].len())
|
||||||
.unwrap_or_else(||(x + step_right) - forest[0].len()),
|
.unwrap_or_else(|| (x + step_right) - forest[0].len()),
|
||||||
))
|
))
|
||||||
})
|
})
|
||||||
.map_while(|(y, x)| forest.get(y).map(|r| r[x]))
|
.map_while(|(y, x)| forest.get(y).map(|r| r[x]))
|
|
@ -3,6 +3,7 @@ extern crate test;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::env;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
struct Passport {
|
struct Passport {
|
||||||
|
@ -17,7 +18,7 @@ struct Passport {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input() -> String {
|
fn read_input() -> String {
|
||||||
std::fs::read_to_string("input").unwrap()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day04"))).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// When I first saw the input and puzzle, I thought
|
/// When I first saw the input and puzzle, I thought
|
|
@ -1,7 +1,7 @@
|
||||||
#![feature(test, map_first_last)]
|
#![feature(test, map_first_last)]
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use std::collections::BTreeSet;
|
use std::{collections::BTreeSet, env};
|
||||||
|
|
||||||
const NUM_ROWS: usize = 128;
|
const NUM_ROWS: usize = 128;
|
||||||
const NUM_COLS: usize = 8;
|
const NUM_COLS: usize = 8;
|
||||||
|
@ -50,7 +50,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input() -> String {
|
fn read_input() -> String {
|
||||||
std::fs::read_to_string("input").unwrap()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day05"))).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
|
@ -1,7 +1,7 @@
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashSet, ops::{BitAnd, BitOr}
|
collections::HashSet, env, ops::{BitAnd, BitOr}
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -11,7 +11,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input() -> String {
|
fn read_input() -> String {
|
||||||
std::fs::read_to_string("input").unwrap()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day06"))).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_input(raw: &str) -> Vec<Vec<HashSet<char>>> {
|
fn parse_input(raw: &str) -> Vec<Vec<HashSet<char>>> {
|
|
@ -1,7 +1,6 @@
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
use std::collections::HashSet;
|
use std::{collections::HashSet, env};
|
||||||
extern crate test;
|
extern crate test;
|
||||||
use std::env;
|
|
||||||
|
|
||||||
const COLOR: &str = "shiny gold";
|
const COLOR: &str = "shiny gold";
|
||||||
|
|
||||||
|
@ -47,7 +46,7 @@ impl From<&str> for Bag {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input() -> String {
|
fn read_input() -> String {
|
||||||
std::fs::read_to_string(env::args().nth(1).unwrap_or(String::from("input"))).unwrap()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day07"))).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part1<'a, 'b>(bags: &'b [Bag], color: &str, seen: &'a mut HashSet<&'b str>) -> &'a mut HashSet<&'b str> {
|
fn part1<'a, 'b>(bags: &'b [Bag], color: &str, seen: &'a mut HashSet<&'b str>) -> &'a mut HashSet<&'b str> {
|
|
@ -10,7 +10,7 @@ enum Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_input() -> String {
|
fn read_input() -> String {
|
||||||
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("input"))).unwrap()
|
std::fs::read_to_string(env::args().nth(1).filter(|n| n != "--bench").unwrap_or(String::from("inputs/day08"))).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_input(raw: &str) -> Vec<Command> {
|
fn parse_input(raw: &str) -> Vec<Command> {
|
|
@ -0,0 +1,3 @@
|
||||||
|
fn main() {
|
||||||
|
println!("Please use cargo run dayXX to run any of the days.");
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user