0

Problema no Desafio 5/5 Introdução a Busca e Substituição em JavaScript

Leonardo Diniz
Leonardo Diniz

Bom dia.


Creio que existe algum problema neste desafio. Vamos lá, pra quem não sabe do que se trata, o desafio é este aqui:


Desafio

Você está ajudando a desenvolver um sistema de gerenciamento de weblog chamado Weblogger Brasil. Embora Weblogger Brasil coloque todo o conteúdo direto no website em HTML, nem todos autores apreciam usar tags HTML em seus textos. Para tornar a vida deles mais fáceis, Weblogger Brasil oferece uma sintaxe simples chamada atalhos para obter alguns efeitos textuais em HTML. Sua tarefa é, dado um documento escrito com atalhos, traduzi-lo para o HTML apropriado.


Um atalho é usado para colocar texto em itálico. HTML faz isto com as tags <i> e </i>, mas no Weblogger Brasil um autor pode simplesmente colocar um pedaço de texto entre dois caracteres de sublinhado, '_'. Portanto, onde um autor escreve

  Você _deveria_ ver a foca no zoologico!
                

Weblogger Brasil vai publicar o seguinte:

  Você <i>deveria</i> ver a foca no zoologico!
                

Outro atalho serve para colocar texto em negrito, o que, em HTML, é feito com as tags <b> e </b>. Weblogger Brasil permite aos autores fazer o mesmo com pares do caractere asterisco, '*'. Quando um autor escreve o texto

  Marque a conta *a receber* para *paga*.
                

ele vai sair no website assim:

  Marque a conta <b>a receber</b> para <b>paga</b>.
                
Entrada
A entrada contem vários casos de teste. Cada caso de teste é composto por uma linha que contem uma string texto, com zero ou mais usos dos atalhos itálico e negrito. Cada texto tem de 1 a 50 caracteres, inclusive. Os únicos caracteres permitidos no texto são os caracteres alfabéticos (de 'a' a 'z' e de 'A' a 'Z'), o sublinhado ('_'), o asterisco ('*'), o caractere de espaço e os símbolos de pontuação ',', ';', '.', '!', '?', '-', '(' e ')'. O caractere sublinhado '_' ocorre no texto um número par de vezes. O asterisco '*' também aparece um número par de vezes no texto. Nenhuma substring do texto entre um par de sublinhados ou entre um par de asteriscos pode conter outros sublinhados ou asteriscos, respectivamente.

Saída
Para cada linha de entrada seu programa deve gerar uma linha de saída com o texto traduzido para HTML como demonstrado nos exemplos abaixo. Para tornar itálico um pedaço de texto no HTML, você deve iniciar este pedaço com a tag <i> e terminá-lo com a tag </i>. Para texto em negrito, inicie com <b> e termine com </b>


Várias pessoas já identificaram o mesmo erro neste desafio do Bootcamp. Vi várias perguntas iguais no Fórum do Bootcamp e ninguém conseguiu postar uma solução. Os códigos de todos que tentaram consegue resolver 4/5 testes, dois abertos e dois ocultos. Mas existe um teste oculto que nunca é aprovado.


Eis aqui um exemplo de código que deveria resolver esse desafio. Mesmo que se remova os dois filtros que o enunciado estabelece, o código continua não resolvendo. Este código que desenvolvi inclui, também, um teste que em teoria nem seria necessário, que seria caso houvesse alguma frase com um número ímpar de _ ou *. Mas mesmo assim, não soluciona o problema.


Estou desconfiado que existe algum problema no enunciado, algo assim. Existe alguma maneira que possamos entrar em contato com algum administrador? Não necessitaria resolver o problema, mas pelo menos dar acesso ao que está em não conformidade no teste oculto.


var lines = [];
var line = "";
var filtro1 = "";
var filtro2 = "";
do {
  line = gets()
  filtro1 = line.replace(/[^\w,;.!?() -*]/g, ''); //remove qualquer caractere que não sejam esses
  filtro2 = filtro1.substr(0,50); //filtra o tamanho do texto em 50 caracteres.
  if (filtro2 !== "") {
    lines.push(filtro2);
  }
} while (line !== "")


while (true) {
    let string = lines.shift();
    let letters = string.split("");
    let formattedLetters = letters;
    let indexDash = [];
    let indexStar = [];
    for (let i = 0; i < letters.length; i++) {
      letter = letters[i];
      if (letter === "_") {
          indexDash.push(i);
      }  else if (letter === "*") {
          indexStar.push(i);
      }
    }
    let j = 0;
    for (let index of indexDash) {
      if (indexDash.length  % 2 === 0) {
        formattedLetters[index] = (j % 2 == 0) ? '<i>' : '</i>';
      } else {
          if (j == indexDash.length-1) {
            
          } else {
            formattedLetters[index] = (j % 2 == 0) ? '<i>' : '</i>';
          }
        }
      j++;
    }
    let k = 0;
    for (let index of indexStar) {
      if (indexStar.length  % 2 === 0) {//não tem problema
        formattedLetters[index] = (k % 2 == 0) ? '<b>' : '</b>';
      } else {
          if (k == indexStar.length-1) {
            
          } else {
            formattedLetters[index] = (k % 2 == 0) ? '<b>' : '</b>';
          }
        }
      k++;
    }
    console.log(formattedLetters.join(""));
    if (lines.length == 0) {
      break;
    }
}
0
1

Comentários (2)

0
Leonardo Diniz

Leonardo Diniz

16/06/2021 14:31

Muito obrigado Nelson. Funcionou.


Sem dúvidas, JS é uma linguagem horrível para ficar resolvendo exercícios de lógica. Você saberia explicar qual o caso específico que o seu código contemplou, que no caso o meu não contemplava?


Abçs

1
Nelson Junior

Nelson Junior

16/06/2021 13:14

Boa tarde,


De todos os desafios da plataforma, apanho mais em JS. Esse desafio analisei vários códigos pra chegar nessa solução.


let texto = gets();
const italico = /\_(.*?)\_/gim;
const negrito = /\*(.*?)\*/gim;

function parseMarkdown(texto) {
 const html = texto.replace(italico, "<i>$1</i>").replace(negrito, "<b>$1</b>");

 return html.trim();
}

let contador = 0;

do {
 console.log(parseMarkdown(texto));
 texto = gets();
 contador++;
} while (contador < 60);

Tenta essa solução;

PhD em Engenharia Química

Brasil