Что это за место?— Блог, энциклопедия, чердоки разума разработчика. Загадочное и темное место.
Кто ты, таинственная фигура в одеяле?— Я программист (ужас, знаю). С 2023 учусь в Школе 21 от Сбера, делаю пет-проекты, иногда прохожу сторонние айти курсы. Люблю рпг, бродилки, песочницы и игры с сюжетными твистами.
О чем этот блог?— О сфере моих компетенций. Языки (С/С++, SQL, bash), принципы разработки, ошибки и баги, инструменты и как что-то устроено. Буду делиться тем, что узнал на своем опыте.
Пока что темы намечаются такие:
#CPP — С++ специфика (что за язык и с чем его едят)
#DevOps — Как общаться с ОС Linux и почему ее так любят разрабы
#OOP — принципы программирования, операции с данными и памятью, частые баги
#Algorithms — способы оптимального построения программ (не для слабонервных)
#Tools — набор инструментов разработчика
В будущем список может поменяться.
Ссылочки:мои проекты — https://github.com/JakeTheSillySnake
мой канал с рисунками (да, я и так могу) — https://t.me/zmeyart
GitHub
JakeTheSillySnake - Overview
I like games, horror, fantasy, art and logical puzzles. - JakeTheSillySnake
Segmentation Fault pinned «Что это за место? — Блог, энциклопедия, чердоки разума разработчика. Загадочное и темное место. Кто ты, таинственная фигура в одеяле? — Я программист (ужас, знаю). С 2023 учусь в Школе 21 от Сбера, делаю пет-проекты, иногда прохожу сторонние айти курсы. Люблю…»
Сегодня хочу рассказать про штуку под названием КЛЕТОЧНЫЙ АВТОМАТ (англ. cellular automata / automation).
Это алгоритм / механизм для симуляции «рождения» и «смерти» клеток в матрице. Изначально придуман Джоном Конвеем в 1970 для «Игры в жизнь» (Game of Life), смысл которой в том, чтобы задать популяцию «живых» клеток и наблюдать за тем, как она меняется со временем (а если загуглить «game of life», гугл выдаст симуляцию этой игры на странице поиска).
Кстати! Не бойтесь слова «матрица». В данном случае оно лишь означает клеточное 2D поле, в котором хранятся нули и единицы. Как лист бумаги для морского боя.
В игру Конвея можно поиграть здесь. Правила следующие:
— Есть изначальная матрица клеток, часть из которых «живые» (1) или «мертвые» (0). Можно задать ее случайно, можно использовать готовый паттерн (их целая куча — глайдеры, статичные фигуры, пушки и т.д.).
— В некоторых версиях автомата можно указать «шанс инициализации» — он задает, с какой вероятностью каждая отдельная клетка будет «живой» в первом поколении.
— Каждый новый «шаг» симуляции определяет, какие клетки будут «мертвыми» или «живыми». За это отвечают две величины — порог рождения (birth limit) — то, сколько «живых» соседей (минимум) должно быть у «мертвой» клетки, чтобы она «ожила», и порог смерти (death limit) — то, сколько «живых» соседей (минимум) должно быть у «живой» клетки, чтобы она не «умерла».
Пример: у «мертвой» клетки 4 «живых» соседа. Порог рождения — 3. Значит, на следующем шаге она станет «живой».
— Соседи — это ближайшие 8 клеток (иногда для крайних клеток учитывают соседей с другой стороны экрана). Таким образом, пороги рождения и смерти, а также формация клеток, определяют, как быстро популяция будет расти или умирать.
А зачем вообще нужен клеточный автомат?
Как минимум, он способен предсказывать развитие реальных популяций. А в программировании его можно использовать для… *барабанная дробь*
Генерации пещер. Да, серьезно.
Представьте, что у вас есть игра по типу Minecraft, в которой случайным образом нужно создавать пещеры (не говорю, что в реальном Minecraft это так работает, там все гораздо сложнее). Если правильно сбалансировать birth limit, death limit и шанс инициализации, то за 20-30 шагов симуляции на случайно созданном поле можно получить большое пространство из «мертвых» клеток — то есть, пещеру.
В этой статье как раз хорошо объяснено.
Год назад я в команде создавал свою версию Game of Life на языке Си. Сейчас делаю приложение, где есть генерация пещер с помощью клеточного автомата, так что этот алгоритм мне уже как родной :)
#Algorithms
Это алгоритм / механизм для симуляции «рождения» и «смерти» клеток в матрице. Изначально придуман Джоном Конвеем в 1970 для «Игры в жизнь» (Game of Life), смысл которой в том, чтобы задать популяцию «живых» клеток и наблюдать за тем, как она меняется со временем (а если загуглить «game of life», гугл выдаст симуляцию этой игры на странице поиска).
Кстати! Не бойтесь слова «матрица». В данном случае оно лишь означает клеточное 2D поле, в котором хранятся нули и единицы. Как лист бумаги для морского боя.
В игру Конвея можно поиграть здесь. Правила следующие:
— Есть изначальная матрица клеток, часть из которых «живые» (1) или «мертвые» (0). Можно задать ее случайно, можно использовать готовый паттерн (их целая куча — глайдеры, статичные фигуры, пушки и т.д.).
— В некоторых версиях автомата можно указать «шанс инициализации» — он задает, с какой вероятностью каждая отдельная клетка будет «живой» в первом поколении.
— Каждый новый «шаг» симуляции определяет, какие клетки будут «мертвыми» или «живыми». За это отвечают две величины — порог рождения (birth limit) — то, сколько «живых» соседей (минимум) должно быть у «мертвой» клетки, чтобы она «ожила», и порог смерти (death limit) — то, сколько «живых» соседей (минимум) должно быть у «живой» клетки, чтобы она не «умерла».
Пример: у «мертвой» клетки 4 «живых» соседа. Порог рождения — 3. Значит, на следующем шаге она станет «живой».
— Соседи — это ближайшие 8 клеток (иногда для крайних клеток учитывают соседей с другой стороны экрана). Таким образом, пороги рождения и смерти, а также формация клеток, определяют, как быстро популяция будет расти или умирать.
А зачем вообще нужен клеточный автомат?
Как минимум, он способен предсказывать развитие реальных популяций. А в программировании его можно использовать для… *барабанная дробь*
Генерации пещер. Да, серьезно.
Представьте, что у вас есть игра по типу Minecraft, в которой случайным образом нужно создавать пещеры (не говорю, что в реальном Minecraft это так работает, там все гораздо сложнее). Если правильно сбалансировать birth limit, death limit и шанс инициализации, то за 20-30 шагов симуляции на случайно созданном поле можно получить большое пространство из «мертвых» клеток — то есть, пещеру.
В этой статье как раз хорошо объяснено.
Год назад я в команде создавал свою версию Game of Life на языке Си. Сейчас делаю приложение, где есть генерация пещер с помощью клеточного автомата, так что этот алгоритм мне уже как родной :)
#Algorithms
Wikipedia
Игра «Жизнь»
клеточный автомат, моделирующий жизнь
💋2 1
В заключение, один из самых известных паттернов — глайдер
This media is not supported in your browser
VIEW IN TELEGRAM
А вот так выглядит пещерная генерация, которую я вставил в приложение
This media is not supported in your browser
VIEW IN TELEGRAM
Почему Гугл использует очевидно плохую модель перевода с языка на язык через «посредника» в виде английского? Ведь теряется столько нюансов, например, разница между «ты», «вы» и «Вы», которые в английском сливаются в единое «you».
С точки зрения программирования Гугл Переводчик использует оптимальное решение: на каждый язык требуется не более двух «словарей» (с этого языка на английский и с английского на этот язык).
В противном случае пришлось бы создавать такие «словари» для каждой пары языков — это факториальный рост памяти, а факториал — вообще самая страшная штука для программиста.
Если в первом случае при добавлении нового языка мы гарантированно добавляем ровно два словаря, то во втором мы добавляем 2 * (количество языков в базе), и с каждым новым языком число необходимых словарей растет.
В идеальном мире это было бы простое и даже элегантное решение, позволяющее сэкономить память и время обработки данных. Как программист я восхищаюсь; как человек, любящий языки, я в ужасе.
#Algorithms
С точки зрения программирования Гугл Переводчик использует оптимальное решение: на каждый язык требуется не более двух «словарей» (с этого языка на английский и с английского на этот язык).
В противном случае пришлось бы создавать такие «словари» для каждой пары языков — это факториальный рост памяти, а факториал — вообще самая страшная штука для программиста.
Если в первом случае при добавлении нового языка мы гарантированно добавляем ровно два словаря, то во втором мы добавляем 2 * (количество языков в базе), и с каждым новым языком число необходимых словарей растет.
В идеальном мире это было бы простое и даже элегантное решение, позволяющее сэкономить память и время обработки данных. Как программист я восхищаюсь; как человек, любящий языки, я в ужасе.
#Algorithms
👀2✍1👨💻1 1
