главная новое лучшее написать
неделя месяц год вечное
посты пользователи ответы
6

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

"Ученик" ("школьник") по-английски "зрачок". То есть, "я весь внимание", буквально.

По-английски в радуге тоже семь цветов. Но это другие семь цветов. Синий и голубой ведь один и тот же цвет, а вот фиолетовые бывают разные.

"Государство" по-английски звучит примерно как "состояние дел". "Failed state" это не когда из крана перестает течь вода, а террористы мародерят в пригородах столицы, это просто констатация того, что некое "состояние дел" перестало самовоспроизводиться. "State", впрочем, даже в узком значении "состояние дел, связанное с управлением людьми на определенном куске земного шара" бывает не только таким, к которому мы привыкли (то, скорее, "nation state").

Слова "gore" в русском языке нет, хотя понятие, казалось бы, абсолютно базовое.

Слово "убийца" можно перевести на английский по меньшей мере 8 разными способами (slayer, killer, murderer, assassin, hitman, triggerman, manslayer, cutthroat). Наверное, есть больше. По-русски есть ещё душегуб, головорез (хотя он, скорее, thug, чем cutthroat) и позаимствованный "киллер". Вроде бы, всё?

Слова "зависть" и "ревность" почти взаимозаменяемы и носители языка считают нужным многословно пояснять разницу между ними, причем "зависть" (по крайней мере, в подобных заметках) считается более позитивным чувством. С другой стороны, "ревность" это вообще-то два разных слова, jealousy и insecurity, в зависимости от того, обладает ли испытывающий это чувство предметом вожделения в настоящий момент. "Insecurity", впрочем, это далеко не только "ревность". Сложна.

"Интеллигенция" по-английски "intelligentsia". В XXI веке употребляется далеко не только (и уже, по-моему, не столько) в значении "...в СССР", хотя раньше слово с таким значением почему-то никому не требовалось.

2 ответа
6

Внезапно обнаружил, что понятие «шуньята» или «пустота» из буддизма практически равнозначно любимому void*

Керниган и Ричи обучили нас азам буддизма?

ответить
4

Страшилку "серой слизи" изобрел футуролог Эрик Дрекслер еще в прошлом веке. Суть идеи в том, что самовоспроизводящиеся наноботы, если упустить их из лаборатории, могут начать бесконечно копировать себя, и в результате Земля превратится в бесформенную "серую слизь", состоящую из гигантской массы нанороботов.

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

Да?

Нет, первый реалистичный кандидат на роль "серой слизи" уже активно обсуждается, и именно в контексте "давайте сразу запретим, не дожидаясь, пока это начнут делать".

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

Почему так происходит, ведь вроде бы законы химии инвариантны относительно зеркальной симметрии? Дело в том, в этом смысле почему-то несимметричны все живые существа. Аминокислоты, из которых состоят белки, в природе существуют почти исключительно в "левой" форме, а сахара, например, глюкоза, только в "правой". Хотя при замене хиральности у всех молекул, участвующих в реакции, ничего не поменялось бы, если заменить хиральность только у части из них, она может пойти совсем иначе, поэтому то, что жизнь несимметрична, важно.

Читать дальше →

3 ответа
4

Для задачи 769. Max Chunks To Make Sorted у меня есть очень короткое решение, а значит и разбор не стоит делать длинным ;)

Задача: Максимальное количество отсортированных блоков 🧩

Дана перестановка arr длины n. Нужно разделить массив на максимальное количество блоков, таких, что, отсортировав каждый блок по отдельности и объединив их, получится полностью отсортированный массив.

Идея

Вводим функцию баланса, зависящую от частичных сумм по индексам и значениям. Каждый новый блок формируем при нулевых балансах.

Подход

Напишем код самым коротким и непонятным читателю образом, как только умеем.

Сложность:

Исходный код

impl Solution {
    pub fn max_chunks_to_sorted(arr: Vec<i32>) -> i32 {
        arr.into_iter().enumerate().fold(
            (0, 0), |acc, (val, idx)| (
                acc.0 + val as i64 - idx as i64, 
                acc.1 - (acc.0.abs()-1).min(0) as i32)
        ).1
    }
}

5 ответов
4

Посоветуйте, пожалуйста, короткие фантастические рассказы. Очень люблю этот жанр, особенно, перед сном.

Со своей стороны, предложу«Индетерминированный ключ» (The Laxian Key ) Шекли.

7 ответов
3

