この質問は不明です。第1に、漠然としているタイトルは、無言の問題に対する特定のアプローチをどのように実施できるかを尋ねる。最初に必要なのは、問題の言葉での声明です。
私はその声明が何であるかを推測し、解決策を提案します。
考える
- 配列
arr
。
- 正の整数
n
,1 <= n <= arr.size
;そして
true
を返すために、どのようなarr
原因m
のn
要素の組み合わせtrue
またはfalse
を返すarr
の明確な要素ですn
引数、
を有する方法m
?
メソッドm
の定義と組み合わせて、以下のメソッドを使用することができます。
def combos(arr, n, m)
arr.combination(n).select { |x| public_send(m, *x) }
end
もちろん、キーはメソッドArray#combinationです。メソッドEnumerable#selectとObject#public_sendのドキュメントを参照してください。
ここでは、質問に記載されている例を使用しています。
def m(*x)
x.sum.odd?
end
arr = [1,2,3,4,5,6]
combos(arr, 2, :m)
#=> [[1, 2], [1, 4], [1, 6], [2, 3], [2, 5], [3, 4], [3, 6], [4, 5], [5, 6]]
combos(arr, 3, :m)
#=> [[1, 2, 4], [1, 2, 6], [1, 3, 5], [1, 4, 6], [2, 3, 4], [2, 3, 6],
# [2, 4, 5], [2, 5, 6], [3, 4, 6], [4, 5, 6]]
combos(arr, 4, :m)
#=> [[1, 2, 3, 5], [1, 2, 4, 6], [1, 3, 4, 5], [1, 3, 5, 6], [2, 3, 4, 6], [2, 4, 5, 6]]
それはRubyのV2.4でデビューだ作られている(Array#sumのためのドキュメントを参照してください
ここで第二の例です:5つの文字の組み合わせは、2つの母音を持つ文字の配列、与えられた
?
VOWEL_COUNTER = %w| a e i o u |.product([1]).to_h.tap { |h| h.default=0 }
#=> {"a"=>1, "e"=>1, "i"=>1, "o"=>1, "u"=>1}
VOWEL_COUNTER['a']
#=> 1
ハッシュのデフォルト値をゼロに設定すると、VOWEL_COUNTER[k]
は、キーがk
でない場合はゼロを返します。例えば、以下のように
VOWEL_COUNTER['r']
#=> 0
def m(*x)
x.sum { |c| VOWEL_COUNTER[c] } == 2
end
arr = %w| a r t u e v s |
combos(arr, 5, :m)
#=> [["a", "r", "t", "u", "v"], ["a", "r", "t", "u", "s"],
# ["a", "r", "t", "e", "v"], ["a", "r", "t", "e", "s"],
# ["a", "r", "u", "v", "s"], ["a", "r", "e", "v", "s"],
# ["a", "t", "u", "v", "s"], ["a", "t", "e", "v", "s"],
# ["r", "t", "u", "e", "v"], ["r", "t", "u", "e", "s"],
# ["r", "u", "e", "v", "s"], ["t", "u", "e", "v", "s"]]
なおVOWEL_COUNTER
が構成されています。このハッシュで
a = %w| a e i o u |
#=> ["a", "e", "i", "o", "u"]
b = a.product([1])
#=> [["a", 1], ["e", 1], ["i", 1], ["o", 1], ["u", 1]]
c = b.to_h
#=> {"a"=>1, "e"=>1, "i"=>1, "o"=>1, "u"=>1}
、
c['r']
#=> nil
ので、我々はゼロにデフォルト値を設定する必要があります。 NilClass#to_iがゼロにnil
を変換
x.sum { |c| VOWEL_COUNTER[c].to_i } == 2
ので
VOWEL_COUNTER = c.tap { |h| h.default=0 }
#=> {"a"=>1, "e"=>1, "i"=>1, "o"=>1, "u"=>1}
c['r']
#=> 0
代わりに、我々は最後のステップ(ゼロにハッシュのデフォルトの設定)を省略し、書かれている可能性があります。
は、メソッドの#selectのためにも、ドキュメントを参照してください、#public_send
'Array#combination'の後に' Enumerator#to_a'を削除することができます。 6文字未満だから削除できません。 –