2016-07-21 6 views
3

Gegeben zwei Münzen, die Anzahl der Ergebnisse wird 2^2 (zwei Münzen mit nur zwei Möglichkeiten (Kopf (nach oben) . oder Schwanz (unten)) gibt die folgenden möglichen Kombinationen:.Wie man alle möglichen Kombinationen von zwei Münzen mit drei Möglichkeiten (oben, unten und dazwischen) generiert

00 
01 
10 
11 

Wo, 0 Kopfmittel (oben) und 1 bedeuten Schwanz (nach unten)

Hier ist der Code der bisherigen Kombinationen drucken:

for n=1:2^2 
r(n) = dec2bin(n); 
end 

Ich möchte alle möglichen Kombinationen für die gleichen zwei Münzen drucken, aber mit drei verschiedenen Möglichkeiten (Kopf (oben), Schwanz (unten) und dazwischen (nicht oben oder unten)) Etwas geben wie:

00 
01 
10 
11 
0B 
B0 
B1 
1B 
BB 

Wo, B bedeutet eine der beiden Münzen ist Dazwischen (nicht nach oben oder unten)

Irgendwelche Ideen?

+1

Bitte wählen Sie eine Sprache, nicht eine Liste von ihnen. – PaulMcKenzie

+0

Ich frage nach Ideen mit einer dieser 4 Sprachen. Ich kann jede der vier Sprachen verwenden, für den Fall, dass jemand in der Nähe ist, der die Lösung kennt, aber einen von diesen vier verwendet. Danke für Ihre Nachricht. Hoffe dir einen schönen Tag. –

+0

In Matlab können Sie [this] (http://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n-vectors) mit Eingabe 'Vektoren verwenden = {[0 1 2] [0 1 2]} 'oder' Vektoren = {'01B' '01B'} ' –

Antwort

2

Python Lösung:

from itertools import product 

possible_values = '01B' 
number_of_coins = 2 

for result in product(possible_values, repeat=number_of_coins): 
    print(''.join(result)) 

# Output: 
# 00 
# 01 
# 0B 
# 10 
# 11 
# 1B 
# B0 
# B1 
# BB 
+0

Das war sehr schnell. Es funktioniert gut. Danke vielmals. –

1
from itertools import product 

outcomes = ["".join(item) for item in list(product('01B', repeat=2))] 
for outcome in outcomes: 
    print(outcome) 
#reusults: 
00 
01 
0B 
10 
11 
1B 
B0 
B1 
BB 
1

Matlab Lösung: n ist die Menge der möglichen Lösungen. In deinem Fall 3 mal anders. k ist die Menge der Sätze. In deinem Fall 2 Münzen. sollte eine Matrix mit den Ergebnissen enthalten.

n = 3; k = 2; 
nk = nchoosek(1:n,k); 
p=zeros(0,k); 
for i=1:size(nk,1), 
    pi = perms(nk(i,:)); 
    p = unique([p; pi],'rows'); 
end 

Weitere Lösungen überprüfen: Possible combinations - order is important

+0

Danke Colden, aber dieser Code bietet nicht alle Kombinationen, es funktioniert gut, aber immer noch ein Drittel der Kombinationen fehlt. –

1

ich mehrere Lösungen für MATLAB gefunden. (Das ist nicht ganz mein Code, ich habe ein paar Teile gefunden und angepasst). Poste es, weil @C.Colden' answer nicht voll ist. Was Sie erreichen möchten, ist ein permutations with repetitions. C.Colden zeigt es ohne Wiederholungen. So können Sie diesen Weg gehen:

Lösung 1:

a = [1 2 3] 
n = length(a) 
k = 2 
for ii = k:-1:1 
    temp = repmat(a,n^(k-ii),n^(ii-1)); 
    res(:,ii) = temp(:); 
end 

Ergebnis:

res = 

1  1 
1  2 
1  3 
2  1 
2  2 
2  3 
3  1 
3  2 
3  3 

und interessante Lösung 2 wenn Sie es in String-Form:

dset={'12b','12b'}; 
n=numel(dset); 
pt=[3:n,1,2]; 
r=cell(n,1); 
[r{1:n}]=ndgrid(dset{:}); 
r=permute([r{:}],pt); 
r=sortrows(reshape(r,[],n)); 

Ergebnis:

+1

Vielen Dank Mikhail, das war wirklich hilfreich. Die zwei Lösungen funktionieren großartig und es ist wirklich gut. Danke vielmals. –

0

Zugegeben, ich bin nicht vertraut mit der Syntax dieser anderen Sprachen, die Lösungen für sie sehen übermäßig kompliziert aus.

Es ist nur eine einfache doppelt verschachtelte for Schleife:

C++

#include <iostream> 
using namespace std; 

int main() 
{ 
    const char* ch = "01B"; 
    for (int i = 0; i < 3; ++i) 
    { 
     for (int j = 0; j < 3; ++j) 
      cout << ch[i] << ch[j] << '\n'; 
    } 
} 

Ausgang:

00 
01 
0B 
10 
11 
1B 
B0 
B1 
BB 
+0

Hallo Paul, Danke für die Freigabe des Codes. Ja, Ihre Lösung ist sehr einfach, aber es funktioniert nur, wenn Sie nur zwei Münzen haben (dargestellt durch zwei verschachtelte Schleifen), was genau der Fall in dieser Frage ist, aber die anderen von den Gentles bereitgestellten Codes haben die Möglichkeit, alle zu drucken die Kombination für eine beliebige Anzahl von Münzen und es ist auch einfach. Hoffen Sie einen schönen Tag! –