我正试图从Seven Languages in Seven Weeks
解决一个简单的Ruby问题打印数组的内容 16个数字,4个数字 时间,仅使用
each
以下是我提出的问题,这可以通过简单的方式完成还是做得更好?
a = (1..16).to_a
i = 0
j = []
a.each do |item|
i += 1
j << item
if(i % 4 == 0)
p j
j = []
end
end
可以在一行中使用each_slice
完成
a.each_slice(4){|x| p x}
答案 0 :(得分:6)
Teja,你的解决方案还可以。当您需要使用每个时,算法的复杂性将受到数组大小的限制。
我想出了解决方案。除了它不使用aux var(j)存储部分结果外,它与你的想法相同。
i = 0
a.each do |item|
p a[i, 4] if(i % 4 == 0)
i +=1
end
答案 1 :(得分:2)
格伦麦克唐纳很短,但它使用的是不允许的切片(只有每一个,请记住)。这是我的:
(0...a.size).each {|index| p a[index, 4] if index % 4 == 0}
也适用于其他数组大小,这里应用于18大小的数组:
>> a = (113..150).to_a.insert(5,55).insert(10,66666).shift(18)
=> [113, 114, 115, 116, 117, 55, 118, 119, 120, 121, 66666, 122, 123, 124, 125, 126, 127, 128]
>> (0...a.size).each {|index| p a[index, 4] if index % 4 == 0}
[113, 114, 115, 116]
[117, 55, 118, 119]
[120, 121, 66666, 122]
[123, 124, 125, 126]
[127, 128]
=> 0...18
答案 2 :(得分:1)
我认为这应该适用于任何大小的数组和任何大小的x:
x = 4
(0...(a.size/x.to_f).ceil).each {|i| p a.slice(x*i,x)}
答案 3 :(得分:0)
试试这个:
(1..16).each do |item|
print "#{item} "
print "\n" if item % 4 == 0
end
答案 4 :(得分:0)
问题没有说明十六个数字的数组是顺序的还是从一个开始...让我们创建一个适用于任何16个数字的解决方案。
##########
# Method 1 - Store chunks of 4 and print at the end
##########
a = (1..16).to_a
b = []
a.each do |item|
b << [] if b.size == 0
b << [] if b[-1].size == 4
b[-1] << item
end
# choose your desired printing method
print b
b.each{|c| puts c.join(",")}
##########
# Method 2 - print the chunks as they are encountered
##########
# Note: "p" was specifically chosen over "print" because it returns the value printed instead of nil.
# If you use a different printing function, make sure it returns a value otherwise the 'b' array will not clear.
# Note: This implementation only prints out all array entries if a multiple of 4
# If 'b' contains any items outside the loop, they will not be printed
a = (1..16).to_a
b = []
a.each do |item|
b << item
b = [] if b.size == 4 and puts b
end
# Note: This implementation will print all array elements, even if number of elements is not multiple of 4.
a = (1..16).to_a
b = []
a.each do |item|
b = [] if b.size == 4 and p b
b << item
end
p b
答案 5 :(得分:0)
我使用了类似于Miguel的东西,尽管他更清洁:
array = (1..16).to_a
i = 0
array.each do
puts array[i...i+4].to_s if i % 4 == 0 and i+4 <= array.size
i+=4
end
答案 6 :(得分:0)
您是否被禁止使用each_with_index
?如果没有,建立在@Miguel的答案上:
a.each_with_index do |item, i|
p a[i, 4] if i.modulo(4).zero?
end
我还用一些听起来像英语的东西取代i % 4 == 0
(“i modulo 4 is zero”)
答案 7 :(得分:0)
没有切片的单线:
a.each {|i| p a[i,4] if (i+3) % 4 == 0}