|
|
@@ -0,0 +1,76 @@
|
|
|
+using System;
|
|
|
+using System.IO;
|
|
|
+
|
|
|
+namespace D09._2
|
|
|
+{
|
|
|
+ class Program
|
|
|
+ {
|
|
|
+
|
|
|
+ static bool TryGetToken(string input, ref int index, out long length)
|
|
|
+ {
|
|
|
+ length = 0;
|
|
|
+ int idx = index;
|
|
|
+
|
|
|
+ if (IsCompressionToken(input, out int strlen, out int repetition, ref idx) == false)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ long sublength = 0;
|
|
|
+ for (var i = idx; i < idx + strlen; i++)
|
|
|
+ {
|
|
|
+ if (TryGetToken(input, ref i, out long len))
|
|
|
+ sublength += len;
|
|
|
+ else sublength++;
|
|
|
+ }
|
|
|
+
|
|
|
+ idx += strlen;
|
|
|
+ index = idx - 1;
|
|
|
+
|
|
|
+ length = sublength * repetition;
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static bool IsCompressionToken(string input, out int strlen, out int repetition, ref int idx)
|
|
|
+ {
|
|
|
+ strlen = 0;
|
|
|
+ repetition = 0;
|
|
|
+
|
|
|
+ if (input[idx++] != '(') return false;
|
|
|
+
|
|
|
+ int nindex = idx;
|
|
|
+ while (input[idx] >= '0' && input[idx] <= '9') idx++;
|
|
|
+
|
|
|
+ strlen = int.Parse(input.Substring(nindex, idx - nindex));
|
|
|
+ if (input[idx++] != 'x') return false;
|
|
|
+
|
|
|
+ nindex = idx;
|
|
|
+ while (input[idx] >= '0' && input[idx] <= '9') idx++;
|
|
|
+
|
|
|
+ repetition = int.Parse(input.Substring(nindex, idx - nindex));
|
|
|
+
|
|
|
+ if (input[idx++] != ')') return false;
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ static void Main(string[] args)
|
|
|
+ {
|
|
|
+ if (args.Length < 1) throw new ArgumentException();
|
|
|
+ if (File.Exists(args[0]) == false) throw new FileNotFoundException();
|
|
|
+
|
|
|
+ long totalLength = 0;
|
|
|
+
|
|
|
+ var text = File.ReadAllText(args[0]);
|
|
|
+ for (var i = 0; i < text.Length; ++i)
|
|
|
+ {
|
|
|
+ if (text[i] == ' ' || text[i] == '\n' || text[i] == '\t') continue;
|
|
|
+
|
|
|
+ if (TryGetToken(text, ref i, out long length))
|
|
|
+ totalLength += length;
|
|
|
+ else totalLength++;
|
|
|
+ }
|
|
|
+
|
|
|
+ Console.WriteLine(totalLength);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|