L'interfaccia del Representer


Tutte le interazioni con il sito di Exercism sono gestite automaticamente. I representer hanno la sola responsabilità di prendere una soluzione e restituirne una rappresentazione. Per maggiori informazioni, consulta l'introduzione.

Esecuzione

  • Un representer dovrebbe fornire uno script eseguibile. Puoi trovare maggiori informazioni nel file docker.md.
  • Lo script riceverà tre parametri:
    • Lo slug dell'esercizio (ad esempio two-fer).
    • Un percorso verso una directory che contiene i file inviati (con una barra finale).
    • Un percorso verso una directory di output (con una barra finale). Questa directory è scrivibile.
  • Lo script deve scrivere un file representation.txt nella directory di output.
  • Lo script deve scrivere un file representation.json nella directory di output.
  • Lo script deve scrivere un file mapping.json nella directory di output.

Tempo di esecuzione consentito

Il representer ottiene il 100% delle risorse della macchina per una finestra di 20 secondi per ogni soluzione. Dopo 20 secondi, il processo viene interrotto e segnala un timeout.

Note

Ti consigliamo vivamente di seguire il nostro documento sulle best practice per le prestazioni per ridurre la probabilità di timeout.

Formato dell'output

representation.txt

Il file representation.txt contiene una qualche forma di rappresentazione canonica. Questa rappresentazione può assumere molte forme, ma di solito è un 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))))

La rappresentazione potrebbe anche essere semplicemente il codice sorgente (normalizzato):

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

Il file mapping.json associa i segnaposto ai loro valori originali:

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

È importante notare che tutti i nomi identici devono essere sostituiti con lo stesso segnaposto, indipendentemente dallo scope.

representation.json

Il file representation.json contiene i metadati:

  • version: il numero di versione del representer (il valore predefinito è 1)

Esempio:

{ "version": 2 }