Ответы пользователя по тегу Программирование
  • Почему скалярное произведение не нормализованных и коллинеарных векторов разное при изменении их точек?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Ну, скалярное произведение вектора самого на себя - даст квадрат его длины по определению (|a|*|a|*cos(0)). Если менять точки - меняется длина вектора - меняется скалярное произведение.
    Ответ написан
    Комментировать
  • Как решить ошибку Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Переведите текст ошибки на русский. У вас выход за границу массива. Запустите код в отладчике - он остановится в том месте, где это происходит.

    Возможно файл map.txt лежит не там, программа его не находит и не может его прочитать. Получается пустой массив file, но в функции GetMaxLengthOfLine идет обращение к 0-вому элементу, а его нет.

    Или строки в файле разной длины, тогда при присваивании map[x, y] = file[y][x]; идет выход за границу массива file[y] в не самой длинной строке. Ведь x проходится до длины самой длинной строки.
    Ответ написан
    1 комментарий
  • Дано натуральное число N. Определить количество ифр в цифровой записи данного числа,которые имеют наибольшее значение?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Сначала получите цифровую запись числа (подсказка: деление на 10 с остатком даст вам последнюю цифру и число без этой цифры).

    Далее, поскольку в задаче идет разговор о количестве цифр, вам надо подсчитать, сколько раз каждая цифра встречается. Получите массив из 10 счетчиков.

    Ну и потом просто найдите максимальное число в этом массиве.
    Ответ написан
    Комментировать
  • Как быть когда сущность из одного модуля требуется в другом модуле?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Или клиент может использовать бухгалтерию и запрос оттуда, или наоборот. Но может быть лучше выделить запрос в отдельный модуль, который используют два упомянутых.
    Ответ написан
    Комментировать
  • В чём отличие хэш-таблицы от словаря и ассоциативного массива в C#?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Словарь и ассоциативный массив - это синонимы. Хеш-таблица - это вариант реализации словарей.
    Ответ написан
    2 комментария
  • Существует такое понятие, как "Ассоциативный список"?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Я бы это назвал списком режимов. Ассоциативный список - это что-то самопротиворечивое. У вас же просто список пар значений.
    Ответ написан
    Комментировать
  • Необходимо получить RGB цвет пикселя который находится на кординатах x и y?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Чтобы получить значение пикселя с экрана, воспользуйтесь модулем pyautogui, например.

    Затем пользуясь image из модуля Pillow можно получить конкретный пиксель.

    В этом же pyautogui можно симулировать клики мышью. Читайте документацию.
    Ответ написан
    Комментировать
  • Как работает алгоритм перебора перестановок (рекурсия)?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Перебирается число, которого еще нет в массиве. Ставится на следеющее место и рекурсивно запускается для каждого варианта.
    Ответ написан
    Комментировать
  • Как реализованы программы записи экрана и стриминга?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Используются системные api. Все полатформо зависимое, к сожалению. На винде можно делать через кучу разных апи: gdi+, dxgi, wgc. Гуглите "слово из списка capture screen".

    Далее, похоже нужно будет реализовывать виртуальную камеру. Тут гуглите апи dshow. Уже с этим можно ваш проект прикручивать к существующим стриминг платформам.

    Если же вам хочется сделать все свое (включая бакенд) то можно воспользоваться библиотекой webrtc.
    Ответ написан
    Комментировать
  • Можно ли использовать библиотеки для одного языка в другом?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Можно. Гуглите, что такое ABI.
    Ответ написан
    Комментировать
  • Засчитаются ли баллы за задачу на всош?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Обычно там в условии расписывают. Что-то вроде: при работе для n до 1000, получите 20 баллов; при работе для n до 100000 - 60; при работе для n до 10^9 - 100 баллов.

    Если в условии не расписано, то не факт.
    Но обычно всегда какое-то количество баллов можно набрать даже самым медленным наивным решением.
    Ответ написан
    1 комментарий
  • Существуют ли онлайн - соревнования по программированию?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Собственно сертификат никто нигде не дает (по крайней мере я таких не знаю). Максимум - письмо на почту с позравлением и строчка на сайте. Но это обычно и не надо, потому что результаты есть на сайте олимпиады и любая ложь быстро вскроется.

    При приеме на работу, по крайней мере, это бы работало много где. Но у вас вопрос про ВУЗы и тут другая проблема: а какие соревнования интересующий вас университет вообще учитывает? Если это российские вузы, то кроме официальных школьных олимпиад, признанных минобром, насколько я знаю, они ничего не признают. Иностранные же вполне могли бы учесть практически любую олимпиаду как бонус.

    Как вариант - смотрите соревнования организованные большими компаниями. Например google code jam, facebook hackercup. Тут не надо будет объяснять университету, что это такое и всем сразу все понятно.
    Ответ написан
    3 комментария
  • Зачем Zobrist хешированию случайные числа?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Наверное, можно и константами ограничиться. Вот только выписывать 768 констант никому не охота. Что-то простое брать, вроде подряд идущих чисел - плохой хеш будет. Надо реально 700 разных псевдослучайных чисел.
    Ответ написан
    Комментировать
  • В чем преимущества процессов над потоками?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Главное приемущество: независимость процессов. Потоки делят между собой одну память и ресурсы системы (всякие хандлеры в винде, например).

    Если один из процессов завершится или, что чаще происходит, упадет - остальные не будут затронуты. Плюс эта независимость позволяет делать песочницы для безопасности. Так, все современные браузеры запускают js и вообще каждую вкладку в отдельном процессе. Даже если куллхацкер полностью взломает браузер через специальный сайт, он окажется в процессе, который особо прав никаких не имеет, библиотеки особо интересные туда не загружены, а все общение с внешним миром - через жестко прописанные протоколы ipc (inter-process communication). Так что злодею придется взламывать еще и их.

    Эта же независимость позволяет выполнять работу даже после завершения основного процесса. Так, если вы хотите сделать автообновятор программы, то после скачки/установки нового приложения, надо будет перезапустить основное приложение, чтобы перезаписать исполняемый файл (по крайней мере в винде). Но поток завершится вместе с программой и кто же тогда потом будет ее запускать? А вот процесс останется работать.

    Недостатки тут - ресурсоемкость. С точки зрения системы поднять и поддерживать процесс гораздо больше работы чем сделать это с потоком. Плюс упомянутое выше ipc - это лишняя работа на каждый чих.
    Ответ написан
    Комментировать
  • Как избавиться от кучи if в методе?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Может хотел от вас услышать, что по таблице можно искать бинарным поиском.
    Ответ написан
    Комментировать
  • Как реализовать дерево на основе связного списка?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Вообще, дерево и список не изоморфны друг другу. В дереве же есть иерархия. Дерево нельзя реализовать с помощью списка (одного).

    Возможно, вам надо хранить детей каждой вершины в виде связного списка (тогда у вас будет куча списков). Еще, популярный подход (фактически делающий то же самое) - это хранить в каждой вершине ссылку/указатель на первого ребенка и на следующего брата. Так все списки будут перемешаны в одну большую структуру. Но тут, правда, в отличии от связного списка, все равно есть 2 типа ссылок.
    Ответ написан
    2 комментария
  • Как работают переменные в низкоуровневом понятии?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Тут много уровней.

    Самое простое - компилятор запоминает, что вот myvar - это переменная, которая лежит вот там-то в памяти. Грубо говоря, эти все имена переменных - это псевдонимы для адресов памяти. Если он видит в коде myvar = a + 1;, то он генерирует инструкцию, которая читает из фиксированного адреса переменной a, прибавляет 1 и сохраняет результат в адрес для переменной myvar.

    Все немного усложняется из-за оптимизирующих компиляторов. Они могут какую-то переменную вообще не держать в оперативной памяти, а только в виде регистра процессора.
    Ответ написан
    1 комментарий
  • Как построить граф по матрице?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    а весом рёбер будет выступать расстояние между этими полями. для того чтобы после построения этого графа выбрать в нём 2 вершины и найти между ними кратчайший путь ... Двигаться по карте можно только по горизонтали и по вертикали.


    Это какой-то бред. Начало фразы подразумевает, что ребра есть между всеми парами вершин, продолжение говорит, что все ребра длины 1 между соседними клетками. Я предполагаю что тут именно второй вариант.

    Во-первых, занумеруйте все клетки. Подойдет простая формула вроде i+m*j

    Вот у вас уже есть n*m вершин в графе. Теперь добавьте ребра. Для каждой клетки (два цикла) посмотрите 4 соседние клетки. Если обе клетки - ., то добавьте из текущей клетки ребро в соседнюю.

    Соседей удобно перебирать, если завести константные массивы для смещений:
    const int dx[4]= {1, 0, -1, 0};
    const int dy[4]= {0, 1, 0, -1};


    Тогда для клетки (i, j) можно перебрать всех соседей одним циклом на 4 итерации - (i+dx[k], j+dy[k]). Надо только не забыть проверить на выход за границы матрицы.

    Ну и вам надо написать функцию типа AddEdge(int u, int v) которая будет в удобную для вас структуру данных добавлять ребра. Граф удобно хранить в виде списков смежности. На C++ это можно сделать просто std::vector<std::vector<int>> и добавлять соседей через vector::push_back. Это на практике работает быстрее всяких связных списков.

    И у вас будет три вложенных цикла - внешние по всем клеткам, а внутренний по четырем направлениям. Внутри вы проверяете, что сосед по этому направлению есть и между клетками можно пройти. В этом случае вызывайте AddEdge.

    А можно вообще граф не строить. Берете ваш алгоритм поиска кратчайшего пути (BFS, Dijkstra или A*) и там везде, где перебираются соседи одной вершины, вставляете код проверки четырех направлений через dx/dy. Вершины можно или нумеровать их координатами, и тогда все массивы пометок будут двумерными, или можно использовать формулу u = i+j*m, (i,j) = (u%m, u/m) для преобразования координат в номер вершины и назад.

    А еще есть всякие алгоритмы, которые работают сильно быстрее за счет использования того факта, что у вас не произвольный граф, а сетка в матрице. Jump Point Search - один из таких алгоритмов. В нем граф умышленно не строится и работа идет непосредственно в матрице.
    Ответ написан
    Комментировать
  • Как лучше разместить в оперативной памяти массив комплексных чисел с точки зрения производительности?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы хотите быть дружественными к кэшу, то нужна локальность доступа к данным.

    Поэтому лучше в одном массиве чередовать реальную и мнимую части. Или, еще лучше - завести структуру с двумя полями и хранить массив из них. Тут в памяти расстановка данных будет такая же, но код будет читаем и логичен.
    Ответ написан
    Комментировать
  • Функции по "Чистому коду" - нужно ли это?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Это какой-то карго-культ получается. Корткие фнукции понятны - поэтому все функции должны быть короткими. Нет, они, а вернее, весь код должны быть понятными.

    Если несколько тривиальных строчек кода понятнее трех однострочных функций, то не надо их переписывать, только потому что введен этот принцип.
    Ответ написан
    Комментировать