В данном репозитории не размещается какой-то целый проект, но тут находятся мои решения некоторых задач с сайта Codewars.
Название задачи | Сложность | Файл | Статус | Ссылка |
---|---|---|---|---|
Esolang Interpreters #4 - Boolfuck Interpreter | 3 kyu | Тык | Не решена до конца | Тык |
Rail Fence Cipher: Encoding and Decoding | 3 kyu | Тык | Решена | Тык |
Evaluate mathematical expressions | 2 kyu | Тык | Решена | Тык |
Break the pieces | 2 kyu | Тык | Решена | Тык |
В целом код интерпретатора достаточно простой, больше всего сложностей вызвал побитовый ввод данных и морока с порядком байтов. Программа в целом работает на простых примерах кода на Brainfuck, транслированного в Boolfuck, но с более сложными примерами с циклами возникают проблемы. Надо закончить отладку.
Довольно интересная задача с интересным шифром для кодирования и декодирования. Долго пытался придумать схему, которая на основе числа рельс (здесь и далее рельсами я называю горизонтальные строки) определяла бы номер рельсы каждого символа, но в итоге пришёл к решению другим путём.
На основе числа рельс генерирую шаги, которыми определяется расстояние между буквмаи на каждой рельсе. При этом стоит учитывать, что для не-центральных и не-краевых рельс это расстояние не постоянно, чередуются два шага, названные "первым" и "вторым", которые применяются по очереди, в завимости от того, ближе мы сейчас следующему повороту забора или дальше.
Вспомогательная функция для прохода циклом по всем буквам используется в кодировщике и в декодировщике. Чередование между шагами реализовано максимально наивно через флаг (можно лучше, например брать остаток от деления на 2 в качестве индекса в наборе из 2 шагов).
При этом кодировщик заполняет строку-результат значениями из исходной строки в соответствии с индексами "на заборе", а декодировщик - заполняет предвыделенный буфер (благо размеры строк на входе и выходе одинаковы) буквами из данной строки в соответствии с индексами "на заборе".
Задача классическая, требует написания несложного калькулятора математических выражений с поддержкой одного вида скобок и унарных операций. Все операции определены как произвольные действия, имеющие доступ к стеку. Само вычисление происходит не для инфиксной записи, а для обратной польской записи, преобразование к которой выполнено алгоритмом сортировочной станции Дейкстры.
Единственная сложность - пришлось городить логику для считывания чисел из нескольких цифр, необходимо запоминать их и добавлять к концу результата, а потом преобразовывать все строки из цифр в нормальные числа.
Страшная задача, долго не мог подступиться. В один момент пришло озарение и идея - выделить все области при помощи поиска в ширину и потом просто отрисоваь их, не забыв обрезать в пустых местах.
Но мне на момент решения задачи было дико лень писать всё это, поэтому задача решалась при помощи метода "попробуй заставить ChatGPT сделать то, что тебе нужно". Спустя некоторое время, когда получилось раз двадцать обьяснить Великому ИИ, что он делает не так, результат был получен. Дальше осталось допилить напильником кривые места и добавить стрёмные эвристики (строки 107-111) для определения внутренних и внешних углов.
Но оно того стоило! Классная задача на подумать и подебажить.