|
@@ -0,0 +1,51 @@
|
|
|
+with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
|
|
|
+with GNAT.Regpat; use GNAT.Regpat;
|
|
|
+
|
|
|
+with Ada.Text_IO; use Ada.Text_IO;
|
|
|
+with Ada.Strings.Fixed; use Ada.Strings.Fixed;
|
|
|
+
|
|
|
+-- This code reads its input from standard input
|
|
|
+-- Use cat _input.txt | Mull_It_Over_ to get the result
|
|
|
+procedure Mull_It_Over is
|
|
|
+
|
|
|
+ subtype Operand is Positive;
|
|
|
+
|
|
|
+ -- Use pattern to match mul operations
|
|
|
+ Mul_Pattern : constant Pattern_Matcher :=
|
|
|
+ Compile ("mul\(([0-9]+),([0-9]+)\)");
|
|
|
+
|
|
|
+ Sum : Natural := 0;
|
|
|
+
|
|
|
+begin
|
|
|
+ while not End_Of_File loop
|
|
|
+ declare
|
|
|
+ Line : constant String := Get_Line;
|
|
|
+ Remaining : String := Line;
|
|
|
+ Matches : Match_Array (0 .. Paren_Count (Mul_Pattern));
|
|
|
+ begin
|
|
|
+ Match (Mul_Pattern, Remaining, Matches);
|
|
|
+ -- Iterate on all match of the line
|
|
|
+ while Matches (0) /= No_Match loop
|
|
|
+ declare
|
|
|
+ Operand_1 : Operand;
|
|
|
+ Operand_2 : Operand;
|
|
|
+ Last : Positive;
|
|
|
+ begin
|
|
|
+ Get
|
|
|
+ (Remaining (Matches (1).First .. Matches (1).Last), Operand_1,
|
|
|
+ Last);
|
|
|
+ Get
|
|
|
+ (Remaining (Matches (2).First .. Matches (2).Last), Operand_2,
|
|
|
+ Last);
|
|
|
+ Sum := Sum + Operand_1 * Operand_2;
|
|
|
+ end;
|
|
|
+ -- Copy without last parenthesis
|
|
|
+ Move
|
|
|
+ (Remaining (Matches (2).Last + 2 .. Remaining'Last), Remaining);
|
|
|
+ Match (Mul_Pattern, Remaining, Matches);
|
|
|
+ end loop;
|
|
|
+ end;
|
|
|
+ end loop;
|
|
|
+
|
|
|
+ Put_Line ("The sum is " & Sum'Image);
|
|
|
+end Mull_It_Over;
|