DEV Community

Discussion on: Daily Challenge #152 - Strongest Number in an Interval

Collapse
 
nickholmesde profile image
Nick Holmes • Edited

Don't write functions that already exist...

let strongestIn (n:int) (m:int) =
    seq {n..m} |> Seq.maxBy BitOperations.TrailingZeroCount

(F#)

Collapse
 
andreasjakof profile image
Andreas Jakof

Available since .NET Core 3.0 ... nice touch! Also in F# the Sequence generation is SO MUCH easier.
In C# you'd be better off with a simple for-loop.

public static long StrongestNumber(long start, long end)
{
   long strongestNum = 0;
   int bitCount = -1;
   for (long i = start; i<=end; ++i)
   {
       int currentBitCount = BitOperations.TrailingZeroCount(i);
       if (currentBitCount > bitCount)
       {
           bitCount = currentBitCount;
           strongestNum = i;
       }
   }
   return strongestNum;
}
Collapse
 
nickholmesde profile image
Nick Holmes

Well, my F# solution translated to C# would be something like this;

static int StrongestIn(int n, int m)
{
    return Enumerable.Range(n, (m-n))
        .Aggregate((a,b) => BitOperations.TrailingZeroCount(a) > BitOperations.TrailingZeroCount(b)
            ? a : b);
}

There is no built in "MaxBy" in the C#, so here I replaced it with an Aggregate. (The TrailingZeroCount method will use intrinsics (e.g. a CPU instruction) if its available, so I'm not worried about calling it repeatedly for the accumulator.)