Обновить
55
0

Пользователь

Отправить сообщение

Я выбрал vector, но коротко упомянул, что массив в C++ реализует и array, но по умолчанию array не обнуляет элементы. Этим он похож на массив Си.

C++ разрешает инициализировать переменные с помощью = {}: так мы обнулим array или другие примитивные типы языка Си - int, double и прочие.

Статья - о легкой задаче, а не богатстве C++. Желающий найдет ответ "Почему так?" в документации по vector и array.
https://en.cppreference.com/w/cpp/container/vector.html
https://en.cppreference.com/w/cpp/container/array.html

Я пишу так, чтобы текст увлекал, а не отталкивал. Иной автор так боится погрешить против истины, что никак не поставит точку в предложении.

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

Спасибо за Ваши дополнения :)

Я привел пример кода, в котором в векторе остаются пустые строки после words[i] = std::move(words[i]). Я проверил пример на Leetcode и другом компиляторе онлайн. Причина мне неясна, поэтому я попросил объяснить в комментариях. А Вы потрудились запустить пример и проверить или спорите без аргументов?=)

что-то мне подсказывает, что есть способ инициализировать массив...

Вы очень догадливы, способ есть =)

я думаю лучше посчитать хеш не зависящий от порядка и сравнить его перед тем как проверять

Так напишите код и проверьте. Такую функцию нужно придумать или найти. Круто блеснуть знаниями и показать "секретное" решение, но сперва напишите, тогда хвастайтесь =)

https://en.cppreference.com/w/cpp/container/map/operator_at.html
Complexity
Logarithmic in the size of the container.

Спасибо. Верно ли я понял?

m - размер контейнера, сложность map::operator[] - log(m).

n - размер массива - вход алгоритма.

  • Считаем сложность map::operator[] константой O(1), когда m не зависит от n. Тогда сложность алгоритма - O(n * log(m)) все равно что O(n). Например:

    • латинский алфавит из 26 букв map<char, ...>, m = 26

    • любой символ char от 0 до 0xFF, m = sizeof(char) = 255

  • Сложность map::operator[] - log(n), если бы m зависел от n. Тогда сложность алгоритма - O(n * log(n))

https://en.cppreference.com/w/cpp/algorithm/sort.html
Complexity
Given N as last - first:
1,2) O(N·log(N)) comparisons using operator<(until C++20)std::less{}(since C++20).
3,4) O(N·log(N)) applications of the comparator comp

Упс, ошибся, когда написал O(log(n)) :)

Видимо, слова words короткие, поэтому решение со std::sort работает не хуже подсчета букв в массиве.

Просто так устроены задачи на LeetCode - входной массив передают по ссылке и просят вернуть результат - ответ задачи. Не всегда это массив, но когда да, можно стереть входной массив и вернуть :)

Так ведь я об этом написал, и код работает со входным массивом nums :) Поправлю форматирование - вместо маркированного списка поставлю заголовки, чтобы в глаза бросалось.

  • Способ 1:

NumsVector result;
// копия вектора

  • Способ 2

Сожмем исходный массив так, что нули окажутся в хвосте, а хвост отстрижем
...
nums[w++] = nums[r];
...
nums.resize(w);

Ваш erase тот же, что мой resize. Я проверил на leetcode: erase работает не выигрывает у resize в памяти. А вот явный вызов std::move(nums) дает Memory 119.64 MB Beats 99.57%. Компилятор часто сам соображает, где оптимизировать возврат с помощью move, но здесь почему-то явный вызов сэкономил память.

Явный std::move еще и ускорил решение - чудеса да и только.

Спасибо за находку :)

Можно считать такие виртуальные машины игровыми движками?:)

Про "лучший из лучших" плагин-декомпилятор HexRays к IDA Pro - им декомпилировали Notepad, но компилировать исходник на Си снова не удалось.

Не полагайтесь на декомпиляторы - они не способны восстановить исходный код.

Дизассемблируйте, рисуйте граф кода по условным и безусловным переходам, изучайте структуру кода, распознавайте циклы for, do, while, условия циклов, break, continue и поймете логику программы. Ghidra здорово строит графы автоматически.

