29653


配列から、3つずつ重複なしでグループわけした値を作りたいのですが、  
何をどうして処理したらいいのかわかりません。

アドバイスを頂けませんか。

以下のような感じです。

[code]

    items = ["A", "A", "A", "B", "B", "C", "F", "F", "F", "G", "H", "I"]
    
    hoge(items)
    # => [
      ["A", "B", "C"],
      ["A", "B", "F"],
      ["A", "F", "G"],
      ["F", "H", "I"]
    ]
    
[/code]

組み合わせや順番はこの通りでなくても大丈夫です。

ruby,php,javascriptのいずれかで解説してくださると嬉しいですが、他の言語でも大丈夫です。  
よろしくお願いします。


CC BY-SA 3.0
2016-10-18T03:10:20.640
29642
2016-10-25T10:07:48.900
2016-10-18T03:26:39.267
9149
9149
question
ruby
配列から重複のないグループに分ける方法


ベタですが、一応こんな感じでできました。

[code]

    items = ["A", "A", "A", "B", "B", "C", "F", "F", "G", "H", "I"]
    results = []
    while item = items.shift
      catch :next do
        results.each do |rec|
          if rec.size < 3 && !rec.include?(item)
            rec.push item
            throw :next
          end
        end
        results.push [item]
      end
    end
    p results
    
[/code]


CC BY-SA 3.0
2016-10-18T03:24:20.283
29643
2016-10-18T03:24:20.283
3249
29642
answer


別解として `inject` を使う方法を。

[code]

    items = ["A", "A", "A", "B", "B", "C", "F", "F", "F", "G", "H", "I"]
    items.inject([]){|arr, i|
      f = arr.find{|x| !x.include?(i) && x.length < 3}
      f.nil? ? arr << [i] : f << i
      arr
    }
    => [["A", "B", "C"], ["A", "B", "F"], ["A", "F", "G"], ["F", "H", "I"]]
    
[/code]


CC BY-SA 3.0
2016-10-18T07:15:02.073
29653
2016-10-18T07:55:31.733
2016-10-18T07:55:31.733
29642
answer


combination をつかうと、

[code]

    items = ["A", "A", "A", "B", "B", "C", "F", "F", "G", "H", "I"];
    items.uniq.combination(3).each do |arr| print arr, "\n"; end
    
[/code]

です。


CC BY-SA 3.0
2016-10-25T10:07:48.900
29890
2016-10-25T10:07:48.900
19314
29642
answer