str_prev.php:
<?php
function str_prev($str) {
$chars = str_split($str);
$nb_chars = strlen($str);
$ret = true;
for ($i = $nb_chars-1; $i >= 0; --$i) {
if ($chars[$i] === 'a') {
$chars[$i] = 'z';
} else {
$chars[$i] = chr(ord($chars[$i]) - 1);
$ret = false;
break;
}
}
if ($ret)
$chars[$nb_chars-1] = '';
return implode('', $chars);
}
$tests = array(
[ 'a', '' ],
[ 'b', 'a' ],
[ 'z', 'y' ],
[ 'aa', 'z' ],
[ 'ab', 'aa' ],
[ 'az', 'ay' ],
[ 'ba', 'az' ],
[ 'ca', 'bz' ],
[ 'aaa', 'zz' ],
[ 'aba', 'aaz' ],
[ 'abb', 'aba' ],
[ 'cha', 'cgz' ],
[ 'zhuwncha', 'zhuwncgz' ],
);
foreach ($tests as $t) {
$prev = str_prev($t[0]);
if ($prev === $t[1]) {
print "str_prev('$t[0]') -> '$prev' : correct\n";
} else {
print "str_prev('$t[0]') -> '$prev' : wrong, should have been $t[1]\n";
}
}
?>
$ php str_prev.php
str_prev('a') -> '' : correct
str_prev('b') -> 'a' : correct
str_prev('z') -> 'y' : correct
str_prev('aa') -> 'z' : correct
str_prev('ab') -> 'aa' : correct
str_prev('az') -> 'ay' : correct
str_prev('ba') -> 'az' : correct
str_prev('ca') -> 'bz' : correct
str_prev('aaa') -> 'zz' : correct
str_prev('aba') -> 'aaz' : correct
str_prev('abb') -> 'aba' : correct
str_prev('cha') -> 'cgz' : correct
str_prev('zhuwncha') -> 'zhuwncgz' : correct