From 9389cab28ffdf9068b42495ee5908eaaebcdf51d Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Tue, 12 Aug 2025 20:00:25 -0400 Subject: [PATCH 01/19] Add .gitignore to exclude IDE and build artifacts --- .gitignore | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba41720 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +**/.idea +**/bin +**/obj +**/.DS_Store +**/.vs +**/*.DotSettings.user + +**.csproj.user + +**.orig From 05d28e8f920bae0c0de6b5535fd76237ed846dea Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Tue, 12 Aug 2025 20:01:03 -0400 Subject: [PATCH 02/19] WIP first working version --- RomanNumbers.sln | 22 ++++ RomanNumbers/Program.cs | 128 +++++++++++++++++++ RomanNumbers/RomanNumbers.csproj | 16 +++ RomanNumbers/input.txt | 23 ++++ RomanNumbers_Tests/Program.cs | 3 + RomanNumbers_Tests/RomanNumbers_Tests.csproj | 10 ++ 6 files changed, 202 insertions(+) create mode 100644 RomanNumbers.sln create mode 100644 RomanNumbers/Program.cs create mode 100644 RomanNumbers/RomanNumbers.csproj create mode 100644 RomanNumbers/input.txt create mode 100644 RomanNumbers_Tests/Program.cs create mode 100644 RomanNumbers_Tests/RomanNumbers_Tests.csproj diff --git a/RomanNumbers.sln b/RomanNumbers.sln new file mode 100644 index 0000000..a21aa66 --- /dev/null +++ b/RomanNumbers.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RomanNumbers", "RomanNumbers\RomanNumbers.csproj", "{04E6EE40-4E55-484A-9470-8114CE66D5A6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RomanNumbers_Tests", "RomanNumbers_Tests\RomanNumbers_Tests.csproj", "{BD117369-C26D-4456-BE0E-635A6CC49B6E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {04E6EE40-4E55-484A-9470-8114CE66D5A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04E6EE40-4E55-484A-9470-8114CE66D5A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04E6EE40-4E55-484A-9470-8114CE66D5A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04E6EE40-4E55-484A-9470-8114CE66D5A6}.Release|Any CPU.Build.0 = Release|Any CPU + {BD117369-C26D-4456-BE0E-635A6CC49B6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD117369-C26D-4456-BE0E-635A6CC49B6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD117369-C26D-4456-BE0E-635A6CC49B6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD117369-C26D-4456-BE0E-635A6CC49B6E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs new file mode 100644 index 0000000..3a9c923 --- /dev/null +++ b/RomanNumbers/Program.cs @@ -0,0 +1,128 @@ +if (args.Length == 0) +{ + Console.WriteLine("Please provide a file path as an argument."); + return; +} + +var filePath = args[0]; +if (!File.Exists(filePath)) +{ + Console.WriteLine($"File not found: {filePath}"); + return; +} +// TODO: Remove Above code +var content = File.ReadAllText(filePath); +var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + +foreach (var line in lines) +{ + Console.WriteLine(line); // TODO: Remove + + var outputLine = new List(); + var characters = line.AsSpan(); + var place = 1; + for (var i = characters.Length - 1; i >= 0; i--) + { + var character = (int)char.GetNumericValue(characters[i]); + var outputCharacter = new List(); + if (place == 1) + { + if (character < 4) + { + for (var j = 0; j < character; j++) + { + outputCharacter.Add("I"); + } + } + else if (character == 4) + { + outputCharacter.Add("IV"); + } + else if(character < 10) + { + outputCharacter.Add("V"); + for (var h = 5; h < character; h++) + { + outputCharacter.Add("I"); + } + } + } + else if (place == 2) + { + if (character < 4) + { + for (var j = 0; j < character; j++) + { + outputCharacter.Add("X"); + } + } + else if(character == 4) + { + outputCharacter.Add("XL"); + } + else if(character == 5) + { + outputCharacter.Add("L"); + } + else if(character < 10) + { + outputCharacter.Add("L"); + for (var h = 5; h < character; h++) + { + outputCharacter.Add("X"); + } + } + else + { + outputCharacter.Add("X"); + } + } + else if (place == 3) + { + if (character < 4) + { + for (var j = 0; j < character; j++) + { + outputCharacter.Add("C"); + } + } + else if(character == 4) + { + outputCharacter.Add("CD"); + } + else if(character == 5) + { + outputCharacter.Add("D"); + } + else if(character < 10) + { + outputCharacter.Add("D"); + for (var h = 5; h < character; h++) + { + outputCharacter.Add("C"); + } + } + else + { + outputCharacter.Add("C"); + } + } + else if (place == 4) + { + for (var j = 0; j < character; j++) + { + outputCharacter.Add("M"); + } + } + + outputLine.Add(string.Join("", outputCharacter)); + if (place == characters.Length) + { + outputLine.Reverse(); + Console.Write(string.Join("", outputLine)); + break; + } + place++; + } + Console.Write('\n'); +} \ No newline at end of file diff --git a/RomanNumbers/RomanNumbers.csproj b/RomanNumbers/RomanNumbers.csproj new file mode 100644 index 0000000..2b0e269 --- /dev/null +++ b/RomanNumbers/RomanNumbers.csproj @@ -0,0 +1,16 @@ + + + + Exe + net9.0 + enable + enable + + + + + Always + + + + diff --git a/RomanNumbers/input.txt b/RomanNumbers/input.txt new file mode 100644 index 0000000..841c1f0 --- /dev/null +++ b/RomanNumbers/input.txt @@ -0,0 +1,23 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +20 +25 +31 +43 +50 +55 +60 +90 +104 +243 +401 +3277 diff --git a/RomanNumbers_Tests/Program.cs b/RomanNumbers_Tests/Program.cs new file mode 100644 index 0000000..e5dff12 --- /dev/null +++ b/RomanNumbers_Tests/Program.cs @@ -0,0 +1,3 @@ +// See https://aka.ms/new-console-template for more information + +Console.WriteLine("Hello, World!"); \ No newline at end of file diff --git a/RomanNumbers_Tests/RomanNumbers_Tests.csproj b/RomanNumbers_Tests/RomanNumbers_Tests.csproj new file mode 100644 index 0000000..85b4959 --- /dev/null +++ b/RomanNumbers_Tests/RomanNumbers_Tests.csproj @@ -0,0 +1,10 @@ + + + + Exe + net9.0 + enable + enable + + + From f89e5bbca44cbe039662649d7f125003a492f8dc Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Tue, 12 Aug 2025 22:44:42 -0400 Subject: [PATCH 03/19] Reduce to function call and add test --- RomanNumbers/Program.cs | 167 ++++++------------- RomanNumbers/RomanNumbers.csproj | 6 + RomanNumbers_Tests/Program.cs | 76 ++++++++- RomanNumbers_Tests/RomanNumbers_Tests.csproj | 10 +- RomanNumbers_Tests/input.txt | 23 +++ RomanNumbers_Tests/output.txt | 23 +++ 6 files changed, 185 insertions(+), 120 deletions(-) create mode 100644 RomanNumbers_Tests/input.txt create mode 100644 RomanNumbers_Tests/output.txt diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 3a9c923..1f2e9ab 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,128 +1,61 @@ -if (args.Length == 0) -{ - Console.WriteLine("Please provide a file path as an argument."); - return; -} - -var filePath = args[0]; -if (!File.Exists(filePath)) -{ - Console.WriteLine($"File not found: {filePath}"); - return; -} -// TODO: Remove Above code -var content = File.ReadAllText(filePath); +var content = File.ReadAllText(args[0]); var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); -foreach (var line in lines) +foreach (var l in lines) { - Console.WriteLine(line); // TODO: Remove - - var outputLine = new List(); - var characters = line.AsSpan(); - var place = 1; - for (var i = characters.Length - 1; i >= 0; i--) + var op = new List(); + var lts = l.AsSpan(); + var ix = 1; + for (var i = lts.Length - 1; i >= 0; i--) { - var character = (int)char.GetNumericValue(characters[i]); - var outputCharacter = new List(); - if (place == 1) - { - if (character < 4) - { - for (var j = 0; j < character; j++) - { - outputCharacter.Add("I"); - } - } - else if (character == 4) - { - outputCharacter.Add("IV"); - } - else if(character < 10) - { - outputCharacter.Add("V"); - for (var h = 5; h < character; h++) - { - outputCharacter.Add("I"); - } - } - } - else if (place == 2) - { - if (character < 4) - { - for (var j = 0; j < character; j++) - { - outputCharacter.Add("X"); - } - } - else if(character == 4) - { - outputCharacter.Add("XL"); - } - else if(character == 5) - { - outputCharacter.Add("L"); - } - else if(character < 10) - { - outputCharacter.Add("L"); - for (var h = 5; h < character; h++) - { - outputCharacter.Add("X"); - } - } - else - { - outputCharacter.Add("X"); - } - } - else if (place == 3) - { - if (character < 4) - { - for (var j = 0; j < character; j++) - { - outputCharacter.Add("C"); - } - } - else if(character == 4) - { - outputCharacter.Add("CD"); - } - else if(character == 5) - { - outputCharacter.Add("D"); - } - else if(character < 10) - { - outputCharacter.Add("D"); - for (var h = 5; h < character; h++) - { - outputCharacter.Add("C"); - } - } - else - { - outputCharacter.Add("C"); - } - } - else if (place == 4) + var lt = (int)char.GetNumericValue(lts[i]); + var cfg = new Dictionary { - for (var j = 0; j < character; j++) - { - outputCharacter.Add("M"); - } - } + { 1, new () { First = "I", Forth = "IV", Fifth = "V", Sixth = "I"}}, + { 2, new() { First = "X", Forth = "XL", Fifth = "L", Sixth = "X", Ten = "X"}}, + { 3, new() { First = "C", Forth = "CD", Fifth = "D", Sixth = "C", Ten = "C"}}, + { 4, new () { First = "M"}} + }; + + var opChar = ToRomain(cfg[ix], lt, ix); - outputLine.Add(string.Join("", outputCharacter)); - if (place == characters.Length) + op.Add(string.Join("", opChar)); + if (ix == lts.Length) { - outputLine.Reverse(); - Console.Write(string.Join("", outputLine)); - break; + op.Reverse(); + Console.Write(string.Join("", op)); } - place++; + ix++; } Console.Write('\n'); +} + +static List ToRomain(Config cfg, int lt, int ix) +{ + var oplt = new List(); + if (ix != 1 && lt == 1 ) + { + oplt.Add(cfg.Ten); + } + else if (lt < 4 && lt != 0) + for (var j = 0; j < lt; j++) + oplt.Add(cfg.First); + else if (lt == 4) + oplt.Add(cfg.Forth); + else if(lt < 10 && lt != 0) + { + oplt.Add(cfg.Fifth); + for (var h = 5; h < lt; h++) oplt.Add(cfg.Sixth); + } + + return oplt; +} + +record Config +{ + public string First; + public string Forth; + public string Fifth; + public string Sixth; + public string Ten; } \ No newline at end of file diff --git a/RomanNumbers/RomanNumbers.csproj b/RomanNumbers/RomanNumbers.csproj index 2b0e269..f9839e8 100644 --- a/RomanNumbers/RomanNumbers.csproj +++ b/RomanNumbers/RomanNumbers.csproj @@ -13,4 +13,10 @@ + + + <_Parameter1>RomanNumbers_Tests + + + diff --git a/RomanNumbers_Tests/Program.cs b/RomanNumbers_Tests/Program.cs index e5dff12..9de60b1 100644 --- a/RomanNumbers_Tests/Program.cs +++ b/RomanNumbers_Tests/Program.cs @@ -1,3 +1,75 @@ -// See https://aka.ms/new-console-template for more information +using System.Diagnostics; +using Xunit; -Console.WriteLine("Hello, World!"); \ No newline at end of file +namespace RomanNumbers_Tests; + +public class RomanNumberConversionTests +{ + // [Fact] + // public void TestConsoleOutput() + // { + // // Setup test file + // var testFilePath = Path.GetTempFileName(); + // File.WriteAllText(testFilePath, "42\n99"); + // + // // Redirect console output + // var originalOut = Console.Out; + // using var output = new StringWriter(); + // Console.SetOut(output); + // + // // Run your minimal program + // Program.Main(new[] { testFilePath }); + // + // // Check results + // var result = output.ToString().Trim(); + // Assert.Equal("XLII\nXCIX", result); + // + // // Cleanup + // Console.SetOut(originalOut); + // File.Delete(testFilePath); + // } + + [Fact] + public void TestEndToEnd() + { + // Create test input file + // var inputPath = Path.Combine(Path.GetTempPath(), "test-input.txt"); + // File.WriteAllText(inputPath, "27\n238\n2019"); + var programPath = "C:\\source\\playground\\code_golf\\RomanNumbers_Tests\\bin\\Debug\\net9.0\\RomanNumbers.exe"; + var inputFilePath = "C:\\source\\playground\\code_golf\\RomanNumbers_Tests\\input.txt"; + var expectedOutputFilePath = "C:\\source\\playground\\code_golf\\RomanNumbers_Tests\\output.txt"; + + var expectedOutput = File.ReadAllText(expectedOutputFilePath); + var expectedOutputLines = expectedOutput.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + // Build process to run your compiled app + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = programPath, + Arguments = inputFilePath, + RedirectStandardOutput = true, + UseShellExecute = false + } + }; + + // Run and capture output + process.Start(); + var output = process.StandardOutput.ReadToEnd(); + var lines = output.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + Assert.NotEmpty(lines); + for (var i = 0; i < lines.Length; i++) + { + var line = lines[i]; + var expected = expectedOutputLines[i]; + Assert.Equal(expected, line); + } + + process.WaitForExit(); + + //Assert.Equal("XXVII\nCCXXXVIII\nMMXIX", output.Trim()); + //File.Delete(inputPath); + } +} \ No newline at end of file diff --git a/RomanNumbers_Tests/RomanNumbers_Tests.csproj b/RomanNumbers_Tests/RomanNumbers_Tests.csproj index 85b4959..3913a46 100644 --- a/RomanNumbers_Tests/RomanNumbers_Tests.csproj +++ b/RomanNumbers_Tests/RomanNumbers_Tests.csproj @@ -1,10 +1,18 @@  - Exe net9.0 enable enable + true + + + + + + + + diff --git a/RomanNumbers_Tests/input.txt b/RomanNumbers_Tests/input.txt new file mode 100644 index 0000000..841c1f0 --- /dev/null +++ b/RomanNumbers_Tests/input.txt @@ -0,0 +1,23 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +20 +25 +31 +43 +50 +55 +60 +90 +104 +243 +401 +3277 diff --git a/RomanNumbers_Tests/output.txt b/RomanNumbers_Tests/output.txt new file mode 100644 index 0000000..359d4d8 --- /dev/null +++ b/RomanNumbers_Tests/output.txt @@ -0,0 +1,23 @@ +I +II +III +IV +V +VI +VII +VIII +VIIII +X +XI +XX +XXV +XXXI +XLIII +L +LV +LX +LXXXX +CIV +CCXLIII +CDI +MMMCCLXXVII \ No newline at end of file From c3a02a7777c56bd957b50a499bb065787d6cea0d Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Tue, 12 Aug 2025 23:01:41 -0400 Subject: [PATCH 04/19] Refactor configuration handling for Roman numeral conversion --- RomanNumbers/Program.cs | 43 ++++++++++++++++------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 1f2e9ab..184de58 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,6 +1,14 @@ var content = File.ReadAllText(args[0]); var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); +var cfgs = new Dictionary +{ + { 1, new() { Fst = "I", Fth = "IV", Ffh = "V", Sx = "I" } }, + { 2, new() { Fst = "X", Fth = "XL", Ffh = "L", Sx = "X", Tn = "X" } }, + { 3, new() { Fst = "C", Fth = "CD", Ffh = "D", Sx = "C", Tn = "C" } }, + { 4, new() { Fst = "M" } } +}; + foreach (var l in lines) { var op = new List(); @@ -9,17 +17,8 @@ for (var i = lts.Length - 1; i >= 0; i--) { var lt = (int)char.GetNumericValue(lts[i]); - var cfg = new Dictionary - { - { 1, new () { First = "I", Forth = "IV", Fifth = "V", Sixth = "I"}}, - { 2, new() { First = "X", Forth = "XL", Fifth = "L", Sixth = "X", Ten = "X"}}, - { 3, new() { First = "C", Forth = "CD", Fifth = "D", Sixth = "C", Ten = "C"}}, - { 4, new () { First = "M"}} - }; - - var opChar = ToRomain(cfg[ix], lt, ix); - - op.Add(string.Join("", opChar)); + + op.Add(string.Join("", ToRomain(cfgs[ix], lt, ix))); if (ix == lts.Length) { op.Reverse(); @@ -30,32 +29,24 @@ Console.Write('\n'); } -static List ToRomain(Config cfg, int lt, int ix) +List ToRomain(Config cfg, int lt, int ix) { var oplt = new List(); if (ix != 1 && lt == 1 ) { - oplt.Add(cfg.Ten); + oplt.Add(cfg.Tn); } else if (lt < 4 && lt != 0) for (var j = 0; j < lt; j++) - oplt.Add(cfg.First); + oplt.Add(cfg.Fst); else if (lt == 4) - oplt.Add(cfg.Forth); + oplt.Add(cfg.Fth); else if(lt < 10 && lt != 0) { - oplt.Add(cfg.Fifth); - for (var h = 5; h < lt; h++) oplt.Add(cfg.Sixth); + oplt.Add(cfg.Ffh); + for (var h = 5; h < lt; h++) oplt.Add(cfg.Sx); } - return oplt; } -record Config -{ - public string First; - public string Forth; - public string Fifth; - public string Sixth; - public string Ten; -} \ No newline at end of file +record Config { public string Fst; public string Fth; public string Ffh; public string Sx; public string Tn; } \ No newline at end of file From 77b1583c188694d098af8026fc2262fac46839bc Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 10:38:44 -0400 Subject: [PATCH 05/19] Convert Main loop to Lambda --- RomanNumbers/Program.cs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 184de58..3d6b0e0 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,5 +1,5 @@ var content = File.ReadAllText(args[0]); -var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); +var p = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); var cfgs = new Dictionary { @@ -9,17 +9,16 @@ { 4, new() { Fst = "M" } } }; -foreach (var l in lines) +p.ToList().ForEach(l => { var op = new List(); - var lts = l.AsSpan(); + var w = l.AsSpan(); var ix = 1; - for (var i = lts.Length - 1; i >= 0; i--) + for (var i = w.Length - 1; i >= 0; i--) { - var lt = (int)char.GetNumericValue(lts[i]); - + var lt = (int)char.GetNumericValue(w[i]); op.Add(string.Join("", ToRomain(cfgs[ix], lt, ix))); - if (ix == lts.Length) + if (ix == w.Length) { op.Reverse(); Console.Write(string.Join("", op)); @@ -27,7 +26,7 @@ ix++; } Console.Write('\n'); -} +}); List ToRomain(Config cfg, int lt, int ix) { From aaa5d93d2ac4d5969abbf655a451218223238cd9 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 10:49:55 -0400 Subject: [PATCH 06/19] Inner Loop to foreach --- RomanNumbers/Program.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 3d6b0e0..074d238 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -12,19 +12,19 @@ p.ToList().ForEach(l => { var op = new List(); - var w = l.AsSpan(); var ix = 1; - for (var i = w.Length - 1; i >= 0; i--) + foreach (var ch in l.ToArray().Reverse().Select(c => c)) { - var lt = (int)char.GetNumericValue(w[i]); + var lt = (int)char.GetNumericValue(ch); op.Add(string.Join("", ToRomain(cfgs[ix], lt, ix))); - if (ix == w.Length) + if (ix == l.Length) { op.Reverse(); Console.Write(string.Join("", op)); } ix++; } + Console.Write('\n'); }); From f1ed9d71932cc62721af5f761fd1ed3f6c99a291 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:01:12 -0400 Subject: [PATCH 07/19] ToRomain to array --- RomanNumbers/Program.cs | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 074d238..3c7a595 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -24,28 +24,18 @@ } ix++; } - Console.Write('\n'); }); -List ToRomain(Config cfg, int lt, int ix) -{ - var oplt = new List(); - if (ix != 1 && lt == 1 ) - { - oplt.Add(cfg.Tn); - } - else if (lt < 4 && lt != 0) - for (var j = 0; j < lt; j++) - oplt.Add(cfg.Fst); - else if (lt == 4) - oplt.Add(cfg.Fth); - else if(lt < 10 && lt != 0) +string[] ToRomain(Config cfg, int lt, int ix) => + lt switch { - oplt.Add(cfg.Ffh); - for (var h = 5; h < lt; h++) oplt.Add(cfg.Sx); - } - return oplt; -} + 1 when ix != 1 => [cfg.Tn], + < 4 when lt != 0 => Enumerable.Repeat(cfg.Fst, lt).ToArray(), + 4 => [cfg.Fth], + < 10 when lt != 0 => (new[] { cfg.Ffh }) + .Concat(Enumerable.Repeat(cfg.Sx, lt - 5)).ToArray(), + _ => [] + }; record Config { public string Fst; public string Fth; public string Ffh; public string Sx; public string Tn; } \ No newline at end of file From 3f1f8c0350b4def1d3f39440d06b87b3bef6ee14 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:14:56 -0400 Subject: [PATCH 08/19] Config to string array, Read lines to linq --- RomanNumbers/Program.cs | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 3c7a595..ce6935f 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,22 +1,21 @@ -var content = File.ReadAllText(args[0]); -var p = content.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); +var p = File.ReadAllLines(args[0]).Select(s => s.Trim()); -var cfgs = new Dictionary +var cfgs = new Dictionary { - { 1, new() { Fst = "I", Fth = "IV", Ffh = "V", Sx = "I" } }, - { 2, new() { Fst = "X", Fth = "XL", Ffh = "L", Sx = "X", Tn = "X" } }, - { 3, new() { Fst = "C", Fth = "CD", Ffh = "D", Sx = "C", Tn = "C" } }, - { 4, new() { Fst = "M" } } + { 1, ["I", "IV", "V", "I", null] }, + { 2, ["X", "XL", "L", "X", "X"] }, + { 3, ["C", "CD", "D", "C", "C"] }, + { 4, ["M", null, null, null, null] } }; p.ToList().ForEach(l => { - var op = new List(); + List op = []; var ix = 1; foreach (var ch in l.ToArray().Reverse().Select(c => c)) { var lt = (int)char.GetNumericValue(ch); - op.Add(string.Join("", ToRomain(cfgs[ix], lt, ix))); + op.Add(string.Join("", R(cfgs[ix], lt, ix))); if (ix == l.Length) { op.Reverse(); @@ -27,15 +26,12 @@ Console.Write('\n'); }); -string[] ToRomain(Config cfg, int lt, int ix) => +string[] R(string[] c, int lt, int ix) => lt switch { - 1 when ix != 1 => [cfg.Tn], - < 4 when lt != 0 => Enumerable.Repeat(cfg.Fst, lt).ToArray(), - 4 => [cfg.Fth], - < 10 when lt != 0 => (new[] { cfg.Ffh }) - .Concat(Enumerable.Repeat(cfg.Sx, lt - 5)).ToArray(), + 1 when ix != 1 => [c[4]], + < 4 when lt != 0 => Enumerable.Repeat(c[0], lt).ToArray(), + 4 => [c[1]], + < 10 when lt != 0 => [c[2], ..Enumerable.Repeat(c[3], lt - 5)], _ => [] - }; - -record Config { public string Fst; public string Fth; public string Ffh; public string Sx; public string Tn; } \ No newline at end of file + }; \ No newline at end of file From 59bd5ca36f05b59cfd601ebc6bab018f7dbb155c Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:21:06 -0400 Subject: [PATCH 09/19] Inline ToRomain function --- RomanNumbers/Program.cs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index ce6935f..781172a 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -15,7 +15,15 @@ foreach (var ch in l.ToArray().Reverse().Select(c => c)) { var lt = (int)char.GetNumericValue(ch); - op.Add(string.Join("", R(cfgs[ix], lt, ix))); + op.Add(string.Join("", + lt switch + { + 1 when ix != 1 => [cfgs[ix][4]], + < 4 when lt != 0 => Enumerable.Repeat(cfgs[ix][0], lt).ToArray(), + 4 => [cfgs[ix][1]], + < 10 when lt != 0 => [cfgs[ix][2], ..Enumerable.Repeat(cfgs[ix][3], lt - 5)], + _ => [] + })); if (ix == l.Length) { op.Reverse(); @@ -25,13 +33,3 @@ } Console.Write('\n'); }); - -string[] R(string[] c, int lt, int ix) => - lt switch - { - 1 when ix != 1 => [c[4]], - < 4 when lt != 0 => Enumerable.Repeat(c[0], lt).ToArray(), - 4 => [c[1]], - < 10 when lt != 0 => [c[2], ..Enumerable.Repeat(c[3], lt - 5)], - _ => [] - }; \ No newline at end of file From d569989132db7716cd698536ef16706b2d5a8729 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:24:07 -0400 Subject: [PATCH 10/19] Remove extra from read file, rename config --- RomanNumbers/Program.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 781172a..0493fe3 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,6 +1,6 @@ -var p = File.ReadAllLines(args[0]).Select(s => s.Trim()); +var p = File.ReadAllLines(args[0]); -var cfgs = new Dictionary +var x = new Dictionary { { 1, ["I", "IV", "V", "I", null] }, { 2, ["X", "XL", "L", "X", "X"] }, @@ -18,10 +18,10 @@ op.Add(string.Join("", lt switch { - 1 when ix != 1 => [cfgs[ix][4]], - < 4 when lt != 0 => Enumerable.Repeat(cfgs[ix][0], lt).ToArray(), - 4 => [cfgs[ix][1]], - < 10 when lt != 0 => [cfgs[ix][2], ..Enumerable.Repeat(cfgs[ix][3], lt - 5)], + 1 when ix != 1 => [x[ix][4]], + < 4 when lt != 0 => Enumerable.Repeat(x[ix][0], lt).ToArray(), + 4 => [x[ix][1]], + < 10 when lt != 0 => [x[ix][2], ..Enumerable.Repeat(x[ix][3], lt - 5)], _ => [] })); if (ix == l.Length) From b127963e9374bdba2f134aa1b04c8e038a254aa8 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:26:46 -0400 Subject: [PATCH 11/19] Removed extra characters from var names --- RomanNumbers/Program.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 0493fe3..65be31d 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -11,25 +11,25 @@ p.ToList().ForEach(l => { List op = []; - var ix = 1; - foreach (var ch in l.ToArray().Reverse().Select(c => c)) + var i = 1; + foreach (var h in l.Reverse()) { - var lt = (int)char.GetNumericValue(ch); + var lt = (int)char.GetNumericValue(h); op.Add(string.Join("", lt switch { - 1 when ix != 1 => [x[ix][4]], - < 4 when lt != 0 => Enumerable.Repeat(x[ix][0], lt).ToArray(), - 4 => [x[ix][1]], - < 10 when lt != 0 => [x[ix][2], ..Enumerable.Repeat(x[ix][3], lt - 5)], + 1 when i != 1 => [x[i][4]], + < 4 when lt != 0 => Enumerable.Repeat(x[i][0], lt).ToArray(), + 4 => [x[i][1]], + < 10 when lt != 0 => [x[i][2], ..Enumerable.Repeat(x[i][3], lt - 5)], _ => [] })); - if (ix == l.Length) + if (i == l.Length) { op.Reverse(); Console.Write(string.Join("", op)); } - ix++; + i++; } Console.Write('\n'); }); From 86f533b894891156da8b81c5f6ac22dea4c6ac32 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:35:37 -0400 Subject: [PATCH 12/19] Move config from dictionary to array --- RomanNumbers/Program.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 65be31d..8922f0d 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,11 +1,11 @@ var p = File.ReadAllLines(args[0]); -var x = new Dictionary +var x = new[] { - { 1, ["I", "IV", "V", "I", null] }, - { 2, ["X", "XL", "L", "X", "X"] }, - { 3, ["C", "CD", "D", "C", "C"] }, - { 4, ["M", null, null, null, null] } + new[] { "I", "IV", "V", "I" }, + new[] { "X", "XL", "L", "X", "X" }, + new[] { "C", "CD", "D", "C", "C" }, + new[] { "M" } }; p.ToList().ForEach(l => @@ -14,14 +14,14 @@ var i = 1; foreach (var h in l.Reverse()) { - var lt = (int)char.GetNumericValue(h); + var lt=h-'0'; op.Add(string.Join("", lt switch { - 1 when i != 1 => [x[i][4]], - < 4 when lt != 0 => Enumerable.Repeat(x[i][0], lt).ToArray(), - 4 => [x[i][1]], - < 10 when lt != 0 => [x[i][2], ..Enumerable.Repeat(x[i][3], lt - 5)], + 1 when i != 1 => [x[i-1][4]], + < 4 when lt != 0 => Enumerable.Repeat(x[i-1][0], lt), + 4 => [x[i-1][1]], + < 10 when lt != 0 => [x[i-1][2], ..Enumerable.Repeat(x[i-1][3], lt - 5)], _ => [] })); if (i == l.Length) From 13e05c5303c5f599c4cbdbd73824621527414346 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:38:51 -0400 Subject: [PATCH 13/19] Change config to use collection expressions --- RomanNumbers/Program.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 8922f0d..bbf0f9a 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,12 +1,12 @@ var p = File.ReadAllLines(args[0]); -var x = new[] -{ - new[] { "I", "IV", "V", "I" }, - new[] { "X", "XL", "L", "X", "X" }, - new[] { "C", "CD", "D", "C", "C" }, - new[] { "M" } -}; +string[][] x = +[ + ["I", "IV", "V", "I"], + ["X", "XL", "L", "X", "X"], + ["C", "CD", "D", "C", "C"], + ["M"] +]; p.ToList().ForEach(l => { From 18282aed4586d33678abf4b1294f8ae6ddefd640 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:41:43 -0400 Subject: [PATCH 14/19] Rename varable names to single character --- RomanNumbers/Program.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index bbf0f9a..0120033 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -10,24 +10,24 @@ p.ToList().ForEach(l => { - List op = []; + List o = []; var i = 1; foreach (var h in l.Reverse()) { - var lt=h-'0'; - op.Add(string.Join("", - lt switch + var e=h-'0'; + o.Add(string.Join("", + e switch { 1 when i != 1 => [x[i-1][4]], - < 4 when lt != 0 => Enumerable.Repeat(x[i-1][0], lt), + < 4 when e != 0 => Enumerable.Repeat(x[i-1][0], e), 4 => [x[i-1][1]], - < 10 when lt != 0 => [x[i-1][2], ..Enumerable.Repeat(x[i-1][3], lt - 5)], + < 10 when e != 0 => [x[i-1][2], ..Enumerable.Repeat(x[i-1][3], e - 5)], _ => [] })); if (i == l.Length) { - op.Reverse(); - Console.Write(string.Join("", op)); + o.Reverse(); + Console.Write(string.Join("", o)); } i++; } From a460dfa485e0a3a6741db25e92ee7e42af9bf904 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 11:53:41 -0400 Subject: [PATCH 15/19] From Swith to turiniary --- RomanNumbers/Program.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 0120033..7c5271d 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -8,7 +8,7 @@ ["M"] ]; -p.ToList().ForEach(l => +foreach (var l in p) { List o = []; var i = 1; @@ -16,14 +16,10 @@ { var e=h-'0'; o.Add(string.Join("", - e switch - { - 1 when i != 1 => [x[i-1][4]], - < 4 when e != 0 => Enumerable.Repeat(x[i-1][0], e), - 4 => [x[i-1][1]], - < 10 when e != 0 => [x[i-1][2], ..Enumerable.Repeat(x[i-1][3], e - 5)], - _ => [] - })); + e == 1 && i != 1 ? [x[i - 1][4]] : + e < 4 && e != 0 ? Enumerable.Repeat(x[i - 1][0], e) : + e == 4 ? [x[i - 1][1]] : + e < 10 && e != 0 ? [x[i - 1][2], ..Enumerable.Repeat(x[i - 1][3], e - 5)] : [])); if (i == l.Length) { o.Reverse(); @@ -32,4 +28,4 @@ i++; } Console.Write('\n'); -}); +} \ No newline at end of file From 283498eb26711b9c371a4098d3f7720532ab3b35 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 12:07:43 -0400 Subject: [PATCH 16/19] Switch from Enumarable to string append --- RomanNumbers/Program.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 7c5271d..9aaf4ff 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -15,11 +15,13 @@ foreach (var h in l.Reverse()) { var e=h-'0'; - o.Add(string.Join("", - e == 1 && i != 1 ? [x[i - 1][4]] : - e < 4 && e != 0 ? Enumerable.Repeat(x[i - 1][0], e) : - e == 4 ? [x[i - 1][1]] : - e < 10 && e != 0 ? [x[i - 1][2], ..Enumerable.Repeat(x[i - 1][3], e - 5)] : [])); + o.Add( + e == 1 && i != 1 ? x[i - 1][4] : + e < 4 && e != 0 ? new string(x[i - 1][0][0], e) : + e == 4 ? x[i - 1][1] : + e < 10 && e != 0 ? x[i - 1][2] + new string(x[i - 1][3][0], e - 5) : + "" + ); if (i == l.Length) { o.Reverse(); @@ -28,4 +30,4 @@ i++; } Console.Write('\n'); -} \ No newline at end of file +} From c74eb142911c0fc08b3ab6775db58f4a8b2d0d93 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 12:16:11 -0400 Subject: [PATCH 17/19] Convert the list of string to string concat --- RomanNumbers/Program.cs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 9aaf4ff..e9d1e04 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -10,22 +10,20 @@ foreach (var l in p) { - List o = []; + var o = ""; var i = 1; foreach (var h in l.Reverse()) { - var e=h-'0'; - o.Add( - e == 1 && i != 1 ? x[i - 1][4] : - e < 4 && e != 0 ? new string(x[i - 1][0][0], e) : - e == 4 ? x[i - 1][1] : - e < 10 && e != 0 ? x[i - 1][2] + new string(x[i - 1][3][0], e - 5) : - "" - ); + var e = h - '0'; + o = + e == 1 && i != 1 ? x[i - 1][4] + o : + e < 4 && e != 0 ? new string(x[i - 1][0][0], e) + o : + e == 4 ? x[i - 1][1] + o : + e < 10 && e != 0 ? x[i - 1][2] + new string(x[i - 1][3][0], e - 5) + o : + o; if (i == l.Length) { - o.Reverse(); - Console.Write(string.Join("", o)); + Console.Write(o); } i++; } From 2fc1108ae6bc2578cee76282e7f4393b311c37e3 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 12:33:10 -0400 Subject: [PATCH 18/19] Swith from write to write line --- RomanNumbers/Program.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index e9d1e04..66c0ccf 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -21,11 +21,7 @@ e == 4 ? x[i - 1][1] + o : e < 10 && e != 0 ? x[i - 1][2] + new string(x[i - 1][3][0], e - 5) + o : o; - if (i == l.Length) - { - Console.Write(o); - } i++; } - Console.Write('\n'); + Console.WriteLine(o); } From 5780a289674aee72f721eef4537c1cb47ba93875 Mon Sep 17 00:00:00 2001 From: Jeffrey Stines Date: Wed, 13 Aug 2025 12:52:20 -0400 Subject: [PATCH 19/19] Move Imports to global usings --- RomanNumbers/GlobalUsings.cs | 4 ++++ RomanNumbers/Program.cs | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 RomanNumbers/GlobalUsings.cs diff --git a/RomanNumbers/GlobalUsings.cs b/RomanNumbers/GlobalUsings.cs new file mode 100644 index 0000000..5773852 --- /dev/null +++ b/RomanNumbers/GlobalUsings.cs @@ -0,0 +1,4 @@ +// Global using directives + +global using static System.Console; +global using static System.IO.File; \ No newline at end of file diff --git a/RomanNumbers/Program.cs b/RomanNumbers/Program.cs index 66c0ccf..3caa1c2 100644 --- a/RomanNumbers/Program.cs +++ b/RomanNumbers/Program.cs @@ -1,4 +1,4 @@ -var p = File.ReadAllLines(args[0]); +var p = ReadAllLines(args[0]); string[][] x = [ @@ -23,5 +23,5 @@ o; i++; } - Console.WriteLine(o); + WriteLine(o); }