1

アナグラムを配列の配列に配置するコードがあります。(アナグラムを含む)しかし、どこかでバグが発生し、最初の値が配列として出力されず、文字列として出力されます

<< 演算子を使用して、ある配列を別の配列にプッシュしています。コードはそれほど複雑ではありませんが、バグが見つかりません

def combine_anagrams(words)
    indexes = []
    anagrams = []

    words.each{|word| 
    if(word.is_a? String )
        first_word = word.downcase.chars.sort.join
        words.each{|second_word| 
            if(second_word.is_a? String)
                if(first_word == second_word.downcase.chars.sort.join)
                    indexes << words.index(second_word)
                end
            end
        } 

        indexes.each{|index| anagrams << words[index] }
        words.reject!.with_index {|el, idx| indexes.include?(idx)}

        words << anagrams # i replaced words with an array all_anagrams
        indexes = []
        anagrams = []
    end
    }

    return words
end

puts combine_anagrams([ 'cars','for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream'] ).inspect

出力

["for", "four", ["cars", "racs", "scar"], ["potatoes"], ["creams", "scream"]]

入力で「cars」と「for」の順序を入れ替えると、

["cars", "racs", "scar", ["for"], ["potatoes"], ["four"], ["creams", "scream"]]

何が起きてる

乱雑なコードで申し訳ありませんが、Rubyを学びたいと思っています

配列を画面に出力するときに、すべてのアナグラムの配列を格納する追加の変数を作成しましたall_anagrams = []。何らかの理由で「for」と「four」を除くすべての値を取得します。all_anagramsループしていて、それらの値がスキップされますか? ただし、この問題に対処する方法がわかりません。

all_anagrams の出力は

[["cars", "racs", "scar"], ["potatoes"], ["creams", "scream"]]
4

1 に答える 1

1

必要なのは、空白にする前にアナグラムを格納する新しい配列を導入することvalid_anagramsです。今、あなたはそれを に押し込んでいますwords。そして、Fredrick が指摘したように、単語を反復処理しながら変更しています。words_cloneという言葉のクローンを保持し、代わりにそこからアイテムを拒否することを避けるのは良くありません。次のコードが機能するはずです-

def combine_anagrams(words)
    indexes, anagrams, valid_anagrams = [], [], []
    words_clone = words.clone # creating a clone of words

    words.each do |word|
            if(word.is_a? String )
                 first_word = word.downcase.chars.sort.join
                words.each do |second_word|
                        if(second_word.is_a? String)
                            if(first_word == second_word.downcase.chars.sort.join)
                                    indexes << words.index(second_word)
                            end
                        end
                end

                indexes.each{|index| anagrams << words[index] }

                # reject from words_cloned instead of words
                words_clone.reject!.with_index {|el, idx| indexes.include?(idx)}

                # insert anagrams into valid_anagrams array. In your code you inserted it in words array
                valid_anagrams << anagrams unless valid_anagrams.include?(anagrams)
                indexes, anagrams = [], []
            end
    end

    # return valid_anagrams array
    return valid_anagrams
end 
于 2012-10-15T08:01:29.067 に答える