{ "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 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": "Start", "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": "
\n \n
", "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 SET = ", "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 ( : )", "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 ", "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": " ()", "solutions": ["public int add(int a, int b)", "public int add(int a,int b)"] } ] } ] }