Рубиновый массив и цикл - PullRequest
0 голосов
/ 26 января 2019

Мне удалось придумать тот, который представляет собой полностью сплошной звездный треугольник, но у меня возникают проблемы с созданием «пустотелого» и номера один, который увеличивается на любое число, которое вводит пользователь. Любая помощь?

Ответы [ 5 ]

0 голосов
/ 26 января 2019

Другие варианты, просто для удовольствия.

Полый

n, cat, hyp = 4, "?", "?"

n.times do |n|
  a = Array.new(n+1){' '}
  a[0], a[-1] = cat, hyp
  puts a.join
end

Возвращает:

# ?
# ??
# ? ?
# ?  ?


Заполненный
n = 10
r = [*0..9, *'a'..'z']

n.times do |n|
  puts r[0..n].join
end

Возвращает

# 0
# 01
# 012
# 0123

Если вы перетасуете массив r.shuffle[0..n].join, вы можете получить случайный вывод:

# t
# 26
# ce0
# zqiw


Случайные эмодзи:
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 голосов
/ 26 января 2019
def bt(n)
  1.upto(n) do |i|
    puts case i
    when 1
      '*'
    when n
      '*'*n
    else
      "*#{' '*(i-2)}*"
    end
  end
end

bt 8
*
**
* *
*  *
*   *
*    *
*     *
********

ROW = [*1..9, *'A'..'Z'].join
  #=> "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

def lt(n)
  1.upto(n) { |i| puts ROW[0,i] }
end

lt 8
1
12
123
1234
12345
123456
1234567
12345678

lt 22
1
12
123
1234
12345
123456
1234567
12345678
123456789
123456789A
123456789AB
123456789ABC
123456789ABCD
123456789ABCDE
123456789ABCDEF
123456789ABCDEFG
123456789ABCDEFGH
123456789ABCDEFGHI
123456789ABCDEFGHIJ
123456789ABCDEFGHIJK
123456789ABCDEFGHIJKL
123456789ABCDEFGHIJKLM

ROW = '?'*10
lt 6
?
??
???
????
?????
??????
0 голосов
/ 26 января 2019

Это мое решение:

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)
0 голосов
/ 26 января 2019

Вы можете создать простой метод с двумя циклами для второго треугольника:

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)

Пример использования:

Plese enter the height of the triangle: 8
1
12
123
1234
12345
123456
1234567
12345678
0 голосов
/ 26 января 2019

первый.итерации строк

2-й.ставьте «*» только в границах строки: [0, i], заполняя «» внутри:

3-й: исключения для 1-го и последнего (n) случая

n = 8

puts '*'

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

puts '*' * n if n > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...