1
0

Program.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. namespace D9._2
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. if (args.Length < 1) return;
  12. if (File.Exists(args[0]) == false) return;
  13. var file = File.OpenText(args[0]);
  14. var text = file.ReadToEnd();
  15. var matches = new Regex(@"(?<players>\d+) players; last marble is worth (?<points>\d+) points")
  16. .Match(text);
  17. UInt64 lastMarble = UInt64.Parse(matches.Groups["points"].Value) * 100;
  18. int players = int.Parse(matches.Groups["players"].Value);
  19. var scores = new UInt64[players];
  20. var currentMarble = new Marble();
  21. currentMarble.CounterClockwise = currentMarble;
  22. currentMarble.Clockwise = currentMarble;
  23. int currentPlayer = 1;
  24. for (UInt64 marble = 1; marble <= lastMarble; ++marble)
  25. {
  26. // ------- Winning case --------
  27. if (marble % 23 == 0)
  28. {
  29. scores[currentPlayer - 1] += marble;
  30. var sevenCounterClockwiseMarble = currentMarble
  31. .CounterClockwise
  32. .CounterClockwise
  33. .CounterClockwise
  34. .CounterClockwise
  35. .CounterClockwise
  36. .CounterClockwise
  37. .CounterClockwise;
  38. scores[currentPlayer - 1] += sevenCounterClockwiseMarble.Value;
  39. sevenCounterClockwiseMarble.CounterClockwise.Clockwise = sevenCounterClockwiseMarble.Clockwise;
  40. currentMarble = sevenCounterClockwiseMarble.Clockwise;
  41. }
  42. // ------- Cas nominal ---------
  43. else
  44. {
  45. var oneClockwise = currentMarble.Clockwise;
  46. var twoClockwise = oneClockwise.Clockwise;
  47. var newMarble = new Marble()
  48. {
  49. CounterClockwise = oneClockwise,
  50. Clockwise = twoClockwise,
  51. Value = marble
  52. };
  53. oneClockwise.Clockwise = newMarble;
  54. twoClockwise.CounterClockwise = newMarble;
  55. currentMarble = newMarble;
  56. }
  57. currentPlayer += 1;
  58. if (currentPlayer > players) currentPlayer = 1;
  59. }
  60. UInt64 max = scores.Max();
  61. Console.WriteLine($"Result is : {max}");
  62. }
  63. class Marble
  64. {
  65. public Marble CounterClockwise { get; set; }
  66. public Marble Clockwise { get; set; }
  67. public UInt64 Value { get; set; }
  68. }
  69. }
  70. }