with Ada.Text_IO; with Ada.Strings.Fixed; procedure Day03_2 is subtype Lower is Character range 'a' .. 'z'; subtype Upper is Character range 'A' .. 'Z'; subtype Item_ID is Character with Dynamic_Predicate => Item_ID in Lower | Upper; Input : Ada.Text_IO.File_Type; Sum : Natural := 0; begin -- Day03_2 Ada.Text_IO.Open (File => Input, Mode => Ada.Text_IO.In_File, Name => "input_03"); All_Groups : loop exit All_Groups when Ada.Text_IO.End_Of_File (Input); One_Group : declare Elf_1 : constant String := Ada.Text_IO.Get_Line (Input); pragma Assert (Elf_1'Last rem 2 = 0, Elf_1); Elf_2 : constant String := Ada.Text_IO.Get_Line (Input); pragma Assert (Elf_2'Last rem 2 = 0, Elf_2); Elf_3 : constant String := Ada.Text_IO.Get_Line (Input); pragma Assert (Elf_3'Last rem 2 = 0, Elf_3); begin -- One_Group Find_Common : for C of Elf_1 loop if Ada.Strings.Fixed.Index (Elf_2, C & "") /= 0 and Ada.Strings.Fixed.Index (Elf_3, C & "") /= 0 then Sum := Sum + (if C in Lower then Character'Pos (C) - Character'Pos ('a') + 1 else Character'Pos (C) - Character'Pos ('A') + 27); exit Find_Common; end if; end loop Find_Common; end One_Group; end loop All_Groups; Ada.Text_IO.Close (File => Input); Ada.Text_IO.Put_Line (Item => Sum'Image); end Day03_2;