tech-exam.ch
Accesso docenti

Formato delle domande

tech-exam legge le domande da un file. Questa pagina descrive come deve essere costruito — così che un'IA a vostra scelta scriva domande che riprenderete poi nella vostra raccolta. Tutti gli esempi qui riportati sono il contenuto con cui parte un nuovo account e si importerebbero invariati. La materia che vi compare è un esempio, non un modello: conta la struttura, non l'argomento.

Ottenere domande con la propria IA

  1. Nella raccolta di domande scegliere «Con la propria IA» e indicare argomento, numero e tipo di domanda.
  2. Aprire l'incarico pronto in un servizio di IA oppure copiarlo. Rimanda a questa pagina, così l'IA conosce la costruzione del file.
  3. Copiare il risultato dalla conversazione e incollarlo nello stesso dialogo — oppure salvarlo come file e leggerlo con «Da file».
  4. Rileggere le domande nella raccolta prima di tenere un esame con esse. Le domande inventate contengono a volte errori che sembrano credibili.

La costruzione

All'esterno stanno un identificativo, un numero di versione e l'elenco delle domande. Tutto il resto appartiene alle domande stesse. Un campo che porta il suo valore predefinito viene omesso — così si presentano gli esempi di questa pagina, e così può presentarsi anche un file scritto a mano.

{
  "format": "tech-exam/questions",
  "formatVersion": 1,
  "questions": [
    {
      "topic": "Beispielfragen",
      "subtopic": "Fragetypen",
      "subsubtopic": "Multiple Choice",
      "title": "Aussagen über Listen",
      "contentType": "mc",
      "maxPoints": 4,
      "description": "Welche Aussagen über Listen in Python sind richtig?",
      "answerSpec": {
        "kind": "mc",
        "options": [
          {
            "id": "o1",
            "text": "Eine Liste ist veränderbar."
          },
          {
            "id": "o2",
            "text": "Eine Liste kann nur Zahlen enthalten."
          },
          {
            "id": "o3",
            "text": "Eine Liste behält die Reihenfolge der Einträge."
          },
          {
            "id": "o4",
            "text": "`len(zahlen)` gibt den grössten Wert der Liste zurück."
          }
        ],
        "multiple": true,
        "scoring": {
          "mode": "allOrNothing"
        }
      },
      "answerKey": {
        "kind": "mc",
        "correct": [
          "o1",
          "o3"
        ]
      }
    },
    {
      "topic": "Beispielfragen",
      "subtopic": "Fragetypen",
      "subsubtopic": "Langtext",
      "title": "Wann Liste, wann Dictionary?",
      "contentType": "langtext",
      "maxPoints": 6,
      "description": "Begründe in einem Abschnitt, wann sich eine Liste besser eignet als ein Dictionary – und wann umgekehrt. Nenne je ein Beispiel.",
      "solution": "Eine Liste passt, wenn die Reihenfolge zählt und alle Einträge der Reihe nach durchlaufen werden, etwa eine Rangliste.\n\nEin Dictionary passt, wenn ein Wert über einen Schlüssel gefunden werden soll, etwa die Note zu einem Namen: Der Zugriff bleibt gleich schnell, egal wie viele Einträge dazukommen.\n",
      "criteria": [
        {
          "text": "Die Begründung trifft das Entscheidende: Reihenfolge und Durchlaufen bei der Liste, Zugriff über den Schlüssel beim Dictionary.",
          "points": 3
        },
        {
          "text": "Zu beiden Fällen steht ein konkretes Beispiel, das das genannte Merkmal wirklich braucht.",
          "points": 3
        }
      ]
    }
  ]
}

I campi

Una domanda deve portare tre campi: titolo, tipo di domanda e punti. Tutti gli altri possono mancare — vale allora quanto sta nella terza colonna. Un file con tre campi giusti vale più di uno pieno di campi indovinati.

Attorno alle domande

