Files
mindflux/src/main/resources/syntaxsaga/content.json
T
AliceDarkest 4599dd12b8 Syntax Saga: neues Spiel (server-autoritativ) + 34 Seed-Missionen
Drittes Mindflux-Spiel: interaktive IT-Geschichten, in denen man den
fehlenden Code (Schlüsselwörter, Operatoren, ganze Zeilen) in eine kleine
Story tippt. Freitext-Eingabe, drei wählbare Stufen (Junior/Professional/
Senior), mehrere Lücken je Codeblock und mehrere gültige Antworten je Lücke
(optional case-insensitive). Prüfung und Score ausschließlich serverseitig –
die Lösungen verlassen nie das Backend (Anti-Cheat wie TechTacular/MindMatch).
Fehler-Mechanik: bis zu 3 Versuche mit Hinweis, dann Auflösung; kein Game-Over.

Inhalte DB-gestützt und im Admin pflegbar (/admin/syntaxsaga); 34 Seed-
Missionen (Java/SQL/Bash/Git/HTML/Python) aus syntaxsaga/content.json.

- Entities SyntaxSagaMission/Gap/Solution + Flyway V7__syntax_saga.sql
- SyntaxSagaService (Story ohne Lösung / serverseitige Prüfung / Score-Recompute)
- API /api/syntaxsaga (CSRF-ausgenommen) + Admin-CRUD
- Frontend syntaxsaga.html/js/css (Prefix ss-, theme.css-Tokens)
- Dashboard-Kachel aktiv (vorher "coming soon")

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 12:13:37 +02:00

