/
part_2.adb
79 lines (72 loc) · 1.99 KB
/
part_2.adb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
with Ada.Text_IO; use Ada.Text_IO;
procedure Part_2 is
Input : File_Type;
Answer : Natural := 0;
Filename : constant String := "input";
procedure Get_Digits (Text : String; First, Last : out Natural) is
Is_First : Boolean := True;
Index : Natural := 1;
procedure Set_Digit (N : Natural) is
begin
if Is_First then
First := N;
Last := First;
Is_First := False;
else
Last := N;
end if;
end Set_Digit;
procedure Parse_Digit (Text : String) is
begin
case Text is
when "one" =>
Set_Digit (1);
when "two" =>
Set_Digit (2);
when "three" =>
Set_Digit (3);
when "four" =>
Set_Digit (4);
when "five" =>
Set_Digit (5);
when "six" =>
Set_Digit (6);
when "seven" =>
Set_Digit (7);
when "eight" =>
Set_Digit (8);
when "nine" =>
Set_Digit (9);
when others =>
null;
end case;
end Parse_Digit;
begin
for C of Text loop
if C in '1' .. '9' then
Set_Digit (Natural'Value (C & ""));
elsif C in 'o' | 't' | 'f' | 's' | 'e' | 'n' then
for L in 2 .. 4 loop
if Index <= Text'Length - L then
Parse_Digit (Text (Index .. Index + L));
end if;
end loop;
end if;
Index := @ + 1;
end loop;
end Get_Digits;
begin
Input.Open (In_File, Filename);
loop
declare
Line : constant String := Input.Get_Line;
First, Last : Natural;
begin
Get_Digits (Line, First, Last);
Answer := @ + (First * 10 + Last);
end;
exit when Input.End_Of_File;
end loop;
Input.Close;
Put_Line ("Answer:" & Answer'Image);
end Part_2;