Since the beginning of the month, I am visiting a course called Algorithms. As far as I have to work with one of the following languages – C#, C++, Java or Python and somehow Python is rather slow for such a course, I have decided to look back at the good old C# language.
The quest for the day was to make something called “Birthday range”. The idea is the following, e.g. this is the input:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public static void Main () { List liBirthdays = new List (new int[]{1,1,1,3,4,5,6,6,6,6,7,10,100,100,300,300,301}); List<list> liRanges = new List<list> { new List{1,100}, //14 new List{9,100}, //3 new List{100,100}, //2 new List{300,302}, //3 }; birthday_count(liBirthdays, liRanges); } |
You need to take a look at the list liBirthdays and to come up with a solution of how many people have birthdays in the range liRanges. A birthday may be any given value between 0 and 365. E.g., as you may see my comments, in the first range, between day 1 and day 100, the people with a birthday are 14 (each entry in the liBirthdays is a single person). In the second range (9-100), the result is 3. And in total it is 22, because some of the ranges overlap, so I count them once again.
It really seems trivial to be done. If you know how to do it or if you have a lot of experience in C#. Or probably both. 🙂
In my way, I have not written in this language for quite a long time (especially in Mint and in Ubuntu!), thus it was a challenge. The solution of the riddle is the following:
- We generate an object with Linq liOriginal, where we count the number of occurrences of each entry of liBirthdays;
- We generate a dictionary myDictionary, where we count the number of occurrences of a given date as value and the date as a key.
- The we come up with something, that I really like from the ABC analysis – cumulative calculation of all previous values. This calculation is stored for each value in a list liBirthdaysOrdered at the value position.
- At the end we take a look at the list of list (see the long way of initializing something like this in C#, compared to Python) liBirthdays and we start calculating how many of our people have birthdays in a given range.
- That is all, the last thing to do is to print the code! 🙂
Here comes the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
using System; using System.Collections.Generic; using System.Linq; class MainClass { public static void Main () { List liBirthdays = new List (new int[]{1,1,1,3,4,5,6,6,6,6,7,10,100,100,300,300,301}); List<list> liRanges = new List<list> { new List{1,100}, //14 new List{9,100}, //3 new List{100,100}, //2 new List{300,302}, //3 }; birthday_count(liBirthdays, liRanges); } public static void birthday_count(ListliBirthdays, List<list>liRanges) { Dictionary<int, int=""> myDictionary = new Dictionary<int,int> (); List liBirthdaysOrdered = new List (); List liBirthdaysSum = new List (); int iResult = 0; var liOriginal = liBirthdays.GroupBy (i => i); int iDays = 367; int zero = (int)0; int iSum = 0; foreach (var l in liOriginal) { myDictionary.Add (l.Key, l.Count ()); } for (int i = 0; i < iDays; i++) { if (myDictionary.TryGetValue (i, out zero)) { liBirthdaysOrdered.Add (myDictionary [i]); } else { liBirthdaysOrdered.Add (0); } } for (int i = 0; i < liBirthdaysOrdered.Count(); i++) { iSum += liBirthdaysOrdered [i]; liBirthdaysSum.Add (iSum); } foreach (var item in liRanges) { int iBottom = liBirthdaysSum [item [0]-1]; int iTop = liBirthdaysSum [item [1]]; int position = iTop - iBottom; iResult += position; } Console.WriteLine (iResult); } } |
Enjoy it and try to improve it! 🙂