Вот быстрый.Интересно, что он все равно должен быть довольно эффективным, поскольку он повторяет термины только один раз.Он может работать только с числами от 0 до 255 ...
array_shift($argv);
$str = str_repeat(chr(0), 256);
foreach ($argv as $key => $element) {
$str[(int) $element] = chr($key + 1);
}
$str = str_replace(chr(0), '', $str);
$hex = unpack('H*', $str);
for ($i = 1; $i < strlen($str); $i++) {
if (substr($hex[1], $i * 2 - 2, 2) != dechex($a)) {
echo "False\n";
die();
}
}
echo "True\n";
Он работает путем инвертирования строки (1 2 5 4
становится 1 2 0 4 3
, другими словами, число в последовательности становится ключом врезультат, и позиция в последовательности становится значением. Тогда все, что нам нужно проверить, это то, что 1
находится в положении 1
.
И в том же духе (та же теория, только теория множествоперации):
array_shift($argv);
$vals = array_flip($argv);
ksort($vals);
echo array_values($vals) == range(0, count($vals) - 1) ? "True\n" : "False\n";