DESAFIO LOSANGO [OFF]

JABA 11/02/2017 18:45:44
#471584
Olá pessoal!

Este é um desafio de nível fácil para treinamento de lógica. Vocês tem que criar um losango com as mesmas características da imagem acima para uma entrada qualquer. Qualquer dúvida é só postar.

OBS: Quando a entrada for um número par, considere o próximo número como sendo a entrada.

Boa sorte!
KERPLUNK 11/02/2017 21:23:25
#471585
Resposta escolhida
Para números pares pode não dar muito certo. Mas a lógica é bem simples.
JABA 11/02/2017 22:45:52
#471588
Citação:

Para números pares pode não dar muito certo. Mas a lógica é bem simples.



Será que alguém consegue resolver ainda hoje?
KERPLUNK 11/02/2017 23:12:02
#471589
JABA 11/02/2017 23:24:34
#471591
Gostei da implementação. Parabéns!
KERPLUNK 11/02/2017 23:28:43
#471592
Citação:

:
Gostei da implementação. Parabéns!


Como você fez?
KERPLUNK 12/02/2017 00:35:33
#471593
Versão melhorada. Quando especificado um número par, poderia ficar desalinhado, agora qualquer número inteiro vai fazer o losango ficar certinho.

Edit: Agora está perfeito, com números pares e ímpares. O comportamento é diferente de um e de outro. Para números pares, o losango precisa começar(a primeira linha) com dois asteriscos, para ímpares, apenas 1. Estou fazendo também uso do método Reverse para tipos List<T>. A lógica é:
Uma interação for, começando do resto da divisão do número digitado(caso par, começa de 0, caso ímpar, começa de um). Isso faz com que o primeiro item seja [Ô]branco[Ô] para números pares e um asterisco para números ímpares. A interação for, não é de um em um, mas de dois em dois. Com isso, faço um List<T> de asteriscos, contendo o número de asteriscos correspondente ao índice de cada interação. Isso é atingido com String([ô]*[ô], <número de asteriscos>). Assim, faço metade do losango, incluindo o maior número deles que é o valor digitado. Em seguida, crio uma segunda List<T> que conterá os mesmos ítens da primeira, exceto o último(o maior) mas em ordem invertida através do método Reverse, adicionando-os à primeira listagem, criando assim todos os ítens necessários para serem exibidos. Por último, simplesmente os exibo.
JABA 12/02/2017 03:52:08
#471595
Citação:

Como você fez?



static void exibirLosango(int t)
{
int inicio = t / 2;
int fim = inicio;
bool b = false;

if (t % 2 == 0) t++;

for (int x = 0; x < t; x++)
{
for (int y = 0; y < t; y++)
{
if (y >= inicio && y <= fim)
Console.Write([Ô]*[Ô]);
else
Console.Write([Ô] [Ô]);
}

if (inicio == 0 && fim == t - 1)
b = true;

if (b)
{
inicio++;
fim--;
}
else
{
inicio--;
fim++;
}
Console.WriteLine();
}
}
DS2T 12/02/2017 15:42:16
#471599
using System;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int i;

Console.WriteLine([Ô]Digite a entrada:[Ô]);

string input = Console.ReadLine();

if (int.TryParse(input,out i))
{
i = i % 2 == 0 ? i + 1 : i;
DesenhaLosango(i);
}
else
{
Console.WriteLine([Ô]Você não colocou um número válido. Aí complica...[Ô]);
}

Console.ReadKey(true);
}

private static void DesenhaLosango(int numeroLinhas)
{
int quantidadeAsterisco = 1;
int quantidadeEspacos = (int)Math.Truncate(Convert.ToDecimal(numeroLinhas) / 2m);
int metade = quantidadeEspacos;


for (int i = 1; i <= numeroLinhas; i++)
{

string linha = string.Concat(new string([ô] [ô], quantidadeEspacos), new string([ô]*[ô], quantidadeAsterisco));
Console.WriteLine(linha);

int k = i <= metade ? 1 : -1;
quantidadeEspacos -= k;
quantidadeAsterisco += k * 2;
}
}
}
}


Segue a minha implementação...
LVFIOROT 12/02/2017 16:31:15
#471600

Citação:

:
Versão melhorada. Quando especificado um número par, poderia ficar desalinhado, agora qualquer número inteiro vai fazer o losango ficar certinho.

Edit: Agora está perfeito, com números pares e ímpares. O comportamento é diferente de um e de outro. Para números pares, o losango precisa começar(a primeira linha) com dois asteriscos, para ímpares, apenas 1. Estou fazendo também uso do método Reverse para tipos List<T>. A lógica é:
Uma interação for, começando do resto da divisão do número digitado(caso par, começa de 0, caso ímpar, começa de um). Isso faz com que o primeiro item seja [Ô]branco[Ô] para números pares e um asterisco para números ímpares. A interação for, não é de um em um, mas de dois em dois. Com isso, faço um List<T> de asteriscos, contendo o número de asteriscos correspondente ao índice de cada interação. Isso é atingido com String([ô]*[ô], <número de asteriscos>). Assim, faço metade do losango, incluindo o maior número deles que é o valor digitado. Em seguida, crio uma segunda List<T> que conterá os mesmos ítens da primeira, exceto o último(o maior) mas em ordem invertida através do método Reverse, adicionando-os à primeira listagem, criando assim todos os ítens necessários para serem exibidos. Por último, simplesmente os exibo.




quando é par nao está começando com 1 Astérico, seria assim mesmo?
KERPLUNK 13/02/2017 01:15:40
#471604
Exato. Como a interação é sempre dois asteriscos à mais, quando o número de entrada é par, o losango ficaria disforme. O primeiro caractere no caso de uma entrada de um número ímpar é um caractere em branco, seguido de asteriscos, depois quatro e assim sucessivamente até o número de entrada. Tecnicamente é um fatorial modificado.
Tópico encerrado , respostas não são mais permitidas