Die Representer-Schnittstelle


Alle Interaktionen mit der Exercism-Website werden automatisch abgewickelt. Representer haben die einzige Aufgabe, eine Lösung zu nehmen und eine Repräsentation davon zurückzugeben. Weitere Informationen findest du in der Einführung.

Ausführung

  • Ein Representer sollte ein ausführbares Skript bereitstellen. Weitere Informationen findest du in der Datei docker.md.
  • Das Skript erhält drei Parameter:
    • Den Slug der Übung (z. B. two-fer).
    • Einen Pfad zu einem Verzeichnis mit der/den eingereichten Datei(en) (mit abschließendem Schrägstrich).
    • Einen Pfad zu einem Ausgabeverzeichnis (mit abschließendem Schrägstrich). Dieses Verzeichnis ist beschreibbar.
  • Das Skript muss eine representation.txt-Datei in das Ausgabeverzeichnis schreiben.
  • Das Skript muss eine representation.json-Datei in das Ausgabeverzeichnis schreiben.
  • Das Skript muss eine mapping.json-Datei in das Ausgabeverzeichnis schreiben.

Erlaubte Laufzeit

Der Representer bekommt pro Lösung für ein Zeitfenster von 20 Sekunden 100 % der Maschinenressourcen. Nach 20 Sekunden wird der Prozess angehalten und meldet eine Zeitüberschreitung.

Note

Wir empfehlen dir dringend, unser Dokument zu Best Practices für die Performance zu befolgen, um die Wahrscheinlichkeit von Zeitüberschreitungen zu verringern.

Ausgabeformat

representation.txt

Die representation.txt-Datei enthält eine Art kanonische Repräsentation. Diese Repräsentation kann viele Formen annehmen, ist aber normalerweise ein AST:

s(:class,
  s(:const, nil, :PLACEHOLDER_1), nil,
  s(:begin,
    s(:def, :PLACEHOLDER_2,
      s(:args),
      s(:begin,
        s(:lvasgn, :PLACEHOLDER_3,
          s(:str, "foo")),
        s(:lvasgn, :PLACEHOLDER_4,
          s(:str, "foo")),
        s(:return,
          s(:lvar, :PLACEHOLDER_3)))),
    s(:def, :PLACEHOLDER_3,
      s(:args),
      s(:const, nil, :PLACEHOLDER_1))))

Die Repräsentation kann auch einfach (normalisierter) Quellcode sein:

class PLACEHOLDER_1
  def PLACEHOLDER_2
    PLACEHOLDER_3 = "foo"
    PLACEHOLDER_4 = "foo"
    return PLACEHOLDER_3
  end

  def PLACEHOLDER_3
    PLACEHOLDER_1
  end
end

mapping.json

Die mapping.json-Datei ordnet Platzhalter ihren ursprünglichen Werten zu:

{
  "PLACEHOLDER_1": "TwoFer",
  "PLACEHOLDER_2": "two_fer",
  "PLACEHOLDER_3": "foo",
  "PLACEHOLDER_4": "bar"
}

Wichtig ist, dass alle identischen Namen durch denselben Platzhalter ersetzt werden müssen, unabhängig vom Gültigkeitsbereich.

representation.json

Die representation.json-Datei enthält Metadaten:

  • version: die Versionsnummer des Representers (Standardwert ist 1)

Beispiel:

{ "version": 2 }