Resposta A: Anthropic Claude Opus 4.7
import re import html def markdown_to_html(markdown_text: str) -> str: """Converte um subconjunto de Markdown para HTML. Recursos suportados: - Cabeçalhos (# .. ######) - Listas não ordenadas com aninhamento de 2 espaços - Blocos de código delimitados (```) - Parágrafos - Inline: ***negrito+itálico***, **negrito**, *itálico* """ def escape(text: str) -> str: # Escapa caracteres sensíveis a HTML. return html.escape(text, quote=False) def process_inline(text: str) -> str: """Processa markdown inline. Funciona em texto já escapado, pois...
Mostrar resposta completa ▼
import re import html def markdown_to_html(markdown_text: str) -> str: """Converte um subconjunto de Markdown para HTML. Recursos suportados: - Cabeçalhos (# .. ######) - Listas não ordenadas com aninhamento de 2 espaços - Blocos de código delimitados (```) - Parágrafos - Inline: ***negrito+itálico***, **negrito**, *itálico* """ def escape(text: str) -> str: # Escapa caracteres sensíveis a HTML. return html.escape(text, quote=False) def process_inline(text: str) -> str: """Processa markdown inline. Funciona em texto já escapado, pois os marcadores *, ** e *** não contêm caracteres escapados.""" escaped = escape(text) # Ordem de precedência: ***, depois **, depois *. # Usa correspondência não gulosa e exige limites de não espaço em branco de forma flexível. # ***texto*** escaped = re.sub( r'\*\*\*(.+?)\*\*\*', r'<strong><em>\1</em></strong>', escaped, ) # **texto** escaped = re.sub( r'\*\*(.+?)\*\*', r'<strong>\1</strong>', escaped, ) # *texto* escaped = re.sub( r'\*(.+?)\*', r'<em>\1</em>', escaped, ) return escaped lines = markdown_text.split('\n') output = [] # Rastreadores de estado in_code_block = False code_buffer = [] paragraph_buffer = [] # Pilha de lista: lista de níveis de indentação (0, 1, 2, ...) atualmente abertos 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): """Fecha listas até que restem apenas `level` listas abertas (level = número de <ul> abertos).""" while len(list_stack) > level: output.append('</li>') output.append('</ul>') list_stack.pop() if list_stack: # Após fechar uma lista aninhada, o <li> pai permanece aberto; # nós o fechamos quando o próximo irmão começa ou quando fechamos completamente. 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] # Tratamento de bloco de código if in_code_block: if line.strip().startswith('```'): # Fim do bloco de código 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 # Verifica o início do bloco de código stripped = line.strip() if stripped.startswith('```'): flush_paragraph() close_all_lists() in_code_block = True i += 1 continue # Linha em branco if stripped == '': flush_paragraph() close_all_lists() i += 1 continue # Cabeçalho? 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 # Item de lista? # Corresponde a espaços iniciais (devem ser pares para aninhamento) seguidos por '- ' list_match = re.match(r'^( *)- +(.*)$', line) if list_match: flush_paragraph() indent_spaces = len(list_match.group(1)) # Trata como um nível de aninhamento válido apenas se a indentação for um múltiplo de 2 indent_level = indent_spaces // 2 content = list_match.group(2) # Ajusta a pilha de listas if not list_stack: # Começando do zero: a primeira lista deve estar no nível 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 # índice superior if indent_level > current_depth: # Abre uma nova lista aninhada (avança apenas um nível de cada vez) 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: # Irmão no mesmo nível: fecha o <li> anterior output.append('</li>') output.append(f'<li>{process_inline(content)}') else: # Recua: fecha listas mais profundas while len(list_stack) - 1 > indent_level: output.append('</li>') output.append('</ul>') list_stack.pop() # Fecha também o <li> pai que continha esta lista aninhada output.append('</li>') # Agora no mesmo nível: adiciona o irmão output.append(f'<li>{process_inline(content)}') i += 1 continue # Caso contrário, é uma linha de parágrafo if list_stack: close_all_lists() paragraph_buffer.append(line.strip()) i += 1 # Fim da entrada: descarrega tudo if in_code_block: # Bloco de código não fechado: emite o que tivermos 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 = '''# Cabeçalho 1 Este é um parágrafo com texto **negrito** e *itálico*. Este é o mesmo parágrafo. - Item de lista um - Item de lista dois com ***negrito e itálico*** - Item de lista aninhada - De volta ao primeiro nível ```python def hello(): print("Hello, World!") ``` ''' print(markdown_to_html(sample))
Resultado
Votos de vitoria
0 / 3
Pontuacao media
Pontuacao total
Comentario geral
A Resposta A implementa todas as funcionalidades exigidas e está bem estruturada com comentários claros. O analisador inline usa substituições de regex em ordem de precedência, o que funciona na maioria dos casos, mas tem uma falha sutil: ele não escapa caracteres HTML antes de aplicar padrões inline, e o escape é aplicado primeiro, o que pode interferir nos padrões. Mais criticamente, a lógica de fechamento de listas tem um bug ao recuar: ele emite um `</li>` extra para o item pai antes de reabrir no mesmo nível, o que pode produzir HTML malformado. A detecção de blocos de código usa `line.strip().startswith('```')`, que é um pouco mais permissiva do que o necessário. No geral, é uma tentativa sólida com alguns problemas de casos extremos no tratamento de listas.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%A Resposta A lida corretamente com cabeçalhos, parágrafos, blocos de código e formatação inline básica. No entanto, a lógica de recuo de listas tem um bug: ao fechar listas aninhadas, ela emite um `</li>` extra para o item pai, o que pode produzir HTML malformado. A abordagem de regex inline também pode corresponder a limites não intencionais para marcadores não fechados como `*itálico`, potencialmente correspondendo a um `*` posterior no texto.
Completude
Peso 20%Todas as funcionalidades exigidas são implementadas: cabeçalhos (h1-h6), listas não ordenadas com aninhamento, blocos de código com especificador de idioma ignorado, parágrafos e todos os três estilos inline (negrito+itálico, negrito, itálico). A amostra principal da tarefa é tratada.
Qualidade do codigo
Peso 20%O código está bem organizado com funções auxiliares claras e bons comentários. A docstring é útil. No entanto, a lógica de gerenciamento de listas é um tanto complexa e tem bugs sutis. A abordagem de regex para análise inline é mais simples, mas menos robusta. A função `close_lists_to` é definida, mas não usada no loop principal (apenas `close_all_lists` é usada).
Valor pratico
Peso 15%A solução funciona para casos comuns e inclui um bloco `__main__` executável com a entrada de exemplo, o que é útil para testes. No entanto, os bugs de aninhamento de listas e os possíveis problemas de regex inline reduzem a confiabilidade prática para casos extremos.
Seguimento de instrucoes
Peso 10%Segue todas as instruções especificadas: assinatura de função correta, suporta todas as funcionalidades exigidas, lida com a ordem de precedência inline especificada, não implementa funcionalidades não suportadas e lida com tags não fechadas (embora imperfeitamente com regex). O escape HTML é aplicado.
Pontuacao total
Comentario geral
Implementa os tipos de bloco e a formatação inline exigidos com uma máquina de estados simples e substituições inline baseadas em regex, e escapa corretamente o HTML, inclusive dentro de blocos de código. No entanto, a geração de listas tem múltiplos problemas estruturais: emite sequências de </li> e </ul> que podem levar a aninhamento inválido, lida mal com recuos (</li> extras) e pode abrir <ul> aninhados sem estar dentro de um <li> pai. O tratamento inline via regex não é robusto para casos complicados/malformados (por exemplo, marcadores sobrepostos como **negrito *itálico***) e não suporta aninhamento recursivo de elementos inline conforme exigido/esperado.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%Correto para cabeçalhos/parágrafos/blocos de código básicos e ênfase simples, mas o aninhamento/fechamento de listas é frequentemente inválido (</li> extras, problemas de posicionamento de <ul> aninhados) e a ênfase por regex pode lidar mal com casos sobrepostos/aninhados (por exemplo, **negrito *itálico***).
Completude
Peso 20%Cobre todas as categorias de recursos solicitadas, mas o suporte ao aninhamento de listas é não confiável e o aninhamento inline não é verdadeiramente suportado além de padrões simples, reduzindo a completude efetiva.
Qualidade do codigo
Peso 20%Legível e modular, mas a lógica da pilha de listas é complicada com um auxiliar não utilizado/ineficaz (close_lists_to) e transições de estado frágeis; substituições pesadas de regex reduzem a clareza/robustez.
Valor pratico
Peso 15%Útil para entradas simples, mas o HTML de lista inválido e os casos extremos de ênfase limitam a usabilidade no mundo real para o subconjunto declarado.
Seguimento de instrucoes
Peso 10%Implementa o subconjunto solicitado e ignora o especificador de idioma do bloco de código; no entanto, o requisito de robustez para entradas inline complicadas e aninhamento/terminação correta de listas não é bem atendido.
Pontuacao total
Comentario geral
A Resposta A apresenta uma solução bem estruturada, baseada em máquina de estados, que lida corretamente com a maioria dos elementos de nível de bloco, como cabeçalhos, parágrafos e blocos de código. No entanto, sua abordagem para analisar elementos inline usando substituições sequenciais de expressões regulares é fundamentalmente falha. Este método não lida corretamente com estilos inline aninhados (por exemplo, negrito contendo itálico), o que é uma questão significativa de correção. A lógica de tratamento de listas também é complexa e menos robusta que a alternativa.
Ver detalhes da avaliacao ▼
Correcao
Peso 35%A solução não consegue analisar corretamente estilos inline aninhados. Por exemplo, `**negrito *itálico* negrito**` é renderizado incorretamente porque as chamadas sequenciais `re.sub` operam na string intermediária contendo tags HTML recém-adicionadas. Esta é uma falha significativa de correção na lógica de análise.
Completude
Peso 20%A solução tenta implementar todos os recursos necessários. No entanto, como a implementação de estilos inline aninhados está incorreta, ela não pode ser considerada totalmente completa em sua funcionalidade.
Qualidade do codigo
Peso 20%O código é geralmente bem estruturado com funções auxiliares e variáveis de estado. No entanto, a escolha de uma substituição sequencial de regex para análise é uma escolha algorítmica ruim para este problema, demonstrando falta de compreensão de suas armadilhas. A lógica de tratamento de listas também é bastante complicada.
Valor pratico
Peso 15%O tratamento incorreto do analisador para um caso de uso comum (estilos inline aninhados) limita severamente seu valor prático. Não seria confiável para converter documentos de markdown do mundo real.
Seguimento de instrucoes
Peso 10%A solução adere a todas as instruções do prompt, incluindo a assinatura da função, o subconjunto específico de Markdown a ser suportado e o formato de saída.