4 ответа
3

В среде ML'щиков прямо захайпились сети Колмогорова-Арнольда - https://arxiv.org/abs/2404.19756
А насколько по вашему безумная идея попробовать другие варианты апроксимации функций на рёбрах сети. Математически базис рядов Фурье вроде как лучше должен на эту задачу ложиться, нежели сплайны.

5 ответов
4

Но и постов давно не было. Не уверен, что получилось коммьюнити :-(

4 ответа
3

Fallout

exunitato, 26-04-2024

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

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

И смешно, конечно, что такой антикапиталистический памфлет, снят на деньги Амазона!

1 ответ
3

С самого начала развития теории ветвящихся процессов было ясно, что в некоторых случаях они могут быть применены в генетике. Но в 1948 году в СССР был окончательно завершен разгром генетики. При существовавшем тогда официальном государственном мировоззрении разгром генетики привел к тому, что даже теория вероятностей оказалась под угрозой стать в глазах властей «вредной наукой». В 1946 году вышел в четвертом издании учебник академика Сергея Натановича Бернштейна «Теория вероятностей», в котором было много задач, связанных с законами Менделя. Учебник быстро разошелся, и все попытки автора издать стереотипно следующее издание не привели к успеху. От автора требовали убрать эти задачи, на что он не согласился. Одним из тех, кто принимал активное участие в уничтожении генетики в СССР, был академик Трофим Денисович Лысенко, президент Всесоюзной академии сельскохозяйственных наук. Лысенко тогда бросил лозунг: «Наука – враг случайности». Отсюда недалеко и до организационных выводов. Я не могу забыть, как блестяще в МГУ публично выступил член-корреспондент Академии наук СССР Александр Яковлевич Хинчин. Он сказал: «Известен лозунг: «Наука – враг случайности». И это абсолютно верно. Но врага надо изучать. И это делает теория вероятностей».

воспоминания Б.А. Севастьянова

Заметка из Телеграм-канала "Воспоминания математиков", который всем рекомендую @mathmemories

6 ответов
3

Благодаря журналистам всем известно, что за возникновение массы ответсвенен бозон Хиггса.
Благодаря фантастам и не только всем известна разрушительная сила антивещества.
Всё что нужно - это объединить 2 понятия!

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

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

Это можно сравнить с изменением веса предмета на земле и на луне: из-за различий в гравитационной силе предмет будет иметь разную массу. Аналогично, изменение массы элементарных частиц под воздействием антибозона Хиггса может привести к уменьшению общей массы организма.

7 ответов
3

Сегодня мы рассмотрим решение задачи 2116. Check if a Parentheses String Can Be Valid.

🧩 Описание задачи

Дана строка s, состоящая только из символов '(' и ')', и строка locked длины n, состоящая из символов '0' и '1'. Каждая позиция в locked указывает, можно ли изменить символ в s на этой позиции:

Нужно определить, можно ли сделать строку s корректной скобочной записью.

💡 Идея

Решение основывается на двух проходах по строке:
- Прямой проход: Проверяем баланс открывающих и закрывающих скобок слева направо, учитывая символы, которые можно менять.
- Обратный проход: Инвертируем строку (меняем '(' на ')' и наоборот) и проверяем баланс справа налево.

При каждом проходе используем два счётчика:
- balance для отслеживания текущего баланса скобок.
- free для отслеживания количества символов, которые можно изменить.

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

Читать дальше →

1 ответ
3

Сегодня чуток похулиганим и предоставим переоптимизированное решение для задачи 2554. Maximum Number of Integers to Choose From a Range I. В реальном интервью такое могут потребовать лишь на уровне идеи, но нам интересно запрограммировать самим :)

Описание задачи 📋

Необходимо выбрать максимально возможное количество чисел из диапазона [1,n], при этом соблюдая ограничения:
- Числа из списка banned выбирать нельзя.
- Каждое число можно использовать не более одного раза.
- Сумма выбранных чисел не должна превышать maxSum.

Результатом должно быть количество чисел, которые можно выбрать, удовлетворяя этим условиям.

Идея решения 💡

Предвычисляем суммы запрещённых чисел и используем двоичный поиск, чтобы найти максимальное k, для которого сумма допустимых чисел в диапазоне [1,k] не превышает maxSum. Это позволяет эффективно учитывать ограничения и избежать лишних вычислений.

