Найти в Дзене
Цифровая Переплавка

🎲 The Lowest Level PL: кубики, математика и языки программирования

В блоге The Lowest Level PL автор разбирает одну на первый взгляд «детскую» задачу о раскладке цветных кубиков, но превращает её в тест на то, какой язык программирования ближе к «низкоуровневому». Идея проста: иногда именно через практические задачи лучше всего понять философию языка. Есть девять позиций в ряд. Нужно разместить: Условие: одинаковые кубики не должны стоять рядом. Математически, через принцип включения–исключения, ответ известен: 3660 допустимых размещений. Но автор решил проверить — как с этой задачей справятся разные языки: Lean, Haskell и Rust. Задача прекрасно решается через комбинаторику: Но математика здесь — лишь референс. Интереснее посмотреть на программные реализации. Lean
📐 Формально-верифицируемая математика. Код в Lean очень декларативный, структура близка к теоремам: чёткие определения типов, функций и условий. Это «язык доказательств», где решение выглядит скорее как описание правил игры, чем как «алгоритм». Haskell
🎻 Классический функционал. Рекурсивны
Оглавление

В блоге The Lowest Level PL автор разбирает одну на первый взгляд «детскую» задачу о раскладке цветных кубиков, но превращает её в тест на то, какой язык программирования ближе к «низкоуровневому». Идея проста: иногда именно через практические задачи лучше всего понять философию языка.

🧩 Сама задача

Есть девять позиций в ряд. Нужно разместить:

  • 🔴 два красных кубика,
  • 🟢 два зелёных,
  • 🔵 два синих,
  • ⚪ три пустых места.

Условие: одинаковые кубики не должны стоять рядом.

Математически, через принцип включения–исключения, ответ известен: 3660 допустимых размещений. Но автор решил проверить — как с этой задачей справятся разные языки: Lean, Haskell и Rust.

🧮 Математическая элегантность

Задача прекрасно решается через комбинаторику:

  • 🌐 без ограничений — 7560 способов;
  • 🔗 учёт смежных пар одним блоком;
  • ➖ метод включения–исключения для вычитания «плохих» случаев;
  • ✅ в итоге — те самые 3660.

Но математика здесь — лишь референс. Интереснее посмотреть на программные реализации.

🛠️ Реализации на языках

Lean
📐 Формально-верифицируемая математика. Код в Lean очень декларативный, структура близка к теоремам: чёткие определения типов, функций и условий. Это «язык доказательств», где решение выглядит скорее как описание правил игры, чем как «алгоритм».

Haskell
🎻 Классический функционал. Рекурсивный перебор, аккуратный pattern matching, concatMap и filter выглядят почти как математические конструкции. Код читается как композиция функций — компактно и выразительно.

Rust
⚙️ Язык системного уровня. Автор честно пишет: «реализация не идеальна, я старался сохранить сходство с другими версиями». Тут — ручное управление векторами, мутабельные переменные, явный backtracking с push/pop. Интересно, что Rust не поддерживает хвостовую рекурсию как Haskell или Lean, поэтому код получается более «императивным» даже при одинаковой логике.

🤔 Мой взгляд

На мой взгляд, это сравнение очень показательно:

  • 🧾 Lean — это доказательство корректности, где программа = математика. Отлично для формализации, но не для продакшн-задач.
  • 🎼 Haskell — близок к математике, но при этом остаётся «живым языком», подходящим для быстрой проверки гипотез и элегантных решений.
  • 🔩 Rust — жёсткий, низкоуровневый, но именно поэтому подходит для реальных систем, где важны управление памятью и безопасность. Здесь он «самый низкоуровневый» из тройки, даже если синтаксис кажется многословным.

Интересный вывод: уровень языка определяется не только синтаксисом, но и моделью исполнения. Rust — ближе к железу, Haskell — ближе к математике, Lean — к доказательствам.

🌟 Почему это важно?

Подобные эксперименты помогают понять философию языка через простые задачи:

  • 📚 для обучения — видно, насколько компактно или многословно формулируется решение;
  • 🔐 для индустрии — ясно, где упор на безопасность, а где на выразительность;
  • 🧠 для исследователей — это шанс сравнить не скорость компиляции, а именно «уровень абстракции» языков.

Источники: