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일 동안 한 번 수행하고 일주일 후에 다시 수행합니다. 유사한 코딩 과제를 계속 연습하세요. (기타를 배우는 것과 같으니 연습해야 합니다.)

관련 정보