CampoValoriSe mancaSignificato
format"tech-exam/questions"ObbligatorioL'identificativo da cui il file viene riconosciuto. È sempre lo stesso.
formatVersion1ObbligatorioIl numero della costruzione.
questions[ … ]ObbligatorioLe domande. Ognuna è o una domanda con area di risposta o una domanda con sottodomande.

Su ogni domanda

CampoValoriSe mancaSignificato
titleTextObbligatorioIl titolo che sta sopra la domanda.
contentType"svg" · "tigerpython" · "tigerpython_robotik" · "python" · "mc" · "lueckentext" · "langtext"ObbligatorioCome si risponde: «mc» una scelta, «lueckentext» lacune in un testo, «langtext» testo discorsivo, «python» e «tigerpython» codice, «tigerpython_robotik» un programma per il micro:bit o per un robot su cui è montato, «svg» un disegno.
maxPoints≥ 0.5ObbligatorioQuanti punti dà al massimo la domanda.
topicText""La cartella nella raccolta.
subtopicText""La sottocartella.
subsubtopicText""La sotto-sottocartella.
descriptionTextnullIl testo della domanda. Nel testo con lacune resta vuoto, perché quel testo sta nei segmenti.
descriptionFormat"markdown" · "html""markdown"Come è composto il testo della domanda. Markdown conosce tabelle, blocchi di codice e formule fra segni di dollaro.
solutionTextnullLa soluzione modello. Visibile solo alle persone che insegnano.
starterCodeTextnullCodice già presente nell'editor all'apertura della domanda.
answerSpec{ … }nullLe risposte disponibili. Necessaria per una scelta e per un testo con lacune, altrimenti si omette.
answerKey{ … }nullLa risposta giusta. Usa gli stessi identificativi di answerSpec.
criteria[ … ][]Le indicazioni di correzione: un testo per gli studenti e i punti relativi. I punti con il più si aggiungono alla valutazione, quelli con il meno si tolgono.
graderCodeTextnullCodice Python che assegna da sé i punti di questa domanda, invece di lasciarli dare a mano. Viene eseguito non appena lo si usa per correggere.
graderRules{ … }{}Che cosa vale quando il programma di una consegna non parte o non arriva in fondo. Ha senso solo per «python» e «tigerpython».

Programmare e disegnare

Con «tigerpython», «tigerpython_robotik», «python» e «svg» si risponde in un ambiente integrato. Con «tigerpython_robotik» il dispositivo è acceso: l'ambiente mostra il simulatore del micro:bit e, non appena il programma importa una libreria robotica, anche quello del robot. «starterCode» vi deposita ciò che è già presente all'apertura della domanda. «graderCode» assegna i punti da sé: una funzione Python «grade(answer, task, run)» che restituisce punti e riscontro — «answer» è la consegna, «task» la domanda con i suoi punti, «run» l'esecuzione del programma e ciò che ha stampato. «graderRules» si assume i due casi in cui un programma non arriva in fondo. Il codice di valutazione viene eseguito non appena lo si usa per correggere; l'importazione lo segnala espressamente, e va letto prima di riprenderlo.

