Find the total number of programming examples for each task and the total for all tasks.

Task
Rosetta Code/Count examples
You are encouraged to solve this task according to the task description, using any language you may know.

Essentially, count the number of occurrences of =={{header| on each task page.

Output:

100 doors: 20 examples.
99 Bottles of Beer: 29 examples.
Abstract type: 10 examples.

Total: X examples.

For a full output, updated periodically, see Rosetta Code/Count examples/Full list.

You'll need to use the Media Wiki API, which you can find out about locally, here, or in Media Wiki's API documentation at, API:Query

Ada

Library: AWS

Parsing XML file with XMLAda from AdaCore <lang Ada>with Aws.Client, Aws.Messages, Aws.Response, Aws.Resources, Aws.Url; with Dom.Readers, Dom.Core, Dom.Core.Documents, Dom.Core.Nodes, Dom.Core.Attrs; with Input_Sources.Strings, Unicode, Unicode.Ces.Utf8; with Ada.Strings.Unbounded, Ada.Strings.Fixed, Ada.Text_IO, Ada.Command_Line; with Ada.Containers.Vectors;

use Aws.Client, Aws.Messages, Aws.Response, Aws.Resources, Aws.Url; use Dom.Readers, Dom.Core, Dom.Core.Documents, Dom.Core.Nodes, Dom.Core.Attrs; use Aws, Ada.Strings.Unbounded, Ada.Strings.Fixed, Input_Sources.Strings; use Ada.Text_IO, Ada.Command_Line;

procedure Count_Examples is

  package Members_Vectors is new Ada.Containers.Vectors (
     Index_Type => Positive,
     Element_Type => Unbounded_String);
  use Members_Vectors;
  Exemples      : Vector;
  Nbr_Lg, Total : Natural := 0;
  procedure Get_Vector (Category : in String; Mbr_Vector : in out Vector) is
     Reader  : Tree_Reader;
     Doc     : Document;
     List    : Node_List;
     N       : Node;
     A       : Attr;
     Page    : Aws.Response.Data;
     Uri_Xml : constant String :=
        "http://rosettacode.org/mw/api.php?action=query&list=categorymembers"
        &
        "&format=xml&cmlimit=500&cmtitle=Category:";
  begin
     Page := Client.Get (Uri_Xml & Category);
     if Response.Status_Code (Page) not  in Messages.Success then
        raise Client.Connection_Error;
     end if;
     declare
        Xml    : constant String := Message_Body (Page);
        Source : String_Input;
     begin
        Open
          (Xml'Unrestricted_Access,
           Unicode.Ces.Utf8.Utf8_Encoding,
           Source);
        Parse (Reader, Source);
        Close (Source);
     end;
     Doc  := Get_Tree (Reader);
     List := Get_Elements_By_Tag_Name (Doc, "cm");
     for Index in 1 .. Length (List) loop
        N := Item (List, Index - 1);
        A := Get_Named_Item (Attributes (N), "title");
        Append (Mbr_Vector, To_Unbounded_String (Value (A)));
     end loop;
     Free (List);
     Free (Reader);
  end Get_Vector;
  function Scan_Page (Title : String) return Natural is
     Page                      : Aws.Response.Data;
     File                      : Aws.Resources.File_Type;
     Buffer                    : String (1 .. 1024);
     Languages, Position, Last : Natural := 0;
  begin
     Page :=
        Client.Get
          ("http://rosettacode.org/mw/index.php?title=" &
           Aws.Url.Encode (Title) &
           "&action=raw");
     Response.Message_Body (Page, File);
     while not End_Of_File (File) loop
        Resources.Get_Line (File, Buffer, Last);
        Position :=
           Index
             (Source  => Buffer (Buffer'First .. Last),
              Pattern => "=={{header|");
        if Position > 0 then
           Languages := Languages + 1;
        end if;
     end loop;
     Close (File);
     return Languages;
  end Scan_Page;

begin

  Get_Vector ("Programming_Tasks", Exemples);
  for I in First_Index (Exemples) .. Last_Index (Exemples) loop
     declare
        Title : constant String :=
           To_String (Members_Vectors.Element (Exemples, I));
     begin
        Nbr_Lg := Scan_Page (Title);
        Total  := Total + Nbr_Lg;
        Put_Line (Title & " :" & Integer'Image (Nbr_Lg) & " exemples.");
     end;
  end loop;
  Put_Line ("Total :" & Integer'Image (Total) & " exemples.");

end Count_Examples; </lang> Output :

100 doors : 107 exemples.
24 game : 30 exemples.
....
Yahoo! search interface : 10 exemples.
Zig-zag matrix : 49 exemples.
Total : 17238 exemples.

AutoHotkey

<lang AutoHotkey>UrlDownloadToFile

 , http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml
 , tasks.xml

FileRead, tasks, tasks.xml pos = 0 quote = "  ; " regtitle := "<cm.*?title=" . quote . "(.*?)" . quote While, pos := RegExMatch(tasks, regtitle, title, pos + 1) {

 UrlDownloadToFile
   , % "http://www.rosettacode.org/w/index.php?title=" . title1 . "&action=raw"
   , task.xml
 FileRead, task, task.xml
 RegExReplace(task, "\{\{header\|", "", count)
 current :=  title1 . ": " . count . " examples.`n"
 output .= current
 TrayTip, current, % current

} MsgBox % output Return</lang>

BBC BASIC

<lang bbcbasic> VDU 23,22,640;512;8,16,16,128+8 : REM Enable UTF-8 support

     SYS "LoadLibrary", "URLMON.DLL" TO urlmon%
     SYS "GetProcAddress", urlmon%, "URLDownloadToFileA" TO UDTF
     special$ = "+()'"
     
     url$ = "http://www.rosettacode.org/w/api.php?action=query" + \
     \      "&list=categorymembers&cmtitle=Category:Programming_Tasks" + \
     \      "&cmlimit=500&format=xml"
     file$ = @tmp$ + "tasks.xml"
     SYS UDTF, 0, url$, file$, 0, 0 TO fail%
     IF fail% ERROR 100, "File download failed (tasks)"
     
     Total% = 0
     file% = OPENIN(file$)
     WHILE NOT EOF#file%
       a$ = GET$#file%
       i% = 0
       REPEAT
         i% = INSTR(a$, "title=", i%+1)
         IF i% THEN
           j% = INSTR(a$, ">", i%)
           title$ = MID$(a$, i%+7, j%-i%-10)
           REM Replace HTML codes:
           REPEAT
             k% = INSTR(title$, "&")
             IF k% THEN
               l% = INSTR(title$, ";", k%)
               title$ = LEFT$(title$,k%-1) + \
               \        FNhtml(MID$(title$,k%,l%-k%+1)) + MID$(title$,l%+1)
             ENDIF
           UNTIL k% = 0
           t$ = title$
           REM Substitute characters not allowed in a URL:
           FOR s% = 1 TO LEN(special$)
             REPEAT
               s$ = MID$(special$, s%, 1)
               k% = INSTR(t$, s$)
               IF k% t$ = LEFT$(t$,k%-1) + "%" + STR$~ASCs$ + MID$(t$,k%+1)
             UNTIL k% = 0
           NEXT
           url$ = "http://www.rosettacode.org/w/index.php?title=" + t$ + \
           \      "&action=raw"
           file$ = @tmp$ + "title.htm"
           SYS UDTF, 0, url$, file$, 0, 0 TO fail%
           IF fail% ERROR 100, "File download failed " + t$
           examples% = 0
           task% = OPENIN(file$)
           WHILE NOT EOF#task%
             IF INSTR(GET$#task%, "=={{header|") examples% += 1
           ENDWHILE
           CLOSE #task%
           Total% += examples%
           PRINT title$ ": " ; examples% " examples."
         ENDIF
       UNTIL i% = 0
       i% = INSTR(a$, "cmcontinue=")
       IF i% THEN
         CLOSE #file%
         j% = INSTR(a$, """", i%+1)
         k% = INSTR(a$, """", j%+1)
         url$ = "http://www.rosettacode.org/w/api.php?action=query" + \
         \      "&list=categorymembers&cmtitle=Category:Programming_Tasks" + \
         \      "&cmlimit=500&format=xml&cmcontinue=" + MID$(a$,j%+1,k%-j%)
         REPEAT
           i% = INSTR(url$, "|")
           IF i% url$ = LEFT$(url$,i%-1) + "%7C" + MID$(url$,i%+1)
         UNTIL i% = 0
         file$ = @tmp$ + "tasks.xml"
         SYS UDTF, 0, url$, file$, 0, 0 TO fail%
         IF fail% ERROR 100, "File download failed (continue)"
         file% = OPENIN(file$)
       ENDIF
     ENDWHILE
     CLOSE #file%
     PRINT ' "Total: " ; Total% " examples."
     END
     
     DEF FNhtml(h$)
     IF LEFT$(h$,2) = "&#" THEN = CHR$(VALMID$(h$,3))
     CASE h$ OF
       WHEN """: = """"
     ENDCASE
     = h$</lang>

Sample output:

100 doors: 154 examples.
24 game: 53 examples.
24 game/Solve: 30 examples.
99 Bottles of Beer: 181 examples.
A+B: 124 examples.
Abstract type: 49 examples.
Accumulator factory: 65 examples.
Ackermann function: 126 examples.
Active Directory/Connect: 12 examples.
Active Directory/Search for a user: 13 examples.
......
XML/DOM serialization: 33 examples.
XML/Input: 50 examples.
XML/Output: 41 examples.
XML/XPath: 33 examples.
Y combinator: 51 examples.
Yahoo! search interface: 13 examples.
Yin and yang: 36 examples.
Zebra puzzle: 11 examples.
Zeckendorf number representation: 14 examples.
Zig-zag matrix: 64 examples.

Total: 27004 examples.

Bracmat

<lang bracmat>( ( get-page

 =   
   .   sys$(str$("wget -q -O wget.out \"" !arg \"))
     & get$("wget.out",HT ML)
 )

& get-page$"http://rosettacode.org/wiki/Category:Programming_Tasks"

 : ? (table.?) ?tasklist (.table.) ?

& 0:?list & whl

 ' ( !tasklist
   :   ?
       ( a
       .   (href.@(?:"/wiki/" ?href)) (title.?title)
         &   get-page$(str$("http://rosettacode.org/wiki/" !href))
           : ?task
         & 0:?cnt
         &   whl
           ' (   !task
               :   ?
                   (   (span.(class.mw-headline) (id.?))
                       ?span
                       (.span.)
                       ?task
                   &   !span
                     :   ?
                         ( a
                         .   (href.@(?:"/wiki/Category:" ?))
                             (title.@(?:"Category:" ?))
                         )
                         @
                         (.a.)
                         ?
                   )
             & 1+!cnt:?cnt
             )
         & (!cnt.!title)+!list:?list
       )
       ?tasklist
   )

& lst$(list,taskfreq,NEW) )</lang> Output (in file tasqfreq):

list=
  (2."OLE Automation")
+ (3."Canny edge detector")
+ ( 3
  . "Continued fraction/Arithmetic/G(matrix NG, Contined Fraction N1, Contined Fraction N2)"
  )
+ (4."Colour pinstripe/Printer")
+ (4."Vogel's approximation method")
+ (5."Catmull–Clark subdivision surface")
+ (5."Percolation/Bond percolation")
+ (5.Pinstripe/Printer)
+ (5."Zeckendorf arithmetic")
+ (6."Continued fraction/Arithmetic/G(matrix NG, Contined Fraction N)")
+ (6."Percolation/Mean cluster density")
+ (7."Bitmap/PPM conversion through a pipe")
+ (7."Deconvolution/2D+")
+ (7."K-d tree")
  ....
+ (125."Greatest element of a list")
+ (127."Averages/Arithmetic mean")
+ (131.Arrays)
+ (131."Increment a numerical string")
+ (132."Greatest common divisor")
+ (133.Loops/While)
+ (134."Conditional structures")
+ (136.Arithmetic/Integer)
+ (137.Loops/For)
+ (145.Loops/Infinite)
+ (147."Ackermann function")
+ (148."Reverse a string")
+ (152."A+B")
+ (152."Function definition")
+ (160."Empty program")
+ (163."Fibonacci sequence")
+ (164.Factorial)
+ (182.FizzBuzz)
+ (187."100 doors")
+ (188.Comments)
+ (216."99 Bottles of Beer")
+ (269."Hello world/Text");

C#

Object-oriented solution.

<lang csharp>using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Net;

class Task {

   private string _task;
   private int _examples;
   public Task(string task, int examples) {
       _task = task;
       _examples = examples;
   }
   public string Name {
       get { return _task; }
   }
   public int Examples {
       get { return _examples; }
   }
   public override string ToString() {
       return String.Format("{0}: {1} examples.", this._task, this._examples);
   }

}

class Program {

   static List<string> GetTitlesFromCategory(string category, WebClient wc) {
       string content = wc.DownloadString(
           String.Format("http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:{0}&cmlimit=500&format=json", category)
       );
       return new Regex("\"title\":\"(.+?)\"").Matches(content).Cast<Match>().Select(x => x.Groups[1].Value.Replace("\\/", "/")).ToList();
   }
   static string GetSourceCodeFromPage(string page, WebClient wc) {
       return wc.DownloadString(
           String.Format("http://www.rosettacode.org/w/index.php?title={0}&action=raw", page)
       );
   }
   static void Main(string[] args) {
       WebClient wc = new WebClient();
       List<Task> tasks = new List<Task>();
       List<string> tasknames = GetTitlesFromCategory("Programming_Tasks", wc);
       foreach (string task in tasknames) {
           string content = GetSourceCodeFromPage(task, wc);
           int count = new Regex("=={{header", RegexOptions.IgnoreCase).Matches(content).Count;
           Task t = new Task(task, count);
           Console.WriteLine(t);
           tasks.Add(t);
       }
       Console.WriteLine("\nTotal: {0} examples.", tasks.Select(x => x.Examples).Sum());
   }

}</lang>

Clojure

<lang clojure>(ns count-examples

 (:import [java.net URLEncoder])
 (:use [clojure.contrib.http.agent :only (http-agent string)]
       [clojure.contrib.json :only (read-json)]
       [clojure.contrib.string :only (join)]))

(defn url-encode [v] (URLEncoder/encode (str v) "utf-8"))

(defn rosettacode-get [path params]

 (let [param-string (join "&" (for [[n v] params] (str (name n) "=" (url-encode v))))]
   (string (http-agent (format "http://www.rosettacode.org/w/%s?%s" path param-string)))))

(defn rosettacode-query [params]

 (read-json (rosettacode-get "api.php" (merge {:action "query" :format "json"} params))))

(defn list-cm

 ([params] (list-cm params nil))
 ([params continue]
    (let [cm-params (merge {:list "categorymembers"} params (or continue {}))
          result (rosettacode-query cm-params)]
      (concat (-> result (:query) (:categorymembers))
              (if-let [cmcontinue (-> result (:query-continue) (:categorymembers))]
                (list-cm params cmcontinue))))))

(defn programming-tasks []

 (let [result (list-cm {:cmtitle "Category:Programming_Tasks" :cmlimit 50})]
   (map #(:title %) result)))

(defn task-count [task]

 [task (count
        (re-seq #"==\{\{header"
                (rosettacode-get "index.php" {:action "raw" :title task})))])

(defn print-result []

 (let [task-counts (map task-count (programming-tasks))]
   (doseq [[task count] task-counts]
     (println (str task ":") count)
     (flush))
   (println "Total: " (reduce #(+ %1 (second %2)) 0 task-counts))))

</lang> <lang clojure>count-examples> (print-result) 100 doors: 73 24 game: 18 24 game/Solve: 14 99 Bottles of Beer: 89 Abstract type: 27 Accumulator factory: 23 Ackermann function: 73 Active Directory/Connect: 4 Active Directory/Search for a user: 3 Active object: 14 Add a variable to a class instance at runtime: 21 Address of a variable: 20 ... Total: 11216 nil </lang>

D

Works with: Tango

<lang D> import tango.io.Stdout; import tango.net.http.HttpClient; import tango.net.http.HttpHeaders; import tango.text.xml.Document; import tango.text.Util;

alias HttpHeader.ContentLength CL;

auto url = "http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml"; void main() {

   auto client = new HttpClient (HttpClient.Get, url);
   client.open();
   char[] mainData, tmp;
   int total, i;
   void cat(void[] content) { tmp ~= cast(char[]) content; }
   if (client.isResponseOK) {
       client.read(&cat, client.getResponseHeaders.getInt(CL));
       mainData = tmp;
       tmp = null;
       auto doc = new Document!(char);
       doc.parse(mainData);
       foreach (n; doc.query.descendant("cm").attribute("title")) {
           auto subClient = new HttpClient(HttpClient.Get, 
                   "http://www.rosettacode.org/w/index.php?title=" ~
                   replace(n.value.dup, ' ', '_') ~ "&action=raw");
           subClient.open();
           if (! subClient.isResponseOK) {
               Stderr (client.getResponse);
                break;
           }
           subClient.read(&cat, subClient.getResponseHeaders.getInt(CL));
           foreach (segment; patterns(cast(char[])tmp, "=={{header|")) i++;
           --i;
           if (i) --i;
           Stdout.formatln ("{0,-40} - {}", n.value, i);
           total += i;
           tmp = null;
           i = 0;
       }
       Stdout("total examples: ", total).newline;
   } else {
       Stderr (client.getResponse);
   }

} </lang>

EGL

Works with: EDT
 
EGL: Graphical client implementation

A graphical implementation with a grid showing the number of implementations for each Rosetta Code task as well as total task and implementation counts. Uses MediaWiki API service call to fetch tasks/categories in a JSON format and meets API data limit and continuation requirements to consume 100% of the items.

User Interface: RosettaCodeHandler.egl <lang EGL>package com.eglexamples.client;

import org.eclipse.edt.rui.widgets.*;

handler RosettaCodeHandler type RUIhandler{initialUI =[ui], title = "Rosetta Code Tasks and Counts"}

   ui GridLayout{columns = 3, rows = 4, cellPadding = 4, children = [ b1, dg1, l1, l2, l3, l4 ]};
   
   b1 Button{ layoutData = new GridLayoutData{ row = 1, column = 1 }, text = "Go!", onClick ::= b1_onClick };
   l1 TextLabel{ layoutData = new GridLayoutData{ row = 1, column = 2 }, text = "Total Tasks:" };
   l2 TextLabel{ layoutData = new GridLayoutData{ row = 1, column = 3 }, text = "0" };
   l3 TextLabel{ layoutData = new GridLayoutData{ row = 2, column = 2 }, text = "Total Implementations:" };
   l4 TextLabel{ layoutData = new GridLayoutData{ row = 2, column = 3 }, text = "0" };
   
   dg1 DataGrid{ layoutData = new GridLayoutData{ row = 3, column = 1, horizontalSpan = 3 },
   	pageSize = 10, showScrollbar = true,

columns = [ new DataGridColumn{name = "title", displayName = "Task", width=220}, new DataGridColumn{name = "count", displayName = "Count", width=100} ] };

   cmcontinue string?;
   title string?;
   allTasks Task[];
   restBindingTasks IHttp? = new HttpRest{
       restType = eglx.rest.ServiceType.TrueRest, 
  	request.uri = "http://rosettacode.org/mw/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=1&format=json"};
   restBindingPageDetail IHttp? = new HttpRest{
       restType = eglx.rest.ServiceType.TrueRest, 
  	request.uri = "http://rosettacode.org/mw/index.php"};
   function b1_onClick(event Event in)

call ProxyFunctions.listTasks("") using restBindingTasks

   	    returning to listTasksCallBack onException exceptionHandler;
   end
  
   function listTasksCallBack(retResult RosettaCodeJSON in)

title = retResult.query.categorymembers[1].title; cmcontinue = retResult.queryContinue.categorymembers.cmcontinue;

call ProxyFunctions.fetchPageDetail(title) using restBindingPageDetail

	    returning to pageDetailCallBack onException exceptionHandler;
   end
   function pageDetailCallBack(pageResults string in)
  	count int = countSubstring("=={{header", pageResults);
  	allTasks.appendElement(new Task { title = title, count = count });

l2.text = l2.text as int + 1; l4.text = l4.text as int + count;

  	if(cmcontinue != null)

call ProxyFunctions.listTasks(cmcontinue) using restBindingTasks returning to listTasksCallBack onException exceptionHandler; else dg1.data = allTasks as any[]; end

   end
  
   function countSubstring(substr string in, str string in) returns(int)

if(str.length() > 0 and substr.length() > 0) return (str.length() - str.replaceStr(subStr, "").length()) / subStr.length(); else return 0; end

   end 
  function exceptionHandler(exp AnyException in)
  end

end

record Task title string; count int; end</lang>

Service Interface: ProxyFunctions.egl <lang EGL>package com.eglexamples.client;

library ProxyFunctions

   function listTasks(continueLocation String in) returns (RosettaCodeJSON) {

@Rest{method = _GET, uriTemplate = "&cmcontinue={continueLocation}", requestFormat = None, responseFormat = JSON}

   }
   end	
   function fetchPageDetail(title String in) returns (String) {

@Rest{method = _GET, uriTemplate = "?title={title}&action=raw", requestFormat = None, responseFormat = None}

   }
   end	

end

record RosettaCodeJSON

   query Query;
   queryContinue QueryContinue{JSONName = "query-continue"};

end

record Query

   categorymembers Categorymembers[];

end

record Categorymembers

   cmcontinue string?;
   pageid int?;
   ns int?;
   title string?;

end

record QueryContinue

   categorymembers Categorymembers;

end</lang>


Erlang

Library: xmerl

<lang erlang> -module(rosseta_examples). -include_lib("xmerl/include/xmerl.hrl").

-export([main/0]).

main() ->

  application:start(inets), 
  Titles = read_titles(empty),
  Result = lists:foldl(fun(Title,Acc) -> Acc + calculate_one(Title) end, 0, Titles),
  io:format("Total: ~p examples.\n",[Result]),
  application:stop(inets).

read_titles(CurrentContinue) ->

  URL0 = "http://rosettacode.org/mw/api.php?" ++
        "action=query&list=categorymembers&cmtitle=Category:Programming_Tasks" ++
        "&cmlimit=500&format=xml",
  URL = 
     case CurrentContinue of 
        empty -> URL0;
        _ -> URL0 ++ "&cmcontinue=" ++ CurrentContinue
     end,
  {ok,Answer} = httpc:request(URL),
  {Document,_} = xmerl_scan:string(lists:last(tuple_to_list(Answer))),
  Continue = 
     [Value || #xmlAttribute{value = Value} <- xmerl_xpath:string("//@cmcontinue", Document)],
  Titles = 
    [Value || #xmlAttribute{value = Value} <- xmerl_xpath:string("//@title", Document)],
  case Continue of
     []->
        Titles;
     [ContValue | _] -> 
        Titles ++ read_titles(ContValue)
  end.

calculate_one(Title0) ->

  Title = replace_chars(Title0),
  URL = "http://www.rosettacode.org/w/index.php?title=" ++
        Title ++ "&action=raw",
  case httpc:request(URL) of
     {ok,Result} ->
           {match,Found} = 
              re:run(lists:last(tuple_to_list(Result)), "\n=={{header(|)", [global]),
           io:format("~ts: ~p examples.\n",[Title0,length(Found)]),
           length(Found);
     {error,socket_closed_remotely} -> 
        io:format("Socket closed remotely. Retry.\n"),
        calculate_one(Title0)
  end.

replace_chars(String) ->

  replace_chars(String,[]).
 

replace_chars([$ | T],Acc) ->

  replace_chars(T, [$_| Acc]);

replace_chars([$+| T],Acc) ->

  replace_chars(T, lists:reverse("%2B") ++ Acc);

replace_chars([8211| T],Acc) ->

  replace_chars(T, lists:reverse("%E2%80%93") ++ Acc);

replace_chars([Other| T],Acc) ->

  replace_chars(T, [Other| Acc]);

replace_chars([],Acc) ->

  lists:reverse(Acc).

</lang>


Outputs:

> rosseta_examples:main().
100 doors: 165 examples.
24 game: 56 examples.
24 game/Solve: 33 examples.
...
Zebra puzzle: 12 examples.
Zeckendorf number representation: 18 examples.
Zig-zag matrix: 65 examples.
Total: 28629 examples.

F#

Using asynchronous workflows to perform downloads concurrently:

<lang fsharp>#r "System.Xml.Linq.dll"

let uri1 = "http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml" let uri2 task = sprintf "http://www.rosettacode.org/w/index.php?title=%s&action=raw" task

[|for xml in (System.Xml.Linq.XDocument.Load uri1).Root.Descendants() do

   for attrib in xml.Attributes() do
     if attrib.Name.LocalName = "title" then
       yield async {
         let uri = uri2 (attrib.Value.Replace(" ", "_") |> System.Web.HttpUtility.UrlEncode)
         use client = new System.Net.WebClient()
         let! html = client.AsyncDownloadString(System.Uri uri)
         let sols' = html.Split([|"{{header|"|], System.StringSplitOptions.None).Length - 1
         lock stdout (fun () -> printfn "%s: %d examples" attrib.Value sols')
         return sols' }|]

|> Async.Parallel |> Async.RunSynchronously |> fun xs -> printfn "Total: %d examples" (Seq.sum xs)</lang>

This is 21× faster than the python thanks to the concurrency.

Factor

Runs in about a minute. The number of threads is limited to 10 avoid cloudfare's protection mechanism.

<lang factor>USING: arrays assocs concurrency.combinators concurrency.semaphores formatting hashtables http.client io json.reader kernel math math.parser sequences splitting urls.encoding ; IN: rosetta-code.count-examples

CONSTANT: list-url "http://rosettacode.org/mw/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&cmprop=title&format=json"

titles ( query -- titles )
 "query" of "categorymembers" of [ "title" of ] map ;
continued-url ( query -- url/f )
 "query-continue" of "categorymembers" of
 [ assoc>query list-url swap "&" glue ] [ f ] if* ;
(all-programming-titles) ( titles url -- titles' url' )
 http-get nip json> [ titles append ] [ continued-url ] bi
 [ (all-programming-titles) ] [ f ] if* ;
all-programming-titles ( -- titles ) { } list-url (all-programming-titles) drop ;

CONSTANT: content-base-url "http://rosettacode.org/mw/index.php?title=&action=raw"

content-url ( title -- url )
 " " "_" replace
 "title" associate assoc>query
 content-base-url swap "&" glue ;
occurences ( seq subseq -- n ) split-subseq length 1 - ;
count-examples ( title -- n )
 content-url http-get nip "=={{header|" occurences ;
print-task ( title n -- ) "%s: %d examples.\n" printf ;
print-total ( assoc -- ) values sum "Total: %d examples.\n" printf ;
fetch-counts ( titles -- assoc )
 10 <semaphore> [
   [ dup count-examples 2array ] with-semaphore
 ] curry parallel-map ;
print-counts ( titles -- )
 [ [ print-task ] assoc-each nl ] [ print-total ] bi ;
rosetta-examples ( -- )
 all-programming-titles fetch-counts print-counts ;

MAIN: rosetta-examples</lang> Outputs:

100 doors: 169 examples.
24 game: 58 examples.
...
Zeckendorf number representation: 22 examples.
Zig-zag matrix: 66 examples.

Total: 30745 examples.

Go

<lang go>package main

import (

   "bytes"
   "encoding/xml"
   "fmt"
   "io"
   "io/ioutil"
   "net/http"
   "net/url"
   "strings"

)

func req(u string, foundCm func(string)) string {

   resp, err := http.Get(u)
   if err != nil {
       fmt.Println(err) // connection or request fail
       return ""
   }
   defer resp.Body.Close()
   for p := xml.NewDecoder(resp.Body); ; {
       t, err := p.RawToken()
       switch s, ok := t.(xml.StartElement); {
       case err == io.EOF:
           return ""
       case err != nil:
           fmt.Println(err)
           return ""
       case !ok:
           continue
       case s.Name.Local == "cm":
           for _, a := range s.Attr {
               if a.Name.Local == "title" {
                   foundCm(a.Value)
               }
           }
       case s.Name.Local == "categorymembers" && len(s.Attr) > 0 &&
           s.Attr[0].Name.Local == "cmcontinue":
           return url.QueryEscape(s.Attr[0].Value)
       }
   }
   return ""

}

func main() {

   taskQuery := "http://rosettacode.org/mw/api.php?action=query" +
       "&format=xml&list=categorymembers&cmlimit=500" +
       "&cmtitle=Category:Programming_Tasks"
   continueAt := req(taskQuery, count)
   for continueAt > "" {
       continueAt = req(taskQuery+"&cmcontinue="+continueAt, count)
   }
   fmt.Printf("Total: %d examples.\n", total)

}

var marker = []byte("=={{header|") var total int

func count(cm string) {

   taskFmt := "http://rosettacode.org/mw/index.php?title=%s&action=raw"
   taskEsc := url.QueryEscape(strings.Replace(cm, " ", "_", -1))
   resp, err := http.Get(fmt.Sprintf(taskFmt, taskEsc))
   var page []byte
   if err == nil {
       page, err = ioutil.ReadAll(resp.Body)
       resp.Body.Close()
   }
   if err != nil {
       fmt.Println(err)
       return
   }
   examples := bytes.Count(page, marker)
   fmt.Printf("%s: %d\n", cm, examples)
   total += examples

}</lang>

Output
(May 25, 2011):
...
Y combinator: 40
Yahoo! search interface: 10
Yin and yang: 18
Zig-zag matrix: 50
Total: 18290 examples.

Haskell

Library: HTTP XML

from HackageDB

<lang haskell>import Network.Browser import Network.HTTP import Network.URI import Data.List import Data.Maybe import Text.XML.Light import Control.Arrow

justifyR w = foldl ((.return).(++).tail) (replicate w ' ') showFormatted t n = t ++ ": " ++ justifyR 4 (show n)

getRespons url = do

   rsp <- Network.Browser.browse $ do
     setAllowRedirects True
     setOutHandler $ const (return ())     -- quiet
     request $ getRequest url
   return $ rspBody $ snd rsp

getNumbOfExampels p = do

 let pg = intercalate "_" $ words p
 rsp <- getRespons $ "http://www.rosettacode.org/w/index.php?title=" ++ pg ++ "&action=raw"
 let taskPage = rsp
     countEx = length $ filter (=="=={{header|") $ takeWhile(not.null) $ unfoldr (Just. (take 11 &&& drop 1)) taskPage
 return countEx
 

progTaskExamples = do

 rsp <- getRespons "http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml"
 let xmls = onlyElems $ parseXML $ rsp
     tasks = concatMap (map (fromJust.findAttr (unqual "title")). filterElementsName (== unqual "cm")) xmls
 taskxx <- mapM getNumbOfExampels tasks
 let ns = taskxx
     tot = sum ns
 mapM_ putStrLn $ zipWith showFormatted tasks ns
 putStrLn $ ("Total: " ++) $ show tot</lang>

some output: <lang haskell>*Main> progTaskExamples 100 doors: 56 24 game: 11 24 game Player: 9 99 Bottles of Beer: 73 Abstract type: 23 Ackermann Function: 61 Active object: 9 ... Total: 9156</lang>

Icon and Unicon

The following code uses features exclusive to Unicon. This version handles all tasks, not just the first 500.

<lang Unicon>$define RCINDEX "http://rosettacode.org/mw/api.php?format=xml&action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500" $define RCTASK "http://rosettacode.org/mw/index.php?action=raw&title=" $define RCUA "User-Agent: Unicon Rosetta 0.1" $define RCXUA "X-Unicon: http://unicon.org/" $define TASKTOT "* Total Tasks *" $define TOTTOT "* Total Headers*"

link strings link hexcvt

procedure main(A) # simple single threaded read all at once implementation

   Tasks := table(0)
   every task := taskNames() do {
      Tasks[TASKTOT] +:= 1                            # count tasks
      every lang := languages(task) do {              # count languages
         Tasks[task] +:= 1                     
         Tasks[TOTTOT] +:= 1
         }
      }
   every insert(O := set(),key(Tasks))                # extract & sort keys 
   O := put(sort(O--set(TOTTOT,TASKTOT)),TASKTOT,TOTTOT)  # move totals to end
   every write(k := !O, " : ", Tasks[k]," examples.") # report

end

  1. Generate task names

procedure taskNames()

   continue := ""
   while \(txt := ReadURL(RCINDEX||continue)) do {
       txt ? {
           while tab(find("<cm ") & find(s :="title=\"")+*s) do
               suspend tab(find("\""))\1
           if tab(find("cmcontinue=")) then {
               continue := "&"||tab(upto(' \t'))
               }
           else break
           }
       }

end

  1. Generate language headers in a task

procedure languages(task)

   static WS
   initial WS := ' \t'
   page := ReadURL(RCTASK||CleanURI(task))
   page ? while (tab(find("\n==")),tab(many(WS))|"",tab(find("{{"))) do {
              header := tab(find("=="))
              header ? {
                  while tab(find("{{header|")) do {
                      suspend 2(="",tab(find("")))\1
                      }
                  }
              }

end

procedure CleanURI(u) #: clean up a URI

   static tr,dxml                     # xml & http translation
   initial {
      tr := table()
      every c := !string(~(&digits++&letters++'-_.!~*()/\'`')) do 
         tr[c] := "%"||hexstring(ord(c),2)
      every /tr[c := !string(&cset)] := c
      tr[" "] := "_"                                      # wiki convention
      every push(dxml := [],"&#"||right(ord(c := !"&<>'\""),3,"0")||";",c)
      }

   dxml[1] := u                       # insert URI as 1st arg
   u := replacem!dxml                 # de-xml it
   every (c := "") ||:= tr[!u]        # reencode everything
   c := replace(c,"%3E","'")          # Hack to put single quotes back in
   c := replace(c,"%26quot%3B","\"")  # Hack to put double quotes back in
   return c   

end

procedure ReadURL(url) #: read URL into string

   page := open(url,"m",RCUA,RCXUA) | stop("Unable to open ",url)
   text := ""
   if page["Status-Code"] < 300 then while text ||:= reads(page,-1)
   else write(&errout,image(url),": ",
                      page["Status-Code"]," ",page["Reason-Phrase"])
   close(page)
   return text

end</lang>

strings provides replacem hexcvt provides hexstring

Sample Output for July 6, 2013 (abridged):

100 doors : 171 examples.
24 game : 60 examples.
24 game/Solve : 37 examples.
9 billion names of God the integer : 12 examples.
99 Bottles of Beer : 199 examples.
A+B : 137 examples.
Abstract type : 54 examples.
Accumulator factory : 67 examples.
Ackermann function : 137 examples.
...
Y combinator : 56 examples.
Yahoo! search interface : 18 examples.
Yin and yang : 39 examples.
Zebra puzzle : 12 examples.
Zeckendorf arithmetic : 3 examples.
Zeckendorf number representation : 21 examples.
Zig-zag matrix : 67 examples.
* Total Tasks * : 676 examples.
* Total Headers* : 31146 examples.

J

Solution:
Using getCategoryMembers from Find unimplemented tasks. <lang j>require 'web/gethttp'

getAllTaskSolnCounts=: monad define

 tasks=.  getCategoryMembers 'Programming_Tasks'
 counts=. getTaskSolnCounts &> tasks
 tasks;counts

)

getTaskSolnCounts=: monad define

 makeuri=. 'http://www.rosettacode.org/w/index.php?title=' , ,&'&action=raw'
 wikidata=. gethttp makeuri urlencode y
 ([: +/ '{{header|'&E.) wikidata

)

formatSolnCounts=: monad define

 'tasks counts'=. y
 tasks=. tasks , &.>':'
 res=. ;:^:_1 tasks ,. (8!:0 counts) ,. <'examples.'
 res , 'Total examples: ' , ": +/counts

)</lang>

Example Usage: <lang j> formatSolnCounts getAllTaskSolnCounts 100 doors: 61 examples. 24 game: 15 examples. 24 game Player: 11 examples. 99 Bottles of Beer: 76 examples. ...</lang>

Java

Works with: Java version 1.5+

<lang java5> import java.util.ArrayList; import ScreenScrape;

public class CountProgramExamples {

   private static final String baseURL = "http://rosettacode.org/wiki/";
   private static final String rootURL = "http://www.rosettacode.org/w/"
       + "api.php?action=query&list=categorymembers"
       + "&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml";
   private static final String taskBegin = "title=\"";
   private static final String taskEnd = "\"";
   private static final String exmplBegin = "";
   private static final String exmplEnd = "";
   private static final String editBegin = "";
   /**
    * @param args
    */
   public static void main(String[] args) {
       int exTotal = 0;
       try {
           // Get root query results
           ArrayList<String> tasks = new ArrayList<String>();
           ScreenScrape ss = new ScreenScrape();
           String rootPage = ss.read(rootURL);
           while (rootPage.contains(taskBegin)) {
               rootPage = rootPage.substring(rootPage.indexOf(taskBegin)
                   + taskBegin.length());
               String title = rootPage.substring(0, rootPage.indexOf(taskEnd));
               if (!title.contains("Category:")) {
                   tasks.add(title);
               }
               rootPage = rootPage.substring(rootPage.indexOf(taskEnd));
           }
           // Loop through each task and print count
           for (String task : tasks) {
               String title = task.replaceAll("'", "'");
               String taskPage = ss.read(baseURL + title.replaceAll(" ", "_"));
               int exSubTot;
               if (taskPage.contains(exmplBegin)) {
                   int startPos = taskPage.lastIndexOf(exmplBegin)
                       + exmplBegin.length();
                   String countStr = taskPage.substring(startPos,
                       taskPage.indexOf(exmplEnd, startPos));
                   exSubTot = Integer
                       .parseInt(countStr.contains(".") ? countStr
                           .substring(0, countStr.indexOf("."))
                           : countStr);
               } else {
                   exSubTot = 0;
                   while (taskPage.contains(editBegin)) {
                       taskPage = taskPage.substring(taskPage
                           .indexOf(editBegin) + editBegin.length());
                       exSubTot++;
                   }
               }
               exTotal += exSubTot;
               System.out.println(title + ": " + exSubTot + " examples.");
           }
           // Print total
           System.out.println("\nTotal: " + exTotal + " examples.");
       } catch (Exception e) {
           System.out.println(title);
           System.out.println(startPos + ":"
               + taskPage.indexOf(exmplEnd, startPos));
           System.out.println(taskPage);
           e.printStackTrace(System.out);
       }
   }

} </lang> ScreenScrape class


jq

jq does not duplicate the functionality of `curl` but works seamlessly with it, as illustrated by the following bash script. Note in particular the use of jq's `@uri` filter in the bash function `titles`.

<lang bash>#!/bin/bash

  1. Produce lines of the form: URI TITLE

function titles {

   local uri="http://www.rosettacode.org/mw/api.php?action=query&list=categorymembers"
   uri+="&cmtitle=Category:Programming_Tasks&cmlimit=5000&format=json"
   curl -Ss "$uri" |
     jq -r '.query.categorymembers[] | .title | "\(@uri) \(.)"'

}

  1. Syntax: count URI

function count {

   local uri="$1"
   curl -Ss "http://rosettacode.org/mw/index.php?title=${uri}&action=raw" |
     jq -R -n 'reduce (inputs|select(test("=={{header\\|"))) as $x(0; .+1)'

}

local n=0 i while read uri title do

   i=$(count "$uri")
   echo "$title: $i examples."
   n=$((n + i))

done < <(titles) echo Total: $n examples.</lang>

Output:
100 doors: 252 examples.
15 Puzzle Game: 36 examples.
2048: 24 examples.
...
Order two numerical lists: 65 examples.
Ordered Partitions: 28 examples.
Ordered words: 85 examples.
Palindrome detection: 136 examples.
Total: 32416 examples.

Lasso

<lang Lasso>local(root = json_deserialize(curl('http://rosettacode.org/mw/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=10&format=json')->result)) local(tasks = array, title = string, urltitle = string, thiscount = 0, totalex = 0) with i in #root->find('query')->find('categorymembers') do => {^ #thiscount = 0 #title = #i->find('title') #urltitle = #i->find('title') #urltitle->replace(' ','_')

#title+': ' local(src = curl('http://rosettacode.org/mw/index.php?title='+#urltitle->asBytes->encodeurl+'&action=raw')->result->asString) #thiscount = (#src->split('=={{header|'))->size - 1 #thiscount < 0 ? #thiscount = 0 #thiscount + ' examples.' #totalex += #thiscount '\r' ^} 'Total: '+#totalex+' examples.'</lang>

Output:

Collecting 10 results:

100_doors: 176 examples.
24_game: 58 examples.
24_game/Solve: 35 examples.
9_billion_names_of_God_the_integer: 16 examples.
99_Bottles_of_Beer: 210 examples.
A+B: 142 examples.
Abstract_type: 54 examples.
Accumulator_factory: 70 examples.
Ackermann_function: 143 examples.
Active_Directory/Connect: 15 examples.
Total: 919 examples.

LiveCode

1. Add a button to a stack, put the following into the mouseUp

2. Add a text field called "tasks"

n.b. The list of tasks is limited to 10 for demo purposes<lang LiveCode>on mouseUp

   put empty into fld "taskurls"
   put URL "http://rosettacode.org/mw/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=10&format=xml" into  apixml
   put revXMLCreateTree(apixml,true,true,false) into pDocID
   put "/api/query/categorymembers/cm" into pXPathExpression
   repeat for each line xmlnode in revXMLEvaluateXPath(pDocID, pXPathExpression)
       put revXMLAttribute(pDocID,xmlnode,"title") into pgTitle
       put revXMLAttribute(pDocID,xmlnode,"pageid") into pageId
       put "http://www.rosettacode.org/w/index.php?title=" & urlEncode(pgTitle) & "&action=raw" into taskURL
       put URL taskURL into taskPage
       filter lines of taskPage with "==[[:Category:{PercentEncode Xr}
       else
          {Append &%|{PercentEncode Xr}
       else
          {Append &%]] [[Category:{PercentEncode Xr}
       else
          {Append &%]] Property "Implemented in language" (as page type) with input value "{PercentEncode Xr}</br>        else</br>           {Append &%" contains invalid characters or is incomplete and therefore can cause unexpected results during a query or annotation process.
       end
    end
 end
 
 fun {ToHex2 X}
    [{ToHex1 X div 16} {ToHex1 X mod 16}]
 end
 
 fun {ToHex1 X}
    if X >= 0 andthen X =< 9 then &0 + X
    elseif X >= 10 andthen X =< 15 then &A + X - 10
    end
 end

in

 {Main}</lang>

Example output:

100 doors: 86 examples.
24 game: 22 examples.
24 game/Solve: 15 examples.
99 Bottles of Beer: 108 examples.
A+B: 59 examples.
...
Xiaolin Wu's line algorithm: 5 examples.
Y combinator: 29 examples.
Yahoo! Search: 10 examples.
Zig-zag matrix: 43 examples.
Total: 14099 examples.

Perl

<lang Perl>use LWP::Simple;

my $site = "http://rosettacode.org"; my $list_url = "/mw/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml";

for (get("$site$list_url") =~ /cm.*?title="(.*?)"/g) {

   (my $slug = $_) =~ tr/ /_/;
   my $count = () = get("$site/wiki/$slug") =~ /toclevel-1/g;
   print "$_: $count examples\n";

}</lang>

Library: Mojolicious

<lang Perl>use v5.10; use Mojo::UserAgent;

my $site = "http://rosettacode.org"; my $list_url = "/mw/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml";

my $ua = Mojo::UserAgent->new; $ua->get("$site$list_url")->res->dom->find('cm')->each(sub {

   (my $slug = $_->{title}) =~ tr/ /_/;
   my $count = $ua->get("$site/wiki/$slug")->res->dom->find("#toc .toclevel-1")->size;
   say "$_->{title}: $count examples";

});</lang>

Perl 6

Works with: Rakudo version 2018.03

Retrieves counts for both Tasks and Draft Tasks. Save / Display results as a sortable wikitable rather than a static list. Click on a column header to sort on that column. To do a secondary sort, hold down the shift key and click on a second column header. Tasks have a gray (default) background, Draft Tasks have a yellow background.

For a full output, see Rosetta Code/Count examples/Full list <lang perl6>use HTTP::UserAgent; use URI::Escape; use JSON::Fast;

  1. Friendlier descriptions for task categories

my %cat = (

   'Programming_Tasks' => 'Task',
   'Draft_Programming_Tasks' => 'Draft'

);

my $client = HTTP::UserAgent.new;

my $url = 'http://rosettacode.org/mw';

my $hashfile = './RC_Task_count.json'; my $tablefile = './RC_Task_count.txt';

my %tasks;

  1. clear screen

run($*DISTRO.is-win ?? 'cls' !! 'clear');

  1. =begin update

note 'Retrieving task information...';

for %cat.keys -> $cat {

   mediawiki-query(
       $url, 'pages',
       :generator<categorymembers>,
       :gcmtitle("Category:$cat"),
       :gcmlimit<350>,
       :rawcontinue(),
       :prop<title>
   ).map({
       my $page =
         $client.get("{ $url }/index.php?title={ uri-escape .<title> }&action=raw").content;
       my $count = +$page.lc.comb(/ ^^'==' <-[\n=]>* '{{header|' \w+ \N+ '==' \h* $$ /);
       %tasks{.<title>} = {'cat' => %cat{$cat}, :$count};
       print clear, 1 + $++, ' ', %cat{$cat}, ' ', .<title>;
   })

}

print clear;

note "\nTask information saved to local file: {$hashfile.IO.absolute}"; $hashfile.IO.spurt(%tasks.&to-json);

  1. =end update
  1. Load information from local file

%tasks = $hashfile.IO.e ?? $hashfile.IO.slurp.&from-json !! ( );

  1. Convert saved task / author info to a table

note "\nBuilding table..."; my $count = +%tasks; my $taskcnt = +%tasks.grep: *.value.<cat> eq %cat<Programming_Tasks>; my $draftcnt = $count - $taskcnt; my $total = sum %tasks{*}»<count>;

  1. Dump table to a file

my $out = open($tablefile, :w) or die "$!\n";

  1. Add table boilerplate and caption

$out.say:

   '{|class="wikitable sortable"', "\n",
   "|+ As of { Date.today } :: Tasks: { $taskcnt } :: Draft Tasks:",
   "{ $draftcnt } :: Total Tasks: { $count } :: Total Examples: { $total }\n",
   "! Count !! Task !! Category"
  1. Sort tasks by count then add row

for %tasks.sort: { [-.value<count>, .key] } -> $task {

   $out.say:
     ( $task.value<cat> eq 'Draft'
       ?? "|- style=\"background-color: #ffc\"\n"
       !! "|-\n"
     ),
     "| { $task.value<count> }\n",
     ( $task.key ~~ /\d/
       ?? "|data-sort-value=\"{ $task.key.&naturally }\"| [[{uri-escape $task.key}|{$task.key}]]\n"
       !! "| [[{uri-escape $task.key}|{$task.key}]]\n"
     ),
     "| { $task.value<cat> }"

}

$out.say( "|}" ); $out.close;

note "Table file saved as: {$tablefile.IO.absolute}";

sub mediawiki-query ($site, $type, *%query) {

   my $url = "$site/api.php?" ~ uri-query-string(
       :action<query>, :format<json>, :formatversion<2>, |%query);
   my $continue = ;
   gather loop {
       my $response = $client.get("$url&$continue");
       my $data = from-json($response.content);
       take $_ for $data.<query>.{$type}.values;
       $continue = uri-query-string |($data.<query-continue>{*}».hash.hash or last);
   }

}

sub uri-query-string (*%fields) { %fields.map({ "{.key}={uri-escape .value}" }).join("&") }

sub naturally ($a) { $a.lc.subst(/(\d+)/, ->$/ {0~(65+$0.chars).chr~$0},:g) }

sub clear { "\r" ~ ' ' x 100 ~ "\r" }</lang>

Abridged output:
As of 2018-04-10 :: Tasks: 871 :: Draft Tasks:209 :: Total Tasks: 1080 :: Total Examples: 55787
Count Task Category
383 Hello world/Text Task
270 99 Bottles of Beer Task
262 100 doors Task
262 FizzBuzz Task
239 Comments Task
239 Fibonacci sequence Task
230 Factorial Task
215 Empty program Task
214 A+B Task
207 Function definition Task

PicoLisp

<lang PicoLisp>(load "@lib/http.l")

(client "rosettacode.org" 80

  "mw/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml"
  (while (from " title=\"")
     (let Task (till "\"")
        (client "rosettacode.org" 80 (pack "wiki/" (replace Task " " "_"))
           (let Cnt 0
              (while (from "")
                 (unless (sub? "." (till "<" T))
                    (inc 'Cnt) ) )
              (out NIL (prinl (ht:Pack Task) ": " Cnt)) ) ) ) ) )</lang>

Output (05may10):

100 doors: 79
24 game: 21
24 game/Solve: 15
99 Bottles of Beer: 95
A+B: 37
Abstract type: 29
...


PureBasic

<lang PureBasic>Procedure handleError(value, msg.s)

 If value = 0
   MessageRequester("Error", msg)
   End
 EndIf

EndProcedure

handleError(InitNetwork(), "Unable to initialize network functions.") If OpenConsole()

 Define url$, x1$, y1$, title$, unescapedTitle$, encodedURL$
 Define x2, i, j, totalExamples, totalTasks
 url$ = "http://www.rosettacode.org/mw/api.php?action=query" + 
        "&list=categorymembers&cmtitle=Category:Programming_Tasks" + 
        "&cmlimit=500&format=xml"
 
 Repeat
   handleError(ReceiveHTTPFile(url$, "tasks.xml"), "Unable to access tasks URL.")
   
   handleError(ReadFile(0, "tasks.xml"), "Unable to read 'task.xml' file.")
   x1$ =  ReadString(0)
   CloseFile(0)
   
   Repeat
     x2 = FindString(x1$, "title=", x2 + 1)
     If x2 
       title$ = Mid(x1$, x2 + 7, 99) 
       title$ = Left(title$, FindString(title$, ">", 1) - 4)
       unescapedTitle$ = UnescapeString(ReplaceString(title$, "'", "'"), #PB_String_EscapeXML)
       encodedURL$ = URLEncoder("http://www.rosettacode.org/mw/index.php?title=" + unescapedTitle$ + "&action=raw")
       If ReceiveHTTPFile(encodedURL$, "task.xml")
         ReadFile(0, "task.xml") 
         While Not Eof(0)
           y1$ =  ReadString(0)
           If FindString(y1$, "=={{header|", 1, #PB_String_NoCase)
             totalExamples + 1
           EndIf
         Wend
         CloseFile(0) 
         
         PrintN(unescapedTitle$ +": " + Str(totalExamples) + " examples")
         
         totalTasks + totalExamples
         totalExamples = 0
       EndIf
     EndIf  
   Until x2 = 0
   
   ;check for additional pages of tasks
   x2 = FindString(x1$, "cmcontinue=")
   If x2
     i = FindString(x1$, #DQUOTE$, x2 + 1)
     j = FindString(x1$, #DQUOTE$, i + 1)
     url$ = URLEncoder("http://www.rosettacode.org/mw/api.php?action=query" + 
                       "&list=categorymembers&cmtitle=Category:Programming_Tasks" + 
                       "&cmlimit=500&format=xml&cmcontinue=" + Mid(x1$, i + 1, j - i))
   Else
     Break ;all done
   EndIf
 ForEver
 
 PrintN("Total: " + Str(totalTasks) + " examples")
 Input()
 CloseConsole()

EndIf</lang> Sample output:

100 doors: 224 examples
24 game: 78 examples
24 game/Solve: 46 examples
9 billion names of God the integer: 33 examples
99 Bottles of Beer: 253 examples
A+B: 187 examples
......
Zeckendorf arithmetic: 6 examples
Zeckendorf number representation: 37 examples
Zero to the zero power: 71 examples
Zhang-Suen thinning algorithm: 18 examples
Zig-zag matrix: 83 examples
Total: 44140 examples

Python

<lang python>import urllib, xml.dom.minidom

x = urllib.urlopen("http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml")

tasks = [] for i in xml.dom.minidom.parseString(x.read()).getElementsByTagName("cm"):

   t = i.getAttribute('title').replace(" ", "_")
   y = urllib.urlopen("http://www.rosettacode.org/w/index.php?title=%s&action=raw" % t.encode('utf-8'))
   tasks.append( y.read().lower().count("{{header|") )
   print t.replace("_", " ") + ": %d examples." % tasks[-1]

print "\nTotal: %d examples." % sum(tasks)</lang>

R

Library: XML (R)
Library: RCurl

<lang R> library(XML) library(RCurl) doc <- xmlInternalTreeParse("http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml") nodes <- getNodeSet(doc,"//cm") titles = as.character( sapply(nodes, xmlGetAttr, "title") ) headers <- list() counts <- list() for (i in 1:length(titles)){ headersi <- getURL( paste("http://rosettacode.org/mw/index.php?title=", gsub(" ", "_", titles[i]), "&action=raw", sep="") ) countsi <- strsplit(headersi,split=" ")1 countsi <- grep("\\{\\{header", countsi) cat(titles[i], ":", length(countsi), "examples\n") } cat("Total: ", length(unlist(counts)), "examples\n") </lang>

Racket

<lang racket>

  1. lang racket

(require net/url net/uri-codec json (only-in racket/dict [dict-ref ref]))

(define (RC-get verb params)

 ((compose1 get-pure-port string->url format)
  "http://rosettacode.org/mw/~a.php?~a" verb (alist->form-urlencoded params)))

(define (get-category catname)

 (let loop ([c #f])
   (define t
     ((compose1 read-json RC-get) 'api
      `([action . "query"] [format . "json"]
        [list . "categorymembers"] [cmtitle . ,(format "Category:~a" catname)]
        [cmcontinue . ,(and c (ref c 'cmcontinue))] [cmlimit . "500"])))
   (define (c-m key) (ref (ref t key '()) 'categorymembers #f))
   (append (for/list ([page (c-m 'query)]) (ref page 'title))
           (cond [(c-m 'query-continue) => loop] [else '()]))))

(printf "Total: ~a\n"

 (for/sum ([task (get-category 'Programming_Tasks)])
   (define s ((compose1 length regexp-match-positions*)
              #rx"=={{" (RC-get 'index `([action . "raw"] [title . ,task]))))
   (printf "~a: ~a\n" task s)
   s))

</lang>

Ring

<lang ring>

  1. Project: Rosetta Code/Count examples
  2. Date  : 2018/07/11
  3. Author: Gal Zsolt (~ CalmoSoft ~)
  4. Email  : <calmosoft@gmail.com>

load "stdlib.ring" ros= download("http://rosettacode.org/wiki/Category:Programming_Tasks") pos = 1 num = 0 totalros = 0 rosname = "" rostitle = "" for n = 1 to len(ros)

nr = searchstring(ros,'

  • <a href="/wiki/',pos) if nr = 0 exit else pos = nr + 1 ok nr = searchname(nr) nr = searchtitle(nr) next see nl see "Total: " + totalros + " examples." + nl func searchstring(str,substr,n) newstr=right(str,len(str)-n+1) nr = substr(newstr, substr) if nr = 0 return 0 else return n + nr -1 ok func searchname(sn) nr2 = searchstring(ros,'">',sn) nr3 = searchstring(ros,"</a>
  • ",sn) rosname = substr(ros,nr2+2,nr3-nr2-2) return sn func searchtitle(sn) st = searchstring(ros,"title=",sn) rostitle = substr(ros,sn+19,st-sn-21) rostitle = "rosettacode.org/wiki/" + rostitle rostitle = download(rostitle) sum = count(rostitle,"Edit section:") num = num + 1 see "" + num + ". " + rosname + ": " + sum + " examples." + nl totalros = totalros + 1 return sn func count(cstring,dstring) sum = 0 while substr(cstring,dstring) > 0 sum = sum + 1 cstring = substr(cstring,substr(cstring,dstring)+len(string(sum))) end return sum </lang> Output:

    1. 100 doors: 331 examples.
    2. 15 Puzzle Game: 48 examples.
    3. 15 puzzle solver: 18 examples.
    4. 2048: 40 examples.
    5. 24 game: 95 examples.
    6. 24 game/Solve: 59 examples.
    7. 4-rings or 4-squares puzzle: 42 examples.
    8. 9 billion names of God the integer: 54 examples.
    9. 99 Bottles of Beer: 393 examples.
    10. A+B: 250 examples.
    ......
    872. XML/XPath: 54 examples.
    873. Y combinator: 88 examples.
    874. Yahoo! search interface: 20 examples.
    875. Yin and yang: 59 examples.
    876. Zebra puzzle: 58 examples.
    877. Zeckendorf arithmetic: 11 examples.
    878. Zeckendorf number representation: 64 examples.
    879. Zero to the zero power: 100 examples.
    880. Zhang-Suen thinning algorithm: 26 examples.
    881. Zig-zag matrix: 112 examples.
    
    Total: 27004 examples.
    

    Ruby

    Library: REXML

    First, a RosettaCode module, saved as rosettacode.rb: <lang ruby>require 'open-uri' require 'rexml/document'

    module RosettaCode

     URL_ROOT = "http://rosettacode.org/mw"
    
     def self.get_url(page, query)
       begin
         # Ruby 1.9.2
         pstr = URI.encode_www_form_component(page)
         qstr = URI.encode_www_form(query)
       rescue NoMethodError
         require 'cgi'
         pstr = CGI.escape(page)
         qstr = query.map {|k,v|
           "%s=%s" % [CGI.escape(k.to_s), CGI.escape(v.to_s)]}.join("&")
       end
       url = "#{URL_ROOT}/#{pstr}?#{qstr}"
       p url if $DEBUG
       url
     end
    
     def self.get_api_url(query)
       get_url "api.php", query
     end
    
     def self.category_members(category)
       query = {
         "action" => "query",
         "list" => "categorymembers",
         "cmtitle" => "Category:#{category}",
         "format" => "xml",
         "cmlimit" => 500,
       }
       while true
         url = get_api_url query
         doc = REXML::Document.new open(url)
    
         REXML::XPath.each(doc, "//cm") do |task|
           yield task.attribute("title").value
         end
    
         continue = REXML::XPath.first(doc, "//query-continue")
         break if continue.nil?
         cm = REXML::XPath.first(continue, "categorymembers")
         query["cmcontinue"] = cm.attribute("cmcontinue").value
       end
     end
    

    end</lang>

    Then, we implement the task with: <lang ruby>require 'rosettacode'

    total_examples = 0

    RosettaCode.category_members("Programming_Tasks") do |task|

     url = RosettaCode.get_url("index.php", {"action" => "raw", "title" => task})
     examples = open(url).read.scan("=={{header").length
     puts "#{task}: #{examples}"
     total_examples += examples
    

    end

    puts puts "Total: #{total_examples}"</lang>

    Rust

    <lang rust>extern crate reqwest; extern crate url; extern crate rustc_serialize;

    use std::io::Read; use self::url::Url; use rustc_serialize::json::{self, Json};

    pub struct Task {

       page_id: u64,
       pub title: String,
    

    }

    1. [derive(Debug)]

    enum ParseError {

       /// Something went wrong with the HTTP request to the API.
       Http(reqwest::Error),
    
       /// There was a problem parsing the API response into JSON.
       Json(json::ParserError),
    
       /// Unexpected JSON format from response
       UnexpectedFormat,
    

    } impl From<json::ParserError> for ParseError {

       fn from(error: json::ParserError) -> Self {
           ParseError::Json(error)
       }
    

    }

    impl From<reqwest::Error> for ParseError {

       fn from(error: reqwest::Error) -> Self {
           ParseError::Http(error)
       }
    

    }


    fn construct_query_category(category: &str) -> Url {

       let mut base_url = Url::parse("http://rosettacode.org/mw/api.php").unwrap();
       let cat = format!("Category:{}", category);
       let query_pairs = vec![("action", "query"),
                              ("format", "json"),
                              ("list", "categorymembers"),
                              ("cmlimit", "500"),
                              ("cmtitle", &cat),
                              ("continue", "")];
       base_url.query_pairs_mut().extend_pairs(query_pairs.into_iter());
       base_url
    

    }

    fn construct_query_task_content(task_id: &str) -> Url {

       let mut base_url = Url::parse("http://rosettacode.org/mw/api.php").unwrap();
       let mut query_pairs =
           vec![("action", "query"), ("format", "json"), ("prop", "revisions"), ("rvprop", "content")];
       query_pairs.push(("pageids", task_id));
       base_url.query_pairs_mut().extend_pairs(query_pairs.into_iter());
       base_url
    

    }

    fn query_api(url: Url) -> Result<Json, ParseError> {

       let mut response = try!(reqwest::get(url.as_str()));
       // Build JSON
       let mut body = String::new();
       response.read_to_string(&mut body).unwrap();
    
       Ok(try!(Json::from_str(&body)))
    

    }

    fn parse_all_tasks(reply: &Json) -> Result<Vec<Task>, ParseError> {

       let json_to_task = |json: &Json| -> Result<Task, ParseError> {
           let page_id: u64 = try!(json.find("pageid")
               .and_then(|id| id.as_u64())
               .ok_or(ParseError::UnexpectedFormat));
           let title: &str = try!(json.find("title")
               .and_then(|title| title.as_string())
               .ok_or(ParseError::UnexpectedFormat));
    
           Ok(Task {
               page_id: page_id,
               title: title.to_owned(),
           })
       };
       let tasks_json = try!(reply.find_path(&["query", "categorymembers"])
           .and_then(|tasks| tasks.as_array())
           .ok_or(ParseError::UnexpectedFormat));
    
       // Convert into own type
       tasks_json.iter().map(json_to_task).collect()
    

    } fn count_number_examples(task: &Json, task_id: u64) -> Result<u32, ParseError> {

       let revisions =
           try!(task.find_path(&["query", "pages", task_id.to_string().as_str(), "revisions"])
               .and_then(|content| content.as_array())
               .ok_or(ParseError::UnexpectedFormat));
       let content = try!(revisions[0]
           .find("*")
           .and_then(|content| content.as_string())
           .ok_or(ParseError::UnexpectedFormat));
       Ok(content.split("=={{header").count() as u32)
    

    }

    pub fn query_all_tasks() -> Vec<Task> {

       let query = construct_query_category("Programming_Tasks");
       let json: Json = query_api(query).unwrap();
       parse_all_tasks(&json).unwrap()
    

    }

    pub fn query_a_task(task: &Task) -> u32 {

       let query = construct_query_task_content(&task.page_id.to_string());
       let json: Json = query_api(query).unwrap();
       count_number_examples(&json, task.page_id).unwrap()
    

    }</lang>

    The function is then run using the following: <lang rust> extern crate count_examples; fn main() {

       let all_tasks = count_examples::query_all_tasks();
       for task in &all_tasks {
           let count = count_examples::query_a_task(task);
           println!("Task: {} has {} examples", task.title, count);
       }
    

    }</lang>

    Run BASIC

    <lang runbasic>html "

    "

    a$ = httpGet$("http://rosettacode.org/wiki/Category:Programming_Tasks")

    a$ = word$(a$,1,"
    NumTaskExamples

    ")

    i = instr(a$,"<a href=""/wiki/") i = instr(a$,"<a href=""/wiki/",i+1) while i > 0

     count	= count + 1
     i	= instr(a$,"<a href=""/wiki/",i+1)
     j	= instr(a$,">",i+5)
     a1$	= mid$(a$,i+15,j-i)
     taskId$ = word$(a1$,1,"""")
     task$   = word$(a1$,3,"""")
     url$	= "http://rosettacode.org/wiki/";taskId$
     a2$	= httpGet$(url$)
     ii	= instr(a2$,"")
     jj	= 0
     while ii > 0
       jj	= ii
       ii	= instr(a2$,"",ii+10)
     wend
     if jj = 0 then 
       examp = 0
      else
       kk	= instr(a2$,"<",jj+24)
       examp = int(val(mid$(a2$,jj+24,kk-jj-24)))
     end if
    

    html "";count;"";task$;"";examp;""

     totExamp = totExamp + examp
    

    wend

    html "**** Total **";totExamp;""

    end</lang>

    NumTaskExamples
    1100 doors165
    224 game56
    324 game/Solve34
    499 Bottles of Beer192
    5A+B129
    6Abstract type51
    7Accumulator factory65
    8Ackermann function132
    9Active Directory/Connect13
    10Active Directory/Search for a user13
    11Active object22
    12Add a variable to a class instance at runtime37
    .........
    655Y combinator53
    656Yahoo! search interface16
    657Yin and yang38
    658Zebra puzzle12
    659Zeckendorf number representation18
    660Zig-zag matrix65
    **** Total **28611

    Scala

    Library: Scala

    <lang Scala>import scala.language.postfixOps

    object TaskCount extends App {

     import java.net.{ URL, URLEncoder }
     import scala.io.Source.fromURL
    
     System.setProperty("http.agent", "*")
     val allTasksURL =
       "http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml"
     val allTasks = xml.parsing.XhtmlParser(fromURL(new URL(allTasksURL)))
    
     val regexExpr = "(?i)==\\{\\{header\\|".r
    
     def oneTaskURL(title: String) = {
       println(s"Check $title")
       "http://www.rosettacode.org/w/index.php?title=%s&action=raw" format URLEncoder.encode(title.replace(' ', '_'), "UTF-8")
     }
    
     def count(title: String) = regexExpr findAllIn fromURL(new URL(oneTaskURL(title)))(io.Codec.UTF8).mkString length
    
     val counts = for (task <- allTasks \\ "cm" \\ "@title" map (_.text)) yield scala.actors.Futures.future((task, count(task)))
    
     counts map (_.apply) map Function.tupled("%s: %d examples." format (_, _)) foreach println
     println("\nTotal: %d examples." format (counts map (_.apply._2) sum))
    

    }</lang>

    Sidef

    Translation of: Perl

    <lang ruby>var lwp = require('LWP::UserAgent').new(agent => 'Mozilla/5.0');

    var site = 'http://rosettacode.org'; var list_url = '/mw/api.php?action=query&list=categorymembers&'+

                  'cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml';
    

    var content = lwp.get(site + list_url).decoded_content;

    while (var m = content.match(/cm.*?title="(.*?)"/g)) {

       (var slug = m[0]).gsub!(' ', '_');
       var count = lwp.get("#{site}/wiki/#{slug}").decoded_content.count(/toclevel-1/g);
       say "#{m[0]}: #{count} examples";
    

    }</lang>

    Output:
    100 doors: 2180 examples
    24 game: 760 examples
    24 game/Solve: 450 examples
    9 billion names of God the integer: 320 examples
    99 Bottles of Beer: 2330 examples
    A+B: 1800 examples
    ABC Problem: 720 examples
    Abstract type: 680 examples
    ...
    

    Tcl

    Library: Tcllib (Package: json)

    <lang tcl>package require Tcl 8.5 package require http package require json

    fconfigure stdout -buffering none

    proc get_tasks {category} {

       set start [clock milliseconds]
       puts -nonewline "getting $category members..."
       set base_url http://www.rosettacode.org/w/api.php
       set query {action query list categorymembers cmtitle Category:%s format json cmlimit 500}
       set this_query [dict create {*}[split [format $query $category]]]
       set tasks [list]
    
       while {1} {
           set url [join [list $base_url [http::formatQuery {*}$this_query]] ?]
           set response [http::geturl $url]
           if {[set s [http::status $response]] ne "ok" || [http::ncode $response] != 200} {
               error "Oops: url=$url\nstatus=$s\nhttp code=[http::code $response]"
           }
           set data [json::json2dict [http::data $response]]
           http::cleanup $response
           
           # add tasks to list
           foreach task [dict get $data query categorymembers] {
               lappend tasks [dict get [dict create {*}$task] title]
           }
           
           if {[catch {dict get $data query-continue categorymembers cmcontinue} continue_task] != 0} {
               # no more continuations, we're done
               break
           }
           dict set this_query cmcontinue $continue_task
       }
       puts " found [llength $tasks] tasks in [expr {[clock milliseconds] - $start}] milliseconds"
       return $tasks
    

    }

    1. This proc can be replaced by a single regexp command:
    2. set count [regexp -all "***=$needle" $haystack]
    3. However this proc is more efficient -- we're dealing with plain strings only.

    proc count_substrings {needle haystack} {

       set count 0
       set idx 0
       while {[set idx [string first $needle $haystack $idx]] != -1} {
           incr count
           incr idx
       }
       return $count
    

    }

    set total 0 foreach task [get_tasks Programming_Tasks] {

       set url [format "http://www.rosettacode.org/w/index.php?title=%s&action=raw" [string map {{ } _} $task]]
       set response [http::geturl $url]
       if {[set s [http::status $response]] ne "ok" || [http::ncode $response] != 200} {
           error "Oops: url=$url\nstatus=$s\nhttp code=[http::code $response]"
       }
       set count [count_substrings "\{\{header|" [http::data $response]]
       puts [format "%3d examples in %s" $count $task]
       http::cleanup $response
       incr total $count
    

    }

    puts "\nTotal: $total examples"</lang>

    TUSCRIPT

    <lang tuscript>$$ MODE TUSCRIPT url="http://www.rosettacode.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml" data=REQUEST (url)

    BUILD S_TABLE beg=* DATA :title=": BUILD S_TABLE end=* DATA :":

    titles=EXTRACT (data,beg|,end,1,0,"~~") titles=SPLIT (titles,":~~:") sz_titles=SIZE (titles)

    BUILD R_TABLE header=":==\{\{header|:" all=*

    ERROR/STOP CREATE ("tasks",seq-e,-std-)

    COMPILE LOOP title=titles ask=* ask =SET_VALUE(ask,"title",title) ask =SET_VALUE(ask,"action","raw") ask =ENCODE (ask,cgi) http ="http://www.rosettacode.org/mw/index.php" url =CONCAT (http,"?",ask) data =REQUEST (url) header =FILTER_INDEX (data,header,-) sz_header=SIZE(header) line =CONCAT (title,"=",sz_header," members") FILE "tasks" = line all =APPEND(all,sz_header) ENDLOOP

    ENDCOMPILE all =JOIN(all),sum=SUM(all),time=time() line=CONCAT (time,": ", sz_titles, " Programing Tasks: ", sum, " solutions")

    FILE "tasks" = line </lang> Output in file "tasks":

    100 doors=104 members
    24 game=27 members
    24 game/Solve=21 members
    99 Bottles of Beer=124 members
    A+B=76 members
    Abstract type=35 members
    Accumulator factory=44 members
    ...
    XML/Input=39 members
    XML/Output=32 members
    XML/XPath=24 members
    Xiaolin Wu's line algorithm=0 members
    Y combinator=33 members
    Yahoo! search interface=10 members
    Zig-zag matrix=46 members
    2011-01-15 03:41:30: 455 Programing Tasks: 16009 solutions 
    

    zkl

    Uses shared libraries YAJL and cURL and handles "continue" responses. <lang zkl>var [const] YAJL=Import("zklYAJL")[0], CURL=Import("zklCurl");

    fcn getTasks(language){

      continueValue,tasks:="",Data(0,String);  // "nm\0nm\0...."
      do{
         page:=CURL().get(("http://rosettacode.org/mw/api.php?"
            "action=query&cmlimit=500"
    

    "&format=json" "&list=categorymembers" "&cmtitle=Category:%s" "&cmcontinue=%s").fmt(language,continueValue));

         page=page[0].del(0,page[1]);  // get rid of HTML header
         json:=YAJL().write(page).close();
         json["query"]["categorymembers"].pump(tasks,T("get","title"));
         continueValue=json.find("continue") //continue:-||,cmcontinue:page|954|19)
             .toList().apply("concat","=").concat("&");
      }while(continueValue);
      tasks
    

    } re:=RegExp(0'!\s+==\s*{{\s*header\s*|!); // == {{ header | zkl foreach task in (getTasks("Programming_Tasks")){

      page:=CURL().get(
         "http://www.rosettacode.org/mw/index.php?title=%s&action=raw"
         .fmt(CURL.urlEncode(task)));
      page=page[0].del(0,page[1]);  // get rid of HTML header
      cnt,n:=0,0;  while(re.search(page,True,n)){ cnt+=1; n=re.matched[0].sum(0); }
      "%4d: %s".fmt(cnt,task).println();
    

    }</lang>

    Output:
     229: 100 doors
      15: 15 Puzzle Game
    ...
     257: 99 Bottles of Beer
     199: A+B
    ...
      28: Calendar - for "REAL" programmers
    ...
       9: Stream Merge
    ...
      78: Zero to the zero power
      19: Zhang-Suen thinning algorithm
      83: Zig-zag matrix