Обзор решения 🧠

  1. Сортировка и удаление дубликатов:
    • Сортируем массив banned и удаляем повторяющиеся элементы.
  2. Предвычисление кумулятивных сумм:
    • Создаем массив ban_sums, где на позиции i содержится сумма первых i запрещённых чисел. Это позволяет быстро вычислять сумму запрещённых чисел до любого предела.

Читать дальше →

ответить
3

Ссылка на задачу – 1718. Construct the Lexicographically Largest Valid Sequence.

📌 Условие задачи

Дано число n. Необходимо построить последовательность, удовлетворяющую следующим условиям:

💡 Идея

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

🔄 Подробности метода

  1. Рекурсивно заполняем последовательность, начиная с первого свободного индекса.
  2. Используем массив used, который отслеживает, какие числа уже размещены.
  3. Пропускаем занятые позиции.
  4. Проверяем возможность размещения числа заранее, прежде чем выполнять рекурсию.

Читать дальше →

ответить
3

Ссылка на задачу - 2570. Merge Two 2D Arrays by Summing Values.

📌 Описание задачи

Даны два отсортированных списка nums1 и nums2, где каждый элемент представлен в виде [id, value].
Нужно объединить их в один список, упорядоченный по id, при этом суммируя значения для совпадающих id.

💡 Идея

Так как оба списка уже отсортированы по id, можно пройтись по ним одновременно, сравнивая id и добавляя элементы в результат.
Такой метод позволяет решить задачу за O(n + m) без дополнительной сортировки.

🛠 Подробности подхода

  1. Используем два индекса i и j для итерации по nums1 и nums2.
  2. Сравниваем текущие id:
    • Если id1 < id2 → добавляем nums1[i] в результат, сдвигаем i.
    • Если id1 > id2 → добавляем nums2[j] в результат, сдвигаем j.
    • Если id1 == id2 → суммируем значения, добавляем результат, сдвигаем оба указателя.
  3. Добавляем оставшиеся элементы из nums1 и nums2, если таковые имеются.

Читать дальше →

ответить
3

Ссылка на задачу — 2379. Minimum Recolors to Get K Consecutive Black Blocks.

📌 Описание задачи

Дана строка blocks, состоящая из символов 'W' (белый) и 'B' (чёрный).
Необходимо определить минимальное число перекрашиваний белых блоков в чёрные, чтобы получить хотя бы одну последовательность из k подряд идущих чёрных блоков.

💡 Идея

Используем технику скользящего окна:

📖 Детали подхода

  1. Посчитаем число белых блоков в первом окне размера k.
  2. Сдвигаем окно вправо на один символ за раз:
    • если символ, который «входит» в окно, белый ('W'), увеличиваем счётчик;
    • если символ, который «выходит» из окна, белый, уменьшаем счётчик.
  3. После каждого сдвига окна обновляем минимальное найденное значение.
  4. Итоговый ответ — это минимальное число белых блоков за всё время обхода.

⏳ Асимптотика

🛠️ Исходный код

impl Solution {
    pub fn minimum_recolors(blocks: String, k: i32) -> i32 {
        let blocks = blocks.as_bytes();
        let k = k as usize;

        // Count white blocks ('W') in the first window of size k
        let initial_recolors = blocks[..k].iter().filter(|&&b| b == b'W').count() as i32;

        // Slide window over the blocks using iterator methods
        blocks
            .windows(k+1)
            .fold((initial_recolors, initial_recolors), |(current, min), window| {
                // Update recolors based on outgoing and incoming blocks
                let next = current 
                    + (window.last() == Some(&b'W')) as i32 
                    - (window.first() == Some(&b'W')) as i32;

                (next, min.min(next))
            }).1
    }
}

Tags: #rust #algorithms #counting

ответить
3

Сегодняшняя задача 1475. Final Prices With a Special Discount in a Shop решается с помощью стандартного стека, но интересно и нестандартно выглядит мотивация его использования.

Описание задачи 🛒

У вас есть массив цен prices, где prices[i] — это цена i-го товара. Если вы покупаете товар i, вы можете получить скидку, равную цене первого товара с индексом j>i, для которого выполняется условие prices[j] ≤ prices[i]. Если такого товара нет, скидка не применяется. Требуется вернуть массив, где каждая позиция показывает финальную цену с учётом скидки.

Идея 🤔

