RosettaCodeData/Task/Bioinformatics-base-count/Ada/bioinformatics-base-count.ada

65 lines
2.0 KiB
Ada

with Ada.Text_Io;
procedure Base_Count is
type Sequence is new String;
Test : constant Sequence :=
"CGTAAAAAATTACAACGTCCTTTGGCTATCTCTTAAACTCCTGCTAAATG" &
"CTCGTGCTTTCCAATTATGTAAGCGTTCCGAGACGGGGTGGTCGATTCTG" &
"AGGACAAAGGTCAAGATGGAGCGCATCGAACGCAATAAGGATCATTTGAT" &
"GGGACGTTTCGTCGACAAAGTCTTGTTTCGAGAGTAACGGCTACCGTCTT" &
"CGATTCTGCTTATAACACTATGTTCTTATGAAATGGATGTTCTGAGTTGG" &
"TCAGTCCCAATGTGCGGGGTTTCTTTTAGTACGTCGGGAGTGGTATTATA" &
"TTTAATTTTTCTATATAGCGATCTGTATTTAAGCAATTCATTTAGGTTAT" &
"CGCCGCGATGCTCGGTTCGGACCGCCAAGCATCTGGCTCCACTGCTAGTG" &
"TCCTAAATTTGAATGGCAAACACAAATAAGATTTAGCAATTCGTGTAGAC" &
"GACCGGGGACTTGCATGATGGGAGCAGCTTTGTTAAACTACGAACGTAAT";
Line_Width : constant := 70;
procedure Put (Seq : Sequence) is
use Ada.Text_Io;
package Position_Io is new Ada.Text_Io.Integer_Io (Natural);
First : Natural := Seq'First;
Last : Natural;
begin
loop
Last := Natural'Min (Seq'Last, First + Line_Width - 1);
Position_Io.Put (First, Width => 3);
Put (String'(".."));
Position_Io.Put (Last, Width => 3);
Put (String'(" "));
Put (String (Seq (First .. Last)));
New_Line;
exit when Last = Seq'Last;
First := First + Line_Width;
end loop;
end Put;
procedure Count (Seq : Sequence) is
use Ada.Text_Io;
A_Count, C_Count : Natural := 0;
G_Count, T_Count : Natural := 0;
begin
for B of Seq loop
case B is
when 'A' => A_Count := A_Count + 1;
when 'C' => C_Count := C_Count + 1;
when 'G' => G_Count := G_Count + 1;
when 'T' => T_Count := T_Count + 1;
when others =>
raise Constraint_Error;
end case;
end loop;
Put_Line ("A: " & A_Count'Image);
Put_Line ("C: " & C_Count'Image);
Put_Line ("G: " & G_Count'Image);
Put_Line ("T: " & T_Count'Image);
Put_Line ("Total: " & Seq'Length'Image);
end Count;
begin
Put (Test);
Count (Test);
end Base_Count;