Task

Given the name of a language on Rosetta Code, find all tasks which are not implemented in that language.



Note: Implementations should allow for fetching more data than can be returned in one request to Rosetta Code.

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

local requests = require('requests')
local lang = arg[1]
 
local function merge_tables(existing, from_req)
  local result = existing
 
  for _, v in ipairs(from_req) do
      result[v.title] = true
  end
 
  return result
end
 
local function get_task_list(category)
  local url = 'http://www.rosettacode.org/mw/api.php'
  local query = {
    action = 'query',
    list = 'categorymembers',
    cmtitle = string.format('Category:%s', category),
    cmlimit = 500,
    cmtype = 'page',
    format = 'json'
  }
  local categories = {}
 
  while true do
    local resp = assert(requests.get({ url, params = query }).json())
 
    categories = merge_tables(categories, resp.query.categorymembers)
 
    if resp.continue then
      query.cmcontinue = resp.continue.cmcontinue
    else
      break
    end
  end
 
  return categories
end
 
local function get_open_tasks(lang)
  if not lang then error('Language missing!') end
  local all_tasks = get_task_list('Programming_Tasks')
  local lang_tasks = get_task_list(lang)
  local task_list = {}
 
  for t, _ in pairs(all_tasks) do
    if not lang_tasks[t] then
      table.insert(task_list, t)
    end
  end
 
  table.sort(task_list)
  return task_list
end
 
local open_tasks = get_open_tasks(lang)
 
io.write(string.format('%s has %d unimplemented programming tasks: \n', lang, #open_tasks))
for _, t in ipairs(open_tasks) do
  io.write(string.format('  %s\n', t))
end