Задать вопрос
  • Как пишутся в JavaScript строки сверх BMP?

    @Mercury13 Автор вопроса
    Программист на «си с крестами» и не только
    Ладно, отпишусь сам — так можно.
    <html>
    <body>
    <script type="text/javascript">
    var s = "☺";
    alert('length  of ' + s + ' is ' + s.length + '.');
    </script>
    </body>
    </html>

    Если эмодзи настоящий, а не та замена, которую получается сделать в Q&A, выведет 2 (внутренне строки — UTF-16).
    Ответ написан
    Комментировать
  • Как называется этот алгоритм сортировки?

    @Mercury13
    Программист на «си с крестами» и не только
    Я это называю «сортировка в три строки». А так это сильно упрощённый алгоритм сортировки выбором.
    Ответ написан
    Комментировать
  • Как найти кратчайший маршрут в графе с дополнительными требованиями к маршруту?

    @Mercury13
    Программист на «си с крестами» и не только
    ВАРИАНТ 1. Расстояние приоритетнее кол-ва заправок.

    Моё решение — в каждой вершине хранить не просто цифру пройденного расстояния, а список: «расстояние/запас топлива/предыдущая вершина». И расстояние, и топливо не убывают.

    С этими списками можно делать такие операции:

    1. Добавить расстояние + израсходовать топливо. Для каждого элемента списка расстояние′ = расстояние + x, топливо′ = топливо − y. Если получается нехватка топлива — что ж, не повезло, этого элемента в списке не будет.
    2. Добавить расстояние + израсходовать топливо + заправиться. Аналогично, но оставляем один элемент — соответствующий наименьшему расстоянию, где хватает топлива. расстояние′ = расстояние + x, топливо′ = полный бак.
    3. Добавить очередной элемент в список. Тогда удаляем из списка те элементы, где расстояние не меньше, а запас топлива не больше.

    После этого на оптимальном маршруте проводим оптимизацию заправок.

    Если граф такой, что бывает много «ничьих» по расстоянию, приходится эти ничьи разруливать.
    1. Если есть несколько равноценных маршрутов — храним их ВСЕ.
    2. Например, можно заполучить все такие маршруты, и на каждом провести оптимизацию заправок.

    Можно также вместо расстояния хранить список «расстояние, кол-во заправок» с лексикографическим порядком на ней и другой операцией «прибавить+заправиться».

    ВАРИАНТ 2. Кол-во заправок приоритетнее расстояния.

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

    @Mercury13
    Программист на «си с крестами» и не только
    Это находится в «серой зоне» и зависит от «борзости» издателя. По авторским правам это чистое «добросовестное пользование несвободного контента», которое определяется исключительно судом (нет чётких критериев), и если издателю захочется закрыть — закроет. Пара советов.
    1. Ставьте такое качество, чтобы текст едва читался.
    2. Использование каждой несвободной картинки должно быть обосновано.
    Ответ написан
    Комментировать
  • Почему символ 8, в десятичной системе счисления это 56, а не 8?

    @Mercury13
    Программист на «си с крестами» и не только
    Попробую ответить на вопрос: почему в ASCII цифра «8» это 38 hex = 56 dec.

    Дело в том, что в те времена единственным средством вывода был телетайп. И люди просто кидали в одну кучу понятия «текстовая строка» и «протокол обмена». А значит, требовался немаленький набор управляющих символов. Для удобства программирования управляющим символам лучше всего быть в начале таблицы: в ассемблере это будет «если код >= 32, обработать как символ, иначе сделать прыжок по таблице».

    В одной самодельной кодировке цифры были именно что 0…9, пробел −1, ещё пара управляющих символов −2, −3. Но это уже новодел.
    Ответ написан
    Комментировать
  • Почему void ** можно инициализировать только void *?

    @Mercury13
    Программист на «си с крестами» и не только
    К.О.: Потому что void* — это не void. Первый — это вполне конкретный тип, второй — «псевдотип», используемый в двух контекстах.
    Ответ написан
    Комментировать
  • Какой монитор выбрать для кодера?

    @Mercury13
    Программист на «си с крестами» и не только
    1. Стоило бы проверить мониторы на мерцание. Сейчас в большинстве случаев мерцание на запредельных частотах, которые вреда не принесут, но всё-таки…
    2. Если плотность пикселей невелика — попробуйте выключить ClearType на том мониторе.
    3. Более низкая контрастность ноутбука?
    4. Подкрутить освещение? — из-за большей площади на большом экране освещение становится более важно.
    Ответ написан
    Комментировать
  • Почему я не вижу результаты работы метода?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что сначала output, потом work.
    Ответ написан
  • Могу ли я на своем сайте выводить чпу-ссылки на статьи другого сайта?

    @Mercury13
    Программист на «си с крестами» и не только
    Можно, разумеется.
    Нельзя «драть», в том числе методом проксирования.
    Ответ написан
    3 комментария
  • Тестовое задания - написать свой видео проигрыватель, сложно ли это?

    @Mercury13
    Программист на «си с крестами» и не только
    Не советую — эти ребята хотят чужими руками жар загребать.
    Слишком уж специализированная программа выходит — два монитора, эффекты частиц…
    Работы, как по мне, на два рабочих дня даже с наличием библиотек.
    Ответ написан
    Комментировать
  • Как определять сложность алгоритма?

    @Mercury13
    Программист на «си с крестами» и не только
    Начнём с того, что такое символы Ландау (не того, немца Эдмунда Ландау) O(f(n)) и o(f(n)) при n→∞.
    g(n) = O(f(n)), если при достаточном n g(n)≤cf(n).
    g(n) = O(f(n)), если g(n)/f(n) → 0 при стремлении n→∞.
    Таким образом…
    • Символы Ландау отражают изменение чего-то (времени, памяти и т.д.) при n→∞.
    • Если, например, два цикла друг в друге и каждый по n — пишем O(n²). Например, для умножения матриц n×n:
    для i = 1…n
      для j = 1…n
        s = 0
        для k = 1…n
          s += a[i,k]·b[k,j]
        c[i,j] = s

    Тут три вложенных друг вы друга цикла по n — так что сразу же пишем O(n³).
    • Если g(n) = O(n), то g(n) = O(n²), потому мы не грешим против истины. Но если вдруг оказалось, что внутренний цикл — это извлечение из очереди и через эту самую очередь пройдут, например, 2n событий — внешний цикл выполняется O(n) раз и внутренний O(n) раз; оценка алгоритма сразу же превращается в O(n).
    • Константы мы, разумеется, выкидываем: и 2n², и 200n² = O(n²). Также выкидываем те части, чей порядок меньше, чем самый крупный: n²+n log n = O(n²). Кстати, потому мы и не пишем основание логарифма: логарифмы разных оснований отличаются множителем.
    • Но иногда константы важны. Скоростные методы умножения матриц имеют насколько большую константу при n2,81, что реально они начинают иметь смысл где-то со 100×100 (а то и крупнее). По той же причине живёт двоичный алгоритм поиска подстроки — он имеет крайне низкую константу при n² и ещё парочку полезных свойств.
    Ответ написан
    Комментировать
  • Порядок вызова конструкторов при наследовании?

    @Mercury13
    Программист на «си с крестами» и не только
    Вызов конструктора Parent считается частью вызова конструктора Child. И он происходит раньше, чем конструирование всех полей, добавленных в Child — и уж тем более до тела Child::Child.
    Ответ написан
    7 комментариев
  • Как пропусть внешний и внутрений цикл For?

    @Mercury13
    Программист на «си с крестами» и не только
    goto перед концом внешнего цикла.

    for(первый) {
      for(второй) {
        goto a;
      }
      a:;
    }
    Ответ написан
    Комментировать
  • Как это должно работать?

    @Mercury13
    Программист на «си с крестами» и не только
    Нет, ищите Hello World на WinAPI. Поскольку WinMain() там стандартный и немаленький, его опустили.

    Основано это на поведении Windows: она всегда пытается закрыть прогу корректно. Хорошо, закроем корректно, зато вот тебе вторая.
    Ответ написан
  • Как понять условие задачи?

    @Mercury13
    Программист на «си с крестами» и не только
    Что вы не поняли в решении: вы оптимизируете «чёрную» половинку графа, забыв, что самое малое ребро может быть в «белой».

    ДЛЯ КАЖДОЙ ВЕРШИНЫ: ук-ль на «начальника» + флаг инверсии. Если у вершины нет начальника — то указывает в null.
    ДИРЕКТОРОМ назовём вершину, у которого нет начальников. Считаем также, что у директора флаг инверсии всегда false.

    Заведём функцию getInfoNonDestructive, она возвращает структуру из двух элементов. Во-первых, это директор (никогда не null!!). Во-вторых, это цвет — XOR флагов инверсии от самóй вершины до директора.

    Функция getInfo вызовет getInfoNonDestructive, а затем проведёт ОПТИМИЗАЦИЮ СТРУКТУРЫ: ЕСЛИ вершина имеет начальника, ТО: начальник вершины := директор, флаг инверсии вершины := цвет вершины.

    СЛИЯНИЕ фирм происходит так. Директор фирмы становится подчинённым кому-то из членов другой фирмы.

    ИЗНАЧАЛЬНО для всех вершин начальник — null, флаг инверсии — false. То есть каждая вершина белая и сама себе директор.
    РЕШЕНИЕ: Отсортируем рёбра в порядке возрастания.
    Для каждого ребра…
    • Находим информацию о вершинах — концах ребра.
    • Если директор один и цвета разные — ничего не делаем.
    • Если директор один и цвет один — выводим вес этого ребра как ответ.
    • Если директора разные — сливаем фирмы. Подкручиваем флаг инверсии того директора, который исчез, так, чтобы цвета вершин — концов ребра были разные. Хотя бы так.
    VertexInfo info1 = getInfo(vertex1);
    VertexInfo info2 = getInfo(vertex2);
    if (…) {
      info1.director->superior = info2.director;
      VertexInfo info1new = getInfoNonDestructive(vertex1);
      if (info1new.color == info2.color)
        info1.director->inverseFlag = !info1.director->inverseFlag;
    }

    ВНИМАНИЕ, без оптимизации структуры сложность с «чуть более O(N)» превращается в N²! Но конкретно в этом месте важно получить инфу без разрушений — временно запрещается кого бы то ни было выводить из-под старого директора, пока не выставим ему флаг инверсии цвета.

    Если рёбер не осталось — перед нами двудольный граф, такого по условию не бывает.

    (такая структура данных, только без флага инверсии, называется, «система непересекающихся множеств»).

    ТЕОРИЯ. Начиная от самых «маленьких» рёбер, начинаем раскрашивать вершины в разные цвета. Если в какой-то момент это не удалось (цвета уже одинаковые) — выводим это ребро как ответ. Если соединяются два раскрашенных «островка» (в нашей терминологии «фирмы») — возможно, один из островков придётся инвертировать, и надо наладить инверсию так, чтобы она не захватила весь островок (судя по цифре 105, от нас ожидают сложность N log N, а не N²). Поскольку соединение кусков графа рёбрами и подсчёт компонент связности — это самая настоящая система непересекающихся множеств, я попытался приделать к этой самой СнПМ раскраску, не повышающую общую сложность (амортизированные почти что O(1) за транзакцию).

    Попробуй доказать самостоятельно, что данная система не зависит от того, в каком порядке оказались рёбра с одинаковым весом.

    И кончайте на чужом буе в рай въезжать!
    Ответ написан
  • Как линковщик производит подстановку функций из динамических библиотек?

    @Mercury13
    Программист на «си с крестами» и не только
    Это называется name mangling — как по-русски, я не знаю, но называю это «козявить имена».

    Названия foo в объектных файлах действительно не будет существовать.

    Линкер тут ни к чему, имена готовит компилятор. Потому, кстати, в межъязыковых библиотеках стараются имена не козявить.

    Чтобы функция называлась именно так, как надо, в Си++ есть ключевое слово extern "C", и часто его применяют, например, при экспорте в межъязыковой DLL, при интеграции Си-кода с Си++. Что в Ди, не знаю.
    В Си такого точно нет, как ты назвал, так и называются.

    Линкер, конечно, может каким-то образом подхватывать DLL (так работает LD), но это очень не стандартно — при переходе с LD на LLD пришлось готовить *.a для всех имеющихся DLL. Но в любом случае именами занимается компилятор.
    Ответ написан
    4 комментария
  • Почему программа на C++ не выводит результат?

    @Mercury13
    Программист на «си с крестами» и не только
    printf("%d %f", &n, &sum);
    printf("%d %f", n, sum);
    Ответ написан
  • В чем разница между методом в public и private?

    @Mercury13
    Программист на «си с крестами» и не только
    Это права доступа к методу. Относятся не к Cи++, а к ООП в целом.

    private — имеют доступ только методы самого объекта.
    protected — имеют доступ методы объекта и его потомков.
    public — кто угодно.

    Также существуют права доступа типа «не важно, что объекты станут связанным клубком; я готов к тому, что этот клубок придётся добавлять в программу целиком». В общем, когда объекты имеют доступ к private-методам друг друга.
    • В Си++ — ключевое слово friend
    • В Java — без ключевого слова (т.н. права доступа package)
    • В Паскале — по умолчанию есть доступ к private-полям и методам всех объектов в том же модуле.

    Эти особые права доступа (friend/package) оправданы, когда…
    • Издержки от клубка незначительны (например, объекты невелики и хорошо взаимосвязаны).
    • В клубок входят объект и его утилиты (например, какая-нибудь операция ++).
    Ответ написан
    Комментировать
  • Детерминирована ли реализация typeid?

    @Mercury13
    Программист на «си с крестами» и не только
    Не детерминирована.
    В зависимости от компилятора, может скомпилироваться, но не заработать правильно.
    Ответ написан
    Комментировать
  • Как решить задачу c++?

    @Mercury13
    Программист на «си с крестами» и не только
    У вас нормальное (хоть и корявое по части кода, я за такой код пинаю!) лобовое решение. Очевидно, придётся наладить какой-нибудь ускоритель, позволяющий выполнить запрос быстрее, чем за O(n).

    Моё предложение: map (ради скорости можно прикрутить собственный аллокатор типа «объектный пул», благо кол-во блоков данных ограничено сверху 100k), показывающий, например, для третьего примера картинку «1→1, 2→2, 3→3, 4→4, 5→5». После первой транзакции — «1→2, 3→3, 4→4, 5→5». Поиск в этом map’е — upper_bound минус единичка (даже поиск 1-цы укажет или на второй элемент, или за первый). Сможете наладить методику разделения и склеивания диапазонов?

    Можно и наоборот: 2→1, 3→3, 4→4, 5→5. Поиск в таком map’е — lower_bound (даже поиск 5-ки не выкинет за пределы, правильно?).
    Ответ написан