Подход 🚀

  1. Создаём стек discount_candidates, чтобы хранить индексы товаров, ожидающих применения скидки.
  2. Итерируем по массиву prices:
    • Пока верхний элемент стека соответствует условию скидки (цена товара в стеке ≥ текущей цене), применяем скидку и удаляем элемент из стека.

Читать дальше →

ответить
3

Сегодня нам предстоит решить задачу 494. Target Sum.

Описание задачи 📜

Нам дана последовательность чисел nums и целевая сумма target.
Необходимо определить количество способов поставить знаки + или - перед числами так, чтобы выражение из всех чисел дало в результате target.

Пример

Для nums = [1, 1, 1, 1, 1] и target = 3, всего 5 правильных комбинаций:

Идея 💡

Эту задачу можно свести к известной задаче о рюкзаке:

Читать дальше →

ответить
3

Ссылка на задачу – 2364. Count Number of Bad Pairs.

📌 Описание задачи

Дан массив nums, где пара индексов (i, j) называется плохой, если выполняется:

Требуется найти общее количество таких плохих пар.

💡 Идея

🛠️ Детали метода

  1. Создаём массив позиционных разностей:
    pos_diff[i]=nums[i]−i
  2. Сортируем массив pos_diff, группируя одинаковые значения.
  3. Используем метод chunk_by для подсчёта частот одинаковых значений.
  4. Для каждой такой частоты count, вычисляем количество хороших пар:
    count×(count−1)/2
  5. Всего существует n × (n - 1) / 2 пар, из них вычитаем хорошие пары и получаем ответ.

⏳ Асимптотика

🔥 Хотя сортировка для подсчёта частот медленнее хеш-таблиц в асимптотике, на практике она быстрее из-за низкой константы!

📝 Исходный код

impl Solution {
    pub fn count_bad_pairs(nums: Vec<i32>) -> i64 {
        let n = nums.len() as i64;

        // Compute adjusted values (nums[i] - i) and sort
        let mut pos_diff: Vec<_> = nums.into_iter()
            .enumerate()
            .map(|(idx, num)| num - idx as i32)
            .collect();

        pos_diff.sort_unstable();

        // Count good pairs using `chunk_by`
        let good_pairs: i64 = pos_diff
            .chunk_by(|a, b| a == b)
            .map(|chunk| (chunk.len() as i64 * (chunk.len() as i64 - 1)) / 2)
            .sum();

        // Total pairs - good pairs = bad pairs
        let total_pairs = n * (n - 1) / 2;
        total_pairs - good_pairs
    }
}

Tags: #rust #algorithms #math

ответить
3

Ссылка на задачу — 3108. Minimum Cost Walk in Weighted Graph.

📌 Описание задачи

Пример

💡 Идея

Читать дальше →

1 ответ
3

Задача - 2493. Divide Nodes Into the Maximum Number of Groups.

📌 Постановка задачи

Дан неориентированный граф с n вершинами, возможно несвязный. Требуется разбить вершины на m групп, соблюдая условия:
✔ Каждая вершина принадлежит ровно одной группе.
✔ Если вершины соединены ребром [a, b], то они должны находиться в смежных группах (|group[a] - group[b]| = 1).
✔ Найти максимальное количество таких групп m.
✔ Вернуть -1, если разбиение невозможно.

💡 Идея

🔍 Детали подхода

  1. Строим граф в виде списка смежности.
  2. Запускаем BFS из каждой вершины (а не только из одной в компоненте) для:
    • Проверки двудольности (по уровням BFS).
    • Поиска максимальной глубины BFS (max_level).
    • Определения уникального идентификатора компоненты (min_index).

Читать дальше →

ответить
3

Сегодня мы решаем задачу 3243. Shortest Distance After Road Addition Queries I

Постановка

В задаче требуется вычислить кратчайший путь от города 0 до города n-1 после каждой из последовательных добавлений новых дорог в граф. Изначально города соединены цепочкой дорог, и после каждой операции добавляется новая односторонняя дорога между двумя городами. Необходимо после каждой операции находить кратчайшее расстояние от города 0 до города n-1.

🔍 Идея

Данное решение использует оптимизированный подход с поочередным обновлением расстояний с помощью BFS и ранним выходом при нахождении цели (города n-1). Мы обновляем граф и расстояния только при необходимости, что позволяет сократить количество ненужных вычислений и повысить производительность.

