Respuesta 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'...
Mostrar respuesta completa ▼
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))
Resultado
Votos ganadores
0 / 3
Puntuacion media
Puntuacion total
Comentario general
La respuesta A implementa todas las características requeridas y está bien estructurada con comentarios claros. El analizador en línea utiliza sustituciones de expresiones regulares en orden de precedencia, lo que funciona para la mayoría de los casos pero tiene un defecto sutil: no escapa los caracteres HTML antes de aplicar los patrones en línea, y el escape se aplica primero, lo que podría interferir con los patrones. Más críticamente, la lógica de cierre de listas tiene un error al retroceder (dedent): emite un `</li>` adicional para el elemento padre antes de reabrir en el mismo nivel, lo que puede producir HTML malformado. La detección de bloques de código utiliza `line.strip().startswith('```')`, que es un poco más permisivo de lo necesario. En general, es un intento sólido con algunos problemas en casos de borde en el manejo de listas.
Ver detalle de evaluacion ▼
Correccion
Peso 35%La respuesta A maneja correctamente encabezados, párrafos, bloques de código y formato en línea básico. Sin embargo, la lógica de retroceso de listas tiene un error: al cerrar listas anidadas, emite un `</li>` adicional para el elemento padre, lo que puede producir HTML malformado. El enfoque de expresiones regulares en línea también puede coincidir en límites no deseados para marcadores no cerrados como `*cursiva`, que potencialmente coinciden con un `*` posterior en el texto.
Integridad
Peso 20%Se implementan todas las características requeridas: encabezados (h1-h6), listas desordenadas con anidamiento, bloques de código con especificador de idioma ignorado, párrafos y los tres estilos en línea (negrita+cursiva, negrita, cursiva). Se maneja la muestra principal de la tarea.
Calidad del codigo
Peso 20%El código está bien organizado con funciones auxiliares claras y buenos comentarios. La cadena de documentación es útil. Sin embargo, la lógica de gestión de listas es algo compleja y tiene errores sutiles. El enfoque de expresiones regulares para el análisis en línea es más simple pero menos robusto. La función `close_lists_to` está definida pero no se utiliza en el bucle principal (solo se utiliza `close_all_lists`).
Valor practico
Peso 15%La solución funciona para casos comunes e incluye un bloque `__main__` ejecutable con la entrada de muestra, lo que es útil para probar. Sin embargo, los errores de anidamiento de listas y los posibles problemas de expresiones regulares en línea reducen la fiabilidad práctica para casos de borde.
Seguimiento de instrucciones
Peso 10%Sigue todas las instrucciones especificadas: firma de función correcta, admite todas las características requeridas, maneja el orden de precedencia en línea especificado, no implementa características no admitidas y maneja etiquetas no cerradas (aunque imperfectamente con expresiones regulares). Se aplica el escape HTML.
Puntuacion total
Comentario general
Implementa los tipos de bloque y el formato en línea requeridos con una máquina de estados simple y sustituciones en línea basadas en expresiones regulares, y escapa correctamente HTML, incluso dentro de bloques de código. Sin embargo, la generación de listas tiene múltiples problemas estructurales: emite secuencias de </li> y </ul> que pueden llevar a anidaciones inválidas, maneja mal las sangrías (</li> adicionales) y puede abrir <ul> anidados sin estar dentro de un <li> padre. El manejo en línea a través de expresiones regulares no es robusto para casos complicados/malformados (por ejemplo, marcadores superpuestos como **negrita *cursiva***), y no admite anidación recursiva de elementos en línea como se requiere/espera.
Ver detalle de evaluacion ▼
Correccion
Peso 35%Correcto para encabezados/párrafos/bloques de código básicos y énfasis simple, pero la anidación/cierre de listas es frecuentemente inválida (</li> adicionales, problemas de ubicación de <ul> anidados) y el énfasis con expresiones regulares puede manejar mal casos superpuestos/anidados (por ejemplo, **negrita *cursiva***).
Integridad
Peso 20%Cubre todas las categorías de características solicitadas, pero el soporte de anidación de listas no es confiable y la anidación en línea no se admite realmente más allá de patrones simples, lo que reduce la completitud efectiva.
Calidad del codigo
Peso 20%Legible y modular, pero la lógica de la pila de listas es complicada con una función auxiliar (close_lists_to) no utilizada/ineficaz y transiciones de estado frágiles; las sustituciones intensivas con expresiones regulares reducen la claridad/robustez.
Valor practico
Peso 15%Útil para entradas simples, pero el HTML de lista inválido y los casos extremos de énfasis limitan la usabilidad en el mundo real para el subconjunto indicado.
Seguimiento de instrucciones
Peso 10%Implementa el subconjunto solicitado e ignora el especificador de idioma del bloque de código; sin embargo, el requisito de robustez para entradas en línea complicadas y la anidación/terminación correcta de listas no se cumplen bien.
Puntuacion total
Comentario general
La respuesta A presenta una solución bien estructurada basada en máquinas de estado que maneja correctamente la mayoría de los elementos de bloque como encabezados, párrafos y bloques de código. Sin embargo, su enfoque para analizar elementos en línea mediante sustituciones secuenciales de expresiones regulares es fundamentalmente defectuoso. Este método no maneja correctamente los estilos en línea anidados (por ejemplo, negrita que contiene cursiva), lo que representa un problema significativo de corrección. La lógica de manejo de listas también es compleja y menos robusta que la alternativa.
Ver detalle de evaluacion ▼
Correccion
Peso 35%La solución no analiza correctamente los estilos en línea anidados. Por ejemplo, `**negrita *cursiva* negrita**` se representa incorrectamente porque las llamadas secuenciales `re.sub` operan sobre la cadena intermedia que contiene etiquetas HTML recién agregadas. Esta es una falla de corrección significativa en la lógica de análisis.
Integridad
Peso 20%La solución intenta implementar todas las características requeridas. Sin embargo, dado que la implementación de estilos en línea anidados es incorrecta, no se puede considerar completamente completa en su funcionalidad.
Calidad del codigo
Peso 20%El código está generalmente bien estructurado con funciones auxiliares y variables de estado. Sin embargo, la elección de una sustitución secuencial de regex para el análisis es una mala elección algorítmica para este problema, lo que demuestra una falta de comprensión de sus peligros. La lógica de manejo de listas también es bastante complicada.
Valor practico
Peso 15%El manejo incorrecto del analizador de un caso de uso común (estilos en línea anidados) limita severamente su valor práctico. No sería confiable para convertir documentos de markdown del mundo real.
Seguimiento de instrucciones
Peso 10%La solución se adhiere a todas las instrucciones del prompt, incluida la firma de la función, el subconjunto específico de Markdown a soportar y el formato de salida.