Vediamo... le righe possono essere processate indipendentemente, quindi prendiamo una riga di M', che riporta true o false se il giocatore ha vinto/perso ciascuna manche:
Codice PHP:
$row = [true, true, true, false, true, true, false];
questo vettore va trasformato in uno che riporti la serie di vittore consecutive al termine di ogni manche, quindi il risultato desiderato è:
Codice PHP:
$series = [1, 2, 3, 0, 1, 2, 0];
L'idea è di scorrere il vettore, incrementando di uno ogni volta che si incontra una vittoria, ed azzerando quando si incontra una sconfitta:
Codice PHP:
function compute_series(array $row) {
$series = array();
$series[0] = $row[0] ? 1 : 0;
for ($i = 1; $i < count($row); ++$i) {
if ($row[$i]) {
$series[$i] = $series[$i - 1] + 1;
} else {
$series[$i] = 0;
}
// For one-liners: $series[$i] = $row[$i] ? ($series[$i - 1] + 1) : 0;
}
return $series;
}
Se M' è rappresentata per righe, ad esempio:
Codice PHP:
$M_prime = [
'player1' => [true, true, false, ..., false],
'player2' => [false, false,true, ..., true],
...
'playerN' => [false, true, false, ..., false]
]
si può sfruttare l'indipendenza tra le righe ed usare array_map:
Codice PHP:
$M_second = array_map('compute_series', $M_prime);
Se l'occupazione in memoria è un problema (O(n * m)) sono quasi sicuro si possa trasformare in una versione con programmazione dinamica (O(n)).