Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get highest number from each row of a triangle and sum it up

Tags:

c#

I have below triangle of numbers which will be sent as parameter to a function

5
9 6
4 6 8
0 7 1 5

Now this will be received as string in below function with the format 5#9#6#4#6#8#0#7#1#5. So far I've tried to ripple only the digits from #

public class Sample
{
    public static string validtrianglesum(string input)
    {
        string sum="0";
        foreach(char num in input)
        {
            if(!num.Equals('#'))
            {
                Console.PrintLine(num); //here am getting only the nums excluding #
                //How to sum up based on each row
            }
        }
        return sum; //return 
    }
}

how could highest number from each row and sum them and how could I identify the rows to sum it up? Hope to find some help.

like image 359
CodeFreek Avatar asked Jan 26 '26 10:01

CodeFreek


2 Answers

Let's break this down as follows:

Firstly, turn the input into an array of numbers:

string input = "5#9#6#4#6#8#0#7#1#5";
var numbers = input.Split('#').Select(int.Parse).ToArray();

Now let's assume we have a MakeTriangular(int[]) method that turns an array of numbers into a sequence of rows with the first row being of length 1, the second of length 2 and so on, so that it returns IEnumerable<IEnumerable<int>>.

Then we can use that along with Linq to calculate the sum of the maximum value in each row as follows:

int sum = MakeTriangular(numbers).Sum(row => row.Max());

Which gives the answer.

The implementation of MakeTriangular() could look like this:

public static IEnumerable<IEnumerable<int>> MakeTriangular(int[] numbers)
{
    for (int i = 0, len = 1; i < numbers.Length; i += len, ++len)
        yield return new ArraySegment<int>(numbers, i, len);
}

Putting it all together into a compilable Console app:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    class Program
    {
        public static void Main()
        {
            string input = "5#9#6#4#6#8#0#7#1#5";
            var numbers = input.Split('#').Select(int.Parse).ToArray();
            int sum = MakeTriangular(numbers).Sum(row => row.Max());
            Console.WriteLine(sum);
        }

        public static IEnumerable<IEnumerable<int>> MakeTriangular(int[] numbers)
        {
            for (int i = 0, len = 1; i < numbers.Length; i += len, ++len)
                yield return new ArraySegment<int>(numbers, i, len);
        }
    }
}
like image 67
Matthew Watson Avatar answered Jan 27 '26 23:01

Matthew Watson


Summing up all values in each row:

private static IEnumerable<int> Sum(string input)
{
    int i = 0, s = 0, z = 1;
    foreach (var v in input.Split('#').Select(int.Parse))
    {
        s += v;
        if (++i != z) continue;
        z++;
        yield return s;
        s = i = 0;
    }
}

The same in one line:

private static IEnumerable<int> Sum(string input) => new Func<int, int, IEnumerable<int>>((i, z) => input.Split('#').Select(int.Parse).GroupBy(e => i++ == z && (i = 1) != null ? ++z : z, e => e).Select(e => e.Sum()))(0, 1);

Summing up all the highest values in each row:

private static int Sum(string input)
{
    int i = 0, s = 0, z = 1, m = 0;
    foreach (var v in input.Split('#').Select(int.Parse))
    {
        if (v > m) m = v;
        if (++i != z) continue;
        z++;
        s += m;
        i = m = 0;
    }
    return s;
}

Same in one line:

private static int Sum(string input) => new Func<int, int, int>((i, z) => input.Split('#').Select(int.Parse).GroupBy(e => i++ == z && (i = 1) != null ? ++z : z, e => e).Select(e => e.Max()).Sum())(0, 1);

I am returning the sums as IEnumerable<int> and with the yield return. If you just want to print out the answers change the return type to void and remove the yield return s; line.

like image 21
a-ctor Avatar answered Jan 28 '26 00:01

a-ctor



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!