Не старайтесь понять весь код сразу - изучайте небольшие функции, давайте им имена. Решайте небольшие задачи по одной: распаковать программу, сменить текст, звук, сделать персонажа бессмертным, увеличить урон колотушки до 9999.

Супер, увлекающая статья - читал с карандашом.

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

Игры заканчиваются, но в дизассемблирование можно играть вечно :)

Вспомнил из "Зияющих высот":

Цель мероприятия - обнаружить тех, кто не одобряет его проведения, и принять меры.

Зато Dungeon Keeper дает право творцу свалить вину за поражение на подчиненных - мол, у меня-то руки прямые, а вот они мне все испортили. Такой аргумент не пройдет в Civilization.

Привыкаешь в играх к абсолютной власти над юнитами, но юниты Dungeon Keeper живут сами по себе? Получил приказ, пошел выполнять, пока шел - забыл за чем посылали :) Видимо, нечисть древняя, забывчивая. А, может, бессмертная, потому и заряжена пофигизмом. Сегодня один начальник, завтра - другой.

Еще не играл, но слышал, заинтересовало.

Можно и так :) В этом crackme только читаешь листинги - нет прыжков в середину инструкции, чтобы ослепить дизассемблер.

Ух ты, это та забавная игра, в которой играешь за могущественное зло, заставляешь работать местную нечисть, а она не всегда делает то, что приказано?:)

Интересно, что упаковщик предлагает опцию -x expand a compressed file. Жаль, что от иных программ остаются только скриншоты и воспоминания.

Упаковщики сжимают файл - за это их и любили? Двоичные файлы сжимать трудно, но когда на дискете всего 1.44 Мб, радовались каждому лишнему байту?

Должно быть, порядочный крекер распаковывал программу, побеждал защиту, а затем упаковывал не хуже оригинала :)

На каждую новую версию упаковщика ведь нужен новый распаковщик? Наверное, универсального и всесильного распаковщика никогда не создадут, но задача интересная - автоматически опознать и вырубать хотя бы один распаковщик. А затем еще один, и еще... :)

Нашел файл с сигнатурами для PeID - говорит, содержит 1832 сигнатуры, но это только для PE-файлов. Сколько еще алгоритмов можно выдумать для других форматов - не счесть. Пожалуй, составлять сигнатуры упакованных или зараженных файлов - то еще искусство.

Спасибо за дополнения.

Это мой первый реверс под MS-DOS, так что я не претендую на звание профессора :) Удовлетворил любопытство - нашел повод поработать с 16-битным ассемблером под MS-DOS и познакомиться с Ghidra.

Работает первый же TurboDebugger из списка, аерсия 3.1 от 1992. В том и прелесть реверса - каждый пробует и выбирает инструменты, что работают у него :) Не работает TD.EXE, бросаем, берем другой отладчик.

Автор crackme указал в README, что программа работает под MS-DOS, WinXP и DOSBox - так и скопировал.

Надо уже иметь опыт в реверсе, чтобы работать с упакованными данными

Вот с этим согласен :) Для меня дизассемблер еще ни разу не опознал упаковщик автоматически. Сохраняю распакованную программу с помощью отладчика.

Еще один намек, что файл упакован - мы не найдем инструкций INT в исходном файле, хотя, кажется, они должны быть.

Птица Goворутин отличается умом и сообразительностью
Птица Goворутин отличается умом и сообразительностью

Документация к Remote API предлагает:

All versions of Bitburner can use websockets to connect to a server. That server can then perform a number of actions. Most commonly this is used in conjunction with an external text editor or API in order to make writing scripts easier, or even use typescript.

To make use of this Remote API through the official server, look here.

If you want to make your own server, see below for API details. This API uses the JSON RPC 2.0 protocol.

Typescript template for Bitburner's Remote File API
The official template for synchronizing Typescript/Javascript from your computer to the game.

This repository has been archived by the owner on Jul 31, 2023. It is now read-only

Patch notes for release version 2.7.0, 8 December 2024

  • Remove unmaintained VS Code extension from docs

Устали бороться с расширением и архивировали репозиторий :)

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность