Как создать все возможные комбинации из двух монет с тремя возможностями (вверх, вниз и между ними)

Учитывая две монеты, количество результатов будет 2 ^ 2 (две монеты только с двумя возможностями (голова (вверх) или хвост (вниз)). Дает следующие возможные комбинации:

 00
01
10
11

Куда, 0 означает голову (вверх) и 1 означает хвост (вниз).

Вот код для печати предыдущих комбинаций:

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

Я хочу напечатать все возможные комбинации для одних и тех же монет, но с тремя разными возможностями (голова (вверх), хвост (вниз) и между ними (не вверх или вниз))
Чтобы дать что-то вроде:

00
01
10
11
0B
B0
B1
1B
BB

Куда, B означает, что одна из двух монет находится между (не вверх или вниз)

Есть идеи?

2

Решение

Решение Python:

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
2

Другие решения

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:
n количество возможных решений. В вашем случае 3 разных раза. k это количество комплектов. В вашем случае 2 монеты. pдолжен содержать матрицу с результатами.

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

Для большего количества решений проверьте: Возможные комбинации — порядок важен

1

Я нашел несколько решений для MATLAB. (Это не совсем мой код, я нашел некоторые части и адаптировал его). Разместите это, потому что @ C.Colden ‘ответ не полный
То, что вы хотите достичь, это перестановки с повторениями. К. Колден показывает это без повторов. Таким образом, вы можете пойти по этому пути:

Решение 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

Результат:

res =

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

И интересно Решение 2 если вам это нужно в виде строки:

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));

Результат:

r =

11
12
1b
21
22
2b
b1
b2
bb
1

Конечно, я не знаком с синтаксисом этих других языков, их решения выглядят слишком сложными.

Это просто двойная вложенность for цикл:

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';
}
}

Выход:

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