Antwort A: Anthropic Claude Opus 4.7
import re import html def markdown_to_html(markdown_text: str) -> str: """Konvertiert eine Teilmenge von Markdown in HTML. Unterstützte Funktionen: - Überschriften (# .. ######) - Ungeordnete Listen mit 2-Leerzeichen-Einrückung - Eingefasste Codeblöcke (```) - Absätze - Inline: ***fett+kursiv***, **fett**, *kursiv* """ def escape(text: str) -> str: # HTML-sensible Zeichen escapen. return html.escape(text, quote=False) def process_inline(text: str) -> str: """Verarbeitet Inline-Markdown. Funktioniert auch mit bereits escapedem Text, da...
Vollstandige Antwort anzeigen ▼
import re import html def markdown_to_html(markdown_text: str) -> str: """Konvertiert eine Teilmenge von Markdown in HTML. Unterstützte Funktionen: - Überschriften (# .. ######) - Ungeordnete Listen mit 2-Leerzeichen-Einrückung - Eingefasste Codeblöcke (```) - Absätze - Inline: ***fett+kursiv***, **fett**, *kursiv* """ def escape(text: str) -> str: # HTML-sensible Zeichen escapen. return html.escape(text, quote=False) def process_inline(text: str) -> str: """Verarbeitet Inline-Markdown. Funktioniert auch mit bereits escapedem Text, da die Marker *, ** und *** keine escapeden Zeichen enthalten. """ escaped = escape(text) # Reihenfolge der Priorität: ***, dann **, dann *. # Nicht-gierige Übereinstimmung verwenden und lose Nicht-Leerzeichen-Grenzen erfordern. # ***text*** escaped = re.sub( r'\*\*\*(.+?)\*\*\*', r'<strong><em>\1</em></strong>', escaped, ) # **text** escaped = re.sub( r'\*\*(.+?)\*\*', r'<strong>\1</strong>', escaped, ) # *text* escaped = re.sub( r'\*(.+?)\*', r'<em>\1</em>', escaped, ) return escaped lines = markdown_text.split('\n') output = [] # Zustandsvariablen in_code_block = False code_buffer = [] paragraph_buffer = [] # Listen-Stack: Liste der aktuell offenen Einrückungsebenen (0, 1, 2, ...) list_stack = [] def flush_paragraph(): if paragraph_buffer: content = ' '.join(paragraph_buffer) output.append(f'<p>{process_inline(content)}</p>') paragraph_buffer.clear() def close_lists_to(level): """Schließt Listen, bis nur noch `level` Listen offen sind (level = Anzahl der offenen <ul>).""" while len(list_stack) > level: output.append('</li>') output.append('</ul>') list_stack.pop() if list_stack: # Nach dem Schließen einer verschachtelten Liste bleibt das übergeordnete <li> offen; # es wird geschlossen, wenn der nächste Geschwister beginnt oder wenn es vollständig geschlossen wird. pass def close_all_lists(): while list_stack: output.append('</li>') output.append('</ul>') list_stack.pop() i = 0 while i < len(lines): line = lines[i] # Codeblock-Verarbeitung if in_code_block: if line.strip().startswith('```'): # Codeblock beenden code_content = '\n'.join(code_buffer) output.append(f'<pre><code>{escape(code_content)}</code></pre>') code_buffer = [] in_code_block = False else: code_buffer.append(line) i += 1 continue # Prüfung auf Codeblock-Start stripped = line.strip() if stripped.startswith('```'): flush_paragraph() close_all_lists() in_code_block = True i += 1 continue # Leerzeile if stripped == '': flush_paragraph() close_all_lists() i += 1 continue # Überschrift? header_match = re.match(r'^(#{1,6}) +(.*)$', line) if header_match: flush_paragraph() close_all_lists() level = len(header_match.group(1)) content = header_match.group(2).rstrip() output.append(f'<h{level}>{process_inline(content)}</h{level}>') i += 1 continue # Listenpunkt? # Führende Leerzeichen abgleichen (müssen gerade sein für Verschachtelung) gefolgt von "- " list_match = re.match(r'^( *)- +(.*)$', line) if list_match: flush_paragraph() indent_spaces = len(list_match.group(1)) # Nur als gültige Einrückungsebene behandeln, wenn die Einrückung ein Vielfaches von 2 ist indent_level = indent_spaces // 2 content = list_match.group(2) # Listen-Stack anpassen if not list_stack: # Frisch beginnen: Die erste Liste muss auf Ebene 0 sein indent_level = 0 output.append('<ul>') list_stack.append(0) output.append(f'<li>{process_inline(content)}') else: current_depth = len(list_stack) - 1 # oberster Index if indent_level > current_depth: # Eine neue verschachtelte Liste öffnen (nur eine Ebene tiefer pro Schritt) indent_level = current_depth + 1 output.append('<ul>') list_stack.append(indent_level) output.append(f'<li>{process_inline(content)}') elif indent_level == current_depth: # Geschwister auf derselben Ebene: vorheriges <li> schließen output.append('</li>') output.append(f'<li>{process_inline(content)}') else: # Einrücken reduzieren: tiefere Listen schließen while len(list_stack) - 1 > indent_level: output.append('</li>') output.append('</ul>') list_stack.pop() # Auch das übergeordnete <li> schließen, das diese verschachtelte Liste enthielt output.append('</li>') # Jetzt auf derselben Ebene: Geschwister hinzufügen output.append(f'<li>{process_inline(content)}') i += 1 continue # Andernfalls ist es eine Absatzzeile if list_stack: close_all_lists() paragraph_buffer.append(line.strip()) i += 1 # Ende der Eingabe: alles leeren if in_code_block: # Nicht geschlossener Codeblock: alles ausgeben, was wir haben code_content = '\n'.join(code_buffer) output.append(f'<pre><code>{escape(code_content)}</code></pre>') flush_paragraph() close_all_lists() return '\n'.join(output) if __name__ == '__main__': sample = '''# Überschrift 1 Dies ist ein Absatz mit **fettem** und *kursivem* Text. Dies ist derselbe Absatz. - Listenpunkt eins - Listenpunkt zwei mit ***fett und kursiv*** - Verschachtelter Listenpunkt - Zurück zur ersten Ebene ```python def hallo(): print("Hallo, Welt!") ``` ''' print(markdown_to_html(sample))
Ergebnis
Siegstimmen
0 / 3
Durchschnittsscore
Gesamtpunktzahl
Gesamtkommentar
Antwort A implementiert alle erforderlichen Funktionen und ist gut strukturiert mit klaren Kommentaren. Der Inline-Parser verwendet Regex-Ersetzungen in der Reihenfolge der Priorität, was für die meisten Fälle funktioniert, aber einen subtilen Fehler aufweist: Er maskiert keine HTML-Zeichen, bevor Inline-Muster angewendet werden, und die Maskierung wird zuerst angewendet, was Muster beeinträchtigen könnte. Kritischer ist, dass die Logik zum Schließen von Listen einen Fehler beim Einrücken aufweist: Sie gibt ein zusätzliches `</li>` für das übergeordnete Element aus, bevor sie auf derselben Ebene wieder geöffnet wird, was zu fehlerhaftem HTML führen kann. Die Erkennung von Codeblöcken verwendet `line.strip().startswith('```')`, was etwas nachgiebiger ist als nötig. Insgesamt ist es ein solider Versuch mit einigen Randfallproblemen bei der Listenbehandlung.
Bewertungsdetails anzeigen ▼
Korrektheit
Gewichtung 35%Antwort A behandelt Überschriften, Absätze, Codeblöcke und grundlegende Inline-Formatierungen korrekt. Die Logik zum Einrücken von Listen weist jedoch einen Fehler auf: Beim Schließen verschachtelter Listen gibt sie ein zusätzliches `</li>` für das übergeordnete Element aus, was zu fehlerhaftem HTML führen kann. Der Inline-Regex-Ansatz kann auch über unbeabsichtigte Grenzen für nicht geschlossene Marker wie `*kursiv` hinausgehen und potenziell mit einem späteren `*` im Text übereinstimmen.
Vollstandigkeit
Gewichtung 20%Alle erforderlichen Funktionen sind implementiert: Überschriften (h1-h6), ungeordnete Listen mit Verschachtelung, Codeblöcke mit ignoriertem Sprachspezifizierer, Absätze und alle drei Inline-Stile (fett+kursiv, fett, kursiv). Die Hauptprobe aus der Aufgabe wird behandelt.
Codequalitat
Gewichtung 20%Der Code ist gut organisiert mit klaren Hilfsfunktionen und guten Kommentaren. Die Docstring ist hilfreich. Die Logik zur Listenverwaltung ist jedoch etwas komplex und weist subtile Fehler auf. Der Regex-Ansatz für die Inline-Analyse ist einfacher, aber weniger robust. Die Funktion `close_lists_to` ist definiert, wird aber in der Hauptschleife nicht verwendet (nur `close_all_lists` wird verwendet).
Praktischer Nutzen
Gewichtung 15%Die Lösung funktioniert für gängige Fälle und enthält einen ausführbaren `__main__`-Block mit den Beispiel-Eingaben, was für Tests hilfreich ist. Die Fehler bei der Listenverschachtelung und die potenziellen Inline-Regex-Probleme reduzieren jedoch die praktische Zuverlässigkeit für Randfälle.
Befolgung der Anweisungen
Gewichtung 10%Folgt allen angegebenen Anweisungen: korrekte Funktionssignatur, unterstützt alle erforderlichen Funktionen, behandelt die angegebene Reihenfolge der Inline-Priorität, implementiert keine nicht unterstützten Funktionen und behandelt nicht geschlossene Tags (wenn auch unvollkommen mit Regex). HTML-Maskierung wird angewendet.
Gesamtpunktzahl
Gesamtkommentar
Implementiert die erforderlichen Blocktypen und Inline-Formatierungen mit einer einfachen Zustandsmaschine und Regex-basierten Inline-Ersetzungen und maskiert HTML korrekt, auch innerhalb von Codeblöcken. Die Listen-Generierung weist jedoch mehrere strukturelle Probleme auf: Sie gibt </li>- und </ul>-Sequenzen aus, die zu ungültigen Verschachtelungen führen können, behandelt Einrückungen falsch (zusätzliche </li>) und kann verschachtelte <ul> öffnen, ohne sich innerhalb eines übergeordneten <li> zu befinden. Die Inline-Verarbeitung mittels Regex ist nicht robust für knifflige/fehlerhafte Fälle (z. B. überlappende Marker wie **fett *kursiv***) und unterstützt keine rekursive Verschachtelung von Inline-Elementen, wie es erforderlich/erwartet wird.
Bewertungsdetails anzeigen ▼
Korrektheit
Gewichtung 35%Korrekt für einfache Überschriften/Absätze/Codeblöcke und einfache Hervorhebungen, aber Listenverschachtelung/-schluss ist häufig ungültig (zusätzliche </li>, Probleme bei der Platzierung von verschachtelten <ul>) und Regex-Hervorhebungen können überlappende/verschachtelte Fälle falsch behandeln (z. B. **fett *kursiv***).
Vollstandigkeit
Gewichtung 20%Deckt alle angeforderten Feature-Kategorien ab, aber die Unterstützung für Listenverschachtelung ist unzuverlässig und die Inline-Verschachtelung wird über einfache Muster hinaus nicht wirklich unterstützt, was die effektive Vollständigkeit verringert.
Codequalitat
Gewichtung 20%Lesbar und modular, aber die Listen-Stack-Logik ist kompliziert mit einem ungenutzten/ineffektiven Helfer (close_lists_to) und fragilen Zustandsübergängen; starke Regex-Ersetzungen verringern Klarheit/Robustheit.
Praktischer Nutzen
Gewichtung 15%Nützlich für einfache Eingaben, aber ungültiges Listen-HTML und Hervorhebungs-Randfälle schränken die reale Nutzbarkeit für den angegebenen Teil ein.
Befolgung der Anweisungen
Gewichtung 10%Implementiert den angeforderten Teil und ignoriert den Sprachspezifizierer für Codeblöcke; die Anforderung an die Robustheit für knifflige Inline-Eingaben und die korrekte Listenverschachtelung/-terminierung wird jedoch nicht gut erfüllt.
Gesamtpunktzahl
Gesamtkommentar
Antwort A präsentiert eine gut strukturierte, zustandsautomatenbasierte Lösung, die die meisten Blockelemente wie Überschriften, Absätze und Codeblöcke korrekt verarbeitet. Sein Ansatz zur Analyse von Inline-Elementen mittels sequenzieller regulärer Ausdruckssubstitutionen ist jedoch grundlegend fehlerhaft. Diese Methode behandelt verschachtelte Inline-Stile (z. B. Fett, das Kursiv enthält) nicht korrekt, was ein erhebliches Korrektheitsproblem darstellt. Die Listenlogik ist ebenfalls komplex und weniger robust als die Alternative.
Bewertungsdetails anzeigen ▼
Korrektheit
Gewichtung 35%Die Lösung analysiert verschachtelte Inline-Stile nicht korrekt. Zum Beispiel wird `**fett *kursiv* fett**` falsch gerendert, da die sequenziellen `re.sub`-Aufrufe auf der Zwischenzeichenfolge mit neu hinzugefügten HTML-Tags operieren. Dies ist ein erheblicher Korrektheitsfehler in der Parsing-Logik.
Vollstandigkeit
Gewichtung 20%Die Lösung versucht, alle erforderlichen Funktionen zu implementieren. Da die Implementierung verschachtelter Inline-Stile jedoch fehlerhaft ist, kann sie funktional nicht als vollständig betrachtet werden.
Codequalitat
Gewichtung 20%Der Code ist im Allgemeinen gut strukturiert mit Hilfsfunktionen und Zustandsvariablen. Die Wahl einer sequenziellen Regex-Substitution für die Analyse ist jedoch eine schlechte algorithmische Wahl für dieses Problem und zeigt ein mangelndes Verständnis seiner Fallstricke. Die Listenlogik ist ebenfalls ziemlich verschlungen.
Praktischer Nutzen
Gewichtung 15%Die fehlerhafte Behandlung eines gängigen Anwendungsfalls (verschachtelte Inline-Stile) durch den Parser schränkt seinen praktischen Wert stark ein. Er wäre nicht zuverlässig für die Konvertierung von Markdown-Dokumenten aus der realen Welt.
Befolgung der Anweisungen
Gewichtung 10%Die Lösung hält sich an alle Anweisungen in der Eingabeaufforderung, einschließlich der Funktionssignatur, des zu unterstützenden spezifischen Markdown-Teils und des Ausgabeformats.