dev optozorax
4.19K subscribers
345 photos
53 videos
10 files
275 links
По деловым предложениям: optozorax.work@gmail.com.

Связь с админом через личку канала (кнопка в канале слева снизу).

Ютуб: https://www.youtube.com/@optozorax

Сайт: optozorax.github.io
Download Telegram
Forwarded from Блог*
#blogrecommendation

Этот канал не существует в вакууме. Есть и другие каналы, которые интересны мне и которые я бы мог назвать друзьями Блог*а. Так что без лишних слов представляю вам их, с описаниями от авторов.

@ihatereality
Личный блог вафли, где он в основном пишет о извращениях с растом. Или просто о чём ему в голову взбредёт. Но в основном о расте.
(^берегите его, он умный и он няша)

@optozorax_dev
Илья программирует всякое и периодически пишет о результатах. При этом он старается объяснить как проблему, так и решение, не забывая ссылаться на известные результаты. Поэтому читатель может узнать что-то новое для себя. Не репостит другие каналы, поэтому контента мало, зато он уникальный.
(а ещё он обожает кастомные клавиатуры)

@ShadyBytes
Личный блог айтишника-либертарианца про технологии и общество. Меньше пресс-релизов крупных компаний, больше личного опыта.

@nlinker_rust
Собираю ржавые и лямбдообразные новости, прикольные цитатки с форумов, ссылки на статьи и всё такое. В-общем, сюда я тащу такие крупицы, которые мне будет жаль потерять в цифровой бездне. Возможно, они покажутся интересными и вам.

@repushko_channel
Один шизоид ругается на IT индустрию и постит иногда смешные мемы.
(любитель философии)

@tipaproit
Типа про IT и вот это вот всё. Прокрастинируем и программируем программы на компьютере. Авторский блог exclusively for Telegram.

@rustamann
(микро) блог @mersinvald о Rust, разработке, и жизни экспата в Германии. Ахтунг! Повышенное содержание мемов.
Сразу как у нас открыли кинотеатры, я побежал смотреть фильм "Довод" от Нолана. Мне очень понравилось. И весь дальнейший пост будет основан на концепции из этого фильма, так что если вы не любите спойлеры, то лучше не читайте дальше. Хотя, возможно, я рассказываю спойлеры только максимум на уровне трейлера, я хз, не смотрю трейлеры из-за ненависти к любым спойлерам. Короче, я вас предупредил.

Меня не особо интересуют всякие персонажи и прочие кожаные мешки, а вот концепции и идеи - очень даже. Поэтому мне ОООЧЕНЬ понравился этот фильм. И в "Доводе" как раз показывается ОЧЕНЬ интересная концепция, когда вещество, идущее обратно во времени, существует параллельно с веществом, идущим вперёд во времени. Это даже путешествием во времени назвать нельзя, потому что это не то читерство с гитовыми ветками, которое нам показывают в других фильмах, это очень органичная, сложная, противоречивая и интересная вещь. Сразу после фильма я задался единственным главным вопросом: возможно ли и как такое симулировать?! Интересует как минимум возможность симуляции такого через клеточный автомат, не то что физика. Как раз хорошим совпадением стало то, что я за пару месяцев до этого наконец реализовал обратимый автомат Critters и немного его поисследовал (/235). Я сразу подумал, что обратимость Critters должна как-то помочь с концепцией Довода, но в первые дни я так и ничего не смог придумать.

Так же я начал думать каким образом прошлое может знать о том каким будет будущее, так что наверняка обязательно придётся решать какую-то астрономически огромную систему уравнений, чтобы реализовать что-то подобное "Доводу", поэтому концепция обычной пошаговой симуляции тут может быть неприменима.

Затем я начал целенаправленно думать как это симулировать и наконец придумал. Обратимость Critters действительно помогла, и я сделал на основе него обратимый клеточный автомат, где существует одновременно три вещества:
* пустота - чёрные клетки,
* вещество идущее вперёд во времени - синие клетки,
* вещество идущее обратно во времени - красные клетки.
(Блин, у меня цвета походу с фильмом не сходятся :( )

При этом:
* Если свапнуть цвет красного и синего, и ещё сделать одну мелочь, то симуляция времени вперёд будет равна симуляции времени назад до свапа. То есть все состояния корректно идут во времени в нужную сторону, и существует относительность направления времени!: красным кажется что они идут вперёд, а синие назад во времени, а синим что они идут вперёд, а красные назад.
* Наборы клеток, которые состоят из пустоты, красных и синих клеток корректно обрабатываются.
* Если правила для обычных Critters имеют размер 2^4, то в моём автомате они размером 2*3^4. Такой большой размер тоже составляет некоторую сложность в разработке правил.

Назвал я этот автомат гордым именем и с уважением к вдохновителю: The Tenet Of Life (Critters является самым близким аналогом The Game Of Life в мире обратимых автоматов, поэтому вполне логично).

⬇️
Там были интересные проблемы и их решения, так что я хочу всё это подробно рассказать вместе с картинками, но телеграм слишком слаб для такого формата. Поэтому я думаю написать статью. И вместо того чтобы писать статью в свой блог optozorax.github.io, куда зайдут только мои читатели, думаю эту статью надо опубликовать на Хабр. Ну и сразу в статье на Хабре намного подробнее рассмотрю тему простых обратимых автоматов, которые я не очень подробно раскрыл раньше.

В статье на хабре хочу вставить гифки и оставить ссылку на веб-симуляцию моего автомата. Естественно, эту веб-симуляцию я пишу на Rust'е и компилирую в WASM. Сейчас как раз использую macroquad и заново учусь программировать графику. В частности недавно я научился рендеринть из текстуры в текстуру при помощи шейдеров. А раньше я такое делал на CPU. Ну и спасибо Феде за макроквад, интерфейс делается очень просто, и много полезных примеров :)

А по поводу полученных результатов: ну ничего интересного или революционного я не увидел. Просто красные и синие клетки кипишатся и обладают хорошими математическими свойствами. Поэтому самое интересное - то как я его сделал, а не сам результат. Результаты не интересные потому что сам изначальный автомат Critters не очень интересный. Тут надо другие обратимые автоматы исследовать с таким подходом.

Ну и ещё результаты не очень интересные, потому что у меня нет самой главной фичи из фильма - устройства, которое обращает назад во времени всё что в него войдёт. Ведь именно такое устройство и создаёт интересные парадоксы и вынос мозга. А судя по тому что получилось у меня, просто параллельное существование двух временных типов материи не очень интересно и не очень противоречиво.

Мне кажется ввести клетки, которые делают такое инвертирование либо невозможно, либо придётся решать астрономическую систему уравнений, либо очень сложно. И если такое вводить, то надо заранее просчитывать вселенную чтобы она была согласована с этим устройством, потому что оно на вход должно принимать два одинаковых объекта с разными направлениями времени. То есть надо заранее пускать обратный и прямой глайдер в эту машину, чтобы они вошли в неё и исчезли, тогда результат этой машины будет как в фильме.

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

Ещё, касательно простых обратимых автоматов могу посоветовать смотреть это:
* Большой обзор клеточных автоматов от Онигири
* Квантовый компьютер и обратимые вычисления от Онигири
* Принцип Ландауэра на Википедии

Я знаком с Онигири, и так интересно случается что у нас абсолютно случайно темы с этими автоматами пересеклись по времени и по смыслу в видео что я посоветовал) У него к сожалению видео не изобилуют сложными подробностями, и ориентированны на более молодую аудиторию, но в целом много нового можно узнать)

Ладно, а теперь время картинок!

⬇️
This media is not supported in your browser
VIEW IN TELEGRAM
В прошлом посте про Critters я не осилил управление мышью, поэтому там были очень шакальные картинки, и вы даже не смогли рассмотреть глайдера. Чтож, я исправил это недоразумение, теперь я сделал управление мышью и можно масштабировать, передвигать. И ещё интерфейс есть вместо клавиш на клавиатуре.

⬇️
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Это глайдер в обычном автомате Critters. Так как он синего цвета, видно что он идёт вперёд во времени. Здесь показывается как этот глайдер двигается в направлении куда он указывает. Так же здесь показывается сетка, чтобы можно было видеть как работают блочные правила обычного Critters, о которых я ранее рассказывал в /239.

