2010-08-19 20 views
5

Euler Projesi'nden 41 numaralı problemi denerken, Array.permutation'ın Ruby 1.9 uygulamasında bir hata olduğu görülüyordu. İşte izole sorun kod: dilim ve slice2 içinRuby 1.9 hatası? - 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} 

Benim çıktısı:

slice = 4321 
9876 
9867 
9786 
9768 
9687 
... 

Ancak slice3 1 ila 4 sırası değiştirilebilir olan hane ile dışarı doğru geliyor. Ayrıca n = 4, bu problemi taşıyan ilk değerdir. N = 3'ü ayarladığımda beklenen çıktıyı alırım. Bu bir hata mı, yoksa bir şeyi yanlış kodlu muyum? Hızlı bir Google araması hiçbir şey yapmadı.

cevap

6

1.9.2p136 ve daha yeni bir sürümünde sabitlenmiş olan known bug'dur.

Daha yakın bir Ruby'e güncellemenin yanı sıra, en kolay yolu, dizininizin "paylaşılmış" olmadığından emin olmaktır, ya yeni bir tane oluşturabilir (dilim3 gibi), ya da sadece "değiştirerek", örn. slice += [].

+3

Tatlı, teşekkürler! Japoncam biraz paslı ... beklemek yok, diğer kelime nedir? Oh, değil, varolmayan. Ancak, bu bağlantıdaki koddan aynı sorunun olduğunu görebiliyorum. Farkına vardığım ilk şey olmasaydım, çok fazla özlemedim. Şimdi, hataların nasıl gerçekleştiğini merak ediyorum. Dilimin doğru görünmesine izin verecek iç veri yapılarını düşünemiyorum, ancak permütasyonun yanlış gitmesini sağlayın, ve yine de üç dilim için iyi olun. Herhangi bir yerde İngilizce tartışması var mı? –

İlgili konular