9
respostas

Imprimindo uma sequência de padrões de caracteres lado a lado

Como imprimir os padrões lado a lado? Eu consegui apenas fazer um embaixo do outro: Insira aqui a descrição dessa imagem para ajudar na acessibilidadeMeu código consegue gerar os padrões mas um embaixo do outro:

#a
for i in range(1,11):
    for j in range(1,11):
        print(i*"*", end= "")
        break
    print()

print()
#b
for i in range(10,-1,-1):
    for j in range(1,11):
        print(i*"*", end= "")
        break
    print()

print()
#c
for i in range(11,-1,-1):
    for j in range(1,12):
        print((11-i)*" " + (i-1)*"*", end= "")
        break
    print()

print()


#d
for i in range(1,12):
    for j in range(1,12):
        print((11-i)*" " + (i-1)*"*", end= "")
        break
    print()

print()

Alguma ideia?

9 respostas

Você quer imprimir como está na caixa ? Tem alguma regra no exercício quanto a usar listas para confectionar essa matriz ?

Bom dia, Thiago Matos

Não pode usar matrizes. só loops. Gostaria de imprimir, lado a lado, não tem que aparecer as letras (a,b,c,d)!

Fiz a contagem de * e " " espaços da primeira e última linha para chegar em um pattern. Coloquei no papel e preenchi o intervalo entre as linhas:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A partir disso percebi que só bastava dois ranges, um de 1 a 10 e outro de 10 a 1, pois os demais valores eu poderia conseguir com cálculo simples, como desmonstrado no topo de imagem.

Fazendo um único for utilizando as duas ranges, fiz o teste de saída de valores para comparar com minha matriz:

for a, b in zip(range(1, 11), range(10, 0, -1)):
    print(f'{a} {b+2} {b} {a+a} {b} {b+2} {a}')

Deu certo, então agora era só adicionar os * e os " " em cada campo:

for a, b in zip(range(1, 11), range(10, 0, -1)):
    print(f'{a*"*"}{(b+2)*" "}{b*"*"}{(a+a)*" "}{b*"*"}{(b+2)*" "}{a*"*"}')

Resultado: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Thiago Matos, obrigado. Exercício difícil. Para referência, retirei do livro: Intro to Python for Computer Science and Data Science: Learning to Program with Ai, Big Data and the Cloud autor: Deitel

No livro ele não demonstra a solução? O zip() foi quem permitiu essa minha lógica funcionar, sem ele, utilizando só loop... Realmente difícil

No original, ele fala

"Separate each triangle from the next by three horizontal spaces. [Hint: One for loop should
control the row number. Its nested for loops should calculate from the row number the
appropriate number of asterisks and spaces for each of the four patterns.]"

Na verdade, não poderia usar o zip mas apenas loops aninhados. Alguma ideia?

Thiago Matos, infelizmente não tem gabarito...

Sim, descobri haha, calma aí

Edit:

O PIP8 que me perdoe, mas fui obrigado a converter o calculo brutamente para inteiro com int() porque ele estava transformando todo o cálculo em float.

for a in range(1, 11):
    print(f'{a*"*"}{int((26-(a+a))/2)*" "}{int((22-(a+a))/2)*"*"}{(a+a)*" "}{int((22-(a+a))/2)*"*"}{int((26-(a+a))/2)*" "}{a*"*"}')

Olhando na tabela que eu fiz no caderno: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Eu resolvi apagar todos os calculos de cima e manter só o número referente à linha, que é o A.

A partir daí, eu contei quantos espaços e asteríscos há em cada linha no total, e em todas as linhas, tem 26 espaços e 22 asteríscos, com esses números dava pra chegar nos números da tabela:

Linha - Calculo1 - Calculo2 - Linha+Linha - Calculo2 - Calculo1 - Linha

  • Linha = a
  • Calculo1 = ( 26 - (a+a) ) / 2
  • Calculo2 = ( 22 - (a+a) ) / 2

Removendo os espaços centrais (a+a) do total de espaços/linhas, o que sobra pode ser dividido em duas partes, uma pra cada lado do centro

O legal é que continuou ainda com um único FOR, contrariando a sugestão dele de fazer o cálculo "nos próximos FOR loops", que era o que complicava a solução do problema