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.
  • 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