2016-07-12 21 views
0

Ich versuche, Eingabe als Zeichenfolge zu nehmen.Ruby find combination

Dann muss ich alle mögliche Kombination und unterschiedliche Kombination finden, aber ich bin nicht dazu in der Lage.

input = "aabb" 

Ausgang Ich brauche alle Kombination drucken =

'a','a','b','b','aa','ab','bb','aab','abb','aabb' 

Jetzt Distinct Kombination

'a','b','aa','ab','bb','aab','abb','aabb' 

Dann brauche ich die Buchstaben zu zählen und tun, um eine Summierung

'a','a','b','b','aa','ab','bb','aab','abb','aabb' 

Dazu

result = 1+1+1+1+2+2+2+3+3+4 

Ähnlich für die andere Kombination muss ich Summierung finden.

+1

gelöst Wenn Sie jede Eingabe erhalten möchten, wenden Sie sich bitte zeig uns, was du schon versucht hast. – mudasobwa

+0

okay, ich zeige Ihnen meinen Code – Nishtha

+0

aktualisiert meine Frage bitte siehe – Nishtha

Antwort

4

Sie können Array#combination verwenden.

Um alle Kombinationen zu erhalten:

input = "aabb" 
res = [] 
input.size.times { |n| res << input.chars.combination(n+1).map { |a| a.join } } 
res.flatten 
#=> ["a", "a", "b", "b", "aa", "ab", "ab", "ab", "ab", "bb", "aab", "aab", "abb", "abb", "aabb"] 

verschiedene Kombinationen:

res.flatten.uniq 
#=> ["a", "b", "aa", "ab", "bb", "aab", "abb", "aabb"] 

die Buchstaben zu zählen und eine Summierung tun:

res.flatten.uniq.map(&:size) 
#=> [1, 1, 2, 2, 2, 3, 3, 4] 
res.flatten.uniq.map(&:size).reduce(:+) 
# => 18 
+0

@mudasobwa meine Antwort aktualisiert. – shivam

+0

Okay, lass mich versuchen, dieses – Nishtha

+0

Ihre distinkte Kombination kommt richtig, aber die erste Kombination kommt nicht richtig – Nishtha

1

alle Teil Ihrer input Um (oder allgemeiner, um alle Subsequenzen eines Enumerable zu bekommen) können Sie so etwas wie folgt verwenden:

def subsequences(e) 
    a = e.to_a 
    indices = (0..a.length - 1).to_a 
    indices.product(indices) 
    .reject { |i, j| i > j } 
    .map { |i, j| a[i..j] } 
end 

Sie würden, dass, wie dies auf der Zeichenfolge verwenden: subsequences(input.chars).map(&:join). Die chars und join sind nur notwendig, weil String s nicht Enumerable sind, aber die subsequences Funktion benötigt das nicht wirklich. Sie können nur die erste Zeile herausnehmen und es sollte immer noch für Strings funktionieren (alles was einen "Slicing" Subscript Operator hat, wirklich ...).

Beachten Sie auch, dass dies nicht die einzige Möglichkeit ist, dies zu tun. Das grundlegende Problem besteht darin, über alle geordneten Paare von Indizes einer Sequenz zu iterieren. Sie könnten das auch mit einfachen Loops machen. Ich finde gerade die kartesische Produktmethode sehr elegant. ;)

Sobald Sie Ihre erste Liste in einer Variablen haben, sagen list, ist die zweite Aufgabe so einfach wie list.uniq, und die dritte von

list.map(&:size).reduce(:+) 
+0

was wird der Wert von e ??? das wird in der Funktion – Nishtha

+0

gegeben Wie ich schrieb: Für Ihren Anwendungsfall wäre es 'input.chars'. Im Allgemeinen kann es etwas sein, bei dem "Enumerable" eingemischt ist. Das einfachste Beispiel ist 'Array's, aber auch' Hash'es, obwohl ich nicht denke, dass dies für einen 'Hash' so nützlich ist. ;) (Eigentlich ist es noch allgemeiner, Ruby ist eine dynamisch typisierte Sprache: 'e' kann alles sein, was eine 'to_a'-Methode hat, die etwas zurückgibt, das einen tiefgestellten Operator hat, der mit Bereichen umgehen kann.) –