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
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.