Skip to content

Instantly share code, notes, and snippets.

@laacz

laacz/endijs.php Secret

Last active August 29, 2015 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save laacz/10423b5c3cabef780494 to your computer and use it in GitHub Desktop.
Save laacz/10423b5c3cabef780494 to your computer and use it in GitHub Desktop.
<?php
/**
* @param array $names Masīvs ar visiem dalībniekiem. Piemēram, ['a', 'b', 'c', 'd']
* @param array $exclusions Masīvs ar masīviem, kuros ir pāri, kuri nedrīkst tikt izlozēti. Secība nav būtiska.
* Piemēram, [['a', 'b'], ['b', 'c']]
* @return array|bool Vai nu pāris, vai false, ja pāri izveidot neizdodas.
*/
function make_pair(Array $names, Array $exclusions = []) {
// Strādājam, kamēr ir ar ko strādāt.
while ($names) {
// Pirmais veiksminieks.
$first = $names[rand(0, count($names) - 1)];
// Taisām šōrtlistu ar iespējamajiem paŗiem, kuri ietver veiksminieku.
$shortlist = array_values(array_filter($names, function($name) use ($exclusions, $first) {
if ($name == $first) return false;
if (in_array([$name, $first], $exclusions, true)) return false;
if (in_array([$first, $name], $exclusions, true)) return false;
return true;
}));
// Ja nu gadījumā neveiksmīga pāra pirmā puse (tāda, kura nevar būt nevienā pārī, īsinām kandidātu sarakstu).
if (!$shortlist) {
$index = array_search($first, $names);
unset($names[$index]);
$names = array_values($names);
continue;
}
// No šōrtlista atlasām otro pusīti.
$second = $shortlist[rand(0, count($shortlist) - 1)];
// Darīts, lieta cepurē.
return [$first, $second];
}
}
$participants = ['a', 'b', 'c', 'd'];
$exclusions = [['a', 'b'], ['c', 'd'], ['b', 'c'], ['a', 'c'], ['b', 'd']];
if ($pair = make_pair($participants, $exclusions)) {
echo "{$pair[0]} dāvina dāvanu {$pair[1]}\n";
} else {
echo "Atbilstoši nosacījumiem pāri izveidot neizdvās.\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment