Ali Çehreli:

This is a somewhat common little exercise: Write a function that takes the size of a diamond and produces a diamond of that size.

When printed, here is the output for size 11:

     *
    ***
   *****
  *******
 *********
***********
 *********
  *******
   *****
    ***
     *

Some of my solutions (using each() in the last two is easy):

import std.stdio, std.array, std.string, std.range, std.algorithm, std.math;

void printDiamond1(in uint n) {
    immutable k = (n % 2 == 1) ? 1 : 2;

    for (int i = k; i <= n; i += 2)
        writeln("*".replicate(i).center(n));

    for (int i = n - 2; i >= k; i -= 2)
        writeln("*".replicate(i).center(n));
}

void printDiamond2(in int n) {
    iota(!(n % 2), n)
    .map!(i => "*"
.replicate((n % 2) + ((n / 2) - abs(i - (n / 2))) * 2)
               .center(n))
    .join("\n")
    .writeln;
}

void printDiamond3(in int n) {
    writefln("%-(%s\n%)",
             iota(!(n % 2), n)
             .map!(i => "*"
.replicate((n % 2) + ((n / 2) - abs(i - (n / 2))) * 2)
                        .center(n)));
}

void main() {
    foreach (immutable i; 0 .. 15) {
        printDiamond3(i);
        writeln;
    }
}


Output:


*

**

 *
***
 *

 **
****
 **

  *
 ***
*****
 ***
  *

  **
 ****
******
 ****
  **

   *
  ***
 *****
*******
 *****
  ***
   *

   **
  ****
 ******
********
 ******
  ****
   **

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

    **
   ****
  ******
 ********
**********
 ********
  ******
   ****
    **

     *
    ***
   *****
  *******
 *********
***********
 *********
  *******
   *****
    ***
     *

     **
    ****
   ******
  ********
 **********
************
 **********
  ********
   ******
    ****
     **

      *
     ***
    *****
   *******
  *********
 ***********
*************
 ***********
  *********
   *******
    *****
     ***
      *

      **
     ****
    ******
   ********
  **********
 ************
**************
 ************
  **********
   ********
    ******
     ****
      **


Bye,
bearophile

Reply via email to