Dibuja un triángulo en la consola en bash.

Dibuja un triángulo en la consola en bash.

Quiero dibujar un triángulo usando bucles anidados bash, como el siguiente:

    /\
   /  \
  /    \
 /      \
/________\

Aquí está mi guión:

#!/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 ayúdenme a encontrar la versión corta.

Respuesta1

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

Elegínoutilizar bucles anidados, ya que sería lento e innecesario. En cambio, cada bit del triángulo se imprime printfcon un formato que especifica el espacio entre los caracteres /y \según la fila actual i.

La fila inferior es especial y sólo se imprimirá si el tamaño del triángulo lo permite.

Preguntas similares:

Respuesta2

Aquí está mi intento. Tenga en cuenta mejores nombres de variables, variables entre comillas, sin casos especiales, sin mutación de variable (excepto contadores de bucle), sin comentarios explicativosquéel código lo hace (ese es el trabajo del código, los comentarios deben explicar por qué o completar las debilidades del lenguaje) y menos bucles.

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

Qué hice: - Sangrar el código y nombrar bien las cosas para poder leerlo. - Preguntar qué es condicional:TODOLas líneas tienen a /y a \, entonces, ¿qué cambia? Los espacios antes y los espacios entre.

Tenga en cuenta que no está acabado, según las especificaciones originales. Y si esto es una tarea, practican un poco más. Si no lo haces, te toparás con un muro más adelante en el curso. Hoy, escribe este programa 3 veces sin mirar este ni los intentos anteriores. Luego hazlo una vez por cada uno de los próximos 3 días, y luego nuevamente en una semana. Sigue practicando desafíos de codificación similares (es como aprender a tocar la guitarra, hay que practicar).

información relacionada