From 091ef1f5184b979f04ec20ba040e9978950dc4b3 Mon Sep 17 00:00:00 2001 From: Philippe Zwietering Date: Mon, 20 Mar 2023 17:02:05 +0100 Subject: [PATCH 1/2] Apparently a bug in PE 089 but can't for the life of me figure out what goes wrong --- projecteuler/089/Cargo.lock | 32 ++ projecteuler/089/Cargo.toml | 9 + projecteuler/089/roman.txt | 1000 ++++++++++++++++++++++++++++++++++ projecteuler/089/src/main.rs | 273 ++++++++++ 4 files changed, 1314 insertions(+) create mode 100644 projecteuler/089/Cargo.lock create mode 100644 projecteuler/089/Cargo.toml create mode 100644 projecteuler/089/roman.txt create mode 100644 projecteuler/089/src/main.rs diff --git a/projecteuler/089/Cargo.lock b/projecteuler/089/Cargo.lock new file mode 100644 index 0000000..c97e70b --- /dev/null +++ b/projecteuler/089/Cargo.lock @@ -0,0 +1,32 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "main" +version = "0.1.0" +dependencies = [ + "nom", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] diff --git a/projecteuler/089/Cargo.toml b/projecteuler/089/Cargo.toml new file mode 100644 index 0000000..c3650cd --- /dev/null +++ b/projecteuler/089/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "main" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom = "7.1.3" diff --git a/projecteuler/089/roman.txt b/projecteuler/089/roman.txt new file mode 100644 index 0000000..50651c3 --- /dev/null +++ b/projecteuler/089/roman.txt @@ -0,0 +1,1000 @@ +MMMMDCLXXII +MMDCCCLXXXIII +MMMDLXVIIII +MMMMDXCV +DCCCLXXII +MMCCCVI +MMMCDLXXXVII +MMMMCCXXI +MMMCCXX +MMMMDCCCLXXIII +MMMCCXXXVII +MMCCCLXXXXIX +MDCCCXXIIII +MMCXCVI +CCXCVIII +MMMCCCXXXII +MDCCXXX +MMMDCCCL +MMMMCCLXXXVI +MMDCCCXCVI +MMMDCII +MMMCCXII +MMMMDCCCCI +MMDCCCXCII +MDCXX +CMLXXXVII +MMMXXI +MMMMCCCXIV +MLXXII +MCCLXXVIIII +MMMMCCXXXXI +MMDCCCLXXII +MMMMXXXI +MMMDCCLXXX +MMDCCCLXXIX +MMMMLXXXV +MCXXI +MDCCCXXXVII +MMCCCLXVII +MCDXXXV +CCXXXIII +CMXX +MMMCLXIV +MCCCLXXXVI +DCCCXCVIII +MMMDCCCCXXXIV +CDXVIIII +MMCCXXXV +MDCCCXXXII +MMMMD +MMDCCLXIX +MMMMCCCLXXXXVI +MMDCCXLII +MMMDCCCVIIII +DCCLXXXIIII +MDCCCCXXXII +MMCXXVII +DCCCXXX +CCLXIX +MMMXI +MMMMCMLXXXXVIII +MMMMDLXXXVII +MMMMDCCCLX +MMCCLIV +CMIX +MMDCCCLXXXIIII +CLXXXII +MMCCCCXXXXV +MMMMDLXXXVIIII +MMMDCCCXXI +MMDCCCCLXXVI +MCCCCLXX +MMCDLVIIII +MMMDCCCLIX +MMMMCCCCXIX +MMMDCCCLXXV +XXXI +CDLXXXIII +MMMCXV +MMDCCLXIII +MMDXXX +MMMMCCCLVII +MMMDCI +MMMMCDLXXXIIII +MMMMCCCXVI +CCCLXXXVIII +MMMMCML +MMMMXXIV +MMMCCCCXXX +DCCX +MMMCCLX +MMDXXXIII +CCCLXIII +MMDCCXIII +MMMCCCXLIV +CLXXXXI +CXVI +MMMMCXXXIII +CLXX +DCCCXVIII +MLXVII +DLXXXX +MMDXXI +MMMMDLXXXXVIII +MXXII +LXI +DCCCCXLIII +MMMMDV +MMMMXXXIV +MDCCCLVIII +MMMCCLXXII +MMMMDCCXXXVI +MMMMLXXXIX +MDCCCLXXXI +MMMMDCCCXV +MMMMCCCCXI +MMMMCCCLIII +MDCCCLXXI +MMCCCCXI +MLXV +MMCDLXII +MMMMDXXXXII +MMMMDCCCXL +MMMMCMLVI +CCLXXXIV +MMMDCCLXXXVI +MMCLII +MMMCCCCXV +MMLXXXIII +MMMV +MMMV +DCCLXII +MMDCCCCXVI +MMDCXLVIII +CCLIIII +CCCXXV +MMDCCLXXXVIIII +MMMMDCLXXVIII +MMMMDCCCXCI +MMMMCCCXX +MMCCXLV +MMMDCCCLXIX +MMCCLXIIII +MMMDCCCXLIX +MMMMCCCLXIX +CMLXXXXI +MCMLXXXIX +MMCDLXI +MMDCLXXVIII +MMMMDCCLXI +MCDXXV +DL +CCCLXXII +MXVIIII +MCCCCLXVIII +CIII +MMMDCCLXXIIII +MMMDVIII +MMMMCCCLXXXXVII +MMDXXVII +MMDCCLXXXXV +MMMMCXLVI +MMMDCCLXXXII +MMMDXXXVI +MCXXII +CLI +DCLXXXIX +MMMCLI +MDCLXIII +MMMMDCCXCVII +MMCCCLXXXV +MMMDCXXVIII +MMMCDLX +MMMCMLII +MMMIV +MMMMDCCCLVIII +MMMDLXXXVIII +MCXXIV +MMMMLXXVI +CLXXIX +MMMCCCCXXVIIII +DCCLXXXV +MMMDCCCVI +LI +CLXXXVI +MMMMCCCLXXVI +MCCCLXVI +CCXXXIX +MMDXXXXI +MMDCCCXLI +DCCCLXXXVIII +MMMMDCCCIV +MDCCCCXV +MMCMVI +MMMMCMLXXXXV +MMDCCLVI +MMMMCCXLVIII +DCCCCIIII +MMCCCCIII +MMMDCCLXXXVIIII +MDCCCLXXXXV +DVII +MMMV +DCXXV +MMDCCCXCV +DCVIII +MMCDLXVI +MCXXVIII +MDCCXCVIII +MMDCLX +MMMDCCLXIV +MMCDLXXVII +MMDLXXXIIII +MMMMCCCXXII +MMMDCCCXLIIII +DCCCCLXVII +MMMCLXXXXIII +MCCXV +MMMMDCXI +MMMMDCLXXXXV +MMMCCCLII +MMCMIX +MMDCCXXV +MMDLXXXVI +MMMMDCXXVIIII +DCCCCXXXVIIII +MMCCXXXIIII +MMDCCLXXVIII +MDCCLXVIIII +MMCCLXXXV +MMMMDCCCLXXXVIII +MMCMXCI +MDXLII +MMMMDCCXIV +MMMMLI +DXXXXIII +MMDCCXI +MMMMCCLXXXIII +MMMDCCCLXXIII +MDCLVII +MMCD +MCCCXXVII +MMMMDCCIIII +MMMDCCXLVI +MMMCLXXXVII +MMMCCVIIII +MCCCCLXXIX +DL +DCCCLXXVI +MMDXCI +MMMMDCCCCXXXVI +MMCII +MMMDCCCXXXXV +MMMCDXLV +MMDCXXXXIV +MMD +MDCCCLXXXX +MMDCXLIII +MMCCXXXII +MMDCXXXXVIIII +DCCCLXXI +MDXCVIIII +MMMMCCLXXVIII +MDCLVIIII +MMMCCCLXXXIX +MDCLXXXV +MDLVIII +MMMMCCVII +MMMMDCXIV +MMMCCCLXIIII +MMIIII +MMMMCCCLXXIII +CCIII +MMMCCLV +MMMDXIII +MMMCCCXC +MMMDCCCXXI +MMMMCCCCXXXII +CCCLVI +MMMCCCLXXXVI +MXVIIII +MMMCCCCXIIII +CLXVII +MMMCCLXX +CCCCLXIV +MMXXXXII +MMMMCCLXXXX +MXL +CCXVI +CCCCLVIIII +MMCCCII +MCCCLVIII +MMMMCCCX +MCDLXXXXIV +MDCCCXIII +MMDCCCXL +MMMMCCCXXIII +DXXXIV +CVI +MMMMDCLXXX +DCCCVII +MMCMLXIIII +MMMDCCCXXXIII +DCCC +MDIII +MMCCCLXVI +MMMCCCCLXXI +MMDCCCCXVIII +CCXXXVII +CCCXXV +MDCCCXII +MMMCMV +MMMMCMXV +MMMMDCXCI +DXXI +MMCCXLVIIII +MMMMCMLII +MDLXXX +MMDCLXVI +CXXI +MMMDCCCLIIII +MMMCXXI +MCCIII +MMDCXXXXI +CCXCII +MMMMDXXXV +MMMCCCLXV +MMMMDLXV +MMMCCCCXXXII +MMMCCCVIII +DCCCCLXXXXII +MMCLXIV +MMMMCXI +MLXXXXVII +MMMCDXXXVIII +MDXXII +MLV +MMMMDLXVI +MMMCXII +XXXIII +MMMMDCCCXXVI +MMMLXVIIII +MMMLX +MMMCDLXVII +MDCCCLVII +MMCXXXVII +MDCCCCXXX +MMDCCCLXIII +MMMMDCXLIX +MMMMCMXLVIII +DCCCLXXVIIII +MDCCCLIII +MMMCMLXI +MMMMCCLXI +MMDCCCLIII +MMMDCCCVI +MMDXXXXIX +MMCLXXXXV +MMDXXX +MMMXIII +DCLXXIX +DCCLXII +MMMMDCCLXVIII +MDCCXXXXIII +CCXXXII +MMMMDCXXV +MMMCCCXXVIII +MDCVIII +MMMCLXXXXIIII +CLXXXI +MDCCCCXXXIII +MMMMDCXXX +MMMDCXXIV +MMMCCXXXVII +MCCCXXXXIIII +CXVIII +MMDCCCCIV +MMMMCDLXXV +MMMDLXIV +MDXCIII +MCCLXXXI +MMMDCCCXXIV +MCXLIII +MMMDCCCI +MCCLXXX +CCXV +MMDCCLXXI +MMDLXXXIII +MMMMDCXVII +MMMCMLXV +MCLXVIII +MMMMCCLXXVI +MMMDCCLXVIIII +MMMMDCCCIX +DLXXXXIX +DCCCXXII +MMMMIII +MMMMCCCLXXVI +DCCCXCIII +DXXXI +MXXXIIII +CCXII +MMMDCCLXXXIIII +MMMCXX +MMMCMXXVII +DCCCXXXX +MMCDXXXVIIII +MMMMDCCXVIII +LV +MMMDCCCCVI +MCCCII +MMCMLXVIIII +MDCCXI +MMMMDLXVII +MMCCCCLXI +MMDCCV +MMMCCCXXXIIII +MMMMDI +MMMDCCCXCV +MMDCCLXXXXI +MMMDXXVI +MMMDCCCLVI +MMDCXXX +MCCCVII +MMMMCCCLXII +MMMMXXV +MMCMXXV +MMLVI +MMDXXX +MMMMCVII +MDC +MCCIII +MMMMDCC +MMCCLXXV +MMDCCCXXXXVI +MMMMCCCLXV +CDXIIII +MLXIIII +CCV +MMMCMXXXI +CCCCLXVI +MDXXXII +MMMMCCCLVIII +MMV +MMMCLII +MCMLI +MMDCCXX +MMMMCCCCXXXVI +MCCLXXXI +MMMCMVI +DCCXXX +MMMMCCCLXV +DCCCXI +MMMMDCCCXIV +CCCXXI +MMDLXXV +CCCCLXXXX +MCCCLXXXXII +MMDCIX +DCCXLIIII +DXIV +MMMMCLII +CDLXI +MMMCXXVII +MMMMDCCCCLXIII +MMMDCLIIII +MCCCCXXXXII +MMCCCLX +CCCCLIII +MDCCLXXVI +MCMXXIII +MMMMDLXXVIII +MMDCCCCLX +MMMCCCLXXXX +MMMCDXXVI +MMMDLVIII +CCCLXI +MMMMDCXXII +MMDCCCXXI +MMDCCXIII +MMMMCLXXXVI +MDCCCCXXVI +MDV +MMDCCCCLXXVI +MMMMCCXXXVII +MMMDCCLXXVIIII +MMMCCCCLXVII +DCCXLI +MMCLXXXVIII +MCCXXXVI +MMDCXLVIII +MMMMCXXXII +MMMMDCCLXVI +MMMMCMLI +MMMMCLXV +MMMMDCCCXCIV +MCCLXXVII +LXXVIIII +DCCLII +MMMCCCXCVI +MMMCLV +MMDCCCXXXXVIII +DCCCXV +MXC +MMDCCLXXXXVII +MMMMCML +MMDCCCLXXVIII +DXXI +MCCCXLI +DCLXXXXI +MMCCCLXXXXVIII +MDCCCCLXXVIII +MMMMDXXV +MMMDCXXXVI +MMMCMXCVII +MMXVIIII +MMMDCCLXXIV +MMMCXXV +DXXXVIII +MMMMCLXVI +MDXII +MMCCCLXX +CCLXXI +DXIV +MMMCLIII +DLII +MMMCCCXLIX +MMCCCCXXVI +MMDCXLIII +MXXXXII +CCCLXXXV +MDCLXXVI +MDCXII +MMMCCCLXXXIII +MMDCCCCLXXXII +MMMMCCCLXXXV +MMDCXXI +DCCCXXX +MMMDCCCCLII +MMMDCCXXII +MMMMCDXCVIII +MMMCCLXVIIII +MMXXV +MMMMCDXIX +MMMMCCCX +MMMCCCCLXVI +MMMMDCLXXVIIII +MMMMDCXXXXIV +MMMCMXII +MMMMXXXIII +MMMMDLXXXII +DCCCLIV +MDXVIIII +MMMCLXXXXV +CCCCXX +MMDIX +MMCMLXXXVIII +DCCXLIII +DCCLX +D +MCCCVII +MMMMCCCLXXXIII +MDCCCLXXIIII +MMMDCCCCLXXXVII +MMMMCCCVII +MMMDCCLXXXXVI +CDXXXIV +MCCLXVIII +MMMMDLX +MMMMDXII +MMMMCCCCLIIII +MCMLXXXXIII +MMMMDCCCIII +MMDCLXXXIII +MDCCCXXXXIV +XXXXVII +MMMDCCCXXXII +MMMDCCCXLII +MCXXXV +MDCXXVIIII +MMMCXXXXIIII +MMMMCDXVII +MMMDXXIII +MMMMCCCCLXI +DCLXXXXVIIII +LXXXXI +CXXXIII +MCDX +MCCLVII +MDCXXXXII +MMMCXXIV +MMMMLXXXX +MMDCCCCXLV +MLXXX +MMDCCCCLX +MCDLIII +MMMCCCLXVII +MMMMCCCLXXIV +MMMDCVIII +DCCCCXXIII +MMXCI +MMDCCIV +MMMMDCCCXXXIV +CCCLXXI +MCCLXXXII +MCMIII +CCXXXI +DCCXXXVIII +MMMMDCCXLVIIII +MMMMCMXXXV +DCCCLXXV +DCCXCI +MMMMDVII +MMMMDCCCLXVIIII +CCCXCV +MMMMDCCXX +MCCCCII +MMMCCCXC +MMMCCCII +MMDCCLXXVII +MMDCLIIII +CCXLIII +MMMDCXVIII +MMMCCCIX +MCXV +MMCCXXV +MLXXIIII +MDCCXXVI +MMMCCCXX +MMDLXX +MMCCCCVI +MMDCCXX +MMMMDCCCCXCV +MDCCCXXXII +MMMMDCCCCXXXX +XCIV +MMCCCCLX +MMXVII +MLXXI +MMMDXXVIII +MDCCCCII +MMMCMLVII +MMCLXXXXVIII +MDCCCCLV +MCCCCLXXIIII +MCCCLII +MCDXLVI +MMMMDXVIII +DCCLXXXIX +MMMDCCLXIV +MDCCCCXLIII +CLXXXXV +MMMMCCXXXVI +MMMDCCCXXI +MMMMCDLXXVII +MCDLIII +MMCCXLVI +DCCCLV +MCDLXX +DCLXXVIII +MMDCXXXIX +MMMMDCLX +MMDCCLI +MMCXXXV +MMMCCXII +MMMMCMLXII +MMMMCCV +MCCCCLXIX +MMMMCCIII +CLXVII +MCCCLXXXXIIII +MMMMDCVIII +MMDCCCLXI +MMLXXIX +CMLXIX +MMDCCCXLVIIII +DCLXII +MMMCCCXLVII +MDCCCXXXV +MMMMDCCXCVI +DCXXX +XXVI +MMLXIX +MMCXI +DCXXXVII +MMMMCCCXXXXVIII +MMMMDCLXI +MMMMDCLXXIIII +MMMMVIII +MMMMDCCCLXII +MDCXCI +MMCCCXXIIII +CCCCXXXXV +MMDCCCXXI +MCVI +MMDCCLXVIII +MMMMCXL +MLXVIII +CMXXVII +CCCLV +MDCCLXXXIX +MMMCCCCLXV +MMDCCLXII +MDLXVI +MMMCCCXVIII +MMMMCCLXXXI +MMCXXVII +MMDCCCLXVIII +MMMCXCII +MMMMDCLVIII +MMMMDCCCXXXXII +MMDCCCCLXXXXVI +MDCCXL +MDCCLVII +MMMMDCCCLXXXVI +DCCXXXIII +MMMMDCCCCLXXXV +MMCCXXXXVIII +MMMCCLXXVIII +MMMDCLXXVIII +DCCCI +MMMMLXXXXVIIII +MMMCCCCLXXII +MMCLXXXVII +CCLXVI +MCDXLIII +MMCXXVIII +MDXIV +CCCXCVIII +CLXXVIII +MMCXXXXVIIII +MMMDCLXXXIV +CMLVIII +MCDLIX +MMMMDCCCXXXII +MMMMDCXXXIIII +MDCXXI +MMMDCXLV +MCLXXVIII +MCDXXII +IV +MCDLXXXXIII +MMMMDCCLXV +CCLI +MMMMDCCCXXXVIII +DCLXII +MCCCLXVII +MMMMDCCCXXXVI +MMDCCXLI +MLXI +MMMCDLXVIII +MCCCCXCIII +XXXIII +MMMDCLXIII +MMMMDCL +DCCCXXXXIIII +MMDLVII +DXXXVII +MCCCCXXIIII +MCVII +MMMMDCCXL +MMMMCXXXXIIII +MCCCCXXIV +MMCLXVIII +MMXCIII +MDCCLXXX +MCCCLIIII +MMDCLXXI +MXI +MCMLIV +MMMCCIIII +DCCLXXXVIIII +MDCLIV +MMMDCXIX +CMLXXXI +DCCLXXXVII +XXV +MMMXXXVI +MDVIIII +CLXIII +MMMCDLVIIII +MMCCCCVII +MMMLXX +MXXXXII +MMMMCCCLXVIII +MMDCCCXXVIII +MMMMDCXXXXI +MMMMDCCCXXXXV +MMMXV +MMMMCCXVIIII +MMDCCXIIII +MMMXXVII +MDCCLVIIII +MMCXXIIII +MCCCLXXIV +DCLVIII +MMMLVII +MMMCXLV +MMXCVII +MMMCCCLXXXVII +MMMMCCXXII +DXII +MMMDLV +MCCCLXXVIII +MMMCLIIII +MMMMCLXXXX +MMMCLXXXIIII +MDCXXIII +MMMMCCXVI +MMMMDLXXXIII +MMMDXXXXIII +MMMMCCCCLV +MMMDLXXXI +MMMCCLXXVI +MMMMXX +MMMMDLVI +MCCCCLXXX +MMMXXII +MMXXII +MMDCCCCXXXI +MMMDXXV +MMMDCLXXXVIIII +MMMDLXXXXVII +MDLXIIII +CMXC +MMMXXXVIII +MDLXXXVIII +MCCCLXXVI +MMCDLIX +MMDCCCXVIII +MDCCCXXXXVI +MMMMCMIV +MMMMDCIIII +MMCCXXXV +XXXXVI +MMMMCCXVII +MMCCXXIV +MCMLVIIII +MLXXXIX +MMMMLXXXIX +CLXXXXIX +MMMDCCCCLVIII +MMMMCCLXXIII +MCCCC +DCCCLIX +MMMCCCLXXXII +MMMCCLXVIIII +MCLXXXV +CDLXXXVII +DCVI +MMX +MMCCXIII +MMMMDCXX +MMMMXXVIII +DCCCLXII +MMMMCCCXLIII +MMMMCLXV +DXCI +MMMMCLXXX +MMMDCCXXXXI +MMMMXXXXVI +DCLX +MMMCCCXI +MCCLXXX +MMCDLXXII +DCCLXXI +MMMCCCXXXVI +MCCCCLXXXVIIII +CDLVIII +DCCLVI +MMMMDCXXXVIII +MMCCCLXXXIII +MMMMDCCLXXV +MMMXXXVI +CCCLXXXXIX +CV +CCCCXIII +CCCCXVI +MDCCCLXXXIIII +MMDCCLXXXII +MMMMCCCCLXXXI +MXXV +MMCCCLXXVIIII +MMMCCXII +MMMMCCXXXIII +MMCCCLXXXVI +MMMDCCCLVIIII +MCCXXXVII +MDCLXXV +XXXV +MMDLI +MMMCCXXX +MMMMCXXXXV +CCCCLIX +MMMMDCCCLXXIII +MMCCCXVII +DCCCXVI +MMMCCCXXXXV +MDCCCCXCV +CLXXXI +MMMMDCCLXX +MMMDCCCIII +MMCLXXVII +MMMDCCXXIX +MMDCCCXCIIII +MMMCDXXIIII +MMMMXXVIII +MMMMDCCCCLXVIII +MDCCCXX +MMMMCDXXI +MMMMDLXXXIX +CCXVI +MDVIII +MMCCLXXI +MMMDCCCLXXI +MMMCCCLXXVI +MMCCLXI +MMMMDCCCXXXIV +DLXXXVI +MMMMDXXXII +MMMXXIIII +MMMMCDIV +MMMMCCCXLVIII +MMMMCXXXVIII +MMMCCCLXVI +MDCCXVIII +MMCXX +CCCLIX +MMMMDCCLXXII +MDCCCLXXV +MMMMDCCCXXIV +DCCCXXXXVIII +MMMDCCCCXXXVIIII +MMMMCCXXXV +MDCLXXXIII +MMCCLXXXIV +MCLXXXXIIII +DXXXXIII +MCCCXXXXVIII +MMCLXXIX +MMMMCCLXIV +MXXII +MMMCXIX +MDCXXXVII +MMDCCVI +MCLXXXXVIII +MMMCXVI +MCCCLX +MMMCDX +CCLXVIIII +MMMCCLX +MCXXVIII +LXXXII +MCCCCLXXXI +MMMI +MMMCCCLXIV +MMMCCCXXVIIII +CXXXVIII +MMCCCXX +MMMCCXXVIIII +MCCLXVI +MMMCCCCXXXXVI +MMDCCXCIX +MCMLXXI +MMCCLXVIII +CDLXXXXIII +MMMMDCCXXII +MMMMDCCLXXXVII +MMMDCCLIV +MMCCLXIII +MDXXXVII +DCCXXXIIII +MCII +MMMDCCCLXXI +MMMLXXIII +MDCCCLIII +MMXXXVIII +MDCCXVIIII +MDCCCCXXXVII +MMCCCXVI +MCMXXII +MMMCCCLVIII +MMMMDCCCXX +MCXXIII +MMMDLXI +MMMMDXXII +MDCCCX +MMDXCVIIII +MMMDCCCCVIII +MMMMDCCCCXXXXVI +MMDCCCXXXV +MMCXCIV +MCMLXXXXIII +MMMCCCLXXVI +MMMMDCLXXXV +CMLXIX +DCXCII +MMXXVIII +MMMMCCCXXX +XXXXVIIII \ No newline at end of file diff --git a/projecteuler/089/src/main.rs b/projecteuler/089/src/main.rs new file mode 100644 index 0000000..cdff4d5 --- /dev/null +++ b/projecteuler/089/src/main.rs @@ -0,0 +1,273 @@ +use nom::{ + branch::alt, + character::complete::{char, multispace1}, + multi::{many1, separated_list1}, + IResult, Parser, +}; +use std::{time::Instant, vec}; + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +enum RomanNum { + I, + V, + X, + L, + C, + D, + M, + Empty, +} +use RomanNum::*; +type RomanNumeral = Vec; + +// This function is not correct at all but I'm not gonna bother fixing it +fn _is_minimal(number: &RomanNumeral) -> bool { + let mut last_num = Empty; + let mut occ = 0; + + for num in number.iter() { + if *num == last_num { + occ += 1; + } else { + last_num = *num; + occ = 1; + } + + if occ > 3 && (last_num == I || last_num == X || last_num == C) { + return false; + // } else if occ > 1 && (last_num == V || last_num == L || last_num == D) { + // return false; + } + } + + true +} + +fn reduce(original: &RomanNumeral) -> RomanNumeral { + let mut last_num = Empty; + let mut occ = 0; + let mut result = vec![]; + + let mut number = original.clone(); + number.push(Empty); + + for num in number.iter() { + if *num == last_num { + occ += 1; + + if occ == 10 { + match last_num { + I => result.push(X), + X => result.push(C), + C => result.push(M), + M => { + for _ in 0..occ { + result.push(M); + } + } + _ => {} + } + + occ -= 10; + } + } else { + if occ < 4 { + for _ in 0..occ { + result.push(last_num); + } + } else if occ == 4 { + match last_num { + I => { + result.push(I); + result.push(V); + } + X => { + result.push(X); + result.push(L); + } + C => { + result.push(C); + result.push(D); + } + M => { + for _ in 0..occ { + result.push(M); + } + } + _ => {} + } + } else if occ == 5 { + match last_num { + I => result.push(V), + X => result.push(L), + C => result.push(D), + M => { + for _ in 0..occ { + result.push(M); + } + } + _ => {} + } + } else if occ >= 6 && occ <= 8 { + match last_num { + I => { + result.push(V); + for _ in 0..occ - 5 { + result.push(I); + } + } + X => { + result.push(L); + for _ in 0..occ - 5 { + result.push(X); + } + } + C => { + result.push(D); + for _ in 0..occ - 5 { + result.push(C); + } + } + M => { + for _ in 0..occ { + result.push(M); + } + } + _ => {} + } + } else if occ == 9 { + match last_num { + I => { + result.push(I); + result.push(X); + } + X => { + result.push(X); + result.push(C); + } + C => { + result.push(C); + result.push(M); + } + M => { + for _ in 0..occ { + result.push(M); + } + } + _ => {} + } + } + + last_num = *num; + occ = 1; + } + // println!("{:?}", result); + } + + result +} + +fn reduce_extra(numeral: &RomanNumeral) -> RomanNumeral { + if numeral.len() <= 3 { + return numeral.clone(); + } + + let mut result = vec![]; + let mut window = vec![Empty, numeral[0], numeral[1]]; + let mut i = 2; + + while i < numeral.len() { + result.push(window[0]); + window[0] = window[1]; + window[1] = window[2]; + window[2] = numeral[i]; + + if window[0] == V && window[1] == I && window[2] == V { + result.push(I); + result.push(X); + + window[1] = Empty; + window[2] = Empty; + } else if window[0] == L && window[1] == X && window[2] == L { + result.push(X); + result.push(C); + + window[1] = Empty; + window[2] = Empty; + } else if window[0] == D && window[1] == C && window[2] == D { + result.push(C); + result.push(M); + + window[1] = Empty; + window[2] = Empty; + } + + i += 1; + } + result.push(window[0]); + result.push(window[1]); + result.push(window[2]); + + result.into_iter().filter(|&n| n != Empty).collect() +} + +fn parse_input(input: &str) -> IResult<&str, Vec> { + let (input, result) = separated_list1( + multispace1, + many1( + alt(( + char('I'), + char('V'), + char('X'), + char('L'), + char('C'), + char('D'), + char('M'), + )) + .map(|c| match c { + 'I' => I, + 'V' => V, + 'X' => X, + 'L' => L, + 'C' => C, + 'D' => D, + 'M' => M, + _ => Empty, + }), + ), + )(input)?; + + Ok((input, result)) +} + +fn main() { + println!("Hello, this is Patrick!"); + let now = Instant::now(); + + let input_text = include_str!("../roman.txt"); + + // let res = parse_input(input_text); + // println!("{:?}", res); + + let (_, numerals) = parse_input(input_text).unwrap(); + + let mut result = 0; + for mut numeral in numerals { + let start = numeral.len(); + let mut s = start; + loop { + numeral = reduce(&numeral); + numeral = reduce_extra(&numeral); + if s == numeral.len() { + break; + } + s = numeral.len(); + } + result += start - numeral.len(); + println!("{:?} , {}", numeral, start - numeral.len()); + } + + println!("The number of characters that can be saved is: {}", result); + + println!("Time passed: {:?}", Instant::now() - now); +} From 49784eea22e9bfc0359ca20322067707a6350dda Mon Sep 17 00:00:00 2001 From: Philippe Zwietering Date: Thu, 30 Mar 2023 09:23:37 +0200 Subject: [PATCH 2/2] That was a bitch to debug damn, but PE 089 finished now --- projecteuler/089/src/main.rs | 166 +++++++++++++++++++++++++++++++---- 1 file changed, 150 insertions(+), 16 deletions(-) diff --git a/projecteuler/089/src/main.rs b/projecteuler/089/src/main.rs index cdff4d5..428a892 100644 --- a/projecteuler/089/src/main.rs +++ b/projecteuler/089/src/main.rs @@ -20,7 +20,23 @@ enum RomanNum { use RomanNum::*; type RomanNumeral = Vec; +impl RomanNum { + fn to_digit(&self) -> u32 { + match self { + I => 1, + V => 5, + X => 10, + L => 50, + C => 100, + D => 500, + M => 1000, + Empty => 0, + } + } +} + // This function is not correct at all but I'm not gonna bother fixing it +#[deprecated] fn _is_minimal(number: &RomanNumeral) -> bool { let mut last_num = Empty; let mut occ = 0; @@ -43,7 +59,8 @@ fn _is_minimal(number: &RomanNumeral) -> bool { true } -fn reduce(original: &RomanNumeral) -> RomanNumeral { +#[deprecated] +fn _reduce(original: &RomanNumeral) -> RomanNumeral { let mut last_num = Empty; let mut occ = 0; let mut result = vec![]; @@ -167,7 +184,8 @@ fn reduce(original: &RomanNumeral) -> RomanNumeral { result } -fn reduce_extra(numeral: &RomanNumeral) -> RomanNumeral { +#[deprecated] +fn _reduce_extra(numeral: &RomanNumeral) -> RomanNumeral { if numeral.len() <= 3 { return numeral.clone(); } @@ -211,6 +229,106 @@ fn reduce_extra(numeral: &RomanNumeral) -> RomanNumeral { result.into_iter().filter(|&n| n != Empty).collect() } +fn roman_to_decimal(number: &RomanNumeral) -> u32 { + let mut result: i32 = 0; + let mut last; + let mut current = Empty; + + for &num in number.iter() { + last = current; + current = num; + + if last.to_digit() < current.to_digit() { + result -= last.to_digit() as i32; + } else { + result += last.to_digit() as i32; + } + } + + result += current.to_digit() as i32; + result as u32 +} + +fn decimal_to_roman(number: u32) -> RomanNumeral { + let mut n = number; + let mut result = vec![]; + + while n > 0 { + while n >= 1000 { + result.push(M); + n -= 1000; + } + + if n >= 900 { + result.push(C); + result.push(M); + n -= 900; + } + + if n >= 500 { + result.push(D); + n -= 500; + } + + if n >= 400 { + result.push(C); + result.push(D); + n -= 400; + } + + while n >= 100 { + result.push(C); + n -= 100; + } + + if n >= 90 { + result.push(X); + result.push(C); + n -= 90; + } + + if n >= 50 { + result.push(L); + n -= 50; + } + + if n >= 40 { + result.push(X); + result.push(L); + n -= 40; + } + + while n >= 10 { + result.push(X); + n -= 10; + } + + if n == 9 { + result.push(I); + result.push(X); + n -= 9; + } + + if n >= 5 { + result.push(V); + n -= 5; + } + + if n == 4 { + result.push(I); + result.push(V); + n -= 4; + } + + while n > 0 { + result.push(I); + n -= 1; + } + } + + result +} + fn parse_input(input: &str) -> IResult<&str, Vec> { let (input, result) = separated_list1( multispace1, @@ -250,21 +368,37 @@ fn main() { // println!("{:?}", res); let (_, numerals) = parse_input(input_text).unwrap(); - let mut result = 0; - for mut numeral in numerals { - let start = numeral.len(); - let mut s = start; - loop { - numeral = reduce(&numeral); - numeral = reduce_extra(&numeral); - if s == numeral.len() { - break; - } - s = numeral.len(); - } - result += start - numeral.len(); - println!("{:?} , {}", numeral, start - numeral.len()); + + // for mut numeral in numerals { + // let start = numeral.len(); + // let mut s = start; + // loop { + // numeral = reduce(&numeral); + // numeral = reduce_extra(&numeral); + // if s == numeral.len() { + // break; + // } + // s = numeral.len(); + // } + // result += start - numeral.len(); + // println!("{:?} , {}", numeral, start - numeral.len()); + // } + + // Thanks chat gpt for giving me the direction of a solution that should work (although let the record state that the specific solution it generated was not correct at all) + for numeral in numerals { + let l = numeral.len(); + let dec_version = roman_to_decimal(&numeral); + let rom_version = decimal_to_roman(dec_version); + + // println!( + // "{:?} calculated to be {} then represented as {:?}", + // numeral, &dec_version, &rom_version, + // ); + + debug_assert!(l >= rom_version.len()); + + result += l - rom_version.len(); } println!("The number of characters that can be saved is: {}", result);