Делая каждый в Ruby, как расставить бр каждые n предметов - PullRequest
3 голосов
/ 07 апреля 2011

Учитывая, что у меня есть 10 элементов для повторения, и я хочу разместить br каждые 3 из них, как в этом примере. Как я могу сделать это в Ruby?

1
2
3
<br>
4
5
6
<br>
7
8
9
<br>
10

Ответы [ 9 ]

10 голосов
/ 07 апреля 2011

Раствор 1

(1..10).each_slice(3){|a| puts '<br>' unless a[0] == 1; puts a}

Решение 2 (руб. 1.9.2)

(1..10).chunk{|i| i.%(3).zero?}.each{|r, a| puts(a, *('<br>' if r))}

Решение 3

puts (1..10).each_slice(3).map{|a| a.unshift('<br>')}.flatten.drop(1)

Решение 4 (ruby 1.9.2)

puts ['<br>'].product((1..10).each_slice(3).to_a).flatten.drop(1)

Решение 5

puts (1..10).each_slice(3).with_object([]){|a, aa| aa.push('<br>', *a)}.drop(1)

Раствор 6

puts (1..10).map{|i| i.%(3).zero?? [i, '<br>'] : i}

Решение 7 (ruby1.9.2)

puts (1..10).to_a.
  tap{|a| a.length.downto(1){|i| a.insert(i, '<br>') if i.%(3).zero?}}
4 голосов
/ 07 апреля 2011
>> (1..10).each_slice(3).to_a.map{|x|x.join("\n")}.join("\n<br>\n")
=> "1\n2\n3\n<br>\n4\n5\n6\n<br>\n7\n8\n9\n<br>\n10"
4 голосов
/ 07 апреля 2011
 (1..10).each do |i|
   puts i
   puts '<br>' if i % 3 == 0
 end
1 голос
/ 07 апреля 2011

Если бы я хорошо понял вопрос, он не сказал, что элементы всегда будут (1..10), и большинство ответов, которые я здесь увидел, действительны только для этого конкретного случая, так как они полагаются на значениеэлемент, а не в индексе.Более общее решение, которое будет работать не только при array = (1..10).to_a, но и с любым массивом любого размера:

array.each_with_index do |o, i| 
  puts o
  puts '<br>' if i % 3 == 2
end
0 голосов
/ 18 мая 2015
puts(
  (1..10)
  .each_with_index
  .map { |s, i| i % 3 == 2 ? [s, '<br>'] : s }
  .flatten
  .map(&:to_s)
  .join("\n")
)
  • Это не зависит от того, являются ли начальные значения целыми числами.
  • #each_with_index() без блока возвращает генератор, что означает, что вы можете #map результаты.
  • #flatten используется для перемещения '<br>' обратно в строку. Вместо этого вы можете просто изменить строку s следующим образом: "#{s}#{i % 3 == 2 ? "\n<br>" : nil}", если вам не нравится #flatten или вы не можете #flatten по какой-то причине (например, вы уже используете вложенные массивы).
  • Последний #map должен убедиться, что все является строкой перед присоединением. Если вы избавитесь от #flatten, как указано выше, вам это не нужно.
0 голосов
/ 07 апреля 2011

Для печати мне нравится сочетание kurumi и DigitalRoss:

array.each_slice(3) {|elems| puts elems.join("\n"), '<br>' }

Это довольно декларативно и очень просто.

0 голосов
/ 07 апреля 2011

Что-то не так рубиново-эск

k = 3
while k < array.size
    arrays.insert(k,"<br />")
    k += 4
end
p array
0 голосов
/ 07 апреля 2011
(1..10).each do |i| 
    puts i
    if (i % 3 == 0) 
      puts "<br/>"
    end
end
0 голосов
/ 07 апреля 2011

Я бы предложил сделать for(i=0;i<length;i++) { if (i%3) //put br }

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