Eine kleines Modul, zum fetchen und submitten von Coding Challenges von The Morpheus Tutorials
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

4.4 KiB

Coding Challenge Modul

Build Status

Eine kleines Modul, zum Challenge fetchen und submitten. Außerdem kann man sich die durchschnittliche Dauer für alle Lösungsdurchläufe ausgeben lassen.

Es wurde von mir geschrieben um wiederkehrende Aufgaben wie fetchen, submitten etc. beim Lösen der Coding Challenges vom Youtube Channel The Morpheus Tutorials zu vereinfachen. Meine Lösungen die dieses Modul nutzen liegen hier: coding_challenge_loesung

Warning

I am not a programmer, so here's a warning: This code was written in an exploratory way. If you encounter problems, see something wrong or something was implemented in a weird way, I would be happy if you tell me about it or create a pull request. Thank you. :)

Nutzungsbeispiel

> CC = require('cc')
> cc = CC.new(1, { nojson = true })
> cc:solve(function(ch) return { token = tostring(ch) } end, true)
Success   200
> cc:runtime_avg()
0.000003s

Inhalt

Abhängigkeiten

Funktionen

new(cn[, opts])

Erstellt neues Coding Challenge Instanz.

Parameter:

  • cn: (number) Nummer der Challenge, also z.B. 3 für die dritte Challenge
  • opts: (table) options (opt)
  • opts.nojson: (bool) auf true setzen wenn die Challenge nicht als JSON bereitgestellt wird
  • opts.get_path: (string) der Pfad wird der get URL hinzugefügt. Bei einer Challenge gab es mal die Möglichkeit die Werte sortiert übermittelt zu bekommen indem mal /sorted als Pfad angab.
  • opts.post_path: (string) selbe wie get_path nur POST request, also submit()

Returns:

(table) Objekt table

Usage:

local cc = CC.new(15)

fetch()

Abrufen einer Challenge.

Parameter:

nil

Returns:

(table|string) wenn opts.nojson auf true gesetzt ist, wird ein String returned, sonst eine Table.

Usage:

local challenge = cc:fetch()

solve(fn, sbmt)

Lösen der Challenge. Dies ist eigentlich nur ein Wrapper für die Lösungsfunktion, welcher die Ausführungszeit misst. Wird dies nicht benötigt kann man auch die Lösungsfunktion ohne solve() nutzen. solve() ruft fetch() auf um eine neue Challenge zu bekommen. Sollte man also eine for-Loop nutzen, brauch man nur solve() nutzen.

Parameter:

  • fn: (function) die Funktion, welche die Challenge löst. fn nimmt ein Parameter (table) entgegen.
  • sbmt: (bool) Wenn true wird direkt submit() mit dem zurückgegebenen Wert von fn aufgerufen.

Returns:

(void | string, number) Das Ergebnis | Wenn sbmt = true

Usage:

local result = cc:solve(function(c) return c.word end)

submit(data[, header])

Übermitteln der Lösung.

Parameter:

  • data: (table) Übergabe der Daten in Form einer table, welche dann in JSON umgewandelt wird.
  • headers: (table) Werden zusätzliche Header benötigt, können diese als Tabelle übergeben werden

Returns:

(string, number) Return value 1 ist der Status Text ob Success oder Error und value 2 ist der HTTP Statuscode

Usage:

local resp = cc:post({ token = 'blubb' })
local c2 = c2:post({
  token = 'blubb'
},
{
  headers = {
    ['X-Clacks-Overhead'] = 'GNU Terry Pratchett'
  }
})

runtime_avg()

Durchschnittliche Zeit aller Lösungs Durchläufe. Für Benchmark.

Parameter:

nil

Returns:

(string) the time in seconds

Usage:

cc:runtime_avg() -- Output: 0.000004

Beispiele

Tests

Um die Tests laufen zu lassen wird gambiarra benötigt. Einfach gambiarra.lua herunterladen und in den Ordner spec/ packen und die Tests mit lua lib/spec/cc_spec.lua ausführen.