РЕДАКТИРОВАТЬ: Обновлено с использованием новых алгоритмов Gnovices (всего 3 верно? Вы использовали filter (), теперь вы используете conv2 ()).
Новые числа:
Apus B3 B3 Gnovice
Old New Orig Conv Index
Player One Wins: 97 197 91 97 97 97
Player Two Wins: 102 181 114 102 118 118
Both Players Win: 16 0 0 16 0 0
Neither Player Win: 785 622 795 785 785 785
Execution Time: 0.081 0.037 0.144 0.317 0.068 0.036
Это было слишком весело, чтобы сопротивляться.Без B3 и кода Gnovice мой был бы пронизан ошибками.Насколько я могу судить, код Гновице, похоже, имеет 100% точность.B3 представил две функции: первая ложно присуждается победителю, если было 4 подряд, пробел и еще одна.Вторая запись B3 не может определить победителя по диагонали сверху справа внизу слева.B3 также не принял во внимание случай, когда оба игрока имеют выигрышные позиции.(Как я понимаю в игре, вращение квадранта может привести к тому, что оба игрока выиграют сразу?)
Вот список из 1000 случайных досок.
Apus B3 B3 Gnovice
Player One Wins: 106 207 104 106
Player Two Wins: 103 180 105 103
Both Players Win: 6 0 0 6
Neither Player Win: 785 613 791 785
Execution Time: 0.082 0.037 0.146 0.322
Гновице был первымдостиг 100% точности, но пришел в самый высокий момент исполнения.B3, возможно, может изменить свой код, чтобы исправить ошибки, а затем получить самый быстрый код.И я, вероятно, мог бы получить жизнь вместо гонок, соединяя 4 кода друг с другом.
Вот мой код:
function winner = testboard_apus(board)
answersheet1 = true(6,6);
answersheet1(6,:) = false(1,6);
answersheet2 = true(6,6);
answersheet2(1,:) = false(1,6);
winner = 0;
for player = 1:2
if any(sum((board==player) & answersheet1)==5) ||...
any(sum((board==player) & answersheet2)==5) ||...
any(sum((board'==player) & answersheet1)==5) ||...
any(sum((board'==player) & answersheet2)==5) ||...
all(diag(board(1:5,1:5))==player) ||...
all(diag(board(2:6,2:6))==player) ||...
all(diag(board(1:5,2:6))==player) ||...
all(diag(board(2:6,1:5))==player) ||...
all(diag(board(1:5,5:-1:1))==player) ||...
all(diag(board(2:6,6:-1:2))==player) ||...
all(diag(board(1:5,6:-1:2))==player) ||...
all(diag(board(2:6,5:-1:1))==player)
winner = winner + player;
end
end
end
Вот код драйвера
function testboard_wrapper
total = zeros(4,1);
agree = false(1000,1);
winner = zeros(1000,4);
for i = 1:1000
board = floor(rand(6)*3);
t(1) = tic;
winner(i,1) = testboard_apus(board);
total(1) = total(1)+toc(t(1));
board2 = board;
board2(board2==2) = -1;
t(2) = tic;
winner(i,2) = testboard_b3(board2);
total(2) = total(2)+toc(t(2));
t(3) = tic;
winner(i,3) = testboard_b3_2nd(board2);
total(3) = total(3)+toc(t(3));
t(4) = tic;
winner(i,4) = testboard_gnovice(board2);
total(4) = total(4)+toc(t(4));
agree(i) = all(winner(i,:)==0) || all(winner(i,:)==1) || all(winner(i,:)==2) ||all(winner(i,:)==3);
end
fprintf(' Apus B3 B3 Gnovice\n')
fprintf('Player One Wins: %5i %5i %5i %5i \n',sum(winner==1))
fprintf('Player Two Wins: %5i %5i %5i %5i \n',sum(winner==2))
fprintf('Both Players Win: %5i %5i %5i %5i \n',sum(winner==3))
fprintf('Neither Player Win: %5i %5i %5i %5i \n',sum(winner==0))
fprintf('Execution Time: %1.3f %1.3f %1.3f %1.3f \n',total)
end
К вашему сведению B3 - это пример платы, которую ваш код не смог обнаружить.
0 0 0 0 0 2
1 0 1 0 2 0
1 2 1 2 1 0
1 1 2 2 1 0
0 2 2 0 0 2
1 1 0 0 1 1
а также
0 2 2 2 0 2
1 2 1 2 1 1
0 0 2 0 0 2
2 0 1 2 0 0
2 0 1 0 2 0
1 0 1 1 1 2