Pull to refresh
14
0
Алексей Золотов@freopen

User

Send message
Судя по количеству коммитов и строк у них настроен скрипт автокоммита на каждые 100 отредактированных строк кода :)
Пришел узнать, как распараллелить наибольший общий делитель (greatest common divisor) :)
Для избегания подобного иногда усложняют эту игру добавлением помощника. Помощник тоже участвует в игре, но не приносит победы игроку. Если игра проходит в несколько раундов, то игроку, помощник которого победил, запрещается использовать помощника в дальнейшем.
Разумеется я знаю эту и некоторые другие реализации пузырька. Меня интересует одна конкретная реализация пузырька — «референсная», которая настолько интересна, что инициатор ветки предлагает добавить ее в список выше.
Ни капли. Сколько я не гуглил референсную реализацию пузырька на русском и английском — ничего не нашел. Вот и интересуюсь, что такое?
Ну если открыть ссылку, можно узнать, что алгоритмы преимущественно закодированы в C++ из-за библиотеки шаблонов, а структуры данных — на Java из-за Collections и сборщика мусора.
UPD. уже не актуально :(
Что такое референсная реализация bubblesort? Уж не это ли?
for (int i=0;i<n;i++) ref[i]=i;
for (int i=0;i<n;i++)
  for (int j=0;j<n-1;j++) 
    if (to_sort[ref[j]] > to_sort[ref[j+1]])
      swap(ref[j],ref[j+1);
Не надо считать все расстояния, надо лишь найти минимальное. Для этого достаточно для каждой пары совпадающих чисел проверить два варианта расположений точек и выбрать минимальный.
Быстрее заново посчитать, на пересчет 64 расстояний уйдет больше времени, чем на вычисление расстояния с нуля.
1. Можно текущий путь хранить в setе, а не в массиве, уже должно неплохо помочь.
2. Я вижу такую строчку: «Таким образом, если мы начнем двигать одну из парных фишек не на свое место, мы, скорее всего, не сможем решить головоломку». Единственная проблема — в подсчете расстояния до ответа, т.к. непонятно, до какого места считать расстояние. Можно в качестве оценки считать до ближайшего (тогда придется каждый раз пересчитывать расстояние заново), либо вообще забить. Итак, мы теряем отсечение по расстоянию. Посмотрим на то, что мы получим взамен. В оригинальных пятнашках позиций 16!=2.09×10¹³. В нашей игре — 16!/2⁷ =1.63×10¹¹. Получается, что действительно неочевидно, какой подход лучше, хотя чисто интуитивно мне кажется, что этот способ таки немного ускорит решение.
Простые оптимизации, которые должны заметно ускорить процесс:
1. Можно завести set, в котором хранить вообще все позиции, в которых мы побывали. Но тогда надо уверенность в том, что в каждую позицию мы приходим за минимальное число ходов, поэтому придется поиск в глубину заменить на поиск в ширину. Как вариант, можно set заменить на map, который отображает позицию в ее глубину, тогда надо идти в рекурсию только если новая найденная глубина меньше старой.
2. Я не очень понял, зачем перенумеровывать фишки. Вроде бы без перенумерации задача сильно проще. А если в endPos хранится правильно заполненное поле, то алгоритм не будет смотреть, какую из одинаковых фишек он помещает на подходящее поле и проблемы не возникнет.
Оффтоп оффтопа: Когда я читаю подобное, мне сразу вспоминается Рамануджан.
Наверное просто каждому свое. Можно и так и так. Мне вот очень тяжело неделю следить за собой. 4 часа рывка для меня гораздо проще.
Это кажется еще более простой задачей. Это просто рефлекс, а рефлексы легче всего ломаются именно таким спринтерским рывком, постепенно рефлекс тяжело сбить. А добавляя по одной-двум буквам можно постепенно обучить мозг не смотреть на конкретно эти кнопки. Ведь казалось бы, нажимать не глядя две кнопки легко научиться, а если наизусть знаешь положение N кнопок, добавить к ним еще одну тоже кажется не очень сложным. Это примерно так же сложно, как выучить новую комбинацию клавиш в какой-нибудь IDE.
Я ведь не от балды взял 4 часа, а потому что у меня самого ушло как раз столько. Основная фишка в том, что у нас в голове уже лежит информация о том, где находится какая кнопка, потому что печатаем мы часто. Ведь, даже люди, которые печатают двумя пальцами, но постоянно, не ищут, где находится та или иная кнопка. Их мозг уже содержит информацию об этом и умеет ее доставать в нужное время. Все, что нам надо — сопоставить палец каждой кнопке. Это очень простая задача, ведь положение кнопок мы уже знаем и надо просто вбить в голову шаблон нажимать каждую кнопку ближайшим пальцем. За 4 часа сосредоточенной работы вполне можно добиться успеха, если не отвлекаться.
А никто не пробовал просто сесть за любой клавиатурный тренажер, который подкидывает по паре клавиш за раз (типа стамины или ktouch) и непрерывно сидеть на нем до достижения эффекта? Мне кажется, что так можно научиться печатать вслепую часа за 4.
Насчет этого контеста не знаю, но вот, например, по Google Code Jam статистика есть: статистика. Можете посмотреть, на каких языках писалась квалификация, на каких первый тур и т.п.

По факту: языки типа Ruby неплохо работают, но довольно сильно проигрывают по скорости. Бывает даже так, что задачу на Python или Ruby надо писать алгоритмом другой сложности, т.к. обычный алгоритм работает в 5 раз медленнее и не проходит в ограничения. В Code Jam скорость не так важна, т.к. есть целых 8 минут на тесты, так что на этом соревновании все будет еще хуже. С другой стороны статистика не очень честная, т.к. понятно, что в финал проходят опытные участники, а они привыкли к C++ и Pascal, т.к. на многих олимпиадах нет Ruby.
Что-то не очень понял. Можете объяснить, чем отличается скачивание софта с торрентов от скачивания софта с оф сайта с точки зрения цен на инет?
Возможно стоит добавить следующие ссылки:
Template metaprogramming на википедии
Boost.MPL — фреймворк для создания программ, которые производят вычисления во время компиляции с помощью шаблонов.
Возможно, стоит добавить в топик http://habrahabr.ru/post/126189/

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity