Desenhe um triângulo no console no bash

Desenhe um triângulo no console no bash

Quero desenhar um triângulo usando loops aninhados bash, como o seguinte:

    /\
   /  \
  /    \
 /      \
/________\

Aqui está meu roteiro:

#!/bin/bash
read -r -p "Enter depth of pyramid: " n
echo "You enetered level: $n"
s=0
space=n
for((i=1;i<=n;i++))
do
  space=$((space-1)) #calculate how many spaces should be printed before /
  for((j=1;j<=space;j++))
  do
    echo -n " " #print spaces on the same line before printing /
  done
  for((k=1;k<=i;k++))
  do
    if ((i==1))
    then
      echo -n "/\ " #print /\ on the same line
      echo -n " " #print space after /\ on the same line
    elif((k==1))
    then
      echo -n "/" #print / on the same line
    elif((k==i))
    then
      for((l=1;l<=k+s;l++))
      do
        echo -n " " #print spaces on the same line before printing /\
      done
      s=$((s+1)) #as pyramid expands at bottom, so we need to recalculate inner spaces
      echo -n "\ " #print \ on the same line
    fi
  done
  echo -e #print new line after each row
done

Por favor, ajude-me a encontrar a versão curta.

Responder1

$ ./script.sh
Size: 5
    /\
   /  \
  /    \
 /      \
/________\
#!/bin/bash

read -p 'Size: ' sz

for (( i = 0; i < sz-1; ++i )); do
        printf '%*s/%*s\\\n' "$((sz-i-1))" "" "$((2*i))" ""
done

if [[ $sz -gt 1 ]]; then
        printf '/%s\\\n' "$( yes '_' | head -n "$((2*i))" | tr -d '\n' )"
fi

Eu escolhinãousar loops aninhados, pois seria lento e desnecessário. Cada bit do triângulo é impresso usando printfum formato que especifica o espaçamento entre os caracteres /e \com base na linha atual i.

A linha inferior é especial e só será impressa se o tamanho do triângulo permitir.

Perguntas semelhantes:

Responder2

Aqui está minha tentativa. Observe nomes de variáveis ​​melhores, variáveis ​​entre aspas, nenhum caso especial, nenhuma mutação de variável (exceto contadores de loop), nenhum comentário explicandoo queo código faz (esse é o trabalho dos códigos, os comentários devem explicar o porquê ou preencher os pontos fracos da linguagem) e menos loops.

#!/bin/bash
if (($# == 0))
then
    read -r -p "Enter depth of pyramid: " requested_height
elif (($# == 1))
then
    requested_height="$1"
fi
echo "You enetered level: $requested_height"

left_edge="/"
right_edge=\\

#this procedure can be replaced by printf, but shown here to
#demonstrate what to do if a built in does not already exist.
function draw_padding() {
    width="$1"
    for((i=1;i<=width;i++))
    do
        echo -n " "
    done
}

for((line_number=1;line_number<=requested_height;line_number++))
do
    initial_spaces=$((requested_height-line_number))
    draw_padding "$initial_spaces"

    echo -n "$left_edge"

    middle_spaces="$(((line_number-1) * 2  ))"
    draw_padding "$middle_spaces"

    echo "$right_edge"

done

O que eu fiz: - Recuar o código e nomear bem as coisas, para que eu possa lê-lo. - Pergunte o que é condicional:TODOSlinhas têm a /e a \, então o que muda: os espaços antes e os espaços entre.

Observe que não é acabamento, de acordo com as especificações originais. E se isso for uma tarefa, eles praticam um pouco mais. Caso contrário, você atingirá uma parede no final do percurso. Hoje, escreva este programa 3 vezes sem olhar para esta ou para as tentativas anteriores. Em seguida, faça isso uma vez a cada um dos próximos 3 dias e novamente em uma semana. Continue praticando desafios de codificação semelhantes (é como aprender a tocar violão, você precisa praticar).

informação relacionada