425 lines
22 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"missions": [
{
"difficulty": "junior",
"title": "Hello World",
"language": "java",
"narrative": "Dein erster Tag als Praktikant. Der Serverraum ist still, das Terminal reagiert nicht – es fehlt der Einstiegspunkt des Programms.",
"dialog": null,
"code": "public class Main {\n public static void {{1}}(String[] args) {\n System.out.println(\"Hello World\");\n }\n}",
"successText": "Das Terminal erwacht zum Leben und begrüßt dich: \"Hello World\".",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Methodenname", "hint": "Der Einstiegspunkt jeder Java-Anwendung.", "solutions": ["main"] }
]
},
{
"difficulty": "junior",
"title": "Die verschwundene Variable",
"language": "java",
"narrative": "Ein Kunde meldet einen Fehler: Auf dem Bildschirm soll die Anzahl der Leben erscheinen – doch da steht nichts.",
"dialog": null,
"code": "int lives = 3;\nSystem.out.println({{1}});",
"successText": "Die Zahl 3 leuchtet auf dem Monitor. Der Kunde atmet auf.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Variable", "hint": "Welche Variable soll ausgegeben werden?", "solutions": ["lives"] }
]
},
{
"difficulty": "junior",
"title": "Der flackernde Monitor",
"language": "java",
"narrative": "Der Serverraum ist dunkel. Nur ein Monitor flackert und wartet auf eine Eingabe, die er nicht lesen kann.",
"dialog": "Bitte… repariere mich…",
"code": "Scanner sc = new {{1}}(System.in);",
"successText": "Eingaben sind wieder möglich. Der Monitor beruhigt sich.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Klassenname", "hint": "Dieselbe Klasse wie links vom Gleichheitszeichen.", "solutions": ["Scanner"] }
]
},
{
"difficulty": "junior",
"title": "Zehn Server",
"language": "java",
"narrative": "Zehn Server müssen der Reihe nach geprüft werden – aber die Schleife, die sie durchläuft, fehlt.",
"dialog": null,
"code": "{{1}} (int i = 0; i < 10; i++) {\n check(server[i]);\n}",
"successText": "Alle zehn Server melden nacheinander: OK.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Die Zählschleife mit Start, Bedingung und Schritt.", "solutions": ["for"] }
]
},
{
"difficulty": "junior",
"title": "Der Virus",
"language": "java",
"narrative": "Eine Schadsoftware hat eine Bedingung verdreht. Das Achievement schaltet nicht mehr frei, wenn der Score 100 erreicht.",
"dialog": null,
"code": "if (score {{1}} 100) {\n unlockAchievement();\n}",
"successText": "Bei 100 Punkten schaltet das Achievement wieder frei. Der Virus ist neutralisiert.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Operator", "hint": "Mindestens 100 – größer oder gleich.", "solutions": [">="] }
]
},
{
"difficulty": "junior",
"title": "Die Datenbank",
"language": "sql",
"narrative": "Die KI hat alle Datensätze durcheinandergebracht. Du brauchst nur die volljährigen Nutzer – die Filter-Klausel fehlt.",
"dialog": null,
"code": "SELECT * FROM users\n{{1}} age > 18;",
"successText": "Nur noch die passenden Datensätze erscheinen in der Liste.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Die SQL-Klausel zum Filtern von Zeilen.", "solutions": ["WHERE"] }
]
},
{
"difficulty": "junior",
"title": "Netzwerk",
"language": "bash",
"narrative": "Du musst einen Server wieder erreichbar machen. Ein Ping soll zeigen, ob der lokale Rechner überhaupt antwortet.",
"dialog": null,
"code": "ping {{1}}",
"successText": "Reply… reply… reply. Die Verbindung steht wieder.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "Host / IP", "hint": "Die Adresse des eigenen Rechners – als Name oder als IP.", "solutions": ["localhost", "192.168.0.1", "127.0.0.1"] }
]
},
{
"difficulty": "junior",
"title": "Der Dauerdienst",
"language": "java",
"narrative": "Ein Hintergrunddienst soll laufen, solange er aktiv ist. Das Schleifen-Schlüsselwort wurde gelöscht.",
"dialog": null,
"code": "{{1}} (running) {\n handleRequests();\n}",
"successText": "Der Dienst nimmt wieder Anfragen entgegen.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Kopfgesteuerte Schleife mit nur einer Bedingung.", "solutions": ["while"] }
]
},
{
"difficulty": "junior",
"title": "Was zurückkommt",
"language": "java",
"narrative": "Eine Methode soll die Summe zweier Zahlen liefern – doch das Ergebnis kommt nie beim Aufrufer an.",
"dialog": null,
"code": "int sum(int a, int b) {\n {{1}} a + b;\n}",
"successText": "Die Methode liefert endlich ihren Wert zurück.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Beendet die Methode und gibt einen Wert zurück.", "solutions": ["return"] }
]
},
{
"difficulty": "junior",
"title": "Die leere Liste",
"language": "java",
"narrative": "Eine Namensliste soll angelegt werden, aber die konkrete Implementierung der Liste fehlt.",
"dialog": null,
"code": "List<String> namen = new {{1}}<>();",
"successText": "Die Liste ist bereit, Namen aufzunehmen.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Klasse", "hint": "Die gängigste List-Implementierung (dynamisches Array).", "solutions": ["ArrayList"] }
]
},
{
"difficulty": "junior",
"title": "Ins Log-Verzeichnis",
"language": "bash",
"narrative": "Um den Fehler zu finden, musst du in das Verzeichnis mit den Logdateien wechseln.",
"dialog": null,
"code": "{{1}} /var/log",
"successText": "Du stehst jetzt mitten in den Logs.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Befehl", "hint": "\"change directory\" – Verzeichnis wechseln.", "solutions": ["cd"] }
]
},
{
"difficulty": "junior",
"title": "Sicher im Verlauf",
"language": "bash",
"narrative": "Deine Änderung ist fertig. Sichere sie mit einer Nachricht im Git-Verlauf.",
"dialog": null,
"code": "git {{1}} -m \"fix: login\"",
"successText": "Der Stand ist im Verlauf festgehalten.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Git-Befehl", "hint": "Schreibt die vorgemerkten Änderungen in die Historie.", "solutions": ["commit"] }
]
},
{
"difficulty": "junior",
"title": "Der tote Link",
"language": "html",
"narrative": "Auf der Kundenseite zeigt ein Link ins Leere – das Attribut für die Zieladresse fehlt.",
"dialog": null,
"code": "<a {{1}}=\"/home\">Start</a>",
"successText": "Der Link führt jetzt sauber zur Startseite.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "Attribut", "hint": "Attribut für die Zieladresse eines Links.", "solutions": ["href"] }
]
},
{
"difficulty": "junior",
"title": "Sortierte Ware",
"language": "sql",
"narrative": "Die Produktliste des Shops kommt wild durcheinander. Sie soll nach Preis absteigend sortiert werden.",
"dialog": null,
"code": "SELECT * FROM produkte\n{{1}} preis DESC;",
"successText": "Das teuerste Produkt steht jetzt oben.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Klausel", "hint": "Sortiert das Ergebnis (zwei Wörter).", "solutions": ["ORDER BY"] }
]
},
{
"difficulty": "junior",
"title": "Das stumme Skript",
"language": "python",
"narrative": "Im Wartungsskript des Kunden soll nach dem Backup eine Meldung erscheinen – der Ausgabebefehl fehlt.",
"dialog": null,
"code": "{{1}}(\"Backup fertig\")",
"successText": "\"Backup fertig\" erscheint im Terminal.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Funktion", "hint": "Pythons Standard-Ausgabefunktion.", "solutions": ["print"] }
]
},
{
"difficulty": "junior",
"title": "Der Türcode",
"language": "java",
"narrative": "Die Sicherheitstür soll nur öffnen, wenn der eingegebene PIN exakt stimmt – der Vergleich fehlt.",
"dialog": null,
"code": "if (pin {{1}} 1234) {\n openDoor();\n}",
"successText": "Bei richtigem PIN öffnet die Tür – und nur dann.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Operator", "hint": "Vergleich auf Gleichheit (nicht die Zuweisung).", "solutions": ["=="] }
]
},
{
"difficulty": "professional",
"title": "Die halbe Schleife",
"language": "java",
"narrative": "Ein Praktikant hat die Schleife halb fertig gelassen: Sowohl die Abbruchbedingung als auch der Zählschritt fehlen.",
"dialog": null,
"code": "for (int i = 0; i {{1}} 10; i{{2}}) {\n process(i);\n}",
"successText": "Die Schleife läuft sauber von 0 bis 9 durch.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Bedingung", "hint": "Solange i kleiner als 10 ist.", "solutions": ["<"] },
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Schritt", "hint": "i um eins erhöhen.", "solutions": ["++"] }
]
},
{
"difficulty": "professional",
"title": "Fehler abfangen",
"language": "java",
"narrative": "Ein Dateizugriff lässt das Programm abstürzen. Du sollst den Fehler abfangen, statt alles crashen zu lassen.",
"dialog": null,
"code": "{{1}} {\n readFile(\"daten.txt\");\n} {{2}} (IOException e) {\n log(e);\n}",
"successText": "Der Fehler wird sauber protokolliert – kein Absturz mehr.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Block", "hint": "Der Block, der den riskanten Code umschließt.", "solutions": ["try"] },
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Block", "hint": "Der Block, der die Exception auffängt.", "solutions": ["catch"] }
]
},
{
"difficulty": "professional",
"title": "Neuer Eintrag",
"language": "sql",
"narrative": "Ein neuer Nutzer soll angelegt werden, aber das INSERT-Statement ist an zwei Stellen unvollständig.",
"dialog": null,
"code": "{{1}} INTO users (name, age)\n{{2}} ('Alice', 28);",
"successText": "Alice ist jetzt in der Datenbank gespeichert.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Mit welchem Befehl fügt man eine Zeile ein?", "solutions": ["INSERT"] },
{ "position": 2, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Leitet die einzufügenden Werte ein.", "solutions": ["VALUES"] }
]
},
{
"difficulty": "professional",
"title": "Durch die Liste",
"language": "java",
"narrative": "Jeder Eintrag der Liste soll ausgegeben werden. In der erweiterten for-Schleife fehlen Trenner und Ausgabe.",
"dialog": null,
"code": "for (String s {{1}} liste) {\n System.out.{{2}}(s);\n}",
"successText": "Alle Einträge der Liste laufen über den Bildschirm.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Trenner", "hint": "Trennt in der for-each-Schleife Variable und Sammlung.", "solutions": [":"] },
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Methode", "hint": "Gibt eine Zeile mit Zeilenumbruch aus.", "solutions": ["println"] }
]
},
{
"difficulty": "professional",
"title": "Das Fließband",
"language": "java",
"narrative": "Eine Auto-Klasse braucht ihren Bauplan. Klassen-Schlüsselwort und der Verweis aufs eigene Objekt fehlen.",
"dialog": null,
"code": "public {{1}} Auto {\n String marke;\n Auto(String marke) {\n {{2}}.marke = marke;\n }\n}",
"successText": "Vom Fließband rollt das erste Auto-Objekt.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Leitet die Definition eines Bauplans ein.", "solutions": ["class"] },
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Referenz", "hint": "Verweis auf das aktuelle Objekt.", "solutions": ["this"] }
]
},
{
"difficulty": "professional",
"title": "Bestellungen verknüpfen",
"language": "sql",
"narrative": "Nutzer und ihre Bestellungen sollen zusammengeführt werden – die Verknüpfung und ihre Bedingung fehlen.",
"dialog": null,
"code": "SELECT * FROM users u\n{{1}} orders o {{2}} u.id = o.user_id;",
"successText": "Jede Bestellung steht jetzt neben ihrem Nutzer.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Verbindet zwei Tabellen.", "solutions": ["JOIN", "INNER JOIN"] },
{ "position": 2, "points": 100, "caseSensitive": false, "placeholder": "SQL-Keyword", "hint": "Leitet die Verknüpfungsbedingung ein.", "solutions": ["ON"] }
]
},
{
"difficulty": "professional",
"title": "Auf Fehlersuche",
"language": "bash",
"narrative": "Im riesigen Logfile sollst du nur die Fehlerzeilen sehen. Verbinde die Ausgabe mit dem Suchwerkzeug.",
"dialog": null,
"code": "cat app.log {{1}} {{2}} ERROR",
"successText": "Nur noch die ERROR-Zeilen rauschen über den Schirm.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Zeichen", "hint": "Leitet die Ausgabe an den nächsten Befehl weiter (Pipe).", "solutions": ["|"] },
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Befehl", "hint": "Filtert Zeilen nach einem Muster.", "solutions": ["grep"] }
]
},
{
"difficulty": "professional",
"title": "Ungültiges Alter",
"language": "java",
"narrative": "Ein negatives Alter darf nicht durchrutschen. Bedingung und das Auslösen der Ausnahme fehlen.",
"dialog": null,
"code": "{{1}} (alter < 0) {\n {{2}} new IllegalArgumentException(\"negativ\");\n}",
"successText": "Negative Werte werden jetzt sofort abgewiesen.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Prüft eine Bedingung.", "solutions": ["if"] },
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Schlüsselwort", "hint": "Wirft eine Exception aktiv aus.", "solutions": ["throw"] }
]
},
{
"difficulty": "professional",
"title": "Die Summe im Array",
"language": "java",
"narrative": "Alle Zahlen eines Arrays sollen aufsummiert werden. Die Längenabfrage und die Aufsummierung fehlen.",
"dialog": null,
"code": "int sum = 0;\nfor (int i = 0; i < zahlen.{{1}}; i++) {\n sum {{2}} zahlen[i];\n}",
"successText": "Die Summe steht – ohne ein einziges Element zu verpassen.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": true, "placeholder": "Eigenschaft", "hint": "Die Anzahl der Elemente eines Arrays.", "solutions": ["length"] },
{ "position": 2, "points": 100, "caseSensitive": true, "placeholder": "Operator", "hint": "sum um zahlen[i] erhöhen (Kurzform).", "solutions": ["+="] }
]
},
{
"difficulty": "professional",
"title": "Das Login-Formular",
"language": "html",
"narrative": "Das Anmeldeformular schickt nichts ab und zeigt das Passwort im Klartext. Versandart und Feldtyp fehlen.",
"dialog": null,
"code": "<form action=\"/login\" {{1}}=\"post\">\n <input {{2}}=\"password\">\n</form>",
"successText": "Das Formular sendet sicher per POST, das Passwort bleibt verdeckt.",
"gaps": [
{ "position": 1, "points": 100, "caseSensitive": false, "placeholder": "Attribut", "hint": "Legt die HTTP-Methode des Formulars fest.", "solutions": ["method"] },
{ "position": 2, "points": 100, "caseSensitive": false, "placeholder": "Attribut", "hint": "Bestimmt die Art des Eingabefeldes.", "solutions": ["type"] }
]
},
{
"difficulty": "senior",
"title": "Stille Konsole",
"language": "java",
"narrative": "Vom Logging-Modul ist nur noch eine halbe Zeile übrig. Rekonstruiere den kompletten Ausgabebefehl.",
"dialog": null,
"code": "{{1}}(\"Hallo\");",
"successText": "\"Hallo\" erscheint in der Konsole. Das Logging lebt wieder.",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Anweisung", "hint": "Der vollständige Standard-Ausgabebefehl in Java (Objektkette).", "solutions": ["System.out.println"] }
]
},
{
"difficulty": "senior",
"title": "Der Einstiegspunkt",
"language": "java",
"narrative": "Eine Schadroutine hat die komplette Signatur der Hauptmethode gelöscht – nur Klammern blieben übrig. Stell die ganze Zeile wieder her.",
"dialog": null,
"code": "public class App {\n {{1}} {\n run();\n }\n}",
"successText": "Die App findet ihren Einstiegspunkt wieder und startet.",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Signatur", "hint": "Sichtbarkeit, static, Rückgabetyp void, Name und String-Array-Parameter.", "solutions": ["public static void main(String[] args)", "static public void main(String[] args)", "public static void main(String args[])"] }
]
},
{
"difficulty": "senior",
"title": "Geburtstag in der DB",
"language": "sql",
"narrative": "Alice hat Geburtstag und ist jetzt 29. Schreibe die komplette UPDATE-Zeile, die ihr Alter setzt (ohne die WHERE-Bedingung).",
"dialog": null,
"code": "{{1}}\nWHERE name = 'Alice';",
"successText": "Alices Alter ist aktualisiert. Herzlichen Glückwunsch!",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": false, "placeholder": "ganze Zeile", "hint": "UPDATE <tabelle> SET <spalte> = <wert>", "solutions": ["UPDATE users SET age = 29"] }
]
},
{
"difficulty": "senior",
"title": "Der Bauplan des Roboters",
"language": "java",
"narrative": "Die Klassendeklaration des Roboters wurde gelöscht – nur der Rumpf blieb. Schreib die komplette öffentliche Klassenzeile (Klasse: Roboter).",
"dialog": null,
"code": "{{1}} {\n // Roboter-Logik\n}",
"successText": "Der Roboter hat wieder einen Bauplan und kann gebaut werden.",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Zeile", "hint": "Sichtbarkeit + Schlüsselwort + Name der Klasse.", "solutions": ["public class Roboter"] }
]
},
{
"difficulty": "senior",
"title": "Eingabe von vorn",
"language": "java",
"narrative": "Die komplette Initialisierung der Tastatureingabe wurde gelöscht. Stell die ganze Zeile wieder her (Variable: sc).",
"dialog": null,
"code": "{{1}};",
"successText": "Die Tastatureingabe ist wieder bereit.",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Zeile", "hint": "Deklaration + Zuweisung eines neuen Scanners auf System.in.", "solutions": ["Scanner sc = new Scanner(System.in)"] }
]
},
{
"difficulty": "senior",
"title": "Jede Zahl zählt",
"language": "java",
"narrative": "Die erweiterte for-Schleife über das Array 'zahlen' fehlt komplett. Rekonstruiere sie (Variable n, Typ int).",
"dialog": null,
"code": "{{1}} {\n summe += n;\n}",
"successText": "Jede Zahl des Arrays fließt in die Summe ein.",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Zeile", "hint": "for ( <Typ> <Variable> : <Array> )", "solutions": ["for (int n : zahlen)", "for(int n : zahlen)"] }
]
},
{
"difficulty": "senior",
"title": "Alte Logs entsorgen",
"language": "sql",
"narrative": "Uralte Logeinträge sollen gelöscht werden. Schreibe die komplette DELETE-Zeile (Tabelle: logs), die WHERE-Bedingung steht schon.",
"dialog": null,
"code": "{{1}}\nWHERE created < '2020-01-01';",
"successText": "Die alten Logs sind Geschichte – die Platte atmet auf.",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": false, "placeholder": "ganze Zeile", "hint": "DELETE FROM <tabelle>", "solutions": ["DELETE FROM logs"] }
]
},
{
"difficulty": "senior",
"title": "Die Methode zurückbauen",
"language": "java",
"narrative": "Von einer Additions-Methode ist nur der Rumpf übrig. Schreibe die komplette Signatur (public, gibt int zurück, heißt add, nimmt int a und int b).",
"dialog": null,
"code": "{{1}} {\n return a + b;\n}",
"successText": "Die Methode add ist wiederhergestellt und liefert die Summe.",
"gaps": [
{ "position": 1, "points": 200, "caseSensitive": true, "placeholder": "ganze Signatur", "hint": "<Sichtbarkeit> <Rückgabetyp> <Name>(<Parameter>)", "solutions": ["public int add(int a, int b)", "public int add(int a,int b)"] }
]
}
]
}