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
私がしたこと: - 読みやすいようにコードをインデントし、適切な名前を付けます。 - 条件付きかどうかを尋ねます:全て/
行には と がある\
ため、変更されるのは、その前のスペースと行間のスペースです。
元の仕様によると、これは完成ではないことに注意してください。また、これが課題である場合は、もう少し練習してください。そうしないと、コースの後半で壁にぶつかることになります。今日、このプログラムや以前の試行を見ずに 3 回書きます。その後、次の 3 日間で 1 回ずつ実行し、1 週間後にもう一度実行します。同様のコーディング チャレンジを練習し続けます (ギターの演奏を学ぶのと同じで、練習が必要です)。