{
  "format": "tech-exam/questions",
  "formatVersion": 1,
  "questions": [
    {
      "topic": "Beispielfragen",
      "subtopic": "Programmieren",
      "subsubtopic": "TigerPython",
      "title": "Quadrat mit repeat",
      "contentType": "tigerpython",
      "maxPoints": 6,
      "description": "Zeichne mit der Turtle ein Quadrat mit Seitenlänge 100. Nutze dafür die `repeat`-Schleife von TigerPython.",
      "solution": "from gturtle import *\n\nmakeTurtle()\nrepeat 4:\n    forward(100)\n    right(90)\n",
      "criteria": [
        {
          "text": "`repeat 4:` wiederholt den eingerückten Block viermal – für ein Quadrat braucht es genau vier Durchgänge.",
          "points": 3
        },
        {
          "text": "Im Schleifenkörper gehören `forward(100)` und `right(90)` zusammen; ohne die Drehung entsteht eine Linie statt eines Quadrats.",
          "points": 3
        },
        {
          "text": "Ohne `makeTurtle()` gibt es nichts, was zeichnen könnte – das Programm bleibt gleich zu Beginn stehen.",
          "points": -1
        }
      ]
    },
    {
      "topic": "Beispielfragen",
      "subtopic": "Programmieren",
      "subsubtopic": "Roboter",
      "title": "Zwei Sekunden geradeaus",
      "contentType": "tigerpython_robotik",
      "maxPoints": 3,
      "description": "Lass den Roboter zwei Sekunden geradeaus fahren und danach anhalten.",
      "solution": "from mbrobot import *\n\nforward()\ndelay(2000)\nstop()\n",
      "criteria": [
        {
          "text": "`forward()` setzt den Roboter in Bewegung, `stop()` hält ihn wieder an.",
          "points": 2
        },
        {
          "text": "`delay(2000)` lässt dazwischen zwei Sekunden verstreichen – ohne die Wartezeit steht er, bevor er losgefahren ist.",
          "points": 1
        }
      ]
    },
    {
      "topic": "Beispielfragen",
      "subtopic": "Programmieren",
      "subsubtopic": "Python",
      "title": "Summe zweier Zahlen",
      "contentType": "python",
      "maxPoints": 10,
      "description": "Schreibe eine Funktion `add(a, b)`, die die Summe der beiden Argumente zurückgibt.",
      "solution": "def add(a, b):\n    return a + b\n",
      "starterCode": "def add(a, b):\n    # Gib hier die Summe von a und b zurück.\n    pass\n",
      "graderCode": "def grade(answer, task, run):\n    # Die Abgabe ausführen und die Funktion aus der Musterlösung holen. Ob sie\n    # sich überhaupt ausführen lässt, entscheiden die Regeln über diesem Feld.\n    umgebung = {}\n    exec(answer[\"value\"], umgebung)\n\n    funktion = umgebung.get(\"add\")  # Name aus der Musterlösung\n    if not callable(funktion):\n        return {\"points\": 0, \"feedback\": \"Die Funktion «add» fehlt.\"}\n\n    faelle = [((1, 2), 3), ((-1, 1), 0), ((0, 0), 0)]  # (Argumente, erwartet)\n    treffer = 0\n    for argumente, erwartet in faelle:\n        try:\n            if funktion(*argumente) == erwartet:\n                treffer += 1\n        except Exception:\n            pass\n\n    return {\n        \"points\": round(task[\"maxPoints\"] * treffer / len(faelle), 2),\n        \"feedback\": f\"{treffer} von {len(faelle)} Testfällen bestanden.\",\n    }\n",
      "graderRules": {
        "error": {
          "points": 0,
          "feedback": "Das Programm läuft nicht."
        },
        "timeout": {
          "points": 0,
          "feedback": "Das Programm wird nicht fertig."
        }
      }
    },
    {
      "topic": "Beispielfragen",
      "subtopic": "Programmieren",
      "subsubtopic": "SVG",
      "title": "Roter Kreis",
      "contentType": "svg",
      "maxPoints": 10,
      "description": "Zeichne mit SVG einen roten Kreis mit Radius 50 in der Mitte einer Zeichenfläche von $200 * 200$.",
      "solution": "<svg viewBox=\"0 0 200 200\">\n  <circle cx=\"100\" cy=\"100\" r=\"50\" fill=\"red\" />\n</svg>\n",
      "starterCode": "<svg viewBox=\"0 0 200 200\">\n  <!-- Zeichne den Kreis hier hinein. -->\n</svg>\n",
      "criteria": [
        {
          "text": "`cx` und `cy` liegen bei `100`, also in der Mitte der Zeichenfläche, und `r` bei `50`.",
          "points": 6
        },
        {
          "text": "`fill=\"red\"` füllt den Kreis rot – ohne `fill` zeichnet der Browser schwarz.",
          "points": 4
        }
      ]
    }
  ]
}

