2015/08-10, 2015/12-13, started on 2015/14

This commit is contained in:
2017-12-05 08:01:57 +01:00
parent b6a89a7ab6
commit 6fc08571bf
20 changed files with 1072 additions and 156 deletions

102
2015/09/Cargo.lock generated
View File

@@ -1,105 +1,95 @@
[root]
[[package]]
name = "09"
version = "0.1.0"
dependencies = [
"lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "aho-corasick"
version = "0.5.3"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "kernel32-sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "lazy_static"
version = "0.1.16"
version = "0.2.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "lazy_static"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "libc"
version = "0.2.18"
version = "0.2.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "memchr"
version = "0.1.11"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "regex"
version = "0.1.80"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
"regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
"thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
"utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "regex-syntax"
version = "0.3.9"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "thread-id"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "thread_local"
version = "0.2.7"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "unreachable"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "utf8-ranges"
version = "0.1.3"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi-build"
version = "0.1.1"
name = "void"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[metadata]
"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
"checksum lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "cf186d1a8aa5f5bee5fd662bc9c1b949e0259e1bcc379d1f006847b0080c7417"
"checksum libc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "a51822fc847e7a8101514d1d44e354ba2ffa7d4c194dcab48870740e327cac70"
"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4"
"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73"
"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
"checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0"
"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
"checksum regex 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ac6ab4e9218ade5b423358bbd2567d1617418403c7a512603630181813316322"
"checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
"checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14"
"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"

View File

@@ -4,5 +4,5 @@ version = "0.1.0"
authors = ["logaritmisk <anders.e.olsson@gmail.com>"]
[dependencies]
lazy_static = "0.1"
regex = "0.1"
lazy_static = "1.0"
regex = "0.2"

View File

@@ -1,7 +1,10 @@
#[macro_use] extern crate lazy_static;
#[macro_use]
extern crate lazy_static;
extern crate regex;
use std::io::{self, Read};
use std::iter::Iterator;
use std::collections::BTreeMap;
use regex::Regex;
@@ -10,23 +13,61 @@ use regex::Regex;
type Map<'a> = BTreeMap<&'a str, BTreeMap<&'a str, i64>>;
#[derive(Clone, Debug)]
struct Route<'a> {
vec: Vec<&'a str>,
distance: i64
struct Permutations<'a, T: 'a> {
source: &'a [T],
iter: Vec<usize>,
done: bool,
}
impl<'a> Route<'a> {
fn new() -> Route<'a> {
Route {
vec: Vec::new(),
distance: 0
impl<'a, T> Permutations<'a, T> {
fn new(source: &'a [T]) -> Permutations<T> {
Permutations {
source: source,
iter: vec![0; source.len()],
done: false,
}
}
}
impl<'a, T> Iterator for Permutations<'a, T>
where
T: Clone,
{
type Item = Vec<T>;
fn next(&mut self) -> Option<Self::Item> {
if self.done {
None
} else {
let values = self.iter
.iter()
.map(|index| self.source[*index].clone())
.collect::<Vec<_>>();
let max = self.source.len() - 1;
self.done = true;
for i in self.iter.iter_mut().rev() {
if *i == max {
*i = 0;
continue;
}
*i += 1;
self.done = false;
break;
}
Some(values)
}
}
}
fn process<'a>(input: &'a str) -> Route<'a> {
fn parse(input: &str) -> Map {
lazy_static! {
static ref RE: Regex = Regex::new(r"^([a-zA-Z]+) to ([a-zA-Z]+) = (\d+)$").unwrap();
}
@@ -34,67 +75,49 @@ fn process<'a>(input: &'a str) -> Route<'a> {
let mut map: Map = BTreeMap::new();
for line in input.lines() {
let caps = RE.captures(&line).unwrap();
let caps = RE.captures(line).unwrap();
let a = caps.at(1).unwrap();
let b = caps.at(2).unwrap();
let a = caps.get(1).unwrap().as_str();
let b = caps.get(2).unwrap().as_str();
let distance = caps.at(3).unwrap().parse::<i64>().unwrap();
let distance = caps[3].parse::<i64>().unwrap();
map.entry(a).or_insert(BTreeMap::new()).insert(b, distance);
map.entry(b).or_insert(BTreeMap::new()).insert(a, distance);
map.entry(a)
.or_insert_with(BTreeMap::new)
.insert(b, distance);
map.entry(b)
.or_insert_with(BTreeMap::new)
.insert(a, distance);
}
let mut routes = iterate(&map, None);
routes.sort_by_key(|x| x.distance);
routes.remove(0)
map
}
fn iterate<'a>(map: &Map<'a>, route: Option<Route<'a>>) -> Vec<Route<'a>> {
let mut routes = Vec::new();
fn routes<'a>(map: &'a Map<'a>) -> Vec<(Vec<&'a str>, i64)> {
let cities = map.keys().map(|city| *city).collect::<Vec<_>>();
if let Some(mut route) = route {
let prev = *route.vec.last().unwrap();
Permutations::new(&cities)
.filter(|route| {
let mut iter = route.iter();
let mut end = true;
for (city, distance) in map.get(prev).unwrap().iter() {
if route.vec.contains(city) {
continue;
while let Some(needle) = iter.next() {
if iter.clone().any(|haystack| haystack == needle) {
return false;
}
}
route.vec.push(*city);
route.distance += *distance;
true
})
.map(|route| {
let distance = route
.windows(2)
.map(|cities| map[cities[0]][cities[1]])
.sum();
{
let mut sub_routes = iterate(&map, Some(route.clone()));
routes.append(&mut sub_routes);
}
end = false;
}
if end {
routes.push(route);
}
} else {
for city in map.keys() {
let mut route = Route::new();
route.vec.push(*city);
{
let mut sub_routes = iterate(&map, Some(route));
routes.append(&mut sub_routes);
}
}
}
routes
(route, distance)
})
.collect::<Vec<_>>()
}
fn main() {
@@ -102,15 +125,20 @@ fn main() {
io::stdin().read_to_string(&mut input).unwrap();
let result = process(&input);
let map = parse(&input);
let mut routes = routes(&map);
println!("{:?}", result);
routes.sort_by_key(|&(_, distance)| distance);
println!("shortest={:?}", routes.first().unwrap());
println!("longest={:?}", routes.last().unwrap());
}
#[cfg(test)]
mod tests {
use super::process;
use super::*;
#[test]
fn example_01() {
@@ -118,8 +146,13 @@ mod tests {
London to Belfast = 518\n\
Dublin to Belfast = 141";
let result = process(input);
let map = parse(input);
let mut routes = routes(&map);
assert_eq!(605, result.distance);
routes.sort_by_key(|&(_, distance)| distance);
println!("{:#?}", routes);
assert_eq!(605, routes[0].1);
}
}