Suppose we want to generate image of spiral by printing line by line.
You are given natural number , where denotes sidelength of spiral (number of lines).
For example, for , program must display following figure on the console:
# # # # # # # # # #
#
# # # # # # # # #
# # #
# # # # # # #
# # # # #
# # # # # #
# # # #
# # # # # # # #
# #
# # # # # # # # # #
Interestingly enough, this is not as simple as it might seem, especially, when you can only use string concatenation (and not use any arrays, lists, etc).
The main implementation idea is to split the figure into two parts:
- Upper
# # # # # # # # # #
#
# # # # # # # # #
# # #
# # # # # # #
# # # # #
- Lower
# # # # # #
# # # #
# # # # # # # #
# #
# # # # # # # # # #
Now we can see some repetitive matter. For upper part, we first print first two outlier-lines and then for every next line we increase size of beginning and end string and the toggling middle repetitive part gets decreased. For lower part, for each line we generate decreasing beginning and end strings and increase toggling middle part.
String finalstr = " #";
System.out.println("#" + " #".repeat(n - 2));
System.out.println(" " + " ".repeat(n - 4) + finalstr);
String beg = "", end = "";
for(int i = 0; i < (n - 3) / 2; ++i){
if(i % 2 == 0){
System.out.println(beg + "# ".repeat(n - 4 - 2 * i) + "#" + end + finalstr);
beg += "# ";
end = " #" + end;
} else{
System.out.println(beg + " ".repeat(n - 4 - 2 * i) + " " + end + finalstr);
beg += " ";
end = " " + end;
}
}
for(int i = 0; i < n / 2; ++i){
String beg = "", end = "#";
for(int j = 0; j < n / 2 - 1 - i; ++j){
if(j % 2 == 0){
beg += "# ";
end = "# " + end;
} else {
beg += " ";
end = " " + end;
}
}
if(i == n / 2 - 1){
System.out.println("# ".repeat(2 * (n / 2) - 2 + n % 2) + "#");
} else if(i % 2 != n / 2 % 2){
System.out.println(beg + "# ".repeat(2 * i + 1 + n % 2) + end);
} else{
System.out.println(beg + " ".repeat(2 * i + 1 + n % 2) + end);
}
}