<?php
$closestRadix = function(int $num) : int {
$index = floor(log($num, 10));
$nextMag = 10**($index+1);
return $nextMag - $num > $nextMag / 2 ? $index: $index + 1;
};
$numDigits = function(int $num) : int {
return floor(log($num, 10)) + 1;
};
$isEven = function(int $num) : bool {
return $num % 2 == 0;
};
$isEvenNumberOfDigits = function(int $num) : bool {
return $isEven($numDigits($num));
};
$mirror = function(int $num, bool $parityCase = false) : int {
echo $num . "\n";
return (int)($parityCase ? substr((string)$num, 0, -1) : (string)$num . strrev((string)$num));
};
$halves = function(int $num) use ($isEvenNumberOfDigits, $numDigits) : array {
$digitsPerHalf = $isEvenNumberOfDigits ? $numDigits($num)/2 : ceil($numDigits($num)/2);
echo $digitsPerHalf;
return [
substr((string)$num, 0, $digitsPerHalf),
substr((string)$num, $digitsPerHalf, $digitsPerHalf)
];
};
$nextPalindrome = function(int $num) use ($halves, $mirror) : int {
print_r($halves($num));
$smallestHalf = min($halves($num));
echo $smallestHalf . "\n";
return $halves($num)[0] == $smallestHalf ? $mirror($halves($num)[0])+1 : $mirror($halves($num)[1]);
};
echo $nextPalindrome(110);
?>
===
110
120 -> 121
999
1312
1314 -> 1331
121
131
191
202
1221
3113
9999
preferences:
50.65 ms | 402 KiB | 5 Q