Testo con lacune

Il testo con lacune è l'unico tipo il cui testo non sta in «description»: esso si trova interamente nei segmenti. Una lacuna senza scelte si scrive, una con scelte si clicca — e ogni lacuna ha bisogno dello stesso identificativo da entrambe le parti.

{
  "format": "tech-exam/questions",
  "formatVersion": 1,
  "questions": [
    {
      "topic": "Beispielfragen",
      "subtopic": "Fragetypen",
      "subsubtopic": "Lückentext",
      "title": "Klammern in Python",
      "contentType": "lueckentext",
      "maxPoints": 2,
      "answerSpec": {
        "kind": "cloze",
        "segments": [
          {
            "type": "text",
            "text": "Eine Liste wird mit "
          },
          {
            "type": "gap",
            "id": "g1",
            "choices": null
          },
          {
            "type": "text",
            "text": " erzeugt, ein Dictionary mit "
          },
          {
            "type": "gap",
            "id": "g2",
            "choices": [
              {
                "id": "g2c1",
                "text": "geschweiften Klammern"
              },
              {
                "id": "g2c2",
                "text": "runden Klammern"
              },
              {
                "id": "g2c3",
                "text": "spitzen Klammern"
              }
            ]
          },
          {
            "type": "text",
            "text": "."
          }
        ],
        "compare": {
          "caseSensitive": false,
          "normalizeWhitespace": true,
          "numericTolerance": null
        }
      },
      "answerKey": {
        "kind": "cloze",
        "gaps": {
          "g1": {
            "type": "text",
            "accepted": [
              "eckigen Klammern"
            ]
          },
          "g2": {
            "type": "choice",
            "correct": [
              "g2c1"
            ]
          }
        }
      }
    }
  ]
}

Domande con sottodomande

Quando più parti condividono un testo comune, le sottodomande prendono il posto del tipo e dei punti. Il testo comune sta allora in alto, il resto presso di esse. Nella raccolta ogni parte diventa una domanda singola che porta con sé il testo comune. — per questo quelle tre stanno anche singolarmente più in alto in questa pagina. Qui portano solo titolo, tipo e punti, perché una sottodomanda non richiede altro.

CampoValoriSe mancaSignificato
titleTextObbligatorioIl titolo che sta sopra la domanda.
subQuestions[ … ]ObbligatorioLe sottodomande. Ognuna porta il proprio tipo e i propri punti.
descriptionTextnullIl testo della domanda. Nel testo con lacune resta vuoto, perché quel testo sta nei segmenti.
{
  "format": "tech-exam/questions",
  "formatVersion": 1,
  "questions": [
    {
      "title": "Robotik mit dem micro:bit",
      "description": "Die beiden Teilfragen programmieren dasselbe Gerät: zuerst sein Display, dann den Roboter, auf dem es sitzt.\n\nZum Ausprobieren braucht es keine Hardware – die Programmierumgebung zeigt beides im Simulator.",
      "subQuestions": [
        {
          "title": "Ein blinkendes Herz",
          "contentType": "tigerpython_robotik",
          "maxPoints": 4
        },
        {
          "title": "Zwei Sekunden geradeaus",
          "contentType": "tigerpython_robotik",
          "maxPoints": 3
        }
      ]
    }
  ]
}

Che cos'altro vale

  • I punti sono almeno 0.5 e hanno al massimo 2 decimali.
  • Ogni identificativo in «answerKey» deve esistere in «answerSpec», altrimenti la domanda non si apre.
  • Una domanda a scelta ha bisogno di almeno due risposte e di almeno una giusta.
  • Il file non porta con sé immagini. Si aggiungono in seguito nell'editor.
  • Il file non contiene altro che le domande — nessuna frase prima, nessuna spiegazione dopo.