ITBlogs

Сообщество IT-профессионалов
Welcome to ITBlogs Sign in | Join | Help
in Search

Мысли, которые не удалось удержать в голове...

Browse by Tags

All Tags » Голомоломки   (RSS)

  • Одноминутная головоломка - найдите проблему в этом цикле за 60 секунд

    Вечером опубликую пост побольше, а пока экспресс-головоломка: найдите проблему в этом цикле за 60 секунд или меньше.

    Такой вот цикл:

    int ar[5];
    for (unsigned int i = 4; i >= 0; i--) {
          printf(
    "%d\n", ar[i]);
    }

     Ответ не даю, поскольку должен быть очевиден. Нет, правда смешно?

  • Работающая быстрая сортировка (quicksort) на C#...

    Вчера супруга, которая решила посмотреть вокруг место работы получше и начала каждый вечер делать программистские задачки на C#, C++ и Python, полвечера убила на быструю сортировку (quicksort). Я тем временем опять удивился насколько много граничных условий вылезает в исходном алгоритме Хоара. Да-да, знаю, уже придумали улучшенную и починенную версию, но захотелось исправить сохранив дух решения, с двумя индексами сходящимися к центру. И вот что получилось. Вроде работает. Кто-нибудь видит баг?

    static public void Quicksort(int[] ar)
    {
         if (ar.Length > 1) Quicksort(ar, 0, ar.Length - 1);
    }

    static private void Quicksort(int[] ar, int left, int right)
    {
         if (left == right) return;
         int i = left + 1;
         int j = right;
         int pivot = ar[left];

         // Loop invariant i <= j
         while (i < j)
         {
              if (ar[i] <= pivot) i++;
              else if (ar[j] > pivot) j--;
              else
              { // Swap ith and jth elements
                   int m = ar[i]; ar[i] = ar[j]; ar[j] = m;
              }
         }
         // Now i == j

         if (ar[j] <= pivot /* it also means that i == right, because j was never moved */)
         {
              // Left most element is array's maximum
              int m = ar[left]; ar[left] = ar[right]; ar[right] = m;
              Quicksort(ar, left, right-1);
         }
         else
         {
              Quicksort(ar, left, i - 1);
              Quicksort(ar, i, right);
         }
    }

    Пока возился обратил внимание на забавный момент: как бы ни распределялись данные, количество нетривиальных вызовов Quicksort (когда i<j) всегда равно длине массива минус один. Сначала удивился, а потом дошло почему. Можете ответить? Ответ вот здесь: http://www.eldar.com/node/154 (да, да, я решил перестать публиковать белым по белому. Слишком много браузеров на которых это не работает).

    И да, это, как обычно, кросс пост с персонального блога.

  • Орел или решка?

    Вот такая вот смешная задачка, кстати, на Интернете уже описанная.

    Перед вами сто одинаковых монеток на столе, а у вас на глазах повязка. Вы можете найти монетки на ощупь, но не можете сказать что сверху – орел или решка. Вы можете разделить монетки на группы или там в колонки, вы можете переворачивать монетки, вы также можете перевернуть все монетки в одной группе (скажем справа) не запутавшись и перевернув все в группе, ни одной не пропустив и ни одну не переврнув дважды. Вы знаете, что из ста монеток на столе, ровно десять – орлы, а остальные решки.

    Задача: разделить монетки на две группы используя только дозволенные операции так чтобы и справа, и слева было точно одно и то же количество орлов.

    Ответ, как всегда, белым по белому. Чтобы его увидеть, выделить текст ниже от >>> до <<<.

    >>>

    Допустим, вы разделили монетки на две группы. Тогда у вас справа N монеток, а слева 100-N. Пусть справа у вас оказалось K орлов, тогда слева у вас 10-K орлов. Теперь, допустим вы перевернули все монетки справа. Тогда справа все орлы стали решками, а решки орлами, то есть теперь у вас справа N-K орлов. А слева, напоминаю, 10-K орлов. Уже догадались?
    Ага, если N=10, то число орлов и справа и слева окажется 10-K. То есть, отбираете направо 10 монеток, а налево остальные 90, после чего переворачиваете все 10 монеток справа.

    <<<

     

This Blog

Syndication

Powered by Community Server (Personal Edition), by Telligent Systems