1. JavaScript / Говнокод #11990

    +165

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    function findeFreePlace()
        {
            try
            {
                var x = random(gs.cells.x - 1),
                    y = random(gs.cells.y - 1);
                if (gs.balls[y][x] != null)
                {
                    return findeFreePlace();
                }
                else
                {
                    return [x, y];
                }
            }
            catch (e)
            {
                isEndGame = true;
                showfinish();
                return false;
            }
        }

    Игра "линии". Нужно случайно выбрать клеточку, в которую будет добавлен новый шарик. Ну, а чтобы узнать, что пустых клеточек нет, ловим ошибку переполнения стека.

    Запостил: vovams, 24 Октября 2012

    Комментарии (28) RSS

    • А если интерпретатор научится сворачивать хвостовую рекурсию? ;)
      Ответить
    • Скажите спасибо, что не OutOfMemoryException...

      >finde
      староанглийским каким-то отдает, по-моему.
      Ответить
    • Надо уебать уже за саму идею потенциально бесконечного алгоритма "делаем что-то случайное, пока не что-то там" там, где довольно просто обойтись и детерминированным алгоритмом.
      Ответить
      • > Надо уебать уже за саму идею потенциально бесконечного алгоритма "делаем что-то случайное, пока не что-то там"
        И автора метода Монте-Карло тоже надо уебать?

        > детерминированным алгоритмом
        Ага. Самое тупое - посчитать сколько клеток пустых, сгенерить один ранд, и отсчитать клеточки до нужной.
        Ответить
        • > И автора метода Монте-Карло тоже надо уебать?

          А ещё надо уебать тех, кто обрывает фразы, меняя их смысл.
          Ответить
          • > А ещё надо уебать тех, кто обрывает фразы, меняя их смысл.

            Но ведь вырывать фразы из контекста так весело... хотя, с другой стороны, уебать того, кто их вырывает не менее весело.
            Ответить
      • С другой стороны, во многих случаях вероятность того, что "потенциально бесконечный" алгоритм будет работать сколько-нибудь заметное время... практически равна нулю. Umad?
        Ответить
        • Нету вероятности. Есть зависимость времени от исходного состояния ГСЧ. Так вот, пока не будет точно доказано, что при любом исходном состоянии ГСЧ алгоритм сойдётся, я нихуяшечки не поверю.
          Ответить
          • Для 100 клеток, из которых 1 свободная, матожидание количества итераций составит всего 100. Поэтому если ГСЧ настоящий - то все сойдется довольно быстро.

            Если же это не ГСЧ а ГПСЧ - то ничего сказать нельзя. И тут уже вероятность того, что мы попадем в свободную клетку может быть равной нулю.
            Ответить
            • > Поэтому если ГСЧ настоящий - то все сойдется довольно быстро.

              И за сколько? Гарантированно за 100 выборок, да?
              Ответить
              • > Гарантированно за 100 выборок, да?
                В среднем за 100 выборок ;) Гарантий тут никто не даст.
                Ответить
                • Дык ото ж.
                  С вероятностью, не равной нулю, сия фигня переполнит стек даже если есть пустые ячейки.
                  Но так как всё делается на ГПСЧ, то достаточной всего лишь доказать, что максимальное число выборок для любого начального положения, содержащего свободную клетку, и любого исходного состояния генератора не превышает некоторой константы, и что при любом состоянии интерпретатора, могущем возникнуть в процессе игры, данная глубина стека не вызовет его переполнение.
                  В общем, не верю я, что автор сего творения проделал сей матан, и если его хорошенько припугнуть необходимостью всё это доказывать, то он глядишь и переделает этот код как надо.
                  Ответить
                  • >С вероятностью, не равной нулю
                    ...зависнет винда.
                    ...в тщательно вылизанном куске кода все же будет ошибка.
                    ...проявится 0-day бага в интерпретаторе JS, вызванная совсем другой процедурой.
                    ...на голову упадет метеорит.
                    ...пролетевшая космическая частица переключит ячейку памяти.

                    На доске 9х9 одна свободная клетка за одну итерацию не найдется с вероятностью 0.9877.
                    Вероятность того, что клетка не найдется за 100 итераций - 0.289
                    за 1000 итераций - 4/1'000'000.

                    Так что я, конечно, понимаю уродство решения, но с практической точки зрения придраться не к чему. (по крайней мере, если принять числа истинно случайными)
                    Ответить
      • > Надо уебать уже за саму идею потенциально бесконечного алгоритма "делаем что-то случайное, пока не что-то там" там, где довольно просто обойтись и детерминированным алгоритмом.

        если ГСЧ хуевый, игра может навечно уйти в поиск, так что по уму - лучше сгенерить список координат клеток, и перемешать, а потом проходить по списку типа "случайная клетка"
        Ответить
        • > лучше сгенерить список координат клеток, и перемешать, а потом проходить по списку типа "случайная клетка"

          Либо держать пул пустых клеток и выполнять операцию за O(1), либо, если уж очень хочется использовать ГСЧ, использовать случайные координаты как начальное приближение, а дальше искать детерминированным алгоритмом.
          Ответить
          • > и выполнять операцию за O(1)
            какую?
            Ответить
            • Выбор случайной пустой клетки. Ваш кэп.
              Ответить
            • Хм...
              Освобождение клетки: клетка добавляется в случайное место списка (фактически, добавляется в конец, а потом меняется местом со случайным элементом). О(1)
              Выбор случайной клетки: берем (с удалением) из списка последний элемент. О(1)
              Только вот занятие заданной пользователем клетки - нужно ее найти и удалить из списка. O(n)
              Ответить
              • Нет, можно всё за О(1)
                Ответить
                • джва стека?
                  Ответить
                  • у кого какие ассоциации...
                    В коридоре на работе есть комната с табличкой "АХО". Когда я прохожу мимо неё, в моём мозгу всегда отзывается эхом одно и тоже слово. "Ульман".
                    Ответить
                    • по идее должен бы вспоминаться Сетхи, но почему-то возникает лицо Петросяна
                      Ответить
                • В каждой пустой клетке хранить индекс в массиве, чтобы не искать? Тоже можно.
                  Ответить

    Добавить комментарий