⬇️
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
А здесь одновременно два глайдера с разными направлениями времени. Красный глайдер указывает влево, но идёт вправо, потому что он обращён во времени. И вообще эта гифка немного напоминает сцену из фильма с машинами) Я думаю это сделать логотипом моего автомата.

⬇️
This media is not supported in your browser
VIEW IN TELEGRAM
А тут просто куча клеток разных времён как-то взаимодействуют...

⬇️
А это так правила записываны в коде))))))))))000)0 Конечно, эти массивы вычисляется. Вычислением просто занимается другой код.

⬇️
А это я проектировал правила на draw.io. Не пытайтесь понять, просто спойлер, в статье подробно расскажу об этом.

⬇️
В общем такие новости у меня за последнее время, сорян что так долго не писал! Что-то я потерял хватку и задрал планку и подумал что всю эту тему с клеточным автоматом надо довести до последнего конца, и рассказать вам только после того как сделаю статью на хабр. А потом вспомнил что я создал этот канал для промежуточных результатов и получения дофамина, поэтому я вам всё проспойлерил сейчас :) Чтож, ещё один жизненный урок усвоен, теперь в этот канал смогу больше писать.
Для предстоящей программки, где можно запускать обратимые клеточные автоматы я хочу сделать возможность задавать любые правила. Как я описывал в /239, любая перестановка массива от 0 до N является корректным правилом. Значит должна быть возможность задавать перестановку в виде чего-то, что можно скопипастить и вставить в программу.

На одном сайте с обратимыми автоматами перестановка задаётся так:

0,2,8,3,1,5,6,7,4,9,10,11,12,13,14,15

По мне это довольно скучно и не очень удобно.

Поэтому я придумал, что это надо отображать одним числом, которое можно менять на +1, -1, и оно будет корректным. А затем вообще переводить это число в систему счисления с основанием 64, чтобы оно было ещё короче.

Итак, для массива из N различных элементов существует N! возможных вариантов перестановки. Значит можно как-то пронумеровать каждую перестановку одним числом. И если сделать так, то пользователь сможет играться, меняя числа, у него всегда будет получаться корректное правило. Если он, конечно, не задаст число больше N!, но не допустить такую ошибку довольно легко.

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

125023449600

Или если же это число перевести в 64-ричную систему счисления:

08D+rQ1

Я сделал маленькую библиотечку чтобы вычислять все эти вещи: permutation_string.

Всеми этими тремя способами в моей программе можно будет задавать правила.

Так же я хочу сделать GUI, чтобы правила можно было перетаскивать мышкой, и чтобы рядом писались все эти данные. Благо на megaui в macroquad сделать это довольно легко. Не знал кстати что Immediate Mode GUI такой простой о_О. Какой-то диссонанс происходит после того как ты делал гуй на всех этих коллбэках. Попробуйте почитать код, и потыкаться.

⬇️
А теперь я расскажу как именно можно превратить перестановку в одно число.

Пусть у нас есть перестановка А из пяти элементов: [4,1,2,3,0]. Главное свойство любой перестановки - в ней все числа уникальны. Значит можно преобразовать этот массив в немного другой.

Пусть у нас ещё есть такой массив Б: [0,1,2,3,4].

Далее берём нашу перестановку, и говорим по какому индексу находится первый её элемент? 4 находится по индексу 4, так и записываем в массив Ц. Удаляем из массива Б и массива А число 4.

А = [1,2,3,0]. Б = [0,1,2,3]. Ц = [4].

Берём следующее число из А: 1. По какому индексу находится? 1. Так и записываем, удаляем из Б и А эти элементы.

А = [2,3,0]. Б = [0,2,3]. Ц = [4,1].

И теперь начинается самое интересное. Берём следующее число из А: 2. Оно находится по индексу 1. Так и записываем, и удаляем из А и Б.

А = [3,0]. Б = [0,3]. Ц = [4,1,1].

Ну и таким образом у нас в итоге получится: А = []. Б = []. Ц = [4,1,1,1,0].

Что интересного в массиве Ц? У него в каждом следующем элементе максимальное возможное число уменьшается на 1. То есть максимальный Ц = [4,3,2,1,0] возможен для перестановки: [4,3,2,1,0]. А Ц = [0,0,0,0,0] получается для перестановки [0,1,2,3,4].

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

0*0! + 1*1! + 1*2! + 1*3! + 4*4! = 105.

Получается это число находится в промежутке от 0 до N!-1. Вот так мы и пронумеровали каждую перестановку.

Кстати несложно модифицировать алгоритм, чтобы обрабатывать перестановки с повторяющимися элементами.
Последнее время Яндекс стал часто мне присылать письма о том как индексируется мой блог optozorax.github.io, и он оказывается по каким-то запросам даже есть в поиске, и на него раз в сто лет даже кто-то кликает! Это оказалось достаточно мотивирующим, чтобы я решился добавить на свой блог весь крутой контент, что лежит у меня на github.

Я сделал так, чтобы при помощи чёрной магии и git submodules в моём блоге публиковались посты, в которых находится содержимое файлов README.md из репозиториев, которые я указал.

Мой блог построен на Jekyll - дефолтном генераторе статических сайтов на GitHub Pages, поэтому я хакал именно его.

В итоге я смог этого добиться, но парой костылей. Я написал об этом пост в блоге: https://optozorax.github.io/submodules-jekyll

Кстати, там добавилось много статей, которые вам могут быть интересны, но вы их раньше никогда не видели, их можно посмотреть на главной странице: optozorax.github.io.
#мысли #вода_дарует_мысли

В Rust'е обработка ошибок хороша тем, что ты видишь в сигнатуре функции что возвращается Option<_>, Result<_, _>. За это его все любят, и за это же не любят концепцию исключений в языках типо C++. В расте ещё есть механизм под названием "паника" - это когда вся программа падает. Перехватывать панику - крайне плохой тон, потому что считается что это ошибка программирования, поэтому это никто не делает. Все перехватывают ошибки через Option/Result Поэтому все стараются писать код так, чтобы он не паниковал.

Но вот чтобы отслеживать какой метод паникует, необходимо читать доку. Например, метод remove на контейнере паникует, если данный элемент не найдётся. Кстати метода try_remove нету, и не очень хотят подобное что-то добавлять (подробности).

И это натолкнуло меня на мысль, что язык программирования будущего, который должен заменить Rust, должен уметь следующую вещь: возможность помечать методы или фунции какой-то меткой, которая будет заражать всё что будет это использовать.

Поясняю: вот есть в Rust паникующие методы/функции. Хотелось бы их помечать их меткой аля panicking, и далее, если ты в своей функции используешь panicking функцию, то и свою функцию ты обязан пометить так же.

Следующей такой меткой может быть allocating. Аналогично, если ты используешь что-то, что аллоцирует память, то ты помечаешь такой штукой свою функцию.

Ещё можно ввести метку nopure, которая ставится если ты модифицируешь какое-то глобальное состояние. Например, вызываешь print!().

Отличие этих всех меток от unsafe в расте в том, что unsafe можно отключить у метода. А эти метки должно быть нельзя отключить. Ну или можно отключить, но через unsafe {}.

Что дадут все эти метки? Ну во-первых, код с метками panicking, allocating, nopure будет считаться либо плохим, либо неподходящим для использования в библиотеках, и все будут стараться делать библиотеки с не-паникующими не-аллоцирующими чистыми методами. Это будет означать что такие методы вероятно очень быстрые и что они очень надёжные.

Например, если переписывать ядро Линукса на расте, то там определённо никто не хочет чтобы метод паниковал (наверное).

Я понимаю, что с точки зрения синтаксиса это будет очень запарно писать. Но такова цена. Типизацию тоже надо везде прописывать)

Может быть это можно будет использовать в библиотеках, вводя свои метки, упрощающие понимание/написание кода.
Хочу трейт коллекции (а для него надо Generic Associated Types 😭), чтобы можно было в стандартную библиотеку добавить:
impl<K, V, C: Collection<V>> FromIterator<(K, V)> for BTreeMap<K, C> 


