2
votes

Tableau et boucle Ruby

J'ai pu en trouver un qui est un triangle en étoile complètement solide, mais j'ai du mal à créer un "creux" et un numéro un qui incrémentent tous les deux du nombre que l'utilisateur entre. Avez-vous de l'aide?


6 commentaires

Pouvez-vous publier un code indiquant ce que vous avez tenté jusqu'à présent?


Bien sûr, j'ai essayé plusieurs choses jusqu'à présent.


La première et la dernière ligne du triangle sont spéciales car la première ne contient qu'un seul * et la dernière est une ligne complète. Le reste est juste une étoile plus (n-2) fois un espace plus une autre étoile, où n est le numéro de ligne commençant à 1 . Votre dernier essai atteint presque ce que vous voulez.


Ok, merci Je vais essayer!


n = 1 tandis que n> = 1 met fin "*" * n n = n - 2 * "" + "*"


cela ressemblerait-il à quelque chose comme ça?


5 Réponses :


1
votes

1er. itérer les lignes

2ème. mettre "*" uniquement dans les limites de la ligne: [0, i], remplir "" à l'intérieur:

3ème: exceptions pour le 1er et le dernier (n) cas

n = 8

puts '*'

(n-2).times do |i|
  puts '*' + ' ' * (i) + '*'
end

puts '*' * n if n > 1


2 commentaires

Ça marche! Puis-je essayer une méthode similaire pour produire le deuxième triangle?


Bien sûr, en itérant les lignes, vous pouvez itérer x <= [0, i] puis mettre x + 1, vous pouvez ensuite refactoriser ensuite cela.



1
votes

Voici ma solution:

class RightTriangle
  class << self
    def draw_border(size:, char: '*')
      validate(size)

      1.upto(size) do |n|
        1.upto(n) do |o|
          break if n == size
          o == 1 || o == n ? print(char) : print(' ')
        end

        n.times { print char } if n == size

        puts if n > 0
      end
    end

    def draw_numbers(size:)
      validate(size)

      1.upto(size) do |n|
        1.upto(n) { |o| print o }
        puts
      end
    end

    private

    def validate(size)
      raise 'SizeError: `size` must be greater than 1' if size <= 1
    end
  end
end

# For the triangle border
RightTriangle.draw_border(size: 8) # character will be '*'
RightTriangle.draw_border(size: 8, char: 'a') # character will be 'a'

# For the numbers triangle
RightTriangle.draw_numbers(size: 8)


3 commentaires

Et le deuxième triangle? Doit-il être imbriqué?


@Void Oups, j'ai oublié celui-là. Corrigé.


draw_border si pour le premier triangle et draw_numbers est pour le deuxième triangle.



0
votes

Vous pouvez créer une méthode simple avec deux boucles, pour le deuxième triangle:

Plese enter the height of the triangle: 8
1
12
123
1234
12345
123456
1234567
12345678

Exemple d'utilisation:

def print_numbers_right_triangle(height)
  1.upto(height) do |row|
    1.upto(row) do |i|
      print i
    end
    puts
  end
end

print "Plese enter the height of the triangle:"
print_numbers_right_triangle(gets.strip.to_i)


3 commentaires

Êtes-vous sûr? repl.it/repls/WelltodoGrowingOffice (Cliquez sur Exécuter et regardez à droite de l'écran)


J'ai tout vérifié et cela fonctionne très bien! Je vous remercie.


@Void Réponse mise à jour avec exemple d'entrée utilisateur



1
votes
ROW = '😈'*10
lt 6
😈
😈😈
😈😈😈
😈😈😈😈
😈😈😈😈😈
😈😈😈😈😈😈

0 commentaires

0
votes

Autres options, juste pour le plaisir.

Hollow

# 🥡
# 🥦🥡
# 🥤🥥🥠
# 🥩🥣🥦🥥

Il renvoie:

some_emotics = (0..9).each_with_object([]) { |n, o| o << "1F96#{n}".to_i(16) }.pack 'U*'
n.times do |n|
  puts some_emotics.split("").shuffle[0..n].join
end


0 commentaires