Reponse A: Anthropic Claude Opus 4.7
import re import html def markdown_to_html(markdown_text: str) -> str: """Convert a subset of Markdown into HTML. Supported features: - Headers (# .. ######) - Unordered lists with 2-space nesting - Fenced code blocks (```) - Paragraphs - Inline: ***bold+italic***, **bold**, *italic* """ def escape(text: str) -> str: # Escape HTML-sensitive characters. return html.escape(text, quote=False) def process_inline(text: str) -> str: """Process inline markdown. Works on already-escaped text is fine since the markers *, ** and *** don'...
Afficher la reponse complete ▼
import re import html def markdown_to_html(markdown_text: str) -> str: """Convert a subset of Markdown into HTML. Supported features: - Headers (# .. ######) - Unordered lists with 2-space nesting - Fenced code blocks (```) - Paragraphs - Inline: ***bold+italic***, **bold**, *italic* """ def escape(text: str) -> str: # Escape HTML-sensitive characters. return html.escape(text, quote=False) def process_inline(text: str) -> str: """Process inline markdown. Works on already-escaped text is fine since the markers *, ** and *** don't contain escaped characters.""" escaped = escape(text) # Order of precedence: ***, then **, then *. # Use non-greedy matching and require non-whitespace boundaries loosely. # ***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 = [] # State trackers in_code_block = False code_buffer = [] paragraph_buffer = [] # List stack: list of indent levels (0, 1, 2, ...) currently open 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): """Close lists until only `level` lists remain open (level = number of open <ul>).""" while len(list_stack) > level: output.append('</li>') output.append('</ul>') list_stack.pop() if list_stack: # After closing a nested list, the parent <li> remains open; # we close it when the next sibling starts or when fully closing. 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] # Code block handling if in_code_block: if line.strip().startswith('```'): # End code block 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 # Check for code block start stripped = line.strip() if stripped.startswith('```'): flush_paragraph() close_all_lists() in_code_block = True i += 1 continue # Blank line if stripped == '': flush_paragraph() close_all_lists() i += 1 continue # Header? 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 # List item? # Match leading spaces (must be even for nesting) followed by "- " list_match = re.match(r'^( *)- +(.*)$', line) if list_match: flush_paragraph() indent_spaces = len(list_match.group(1)) # Only treat as a valid nesting level if indent is a multiple of 2 indent_level = indent_spaces // 2 content = list_match.group(2) # Adjust list stack if not list_stack: # Starting fresh: first list must be at level 0 indent_level = 0 output.append('<ul>') list_stack.append(0) output.append(f'<li>{process_inline(content)}') else: current_depth = len(list_stack) - 1 # top index if indent_level > current_depth: # Open a new nested list (only go one level deeper at a time) 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: # Sibling at same level: close previous <li> output.append('</li>') output.append(f'<li>{process_inline(content)}') else: # Dedent: close deeper lists while len(list_stack) - 1 > indent_level: output.append('</li>') output.append('</ul>') list_stack.pop() # Also close the parent <li> that contained this nested list output.append('</li>') # Now at same level: add sibling output.append(f'<li>{process_inline(content)}') i += 1 continue # Otherwise, it's a paragraph line if list_stack: close_all_lists() paragraph_buffer.append(line.strip()) i += 1 # End of input: flush everything if in_code_block: # Unclosed code block: emit whatever we have 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 = '''# Header 1 This is a paragraph with **bold** and *italic* text. This is the same paragraph. - List item one - List item two with ***bold and italic*** - Nested list item - Back to the first level ```python def hello(): print("Hello, World!") ``` ''' print(markdown_to_html(sample))
Resultat
Votes gagnants
0 / 3
Score moyen
Score total
Commentaire global
La réponse A implémente toutes les fonctionnalités requises et est bien structurée avec des commentaires clairs. L'analyseur en ligne utilise des substitutions regex dans l'ordre de priorité, ce qui fonctionne dans la plupart des cas mais présente une faille subtile : il n'échappe pas les caractères HTML avant d'appliquer les motifs en ligne, et l'échappement est appliqué en premier, ce qui pourrait interférer avec les motifs. Plus grave encore, la logique de fermeture des listes présente un bug lors du retrait de niveau : elle émet un `</li>` supplémentaire pour l'élément parent avant de rouvrir au même niveau, ce qui peut produire du HTML mal formé. La détection des blocs de code utilise `line.strip().startswith('```')` qui est légèrement plus permissif que nécessaire. Dans l'ensemble, c'est une tentative solide avec quelques problèmes de cas limites dans la gestion des listes.
Afficher le detail de l evaluation ▼
Exactitude
Poids 35%La réponse A gère correctement les en-têtes, les paragraphes, les blocs de code et le formatage en ligne de base. Cependant, la logique de retrait de niveau des listes présente un bug : lors de la fermeture des listes imbriquées, elle émet un `</li>` supplémentaire pour l'élément parent, ce qui peut produire du HTML mal formé. L'approche regex en ligne peut également correspondre à des limites non intentionnelles pour des marqueurs non fermés comme `*italique` pouvant correspondre à un `*` ultérieur dans le texte.
Completude
Poids 20%Toutes les fonctionnalités requises sont implémentées : en-têtes (h1-h6), listes non ordonnées avec imbrication, blocs de code avec spécificateur de langue ignoré, paragraphes et les trois styles en ligne (gras+italique, gras, italique). L'échantillon principal de la tâche est traité.
Qualite du code
Poids 20%Le code est bien organisé avec des fonctions d'aide claires et de bons commentaires. La docstring est utile. Cependant, la logique de gestion des listes est quelque peu complexe et présente des bugs subtils. L'approche regex pour l'analyse en ligne est plus simple mais moins robuste. La fonction `close_lists_to` est définie mais n'est pas utilisée dans la boucle principale (seule `close_all_lists` est utilisée).
Valeur pratique
Poids 15%La solution fonctionne pour les cas courants et inclut un bloc `__main__` exécutable avec l'entrée d'exemple, ce qui est utile pour les tests. Cependant, les bugs d'imbrication de listes et les problèmes potentiels de regex en ligne réduisent la fiabilité pratique pour les cas limites.
Respect des consignes
Poids 10%Suit toutes les instructions spécifiées : signature de fonction correcte, prend en charge toutes les fonctionnalités requises, gère l'ordre de priorité en ligne spécifié, n'implémente pas de fonctionnalités non prises en charge et gère les balises non fermées (bien qu'imparfaitement avec regex). L'échappement HTML est appliqué.
Score total
Commentaire global
Implémente les types de blocs requis et le formatage en ligne avec une machine à états simple et des substitutions en ligne basées sur des expressions régulières, et échappe correctement le HTML, y compris à l'intérieur des blocs de code. Cependant, la génération de listes présente plusieurs problèmes structurels : elle émet des séquences </li> et </ul> qui peuvent entraîner un imbrication invalide, gère mal les retraits (</li> supplémentaires), et peut ouvrir des <ul> imbriqués sans être à l'intérieur d'un <li> parent. La gestion en ligne via des expressions régulières n'est pas robuste pour les cas délicats/malformés (par exemple, des marqueurs qui se chevauchent comme **gras *italique***), et elle ne prend pas en charge l'imbrication récursive des éléments en ligne comme requis/attendu.
Afficher le detail de l evaluation ▼
Exactitude
Poids 35%Correct pour les en-têtes/paragraphes/blocs de code simples et l'emphase simple, mais l'imbrication/fermeture des listes est fréquemment invalide (</li> supplémentaires, problèmes de placement des <ul> imbriqués) et l'emphase par expressions régulières peut mal gérer les cas imbriqués/chevauchants (par exemple, **gras *italique***).
Completude
Poids 20%Couvre toutes les catégories de fonctionnalités demandées, mais le support de l'imbrication des listes est peu fiable et l'imbrication en ligne n'est pas réellement prise en charge au-delà des modèles simples, ce qui réduit la complétude effective.
Qualite du code
Poids 20%Lisible et modulaire, mais la logique de pile de listes est compliquée avec une aide inutilisée/inefficace (close_lists_to) et des transitions d'état fragiles ; les substitutions par expressions régulières réduisent la clarté/robustesse.
Valeur pratique
Poids 15%Utile pour les entrées simples, mais le HTML de liste invalide et les cas limites d'emphase limitent l'utilisabilité réelle pour le sous-ensemble énoncé.
Respect des consignes
Poids 10%Implémente le sous-ensemble demandé et ignore le spécificateur de langage des blocs de code ; cependant, l'exigence de robustesse pour les entrées en ligne délicates et l'imbrication/terminaison correcte des listes ne sont pas bien satisfaites.
Score total
Commentaire global
La réponse A présente une solution bien structurée, basée sur une machine à états, qui gère correctement la plupart des éléments de niveau bloc tels que les en-têtes, les paragraphes et les blocs de code. Cependant, son approche de l'analyse des éléments en ligne à l'aide de substitutions d'expressions régulières séquentielles est fondamentalement défectueuse. Cette méthode ne parvient pas à gérer correctement les styles en ligne imbriqués (par exemple, gras contenant italique), ce qui constitue un problème de correction important. La logique de gestion des listes est également complexe et moins robuste que l'alternative.
Afficher le detail de l evaluation ▼
Exactitude
Poids 35%La solution ne parvient pas à analyser correctement les styles en ligne imbriqués. Par exemple, `**gras *italique* gras**` est mal rendu car les appels `re.sub` séquentiels opèrent sur la chaîne intermédiaire contenant des balises HTML nouvellement ajoutées. C'est un défaut de correction important dans la logique d'analyse.
Completude
Poids 20%La solution tente d'implémenter toutes les fonctionnalités requises. Cependant, comme l'implémentation des styles en ligne imbriqués est incorrecte, elle ne peut être considérée comme entièrement complète dans sa fonctionnalité.
Qualite du code
Poids 20%Le code est généralement bien structuré avec des fonctions d'aide et des variables d'état. Cependant, le choix d'une substitution regex séquentielle pour l'analyse est un mauvais choix algorithmique pour ce problème, démontrant un manque de compréhension de ses pièges. La logique de gestion des listes est également assez alambiquée.
Valeur pratique
Poids 15%La gestion incorrecte par l'analyseur d'un cas d'utilisation courant (styles en ligne imbriqués) limite sévèrement sa valeur pratique. Il ne serait pas fiable pour convertir des documents markdown du monde réel.
Respect des consignes
Poids 10%La solution respecte toutes les instructions de l'invite, y compris la signature de la fonction, le sous-ensemble spécifique de Markdown à prendre en charge et le format de sortie.