2010-11-05 20 views
5

que estoy tratando de resolver un sencillo problema de Rubí de Seven Languages in Seven WeeksRubí cada una lógica pregunta

imprimir el contenido de una serie de dieciséis números, cuatro números a la vez , utilizando sólo each

Esto es lo que se me ocurrió, ¿se puede hacer de una manera simple o hacerlo mejor?

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 

Se puede hacer usando each_slice en una línea

a.each_slice(4){|x| p x}

Respuesta

6

Teja, su solución es aceptable. Como necesita usar cada uno, la complejidad del algoritmo va a estar limitada al tamaño de su matriz.

Se me ocurrió la solución a continuación. Es la misma idea que la tuya, excepto que no usa una var aux (j) para almacenar resultados parciales.

i = 0 
a.each do |item| 
    p a[i, 4] if(i % 4 == 0) 
    i +=1 
end 
+0

Bueno. La única solución que no usa una variable auxiliar. Gracias. –

+0

¡El problema especificaba el uso de 'each', pero no decía _which_ array en el que debía usarse! –

0

Prueba esto:

(1..16).each do |item| 
    print "#{item} " 
    print "\n" if item % 4 == 0 
end 
+0

pensé acerca de esto, pero el problema dice impresión cuatro números a la vez y esta solución imprime un número y agrega un salto de línea que puede no ser la misma solución que pidieron –

0

El problema no afirmó que la matriz de números dieciséis eran secuencial o comenzó a la una ... vamos a creado una solución que funcione para cualquier 16 números.

########## 
# 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 
1

creo que esto debería funcionar para cualquier matriz de tamaño y de cualquier tamaño de porción x:

x = 4 
(0...(a.size/x.to_f).ceil).each {|i| p a.slice(x*i,x)} 
+0

Bueno también ... Me gustó este enfoque también ... –

0

he usado algo similar a Miguel, aunque la suya es más limpio:

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 
0

¿Está prohibido usar each_with_index? Si no, sobre la base @ respuesta de Miguel:

a.each_with_index do |item, i| 
    p a[i, 4] if i.modulo(4).zero? 
end 

También he sustituido i % 4 == 0 con algo que suena como Inglés ("el módulo i 4 es cero")

0

Una sola línea sin rebanada:

a.each {|i| p a[i,4] if (i+3) % 4 == 0} 
2

Glenn Macdonald's es corto, pero usa slice que no está permitido (solo cada uno, recuerda). Esta es la mía:

(0...a.size).each {|index| p a[index, 4] if index % 4 == 0} 

que también funciona bien para otros tamaños de matriz, aquí se aplican a una matriz 18 de tamaño:

>> 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 
Cuestiones relacionadas