Чтобы я мог собирать итератор из пар в:
.collect::<BTreeMap<_, Vec<_>>>()


Без трейта коллекции можно написать что-то такое:
impl<K, V, C: FromIterator<V>> FromIterator<(K, V)> for BTreeMap<K, C> 


Но мне кажется такое невозможно написать, либо оно будет слишком unsafe, либо будет оверюзать умные указатели типо RefCell.
Отказ от телеги.

Я заметил, что трачу на телеграм очень много времени. Я читаю кучу чатов, отвечаю, и даже с кем-то спорю (в интернете кто-то неправ!). Это вылилось в то, что когда я планировал в какой-то день что-то делать, я просто не мог это делать, потому что всё свободное время я уже потратил на телеграм. Особенно всё это ухудшилось, когда появились комментарии к каналам. Тогда я решил поступить радикально, как радикально я поступал раньше со всем - удалить телеграм (ну, на время).

Подобное я практиковал ещё давно. Пожалуй мой самый радикальный, и самый первый опыт подобного случился в 11 классе. Перед 11 классом я напрокрастинировал всё лето, хотя на это лето у меня были планы по написанию одного проекта. Я понял, что всё своё время я трачу куда-то в интернет, не только в один вконтакт или ютуб. Поэтому на сентябрь 11 класса я принял радикальное решение - отказаться от интернета на месяц. Это было тяжело. Мне пришлось скачать кучу документации на комп заранее. Скачать музыку заранее. По вечерам я ощущал вакуум. Но уже в первые дни я заметил, что оказывается за 2 часа свободного времени можно сделать очень много, и мне это понравилось. После того опыта я не стал снова отрубать интернет на месяц, а уже пользовался интернетом далее, но благодаря таким радикальным действиям я смог научить себя тратить на него меньше времени.

Затем уже в университете я заметил, что очень много времени смотрю ютуб. Поэтому я внёс ютуб в файл hosts, и по сути заблокировал его на компьютере, и разрешал себе смотреть его только через телефон. А через телефон мне дико неудобно смотреть, поэтому получилось хорошо. Таким макаром я держал ютуб заблокированным на компьютере около 2 лет, и уже после возвращения ютуба на компьютер, я не трачу на него столько времени.

Тоже самое было с вконтакте, но там всё обошлось тем что я отписался от всех групп и в приложении Kate Mobile настроил так, чтобы при включении приложения открывалась страница с сообщениями, а не новостями, и вообще кнопки "новости" не было.

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

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

Удаление на три дня показало себя хорошо, и поэтому следующим шагом я удалил телеграм на неделю, с запланированным возвращением в субботу. И вот сейчас уже стукнуло 2 недели как я это делаю.

После двух недель, я не знаю что и сказать. Это круто. Для меня уже стало естественно, что у меня оказывается есть так много времени, и что я больше успеваю, и больше делаю. Я перестал отвлекаться, и каждые 10-30 минут чекать что там в каких чатах написали. Соответственно повысилась концентрация.

⬇️
Немного иронично, что в этот период отказа от телеги, Павел Дуров пишет пост: медуза, оригинал; где говорит что злые корпорации хотят чтобы мы потребляли как можно больше.

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

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

И видимо поэтому мне не стоит устанавливать тикток.

Кстати, глобально по этой теме рекомендую книгу "Пустышка. Что интернет делает с нашими мозгами.".
А ещё я смотрел стримы великого гроссмейстера neal_wu, где он за полтора часа решает то, на решение чего у меня уйдёт 7+ часов, и у него есть такая штука, которая позволяет очень быстро прогонять тесты по его задачке на основе *.in и *.out файлов, которые он создаст. Соответственно я захотел тоже себе такую фигню, но для раста. И сделал такую программку olytest. В ней я храню все тесты в двух файлах: in.txt, out.txt, и разделяю их символом \, чтобы не создавать кучу файлов для каждого теста.

В ней особо ничего интересного нету, разве что когда я её делал, параллельно запилил макрос для работы с библиотекой termcolor, которая позволяет рисовать цвета в консоль кросс-платформенно, для винды и для линукса. Макрос хранится тут: termcolor_macro, и его использование выглядит следующим образом: .

