• Как научиться быстро понимать похожий код?

    @Beltoev
    Живу в своё удовольствие
    ... просто может быть знаний маловато?
    Если быть точнее - маловато практики. Для данного примера много знаний как бы и не нужно, хватит базового владения синтаксисом.

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

    angrySCV
    @angrySCV
    machine learning, programming, startuping
    например матричные преобразования, один из самых распространённых приёмов оптимизации большого числа алгоритмов.
    не знаешь математику - пишешь не эффективные алгоритмы.
    Ответ написан
    7 комментариев
  • Почему рекурсивные алгоритмы работают медленнее своих линейных аналогов?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что этот алгоритм, будучи рализован в лоб без всяких кэшей и ускорителей, неоптимален! F(n–2) высчитывается дважды, F(n–3) трижды, F(n–4) пять раз, и т.д. по Фибоначчи.

    Что читать, сказать не могу (в том издании Кормена, что у меня, маловато), гугли «динамическое программирование». Хотя поначалу поможет и Кормен.

    ЗЫ. В некоторых случаях помогает вычисление в лоб, но с простеньким кэшем, который снизит повторяемость если не для всех входов, то хоть для самых вопиющих.

    ЗЗЫ. Программисты не любят рекурсию по многим причинам. 1. Сложно наладить аварийный стоп. 2. Системный стек ограничен и есть риск переполнения.
    Ответ написан
    4 комментария
  • Как найти последний нулевой элемент в массиве?

    @abcd0x00
    Надо искать с конца. (После последнего нулевого может вообще не быть элементов.)

    for (i=30;i!=0;i--)

    Если в массиве 30 элементов, то
    for (i = 29; i >= 0; i--)

    Нулевой индекс рассматриваем потому, что все элементы массива могут быть ненулевыми.
    Ответ написан
    Комментировать
  • Где можно почитать о бинарных данных и 16-ричных дампах?

    valerium
    @valerium
    Изобретая велосипед
    Вопрос исключительно общий. Начните с изучения самых основ, со способов представления информации и с систем счисления.

    Вообще, если говорить о целых числах, то нет никакой разницы между числами, записанными в двоичный, десятичной, шестнадцати- и шестидесятиричной системе счисления. Конкретно 16-ричная система в компьютерном мире пользуется популярность, потому что позволяет для записи числа использовать количество символов, кратное количеству символов в двоичной записи. Такой компромисс между краткостью и наглядностью. Например, для записи одного байта можно использовать 8 двоичных символов, четыре восьмеричных, три десятичных (при этом только три варианта в старшем разряде) или два шестнадцатеричных.

    В широком смысле любой файл бинарный, так как записан на носителе с помощью всего двух возможных символов. В более узком смысле бинарные файлы — это противопоставление текстовым файлам. Но в любом случае выбор остаётся очень большим: исполняемые файлы приложений, музыка, видео, изображения, архивы, многие документы, базы данных и др.

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

    Ручное создание бинарных файлов — это исключительно редкая ситуация в наше время. С файлами данных это и так очевидно (существуют редакторы на любой вкус и цвет). С исполняемыми файлами это тоже редко, так как существуют языки программирования высокого уровня, которые похожи на человеческий язык и переводятся в двоичные файлы компиляторами. Только в ряде особых случаев пишут на том самом ассемблере, который очень близок к машинным кодам и даёт возможность программисту практически однозначно определить содержимое итогового исполняемого файла.

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

    tsarevfs
    @tsarevfs
    C++ developer
    Это очень похоже на двоичную кучу, только она троичная в вашем примере. В связи с этим такую пирамиду может оказаться удобно хранить в одномерном массиве, как это делают для кучи. Для случая с двумя детьми формулы для адреса детей есть по ссылке, из них очень легко получить формулы для вашего случая.
    4 уровень (счет с 0), номер 1.
    Нужно получить следующие ячейки:
    - 3 уровень номер 1

    Вроде 0 для 1 ячейки родитель должен быть?
    Если это опечатка, то при вашем способе хранения достаточно взять целую часть от деления номера ребенка на 3.
    Ответ написан
    1 комментарий
  • Как легче всего решить матрицы?

    @AVKor
    В уме. Задачи тривиальные.
    Ответ написан
    Комментировать
  • Ошибка внутри ассемблерной вставки?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    1. По стандарту C++, всякая функция, которая что-то возвращает, должна содержать return. Иначе - неопределенное поведение, так как компилятор не сможет сгенерировать правильный эпилог.
    2. Пролог и эпилог должен генерировать кто-то один.
    3. Некоторые особо дурные компиляторы умеют отключать генерирование пролога и эпилога. Напимер, VC++ это делает при помощи __declspec(naked).

    Вывод:
    Либо вы выключаете пролог/эпилог и пишите на ассемблере всю функцию, включая пролог и эпилог.
    Либо вы пишите только ВСТАВКИ, и не выносите мозг компилятору, перекашивая ему стек. (В начале и в конце вставки стек должен быть прежним).
    Ответ написан
    3 комментария
  • Существует ли элегантный алгоритм для поворота 4×4 матрицы на 90 градусов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. Можно просто записать 6 пар перестановок:

    function swap(arr, a, b){
        var tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
    }
    var a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
    swap(a,1,4);
    swap(a,2,8);
    swap(a,3,12);
    swap(a,6,9);
    swap(a,7,13);
    swap(a,11,14);


    2. Можно шагать с инкрементом 4 и брать остаток от деления на 15:

    var a = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] ,tmp;
    
    function pivot(a) {
        var i, result = [];
        for( i=0; i<60; i+=4) result.push(a[i%15]);
        result.push(a[15]);
        return result;
    }
    
    var b = pivot(a);
    Ответ написан
    Комментировать
  • Вы тоже постоянно всё забываете из программирования?

    @JuniorNoobie
    Сижу в поддержке, пишу мелкие проекты
    Я тоже все постоянно забываю. Причем иногда мне кажется, что то, что я писал года два-три назад "красивее" и "правильнее" того, что я пишу сейчас. Хотя должно быть наоборот)
    Открываю свой код и поражаюсь: как будто кто-то другой писал...
    Ответ написан
    2 комментария
  • Что такое замещение в ООП?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Полиморфизм - один из трех фундаментальных принципов ООП-парадигмы.

    Замещение (также "перекрытие" или "переопределение" методов) - общее название механизма, предоставляемого ЯП для поддержки применения этого принципа при проектировании иерархий классов.

    Конкретные детали реализации механизма могут отличаться, (как, например в Java и JS), но суть с т.з. ООП остается той же. А вот в С, например, такого механизма вообще нет, однако это не препятствует (просто не помогает!) писать объектно ориентированный код на этом языке.

    Так что, если под "замещением" понимается именно overriding, я бы не стал так широко отождествлять цель и средство ее достижения :)
    Ответ написан
    Комментировать
  • Правильный сон при умственных нагрузках - как правильно спать?

    Neuroware
    @Neuroware
    Программист в свободное от работы время
    Нужно ложиться тогда когда хочется спать и просыпаться без будильника тогда когда организм захочет. Все остальное происки заинтересованных лиц, которым нужно, чтобы рабы работали больше, а думали меньше
    Ответ написан
    5 комментариев
  • Почему видеоформат так ненавидим?

    zenden2k
    @zenden2k
    PHP & C++ programmer
    Потому что там рассказывают слишком медленно
    Ответ написан
    Комментировать
  • Как найти позицию кропнутого изображения на оригинале?

    sim3x
    @sim3x
    https://www.google.com/search?q=sub+image+search+a...

    что конкретно из всего того работает придется искать тебе
    Ответ написан
    Комментировать
  • Корректно ли использование нескольких операторов "return" в функции?

    konstantin_berkow
    @konstantin_berkow
    Начинающий разработчик
    Зависит от code-style'а принятого в команде, я например считаю что использовать более двух return'ов везде кроме equals не очень хорошо.
    Ответ написан
    2 комментария
  • Как работает данный алгоритм?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Есть такой код для двусвязного списка.

    Ошибка здесь: этот код для однозвязного списка.
    Ответ написан
    Комментировать
  • Какая математика нужна GameDev'у?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Алгебра, много геометрии, алгоритмы.
    Ответ написан
    Комментировать
  • Как это устроено?

    @mamkaololosha
    Транслятор/Препроцессор
    Ответ написан
    Комментировать
  • Почему алгоритм Дейкстры корректен?

    @throughtheether
    human after all
    После выполнения алгоритма, мы получим, что кратчайшее расстояние до второй вершины равно 10.
    Вот здесь непонятно, поясните вашу мысль.

    Изначально (стартуем из вершины 1) у вас вершина 1 имеет ассоциированное число (длину пути, d[1]) 0, она же находится во множестве посещенных вершин. Длина пути до других вершин - бесконечность.
    Для всех ребер, соединяющих множества посещенных и непосещенных вершин (т.е. для ребер 1-2 и 1-3) рассмотрим суммы d[u]+w(u,v), где d[u]-длина кратчайшего пути до вершины u, w(u,v) - вес (длина) соответствующего ребра. Минимальная сумма наблюдается для ребра 1-3, соответствующего пути 1,3. Добавляем 3 в посещенные.
    Снова, для всех ребер, соединяющих множества посещенных и непосещенных вершин (т.е. для ребер 1-2, 3-2) рассматриваем соответствующие суммы (10 и 2), выбираем минимальную, т.е. добавляем вершину 2 в путь (и во множество посещенных вершин), имеющий вид 1,3,2. Так как непосещенных вершин не осталось, завершаем работу алгоритма.
    Ответ написан
    2 комментария
  • Почему алгоритм Дейкстры корректен?

    На первой итерации вес вершины 1 равен 0. От нее идем к соседям. До 3 вершины вес равен 1. До 2 вершины вес равен 10. Больше к 1 вершине не идем, она с минимальным весом. Следующая оставшаяся с минимальным из соседей - это 3. Выбираем её. Путь только в одну сторону - к 2 - и вес равен 2 (суммируется предыдущий вес). Раньше дотуда был вес 10, но так как наш новый вес меньше, заменяем на меньший. Выбираем вершину 2, а от нее уже некуда идти.

    Итого кратчайший путь до вершины 2 составляет 2 и идет через соседа 3 (если бы мы запоминали это во время итераций). По ребру с весом 10 вообще ничего не пойдет в данном случае.
    Ответ написан
    1 комментарий