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. All But One Shall Die!

All But One Shall Die!

Scheduled Pinned Locked Moved The Lounge
question
24 Posts 8 Posters 0 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.
  • Richard DeemingR Richard Deeming

    http://khanaas.com/kirk/vilmos/[^] :-D


    "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

    N Offline
    N Offline
    Nagy Vilmos
    wrote on last edited by
    #13

    I'll see you and raise![^]

    speramus in juniperus

    1 Reply Last reply
    0
    • P Pete OHanlon

      Doesn't that discriminate against people in wheelchairs?

      L Offline
      L Offline
      Lost User
      wrote on last edited by
      #14

      Pete O'Hanlon wrote:

      Doesn't that discriminate against people in wheelchairs?

      Not more than your average daily scrum :)

      Bastard Programmer from Hell :suss: If you can't read my code, try converting it here[^]

      1 Reply Last reply
      0
      • Richard DeemingR Richard Deeming

        Are you sure your clue is right? For example, with 14 prisoners, how can #15 be the survivor? :confused:


        "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

        N Offline
        N Offline
        Nagy Vilmos
        wrote on last edited by
        #15

        Small mistyping, I fix...

        speramus in juniperus

        Richard DeemingR 1 Reply Last reply
        0
        • N Nagy Vilmos

          Small mistyping, I fix...

          speramus in juniperus

          Richard DeemingR Offline
          Richard DeemingR Offline
          Richard Deeming
          wrote on last edited by
          #16

          Brain's not working properly today - I can see the pattern, but I can't see the formula. Is the answer #977?


          "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

          "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

          N 1 Reply Last reply
          0
          • Richard DeemingR Richard Deeming

            Brain's not working properly today - I can see the pattern, but I can't see the formula. Is the answer #977?


            "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

            N Offline
            N Offline
            Nagy Vilmos
            wrote on last edited by
            #17

            Well done! For the number of prisoners P find N, the highest power of 2 less than or equal to P. The survivor S, is: S = (P-N) * 2 + 1

            speramus in juniperus

            Richard DeemingR 1 Reply Last reply
            0
            • N Nagy Vilmos

              Well done! For the number of prisoners P find N, the highest power of 2 less than or equal to P. The survivor S, is: S = (P-N) * 2 + 1

              speramus in juniperus

              Richard DeemingR Offline
              Richard DeemingR Offline
              Richard Deeming
              wrote on last edited by
              #18

              Ah! That's what I did. I was expecting a more mathematical formula than that. :)


              "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

              "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

              E 1 Reply Last reply
              0
              • Richard DeemingR Richard Deeming

                Ah! That's what I did. I was expecting a more mathematical formula than that. :)


                "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                E Offline
                E Offline
                ednrg
                wrote on last edited by
                #19

                This is nasty and sloppy, but it figures it out to be 505. Where did I got wrong (other than write some horrific code :laugh: )?

                class Program
                {
                    static List captures = new List();
                
                    static void Main(string\[\] args)
                    {
                        PopulateCaptures();
                        int survivor = FindLastOne();
                
                        Console.WriteLine("The last one is: {0}", survivor);
                
                        Console.Write("\\n\\nHit any key to continue...");
                        Console.ReadKey();
                    }
                
                    static void PopulateCaptures()
                    {
                        for (int i = 1; i <= 1000; i++)
                            captures.Add(i);
                    }
                
                    static int FindLastOne(int startingPosition = 0)
                    {
                        int retVal = -1;
                
                        List dead = new List();
                
                        if (captures.Count == 1)
                        {
                            retVal = captures\[0\];
                            return retVal;
                        }
                
                        if (startingPosition == 0)
                            startingPosition = 2;
                
                        if (startingPosition == 1)
                            captures.RemoveAt(0);
                
                        for (int i = 1; i <= captures.Count; i++)
                        {
                            if (i % 2 == 0)
                            {
                                dead.Add(captures\[i - 1\]);
                            }
                        }
                
                        foreach (int i in dead)
                        {
                            captures.Remove(i);
                        }
                
                        if (captures.Count % 2 != 0)
                            startingPosition = 1;
                
                        if (captures.Count == 1)
                            retVal = captures\[0\];
                        else
                            retVal = FindLastOne(startingPosition);
                
                        return retVal;
                    }
                }
                
                Richard DeemingR 1 Reply Last reply
                0
                • E ednrg

                  This is nasty and sloppy, but it figures it out to be 505. Where did I got wrong (other than write some horrific code :laugh: )?

                  class Program
                  {
                      static List captures = new List();
                  
                      static void Main(string\[\] args)
                      {
                          PopulateCaptures();
                          int survivor = FindLastOne();
                  
                          Console.WriteLine("The last one is: {0}", survivor);
                  
                          Console.Write("\\n\\nHit any key to continue...");
                          Console.ReadKey();
                      }
                  
                      static void PopulateCaptures()
                      {
                          for (int i = 1; i <= 1000; i++)
                              captures.Add(i);
                      }
                  
                      static int FindLastOne(int startingPosition = 0)
                      {
                          int retVal = -1;
                  
                          List dead = new List();
                  
                          if (captures.Count == 1)
                          {
                              retVal = captures\[0\];
                              return retVal;
                          }
                  
                          if (startingPosition == 0)
                              startingPosition = 2;
                  
                          if (startingPosition == 1)
                              captures.RemoveAt(0);
                  
                          for (int i = 1; i <= captures.Count; i++)
                          {
                              if (i % 2 == 0)
                              {
                                  dead.Add(captures\[i - 1\]);
                              }
                          }
                  
                          foreach (int i in dead)
                          {
                              captures.Remove(i);
                          }
                  
                          if (captures.Count % 2 != 0)
                              startingPosition = 1;
                  
                          if (captures.Count == 1)
                              retVal = captures\[0\];
                          else
                              retVal = FindLastOne(startingPosition);
                  
                          return retVal;
                      }
                  }
                  
                  Richard DeemingR Offline
                  Richard DeemingR Offline
                  Richard Deeming
                  wrote on last edited by
                  #20

                  Try this:

                  int index = 1;
                  var prisoners = Enumerable.Range(1, 1000).ToList();
                  while (prisoners.Count != 1)
                  {
                  while (index < prisoners.Count)
                  {
                  prisoners.RemoveAt(index);

                      // We've killed a prisoner, so the rest of the list has moved up one place.
                      // Therefore, we only need to move to the next place to skip the next prisoner.
                      index++;
                  }
                  
                  if (index == prisoners.Count + 1)
                  {
                      // We killed the last one in the list; start the next round with the second in the list:
                      index = 1;
                  }
                  else
                  {
                      // We killed the second to last; start the next round with the first:
                      index = 0;
                  }
                  

                  }

                  Console.WriteLine(prisoners[0]);


                  "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                  "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

                  E 1 Reply Last reply
                  0
                  • OriginalGriffO OriginalGriff

                    "...to the last I grapple with thee; from hell's heart I stab at thee; for hate's sake I spit my last breath at thee." Don't think Ahab was too happy really... :laugh:

                    J Offline
                    J Offline
                    JMK89
                    wrote on last edited by
                    #21

                    OriginalGriff wrote:

                    "...to the last I grapple with thee; from hell's heart I stab at thee; for hate's sake I spit my last breath at thee."

                    That quote always reminds me of the Simpsons!

                    OriginalGriffO 1 Reply Last reply
                    0
                    • J JMK89

                      OriginalGriff wrote:

                      "...to the last I grapple with thee; from hell's heart I stab at thee; for hate's sake I spit my last breath at thee."

                      That quote always reminds me of the Simpsons!

                      OriginalGriffO Offline
                      OriginalGriffO Offline
                      OriginalGriff
                      wrote on last edited by
                      #22

                      Herman Melville for me, I'm afraid!

                      "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
                      "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

                      1 Reply Last reply
                      0
                      • Richard DeemingR Richard Deeming

                        Try this:

                        int index = 1;
                        var prisoners = Enumerable.Range(1, 1000).ToList();
                        while (prisoners.Count != 1)
                        {
                        while (index < prisoners.Count)
                        {
                        prisoners.RemoveAt(index);

                            // We've killed a prisoner, so the rest of the list has moved up one place.
                            // Therefore, we only need to move to the next place to skip the next prisoner.
                            index++;
                        }
                        
                        if (index == prisoners.Count + 1)
                        {
                            // We killed the last one in the list; start the next round with the second in the list:
                            index = 1;
                        }
                        else
                        {
                            // We killed the second to last; start the next round with the first:
                            index = 0;
                        }
                        

                        }

                        Console.WriteLine(prisoners[0]);


                        "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                        E Offline
                        E Offline
                        ednrg
                        wrote on last edited by
                        #23

                        Found the error in my ways :) It now works.

                           static int FindLastManStanding(int startingPosition = 2)
                            {
                                int retVal = -1;
                                bool lastWasKilled = false;
                                List dead = new List();
                        
                                if (startingPosition == 1)
                                    captures.RemoveAt(0);
                        
                                int max = captures.Max();
                        
                                for (int i = 1; i <= captures.Count; i++)
                                {
                                    if (i % 2 == 0)
                                    {
                                        if ( max == captures\[i - 1\])
                                            lastWasKilled = true;
                        
                                        dead.Add(captures\[i - 1\]);
                                    }
                                }
                        
                                dead.ForEach(x => captures.Remove(x));
                        
                                startingPosition = lastWasKilled ? 2 : 1;
                        
                                if (captures.Count == 1)
                                    retVal = captures\[0\];
                                else
                                    retVal = FindLastManStanding(startingPosition);
                        
                                return retVal;
                            }
                        
                        1 Reply Last reply
                        0
                        • N Nagy Vilmos

                          Genghis Kahn, being in a good mood decides to spare one life of his 1,000 captives. He has them stand in a circle and runs a sword through every second man. If the first man is #1 [amongst Kahn's many crimes was a love for VB], which man will be left alive?

                          speramus in juniperus

                          E Offline
                          E Offline
                          ednrg
                          wrote on last edited by
                          #24

                          Is this the shortest solution?

                          var switcher = true;

                          var range = Enumerable.Range(1,1000).ToList();

                          while( range.Count > 1)
                          range = range.Where(x => (switcher = !switcher) == false).ToList();

                          range.Dump(); // (LinqPad)

                          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