- it either requires loops or ranges (both haven't explained before)
- it requires casting (or knowing how to omit that by defining to char variables)
- it requires knowledge about ASCII (which we would at least have to explain)
- it's non-idiomatic D, because we usually do stuff lazily
That being said, here's my "idiomatic" solution:
import std.array: array;
import std.algorithm: map;
return input.map!((x) => cast(char) (((x - 97) + shift) % 26 + 97)).array;