Ajuda sobre Questão de lógica

Boa noite pessoal!, estou lendo um livro de lógica e cheguei em uma questão que não consigo sair; tentei bastante fiz debugger de codigo varias vezes, me inscrevi em alguns fóruns em busca de respostas, mais não achei nenhum código para mim analisar o que errei, tenho que fazer um “desafio” com js vanilla, mais consigo apenas metade do esperado, e um codigo “simples” eu sei. porem nao tenho um insight do que pode ser!

O código que tenho e o seguinte:

<!doctype html>

Inprimir V de vingança
<body>
	<h3>CTRL SHIFT + J</h3>
	<script>
	    
		for(var line = 0; line < 10; line++) {


			for(var col = 1; col <= line; col++) {
				document.write("_");
			}
			
			document.write("*");
			document.write("<br>");
		}
	</script>
</body>

Tenho que mostrar no documento um “V” com underlines na esquerda e direita, mais só consegui na esquerda…

Você precisa analisar como ficaria cada linha, e tentar generalizar uma regra a partir disso.

Para simplificar, vamos imaginar como seria com apenas quatro linhas (considerando da linha 0 a 3 - sim, muitas coisas em programação começam a contar do zero, então é bom já ir se acostumando a isso):


*     * <- linha 3: nenhum espaço antes, 5 espaços no meio
 *   *  <- linha 2: 1 espaço antes,      3 espaços no meio
  * *   <- linha 1: 2 espaços antes,     1 espaço no meio
   *    <- linha 0: 4 espaços antes,     nenhum espaço no meio

Repare que o que varia em cada linha é a quantidade de espaços antes e depois do primeiro * (e se não tiver nenhum depois, então eu só imprimo um *).

A quantidade de espaços antes começa do zero e aumenta de um em um. Já a quantidade de espaços depois é igual ao dobro do número da linha, menos 1. Com isso, ficaria assim:

var qtd_linhas = 9;
var espacos_antes = 0; // espaços antes do primeiro asterisco
// para cada linha
for (var linha = qtd_linhas - 1; linha >= 0; linha--, espacos_antes++) {
    for (var i = 0; i < espacos_antes; i++) { // imprime os espaços antes
        document.write("&ensp;");
    }
    // imprime o asterisco
    document.write("*");

    // espaços antes do segundo asterisco
    var espacos_entre = (2 * linha) - 1;
    if (espacos_entre > 0) { // se não tem espaços, não imprime nem os espaços, nem o segundo asterisco
        for (var i = 0; i < espacos_entre; i++) {
            document.write("&ensp;");
        }
        document.write("*");
    }
    // pula a linha
    document.write("<br>");
}

Repare que no for eu já usei linha--, espacos_antes++, ou seja, a cada iteração diminui o número da linha e incrementa a quantidade de espaços antes do asterisco. Aliás, também poderia ser assim:

for (var linha = qtd_linhas - 1, espacos_antes = 0; linha >= 0; linha--, espacos_antes++) {
    ... etc

Dentro do for eu sigo a lógica já explicada acima, imprimindo os espaços conforme a quantidade requerida em cada linha.

Para o espaço eu usei o HTML entity &ensp;, que representa o caractere “en-space” (um espaço que geralmente possui a mesma largura da letra “N”). Assim o browser renderiza corretamente: se você usar espaços “normais” - ou seja, a barra de espaço do seu teclado - não vai funcionar porque o browser interpreta uma sequência de vários espaços como um só. Mas usando esses “espaços especiais” ele renderiza corretamente. No meu ficou assim:

triangle

1 curtida

obg amigo!!. nunca ia conseguir formular tal algoritmo tão estruturado.
estou debugando seu código, consigo entender o que está acontecendo(ler código), mais não sou bom em pensar em como chegar em soluções, também consegui encontrar outras pessoas que escreveram esse mesmo código em maneiras diferentes. vou tentar ser mais analítico! e quebrar mais a cabeça.

também notei que você não achou necessário imprimiu os espaços depois, o código ficou mais limpo!.

agora posso continuar no meus estudos.

1 curtida