Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Friday's Coding Challenge

Friday's Coding Challenge

Scheduled Pinned Locked Moved The Lounge
c++architectureperformancehelplounge
76 Posts 35 Posters 6 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • C Chris Maunder

    What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

    cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

    S Offline
    S Offline
    Single Step Debugger
    wrote on last edited by
    #51

    void Test()
    {
    int arr[] = {1, 4, 6, 8, 9};
    int nNumToGet = 3;

    int \*arr2 = ReturnLowerN(arr, sizeof(arr)/sizeof(int), nNumToGet);
    

    }

    int* ReturnLowerN(int *arr, int arrSize, int nNum)
    {
    std::sort(arr, arr + 5, std::greater<int>());

    return(arr + arrSize - nNum);
    

    }

    Of course if you want to use qsort instead, here is an article from someone you may know. :-D Using qsort on arrays of sequential data[^]

    There is only one Vera Farmiga and Salma Hayek is her prophet! Advertise here – minimum three posts per day are guaranteed.

    1 Reply Last reply
    0
    • B BobJanova

      Well, if not, it is obviously possible to invent a language where one symbol does this operation :P. Since "sort and take" seems to be how to do it, it would be easy to conceive of a language where putting two symbols for "take" and "sort" next to each other would create a composite function that did it, making two characters the sensible theoretical minimum.

      D Offline
      D Offline
      Daniel Grunwald
      wrote on last edited by
      #52

      BobJanova wrote:

      Well, if not, it is obviously possible to invent a language where one symbol does this operation

      Why one symbol? If you're inventing a new language, you might as well invent one where the empty program solves this challenge.

      1 Reply Last reply
      0
      • C Chris Maunder

        The hamsters have asked for an end to the rumours and baseless allegations of alleged behaviour during certain incidents. The hamsters involved are currently taking some time off to spend more time with their families.

        cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

        R Offline
        R Offline
        Roger Wright
        wrote on last edited by
        #53

        I wasn't aware that the Betty Ford Clinic has a hamster wing. How very nice. I hope they enjoy the rest. :-D

        Will Rogers never met me.

        1 Reply Last reply
        0
        • B BobJanova

          APL:

          f←{⍺↑⍵⌷⍨⍋⍵}

          call like

          n f (sample vector)

          eg

          f←{⍺↑⍵⌷⍨⍋⍵}
          {f}
          xx←20?30 // 20 different ints in 1-30
          (23 28 14 12 10 8 15 3 2 7 26 4 20 29 24 30 25 18 21 27)
          10 f xx // smallest 10 values in xx
          (2 3 4 7 8 10 12 14 15 18)

          This is in my personal dialect since I don't have a licensed major APL on this machine, but the function is essentially the same in normal variants.

          L Offline
          L Offline
          Luc Pattyn
          wrote on last edited by
          #54

          I was thinking about APL too. It has been over 30 years I touched it though. :)

          Luc Pattyn [My Articles] Nil Volentibus Arduum

          1 Reply Last reply
          0
          • C Chris Maunder

            What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

            cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

            Y Offline
            Y Offline
            YvesDaoust
            wrote on last edited by
            #55

            My attempt in plain C:

            for (i= 0; i < m; i++)
            {
            int r= 0;
            for (j= 0; j < m; j++)
            r+= a[j] < a[i];
            if (r < n)
            printf("%d\n", a[i]);
            }

            It simply evaluates the rank of every element. Unfortunately, this method cannot meet the specs in case of equal elements. Actually, it reports all elements with rank less than n.

            1 Reply Last reply
            0
            • C Chris Maunder

              What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

              cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

              Y Offline
              Y Offline
              YvesDaoust
              wrote on last edited by
              #56

              Slightly modified Straight Selection Sort will do the trick (moves n lowest elements first):

              for (int i= 0; i < n; i++)
              {
              int k = i;
              for (int j= i; j < m; j++)
              {
              if (a[k] > a[j])
              {
              k = j;
              }
              }

              int swap= a\[i\]; a\[i\]= a\[k\]; a\[k\]= swap;
              

              }

              IMHO, allowing function calls makes the challenge nonsensical, as the solutions reduces to S(a, m, n), where S is the function that does just that.

              T 1 Reply Last reply
              0
              • C Chris Maunder

                What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                Y Offline
                Y Offline
                YvesDaoust
                wrote on last edited by
                #57

                If you don't care about time, sort the whole array and parameter n is virtually useless !

                S(a, m); // Solution in a[0..n-1]

                where S stands for some sorting algorithm on an array. Slightly shorter in Python, assuming a has length m:

                S(a) # Solution in a[0..n-1]

                1 Reply Last reply
                0
                • C Chris Maunder

                  What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                  cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                  G Offline
                  G Offline
                  George Danila
                  wrote on last edited by
                  #58

                  var nSmallestNumbers = numbers.OrderBy(x => x).Take(n);

                  1 Reply Last reply
                  0
                  • G Gary Wheeler

                    You win the "We Can't Judge Your Submission Because It's Incomprehensible" award.

                    Software Zen: delete this;

                    B Offline
                    B Offline
                    BobJanova
                    wrote on last edited by
                    #59

                    Thanks but it's actually simple and the same as everyone else's:

                    f←{
                    sorted←⍵⌷⍨⍋⍵; // sorts the right argument
                    ⍺↑sorted // first n items (n = left argument)
                    }

                    1 Reply Last reply
                    0
                    • C Chris Maunder

                      What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                      cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                      U Offline
                      U Offline
                      User 8615306
                      wrote on last edited by
                      #60

                      maybe in F# (doesn't check if n < X.Length): let nsmallest X n = (Array.sort X).[0..(n-1)]

                      1 Reply Last reply
                      0
                      • C Chris Maunder

                        What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                        cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                        S Offline
                        S Offline
                        Spectre_001
                        wrote on last edited by
                        #61

                        // Setup
                        int n = 2;
                        int[] m = { 3, 5, 7, 1, 8, 4, 2 };
                        int[] smallest = (int[])Array.CreateInstance(typeof(int), n);

                        // My answer
                        Array.Sort(m); Array.ConstrainedCopy(m, 0, smallest, 0, n);

                        Kevin Rucker, Application Programmer QSS Group, Inc. United States Coast Guard OSC Kevin.D.Rucker@uscg.mil "Programming is an art form that fights back." -- Chad Hower

                        1 Reply Last reply
                        0
                        • C Chris Maunder

                          What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                          cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                          E Offline
                          E Offline
                          eltashi
                          wrote on last edited by
                          #62

                          Hi there, nice challenge ! Didn't want to use language built in array sorting, since that makes the solution obvious. Ok ok, recursion is dangerous, but looks nice :)

                          function reduceTo(arr,n){

                          if (n==arr.length) return arr;
                          var next=Array();
                          	
                          for (i=0,max=0; i\=arr\[max\]) {
                          		if (max!=i) next\[next.length\]=arr\[max\];
                          		max=i;
                          	}
                          	else{
                          		next\[next.length\]=arr\[i\];
                          	}
                          }
                          
                          return reduceTo(next,n);
                          

                          }

                          1 Reply Last reply
                          0
                          • C Chris Maunder

                            What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                            cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                            F Offline
                            F Offline
                            faceless5579
                            wrote on last edited by
                            #63

                            in Java :-) (without dublicates handling) // given an array of ints: m // and a number n, for example n =4 // we can use a java.util.TreeSet (that is, ordered set) to do the job: TreeSet result = new TreeSet (); for (int mcnt=0; mcnt < m.length ; mcnt++) if (result.size() < n) { result.add(m[mcnt]); continue; } else { int curMax = result.last(); if (curMax > m[mcnt]) { result.remove(curMax); result.add(m[mcnt]); } }

                            1 Reply Last reply
                            0
                            • C Chris Maunder

                              What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                              cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                              T Offline
                              T Offline
                              Trajan McGill
                              wrote on last edited by
                              #64

                              A submission in C:

                              #include
                              int*f(int*s,int m,int n){int i,c,*a=(int*)malloc(n*sizeof(int));for(;n;m--,s++){for(i=1,c=0;i
                              Assumptions: the numbers are integers, "smaller" for negative numbers means "more negative", and the initial set of numbers is stored as an array. A different data structure would require reworking the algorithm, but the first two assumptions are easy to change with a few extra bytes-- for instance, for doubles, we can do it as:

                              #include
                              #define D double
                              D*f(D*s,int m,int n){int i,c;D*a=(D*)malloc(n*sizeof(D));for(;n;m--,s++){for(i=1,c=0;i
                              and for a "closer to zero" definition of smaller numbers, the integer version would change to:

                              #include
                              #include
                              int*f(int*s,int m,int n){int i,c,*a=(int*)malloc(n*sizeof(int));for(;n;m--,s++){for(i=1,c=0;i
                              If you test it, don't forget to free() the returned array. And for heaven's sake, don't ever write real code like this (and I don't just mean the formatting).

                              1 Reply Last reply
                              0
                              • Y YvesDaoust

                                Slightly modified Straight Selection Sort will do the trick (moves n lowest elements first):

                                for (int i= 0; i < n; i++)
                                {
                                int k = i;
                                for (int j= i; j < m; j++)
                                {
                                if (a[k] > a[j])
                                {
                                k = j;
                                }
                                }

                                int swap= a\[i\]; a\[i\]= a\[k\]; a\[k\]= swap;
                                

                                }

                                IMHO, allowing function calls makes the challenge nonsensical, as the solutions reduces to S(a, m, n), where S is the function that does just that.

                                T Offline
                                T Offline
                                Trajan McGill
                                wrote on last edited by
                                #65

                                Ahh, shoot, you're right. The requirements didn't specify a non-destructive algorithm. Your method, turned into an actual function, with a few optimizations and a bit of non-essential character elimination, reduces to:

                                void g(int*a,int m,int n){int i=0,j,k,t;for(;ia[j])k=j;}

                                which beats mine by 50 characters (49 if I chop out the one removable whitespace character I missed in my solution). If we modify it further to toss out the array notation and instead do horrible things with pointers, we can even save 6 more:

                                void g(int*a,int m,int n){int*i=a,*j,*k,t;for(;i*j)k=j;}

                                Y 2 Replies Last reply
                                0
                                • C Chris Maunder

                                  What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                                  cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                                  B Offline
                                  B Offline
                                  Bob Beechey
                                  wrote on last edited by
                                  #66

                                  If our list is the_list in Python we have new_list = sorted(the_list)[:n]

                                  1 Reply Last reply
                                  0
                                  • P PIEBALDconsult

                                    SELECT TOP n FROM Sample ORDER BY Value Edit: How should we handle duplicates?

                                    K Offline
                                    K Offline
                                    KP Lee
                                    wrote on last edited by
                                    #67

                                    That won't work in sql. :) (n isn't a number and value isn't selected)

                                    1 Reply Last reply
                                    0
                                    • T Trajan McGill

                                      Ahh, shoot, you're right. The requirements didn't specify a non-destructive algorithm. Your method, turned into an actual function, with a few optimizations and a bit of non-essential character elimination, reduces to:

                                      void g(int*a,int m,int n){int i=0,j,k,t;for(;ia[j])k=j;}

                                      which beats mine by 50 characters (49 if I chop out the one removable whitespace character I missed in my solution). If we modify it further to toss out the array notation and instead do horrible things with pointers, we can even save 6 more:

                                      void g(int*a,int m,int n){int*i=a,*j,*k,t;for(;i*j)k=j;}

                                      Y Offline
                                      Y Offline
                                      YvesDaoust
                                      wrote on last edited by
                                      #68

                                      And as said in my next post (have a look into the future), passing argument n is unessential, use m instead and spare 6 characters.

                                      T 1 Reply Last reply
                                      0
                                      • T Trajan McGill

                                        Ahh, shoot, you're right. The requirements didn't specify a non-destructive algorithm. Your method, turned into an actual function, with a few optimizations and a bit of non-essential character elimination, reduces to:

                                        void g(int*a,int m,int n){int i=0,j,k,t;for(;ia[j])k=j;}

                                        which beats mine by 50 characters (49 if I chop out the one removable whitespace character I missed in my solution). If we modify it further to toss out the array notation and instead do horrible things with pointers, we can even save 6 more:

                                        void g(int*a,int m,int n){int*i=a,*j,*k,t;for(;i*j)k=j;}

                                        Y Offline
                                        Y Offline
                                        YvesDaoust
                                        wrote on last edited by
                                        #69

                                        You can also get rid of variable i by working backwards, and benefit from a little of C's syntaxic sugar:

                                        void g(int a[], int m)
                                        {
                                        while (m)
                                        {
                                        int k= --m, j= m;
                                        while (j)
                                        k= a[k] < a[--j] ? k : j;

                                        	int s= a\[m\]; a\[m\]= a\[k\]; a\[k\]= s;
                                        }
                                        

                                        }

                                        (This code guaranteed unchecked for correctness :-)) Applying your transforms should give something shorter than ever.

                                        1 Reply Last reply
                                        0
                                        • C Chris Maunder

                                          What's the smallest code you can come up with to find the n smallest numbers in a random sample of m numbers where n < m. Any language, speed is not an issue.

                                          cheers, Chris Maunder The Code Project | Co-founder Microsoft C++ MVP

                                          Y Offline
                                          Y Offline
                                          YvesDaoust
                                          wrote on last edited by
                                          #70

                                          This is a straight selection sort, processing back to front and doing immediate swaps to avoid index bookeeping.

                                          void g(int a[], int m)
                                          {
                                          for (int s, p; p= --m;)
                                          while (p--)
                                          if (s= a[m], a[p] > s)
                                          a[m]= a[p], a[p]= s;
                                          }

                                          or, said shortly,

                                          void g(int*a,int m){for(int s,p;p=--m;)while(p--)if(s=a[m],a[p]>s)a[m]=a[p],a[p]=s;}

                                          The requested solution lies in a[0..n-1]. I guess it will be hard to improve on this straight selection approach, given that - two nested loops are required, - two decreasing indexes are required (m and p), - a swap variable is required (s), - a key comparison is required, - three assignments are required for the swaps, wherever they take place.

                                          T 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups