import std.stdio;
import std.string;
import std.algorithm;
import std.ascii; // isLower()
string inc_string(const string s) pure
{
assert(s.all!(isLower), "the input must be a lowercased string");
//
char[] chars = s.dup;
chars.reverse;
bool carry = true;
// dfmt off
foreach (ref c; chars)
{
if (!carry) {
break;
}
// else:
if (carry) {
c += 1;
carry = false;
}
if (c > 'z') {
c = 'a';
carry = true;
}
}
if (carry) {
chars ~= 'a';
}
chars.reverse;
// dfmt on
return chars.idup;
}
void main()
{
writeln(inc_string("aa")); // ab
// writeln(inc_string("aa1")); // error
// writeln(inc_string("aBc")); // error
}
unittest
{
assert(inc_string("a") == "b");
assert(inc_string("z") == "aa");
assert(inc_string("aa") == "ab");
assert(inc_string("am") == "an");
assert(inc_string("az") == "ba");
assert(inc_string("ba") == "bb");
assert(inc_string("bz") == "ca");
assert(inc_string("zz") == "aaa");
assert(inc_string("zza") == "zzb");
assert(inc_string("zzz") == "aaaa");
assert(inc_string("aaaz") == "aaba");
}