Нарисовать треугольник на консоли в bash

Нарисовать треугольник на консоли в bash

Я хочу нарисовать треугольник, используя вложенные циклы bash, как показано ниже:

    /\
   /  \
  /    \
 /      \
/________\

Вот мой сценарий:

#!/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

Пожалуйста, помогите мне найти короткую версию.

решение1

$ ./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

Я выбралнетиспользовать вложенные циклы, поскольку это было бы медленно и ненужно. Вместо этого каждый бит треугольника печатается printfс использованием формата, определяющего интервал между символами /и \на основе текущей строки i.

Нижний ряд является особым и будет напечатан только в том случае, если размер треугольника это позволяет.

Похожие вопросы:

решение2

Вот моя попытка. Обратите внимание на более удачные имена переменных, кавычки переменных, отсутствие особых случаев, отсутствие мутации переменных (кроме счетчиков циклов), отсутствие поясняющих комментариев.чтоделает код (это работа кода, комментарии должны объяснять, почему, или заполнять слабые места в языке), и меньше циклов.

#!/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

Что я сделал: - Сделал отступ в коде и назвал все так, чтобы я мог это прочитать. - Спросил, что является условным:ВСЕВ строках есть a /и a \, поэтому что меняется: пробелы перед ними и пробелы между ними.

Обратите внимание, что это не завершено, согласно оригинальной спецификации. И если это задание, то попрактикуйтесь еще немного. Если вы этого не сделаете, то упретесь в стену позже в ходе курса. Сегодня напишите эту программу 3 раза, не глядя на эту или предыдущие попытки. Затем сделайте это по одному разу в каждый из следующих 3 дней, затем еще раз через неделю. Продолжайте практиковаться в решении подобных задач по кодированию (это как учиться играть на гитаре, вам нужно практиковаться.)

Связанный контент