Rosetta Code/Rank languages by popularity: Difference between revisions

Add Ada solution
(Add Ada solution)
Line 19:
 
Filtering wrong results is optional. You can check against http://www.rosettacode.org/wiki/Special:MostLinkedCategories
 
=={{header|Ada}}==
 
Here is an Ada solution using the open source [https://libre.adacore.com/aws/ AWS] framework.
 
NB: The 'ASCII.Quotation' in the declaration of Title_Str is a rather clunky workaround to the Ada->HTML engine not being able to correctly colourize '"' properly.
 
<lang ada>with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
with Ada.Strings.Fixed; use Ada.Strings.Fixed;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Ordered_Sets;
with Ada.Strings.Less_Case_Insensitive;
with AWS.Client;
with AWS.Response;
procedure Test is
use Ada.Strings;
function "+" (S : String) return Unbounded_String renames To_Unbounded_String;
type A_Language_Link_Count is
record
Count : Integer := 0;
Language : Unbounded_String;
end record;
function "=" (L, R : A_Language_Link_Count) return Boolean is
begin
return L.Count = R.Count;
end "=";
function "<" (L, R : A_Language_Link_Count) return Boolean is
begin
-- Sort by 'Count' and then by Language name
return L.Count < R.Count
or else (L.Count = R.Count
and then Less_Case_Insensitive (Left => To_String (L.Language),
Right => To_String (R.Language)));
end "<";
package Sets is new Ada.Containers.Ordered_Sets (A_Language_Link_Count);
use Sets;
Counts : Set;
procedure Find_Counts (S : String) is
Title_Str : constant String := "title=" & ASCII.Quotation & "Category:";
End_A_Str : constant String := "</a> (";
Title_At : constant Natural := Index (S, Title_Str);
Bracket_At : constant Natural := Index (S (Title_At + Title_Str'Length .. S'Last), ">");
End_A_At : constant Natural := Index (S (Bracket_At + 1 .. S'Last), End_A_Str);
Space_At : constant Natural := Index (S (End_A_At + End_A_Str'Length .. S'Last), " ");
begin
if Title_At /= 0 and then Bracket_At /= 0 and then End_A_At /= 0 and then Space_At /= 0 then
declare
Count : constant Natural := Natural'Value (S (End_A_At + End_A_Str'Length .. Space_At - 1));
Language : constant String := S (Title_At + Title_Str'Length .. Bracket_At - 2);
begin
Counts.Insert (New_Item => (Count, +Language));
end;
-- Recursively parse the string for languages and counts
Find_Counts (S (Space_At + 1 .. S'Last));
end if;
exception
when others =>
null; -- Catch and ignore the error after the last language
end Find_Counts;
Place : Natural := 1;
procedure Display (C : Cursor) is
begin
Put (Place, Width => 1); Put (". ");
Put (Element (C).Count, Width => 1); Put (" - ");
Put_Line (To_String (Element (C).Language));
Place := Place + 1;
end Display;
Http_Source : constant AWS.Response.Data :=
AWS.Client.Get ("http://www.rosettacode.org/w/index.php?title=Special:Categories&limit=500");
begin
Find_Counts (AWS.Response.Message_Body (Http_Source));
Counts.Reverse_Iterate (Display'Access);
end Test;</lang>
 
=={{header|Perl}}==