Home > Blockchain >  C# return string in Sine-Wave format
C# return string in Sine-Wave format

Time:09-10

I'm trying to create a function which will return string in Triangle Sine-Wave format:

enter image description here

but currently, my format is only in Wave format:

enter image description here

Code below:

 public static void printWave(string str)
    {
        int height = 3;
        // Get length of the string
        int len = str.Length;

        // Create a 2d character array
        char[,] matrixArray = new char[height, len];
        char[] charArray = str.ToCharArray();
        
        // for counting the
        // rows of the ZigZag
        int row = 0;
        bool down = true;

        for (int i = 0; i < len; i  )
        {
            
            // put characters
            // in the matrix
            matrixArray[row, i] = charArray[i];

            // You have reached the bottom
            if (row == height - 1)
                down = false;
            else if (row == 0)
                down = true;

            if (down)
                row  ;
            else
                row--;
        }

        // Print the Zig-Zag String
        for (int i = 0; i < height; i  )
        {
            for (int j = 0; j < len; j  )
            {
                Console.Write(matrixArray[i, j]   " ");
            }
            Console.Write("\n");
        }
    }

Can you please help me modify my code to it will return triangle sin wave format?

CodePudding user response:

We can use 3 separate StringBuilders to append to depending on our boolean top and a simple even value comparison. A quick TL;DR is that anything at an even index goes in the middle row, and then we flip between appending to the top or bottom row:

public static void printWave(string str)
{
    //for use to determine top or bottom StringBuilder
    bool top = true;

    //will be used to generate each row of the output
    StringBuilder topString = new StringBuilder();
    StringBuilder middleString = new StringBuilder();
    StringBuilder bottomString = new StringBuilder();

    //iterate through paramter string
    for (int i = 0; i < str.Length; i  )
    {
        //if char is at an even index, it goes in the middle StringBuilder, blank spaces in top and bottom builders
        if (i%2 == 0)
        {
            topString.Append(" ");
            middleString.Append(str[i]);
            bottomString.Append(" ");
        }
        //if not even index, determine top or bottom row
        else
        {
            //simply check our boolean and then flip it after use
            if (top)
            {
                topString.Append(str[i]);
                middleString.Append(" ");
                bottomString.Append(" ");
                top = false;
            }
            else
            {
                topString.Append(" ");
                middleString.Append(" ");
                bottomString.Append(str[i]);
                top = true;
            }
        }
    }

    //write each row of strings on new lines
    Console.WriteLine(topString.ToString());
    Console.WriteLine(middleString.ToString());
    Console.WriteLine(bottomString.ToString());
}

For a variable height:

public static void printWave(string str)
{
    //height we want the wave to reach
    int height = 5;

    //determine "middle" row
    int startingRow = height / 2;
    int currentRow = startingRow; //this one is for modifying inside loop

    bool up = true;

    //2D array to hold the rows
    char[,] arr = new char[height, str.Length];

    for (int i = 0; i < str.Length; i  )
    {
        for (int j = 0; j < height; j  )
        {
            if (j == currentRow)
            {
                arr[j, i] = str[i];
            }
            else
                arr[j, i] = ' ';
        }

        //could probably break this into more digestible pieces if time to think about it
        if (up)
        {
            if (currentRow == 0)
            {
                up = false;
                currentRow  ;
            }
            else
            {
                currentRow--;
            }
        }
        else
        {
            if (currentRow == height - 1)
            {
                up = true;
                currentRow--;
            }
            else
            {
                currentRow  ;
            }
        }
    }

    for (int k = 0; k < height; k  )
    {
        for (int l = 0; l < str.Length; l  )
        {
            Console.Write(arr[k, l]);
        }

        Console.WriteLine();
    }
}

Examples of height = 5 and height = 6 output:

height = 5

height = 6

And finally, height = 7

height = 7

CodePudding user response:

This version works, but it's hard-coded to just the 3 rows like the question shows. If larger waves are needed, or especially if the size of the wave depends on the input string, then this may be hard to adjust to the requirements.

public static void PrintWave(string str)
{
    printWithRowLogic(str, (i) => (i - 1) % 4 == 0);
    Console.WriteLine();
    printWithRowLogic(str, (i) => i % 2 == 0);
    Console.WriteLine();
    printWithRowLogic(str, (i) => (i - 3) % 4 == 0);
}
    
private static void printWithRowLogic(string str, Func<int, bool> checkLogic)
{
    for (int i = 0; i < str.Length; i  )
        Console.Write(checkLogic(i) ? str[i] : ' ');
}
  • Related