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 printf
um 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).