| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Text.RegularExpressions;
- namespace D14._1
- {
- public enum EnumState
- {
- Running, Resting
- };
- public class Reindeer
- {
- public int Speed;
- public int SpeedTime;
- public int RestTime;
- public string Name;
- public int DistanceTraveled = 0;
- public EnumState State = EnumState.Running;
- public int Remaining = 0;
- public override bool Equals(object obj)
- {
- var reindeer = obj as Reindeer;
- return reindeer != null &&
- Name == reindeer.Name;
- }
- public override int GetHashCode()
- {
- return HashCode.Combine(Name);
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- if (args.Length < 1) throw new ArgumentException();
- if (File.Exists(args[0]) == false) throw new FileNotFoundException();
- var reindeers = new HashSet<Reindeer>();
- ParseFile(args[0], reindeers);
- for (int second = 0; second <= 2503; ++second)
- {
- foreach (var r in reindeers)
- {
- if (r.State == EnumState.Running)
- {
- r.DistanceTraveled += r.Speed;
- r.Remaining--;
- if (r.Remaining == 0)
- {
- r.Remaining = r.RestTime;
- r.State = EnumState.Resting;
- }
- }
- else
- {
- r.Remaining--;
- if (r.Remaining == 0)
- {
- r.Remaining = r.SpeedTime;
- r.State = EnumState.Running;
- }
- }
- }
- }
- int maxDistance = 0;
- foreach (var r in reindeers)
- if (r.DistanceTraveled > maxDistance) maxDistance = r.DistanceTraveled;
- Console.WriteLine($"The answer is : {maxDistance}");
- }
- private static void ParseFile(string f, HashSet<Reindeer> reindeers)
- {
- var regex = new Regex(@"(?<n>\w+) can fly (?<s>\d+) km/s for (?<st>\d+) seconds, but then must rest for (?<rt>\d+) seconds.");
- using (var file = File.OpenText(f))
- {
- while (true)
- {
- var line = file.ReadLine();
- if (line == null) break;
- var result = regex.Match(line);
- var r = new Reindeer();
- r.Name = result.Groups["n"].Value;
- r.Speed = int.Parse(result.Groups["s"].Value);
- r.SpeedTime = int.Parse(result.Groups["st"].Value);
- r.RestTime = int.Parse(result.Groups["rt"].Value);
- r.Remaining = r.SpeedTime;
- reindeers.Add(r);
- }
- }
- }
- }
- }
|