2010-08-19 6 views
5

Euler Project에서 41 번 문제를 시도하면서 Ruby 1.9에서 Array.permutation을 구현할 때 버그가있는 것으로 보였습니다. 여기에 고립 문제 코드는 다음과 같습니다 슬라이스와 slice2에 대한Ruby 1.9 버그? - 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} 

내 출력은 다음과 같습니다

slice = 4321 
9876 
9867 
9786 
9768 
9687 
... 

그러나, slice3는 1 ~ 4가 뮤팅되는 자리로, 밖으로 바로 온다. 또한 n = 4는이 문제가있는 첫 번째 값입니다. n = 3으로 설정하면 예상되는 출력을 얻습니다. 이 버그입니까, 아니면 잘못 코딩 한 것입니까? 빠른 Google 검색으로 아무 것도 나타나지 않았습니다.

답변

6

known bug은 1.9.2p136 이상으로 고정되어 있습니다.

가장 최근의 Ruby로 업데이트하는 것 외에도 가장 간단한 방법은 배열을 "공유"하지 않도록하는 것입니다. 새 배열을 만들거나 (예 : slice3) 간단하게 "수정"하십시오. slice += [].

+3

달콤한, 고마워! 내 일본인은 약간 녹슨 ... 잠깐, 그 다른 단어는 뭐니? 아, 맞다. 존재하지 않는다. 그러나 나는 그 링크에있는 코드에서 같은 문제라는 것을 알 수 있습니다. 나는 내가 많이 그리워하지는 않았지만 나는 그것을 알아 차린 첫번째 사람이 아닐 것이라고 생각했다. 이제 어떻게 버그가 발생했는지 궁금합니다. 슬라이스를 올바르게 보이도록 내부 데이터 구조를 생각할 수는 없지만, 순열을 잘못되게 만들 수는 있지만 세 조각으로는 괜찮습니다. 어디에서나 영어로 토론 할 수 있습니까? –

관련 문제