2010-08-19 11 views
5

Al intentar el problema 41 del Proyecto Euler, me encontré con lo que parece ser un error en la implementación de Ruby 1.9 de Array.permutation. Aquí está el código de problema aislado:Ruby 1.9 error? - Array.permutation

n = 4 
slice = '987654321'.chars.to_a[-n..-1] 
puts "slice = #{slice.join}" 
slice.permutation(n) {|perm| puts perm.join} 

slice2 = slice.dup 
puts "slice2 = #{slice2.join}" 
slice2.permutation(n) {|perm| puts perm.join} 

slice3 = [] 
(0...n).each {|i| slice3[i] = slice[i]} 
puts "slice3 = #{slice3.join}" 
slice3.permutation(n) {|perm| puts perm.join} 

Mi salida para cortar y slice2 es:

slice = 4321 
9876 
9867 
9786 
9768 
9687 
... 

Sin embargo, slice3 sale bien, con los dígitos 1 a 4 están permutados. También n = 4 es el primer valor que tiene este problema. Cuando configuro n = 3, obtengo el resultado esperado. ¿Es esto un error, o estoy codificando algo? Una búsqueda rápida en Google no apareció nada.

Respuesta

6

Es un known bug que se ha corregido en 1.9.2p136 y más reciente.

La forma más sencilla de hacerlo, además de actualizar a un Ruby más reciente, es asegurar que su matriz no sea "compartida", ya sea construyendo una nueva (como su slice3) o simplemente "modificándola", p. slice += [].

+3

¡Dulce, gracias! Mi japonés está un poco oxidado ... no, espera, ¿cuál es esa otra palabra? Oh, correcto, inexistente. Sin embargo, puedo ver en el código de ese enlace que es el mismo problema. Pensé que no sería el primero en haberlo notado, aunque no extrañé mucho. Ahora tengo curiosidad sobre cómo es posible que haya ocurrido un error. No puedo concebir las estructuras internas de datos que permitan que slice parezca correcto, pero hacen que la permutación salga mal y, sin embargo, está bien para una porción de tres. ¿Hay alguna discusión en inglés en cualquier lugar? –

Cuestiones relacionadas