clrln!(stdout: b u (Color::Black)[Color::White] "Error:"; " cannot find file {}", filename);

Здесь текст "Error:" выведется жирным (буква b), подчёркнутым (буква u), чёрным цветом (круглые скобки) на белом фоне (квадратные скобки), а после него будет обычный println! без форматирования и цветов, с одним аргументом. Кстати на этом макросе очень хорошо можно увидеть что macro_rules у растишки довольно юзабельный, ибо я такой сложный макрос написал довольно легко.

Во время олимпиадок или решения задач это очень удобно, так что не зря написал.

⬇️
Олимпиадное программирование.

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

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

В итоге это всё вылилось в то, что мне теперь кажется, что я деградирую и у меня отсыхают мозги. А единственный известный мне способ не деградировать и увлажнять мозги - это обучаться, и лучше обучаться математике, ну или решать олимпиадные задачи (ведь они сложные). Поэтому где-то в глубине головы у меня посеялась эта мысль, что мне надо начать либо математику, либо олимпиадки.

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

Затем я посмотрел сериал "Ход королевы", суть которого я к сожалению не буду рассказывать, ибо не люблю спойлерить, советую просто посмотреть.

Затем ещё у нас в университете проходила олимпиада, на которую я решил не идти, ведь там мне придётся прогать на C++, а я такой вот вредный растоман, и вообще на Раст я решил окончательно уйти из-за олимпиады в Барнауле, где я хотел написать что-то на плюсах, и это было дико неудобно, а на расте ведь есть итераторы. И вот я решил не идти на олимпиаду, а меня туда позвал преподаватель, с которым я хорошо знаком. И стало как-то неловко.

Ну и плюс в это время я отказался от телеги и у меня появилось свободное время.

А ещё какой-то чувак усомнил мою веру в себя, сказав что "мне надо больше читать, чем писать".

И вот все эти вещи наложились друг на друга, и теперь я очень активно занимаюсь олимпиадным программированием на codeforces.com, и поставил на паузу развитие всех своих текущих проектов, и написание всяких статей.

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

А ещё на этом сайте есть раздел EDU, и там можно посмотреть лекции по типичным олимпиадным темам и отправить свои решения упражнений на проверку. Советую хотя бы ознакомиться с тем что такое Z-функция. Для меня это стало открытием и взрывом мозга. Особенно мне понравились задачи на Z-функцию, ведь там я на полную катушку использую Растовские итераторы, и прокачиваю скилл их использования.

⬇️
А вот как-то так выглядит использование этой программки.
И вот недавно, 4 декабря, прошёл ещё один контест на этом сайте, и мне очень понравилось как он прошёл. Я быстро решил задачу А, а потом прочитал задачу Б и офигел от её сложности и моего непонимания как решать... Я подумал сдаться, но потом сказал себе что нельзя, взял бумажку и карандаш, и начал крутить эту задачу и так и эдак, в итоге математически вывел что оказывается там что-то независимо, и полностью понял как её решить. Затем уже быстро запрограммировал и она прошла. Затем я пытался решить задачу Ц, но во время олимпиады не смог, ибо неправильно прочитал условие. Меня вдохновило что я осилил задачу Б (хотя она была второй по лёгкости), и я решил после контеста решать дальше. В итоге я смог полностью своим умом добить задачу Ц. Затем снова при помощи бумажки обнаружил решение задачи Д. Затем подумал что понял как решать задачу Е, запрограммировал и она не прошла, затем взялся за бумажку, и её тоже добил. И вот я дошёл до задачи Ф. Это последняя и самая сложная задача, у которой в тэгах написано страшное словосочетание: "динамическое программирование". Я начал её крутить, исследовать, а затем понял что уже 5 утра, и надо бы спать.

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

В этот момент я почувствовал себя Бет Хармон из сериала "Ход королевы" 😂

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

А самое главное что все эти задачи я прорешал полностью сам, без подглядывания в разбор или чужие решения. Очень горд собой.

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

⬇️