2010-08-19 16 views
5

Mentre provavo il problema 41 dal progetto Eulero, mi sono imbattuto in quello che sembra essere un bug nell'implementazione di Ruby 1.9 di Array.permutation. Ecco il codice problema isolato:Ruby 1.9 bug? - 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} 

La mia uscita per fetta e slice2 è:

slice = 4321 
9876 
9867 
9786 
9768 
9687 
... 

Tuttavia, slice3 sgorga, con le cifre da 1 a 4 essere permutati. Anche n = 4 è il primo valore che presenta questo problema. Quando imposto n = 3, ottengo l'output atteso. È un bug o sto codificando male qualcosa? Una rapida ricerca su Google non ha rivelato nulla.

risposta

6

È un known bug corretto in 1.9.2p136 e successivi.

Il metodo più semplice, oltre all'aggiornamento a un Ruby più recente, è assicurare che l'array non sia "condiviso", né costruendone uno nuovo (come lo slice3), o semplicemente "modificandolo", ad es. slice += [].

+3

Dolce, grazie! Il mio giapponese è un po 'arrugginito ... no aspetta, qual'è l'altra parola? Oh, giusto, inesistente. Tuttavia posso vedere dal codice su quel collegamento che è lo stesso problema. Ho pensato che non sarei stato il primo ad averlo notato, anche se non mi mancava molto. Ora sono curioso di sapere come è possibile che si sia verificato un errore. Non riesco a concepire le strutture di dati interne che consentirebbero a slice di sembrare giuste, ma fare in modo che la permutazione vada male, e tuttavia andrebbe bene per una fetta di tre. Esiste una discussione in inglese in qualsiasi luogo? –