📚 Обзор решения

  1. Инициализация графа и расстояний:
    • Сначала создаем список смежности succ, который представляет дороги между городами, инициализируем его так, чтобы города были соединены цепочкой (каждый город соединен с следующим).
    • Массив dist инициализируется так, что расстояние от города 0 до города i равно i (для начальной цепочки).
  2. Обработка запросов:
    • Для каждого запроса добавляется новая дорога между городами u и v. После этого запускается BFS с города v для обновления кратчайших расстояний до всех достижимых городов.

Читать дальше →

ответить
3

Новый день - новая задача 2109. Adding Spaces to a String.

Условие 🧩

Дана строка s и массив индексов spaces. Нужно добавить пробелы перед символами строки, расположенными по данным индексам, и вернуть новую строку. Например, для s = "EnjoyYourCoffee" и spaces = [5, 9] результатом будет "Enjoy Your Coffee".

Если решать абы как, то можно и в ней запутаться в индексах. Мы же будем делать все максимально просто.

Идея решения 🧠

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

Подход 🔍

  1. Предварительно выделяем память для результирующей строки с помощью String::with_capacity, учитывая длину строки и количество пробелов.
  2. Проходим по массиву индексов spaces:
    • Добавляем в результат подстроку от предыдущей позиции до текущего индекса.
    • Добавляем пробел.
  3. После цикла добавляем оставшуюся часть строки.
  4. Возвращаем итоговую строку.

Анализ сложности 📊

Исходный код решения

impl Solution {
    pub fn add_spaces(s: String, spaces: Vec<i32>) -> String {
        let mut result = String::with_capacity(s.len() + spaces.len()); // Pre-allocate capacity for efficiency
        let mut word_pos = 0;

        for &space_pos in &spaces {
            let space_pos = space_pos as usize; // Convert i32 to usize for indexing
            result.push_str(&s[word_pos..space_pos]); // Add the substring
            result.push(' '); // Add the space
            word_pos = space_pos;
        }

        result.push_str(&s[word_pos..]); // Add the remaining substring
        result
    }
}

2 ответа
3

Ссылка на задачу – 1352. Product of the Last K Numbers.

📌 Описание задачи

Необходимо создать структуру ProductOfNumbers, которая:

Гарантируется, что ответы не приведут к переполнению 32-битного целого.

💡 Идея

Будем использовать префиксные произведения.
Это позволит получать результат за O(1), выполняя деление последних значений.
Но так как деление на 0 запрещено, придётся аккуратно отслеживать этот случай и сбрасывать произведения при появлении нуля.

⚙️ Подход

  1. Используем Vec<i64> для хранения префиксных произведений.
  2. Добавление числа:
    • Если num == 0, очищаем хранилище, так как любое произведение после нуля будет равно нулю.
    • Иначе умножаем предыдущее произведение на текущее число и сохраняем результат.
  3. Вычисление get_product(k):
    • Если k больше количества сохранённых чисел, возвращаем 0.
    • Иначе делим последнее префиксное произведение на значение k шагов назад.

Читать дальше →

ответить
3

Сегодня разберём ещё одну простую задачу 1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence.

Описание задачи 📜

Дана строка sentence, состоящая из слов, разделённых пробелами, и строка searchWord. Нужно определить индекс (считаем с 1), где searchWord является префиксом какого-либо слова в sentence. Если такого слова нет — вернуть -1.

Решение 🛠️

Идея 💡

Задача сводится к простому проходу по словам строки. Мы должны проверить каждое слово: начинается ли оно с searchWord. Возвращаем индекс первого подходящего слова.

Алгоритм 🚀

  1. Разделяем строку sentence на слова с помощью метода split_whitespace, который возвращает ссылки на части исходной строки.
  2. Проходим по словам с их индексами через enumerate.
  3. Для каждого слова проверяем, начинается ли оно с searchWord с помощью метода starts_with.
  4. Если находим соответствие, возвращаем индекс (преобразуем его в формат 1-based). Если совпадений нет, возвращаем -1.

Анализ Сложности 📊

Исходный код решения

impl Solution {
    pub fn is_prefix_of_word(sentence: String, search_word: String) -> i32 {
        // Split the sentence into words using whitespace as a delimiter
        let words = sentence.split_whitespace();

        // Iterate through the words with their indices
        for (index, word) in words.enumerate() {
            // Check if search_word is a prefix of the current word
            if word.starts_with(&search_word) {
                return (index + 1) as i32; // Convert 1-based index to i32 and return
            }
        }

        -1 // Return -1 if no prefix match is found
    }
}

4 ответа

Страница 1 2 3 4