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

3 leetcoder 19-12-2024 к записи «Shortest write-up ever!»

Честный разбор с решением, которое не стыдно показать на собеседовании, я всё же сделаю :)

Идея 💡

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

arr1arr2arr3 → ... → arrnarr1

обязательно должны находиться в одном блоке, так как они взаимозависимы.

Описание подхода 🛠️

  1. Создаём массив chunk_assignment, чтобы отслеживать принадлежность каждого индекса к определённому блоку.
  2. Используем функцию assign_chunk для рекурсивного назначения всех индексов, связанных с текущим индексом, в один блок. Она:
    • Обновляет максимальный индекс текущего блока.
    • Помечает все посещённые индексы текущим номером блока.
  3. Внешний цикл:
    • Перебирает индексы массива.
    • Увеличивает счётчик блоков при обнаружении нового блока.
    • Завершает обработку текущего блока, когда все его элементы покрыты.
  4. Возвращаем общее количество блоков

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

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

impl Solution {
    pub fn max_chunks_to_sorted(arr: Vec<i32>) -> i32 {
        let n = arr.len();
        let mut chunk_assignment = vec![0; n]; // Tracks which chunk each index belongs to
        let mut chunk_count = 0; // Counter for the number of chunks

        // Helper function to assign indices to a chunk
        let mut assign_chunk = |start_idx: usize, chunk: i32, max_idx: &mut usize| {
            let mut current_idx = start_idx;
            while chunk_assignment[current_idx] == 0 {
                *max_idx = (*max_idx).max(current_idx);
                chunk_assignment[current_idx] = chunk;
                current_idx = arr[current_idx] as usize;
            }
        };

        let mut start_idx = 0;
        while start_idx < n {
            chunk_count += 1; // Start a new chunk
            let mut max_idx = start_idx;

            // Process the current chunk until all related indices are covered
            loop {
                assign_chunk(start_idx, chunk_count, &mut max_idx);
                if start_idx == max_idx {
                    break; // The current chunk is complete
                }
                start_idx += 1; // Move to the next index
            }
            start_idx += 1; // Move to the next unprocessed index
        }

        chunk_count // Return the total number of chunks
    }
}
перейти
2 leetcoder 13-01-2025 к записи «Проверка возможности коррекции скобочной записи с использованием итераторов 🚀»

Небезынтересно выглядит реализация этого же подхода на Go – у них весьма своеобразно реализуются итераторы в неожиданном для Go функциональном стиле. В реальной же практике такое редко гошники практикуют, как я понимаю, — гораздо проще байты строки in-place инвертировать.

// CharLockPair represents a character and its corresponding lock state.
type CharLockPair struct {
    char, lock rune
}

// Seq defines a functional iterator for yielding elements of type T.
type Seq[T any] func(func(T) bool)

// canBeValid checks if the given string can be a valid parentheses string.
func canBeValid(s, locked string) bool {
    if len(s)%2 != 0 {
        return false
    }

    // Forward pass
    if !checkBalance(forwardIter(s, locked)) {
        return false
    }

    // Backward pass
    if !checkBalance(backwardIter(s, locked)) {
        return false
    }

    return true
}

// checkBalance processes the iterator and determines if the sequence is balanced.
func checkBalance(seq Seq[CharLockPair]) bool {
    balance, free := 0, 0

    for pair := range seq {
        char, lock := pair.char, pair.lock

        if lock == '0' {
            free++
        } else if char == '(' {
            balance++
        } else {
            balance--
        }

        if balance < 0 {
            if free == 0 {
                return false // Stop iteration early
            }
            balance++
            free--
        }
    }

    return balance <= free
}

// forwardIter generates an iterator for the forward pass.
func forwardIter(s, locked string) Seq[CharLockPair] {
    return func(yield func(CharLockPair) bool) {
        for i := 0; i < len(s); i++ {
            if !yield(CharLockPair{char: rune(s[i]), lock: rune(locked[i])}) {
                return
            }
        }
    }
}

// backwardIter generates an iterator for the backward pass with swapped characters.
func backwardIter(s, locked string) Seq[CharLockPair] {
    return func(yield func(CharLockPair) bool) {
        for i := len(s) - 1; i >= 0; i-- {
            char := rune(s[i])
            if char == '(' {
                char = ')'
            } else {
                char = '('
            }
            if !yield(CharLockPair{char: char, lock: rune(locked[i])}) {
                return
            }
        }
    }
}
перейти
2 leetcoder 20-03-2025 к записи «🔗 Оптимальный поиск минимальной AND-стоимости пути »

Полезно заметить, что если использовать для разбиения на компоненты связности подход с Disjoint Set Unions, — можно получить решение, работающее на практике в 2 раза быстрее за счёт более эффективных аллокаций памяти (нет необходимости поддерживать списки смежности).

struct UnionFind {
    parent: Vec<usize>,
    size: Vec<usize>,
    min_and: Vec<i32>,
}

impl Solution {
    pub fn minimum_cost(n: i32, edges: Vec<Vec<i32>>, query: Vec<Vec<i32>>) -> Vec<i32> {
        let n = n as usize;
        let mut uf = UnionFind::new(n);

        // Process edges to construct the Union-Find structure
        for edge in &edges {
            let (u, v, w) = (edge[0] as usize, edge[1] as usize, edge[2]);
            uf.union(u, v, w);
        }

        // Process queries efficiently
        query.into_iter().map(|q| {
                let (s, t) = (uf.find(q[0] as usize), uf.find(q[1] as usize));
                if s == t { uf.min_and[s] } else { -1 }
            }).collect()
    }
}

impl UnionFind {
    fn new(n: usize) -> Self {
        UnionFind {
            parent: (0..n).collect(),
            size: vec![1; n],
            min_and: vec![-1; n],
        }
    }

    fn find(&mut self, x: usize) -> usize {
        if self.parent[x] != x {
            self.parent[x] = self.find(self.parent[x]); // Path compression
        }
        self.parent[x]
    }

    fn union(&mut self, a: usize, b: usize, weight: i32) {
        let mut root_a = self.find(a);
        let mut root_b = self.find(b);

        if root_a != root_b {
            // Union by size: attach the smaller tree under the larger tree
            if self.size[root_a] < self.size[root_b] {
                std::mem::swap(&mut root_a, &mut root_b);
            }
            self.parent[root_b] = root_a;
            self.size[root_a] += self.size[root_b];
            self.min_and[root_a] &= self.min_and[root_b];
        }

        // Update min_and for the new root
        self.min_and[root_a] &= weight;
    }
}
перейти
3 ydmitry 14-05-2024 к записи «Короткие фантастические рассказы»

Про Шекли ты уже сказал, надеюсь не имеешь в виду только один его рассказ.

Из менее известных очень рекомендую Грега Игана. Кроме рассказов, у него и романы суперские ("Карантин", "Город перестановок", остальные тоже неплохи, но мне уже меньше понравились).

Можно начать с рассказов "Во тьму" и "Тёмные целые", чтобы оценить оригинальность идей. А потом просто любой брать и наслаждаться.

перейти
3 wd28 07-05-2024 к записи «Короткие фантастические рассказы»

Попробуй достать архив журнала "Полдень, XXI век", мне кажется, как раз то, что тебе может быть интересно. Он закрылся в 2013, сейчас под таким же названием выпускаются периодические альманахи, но про них я не могу сказать, ок или нет.

перейти
1 leetcoder 27-02-2025 к записи «🚀 Двунаправленный итератор + оптимизированный ДП для поиска самой длинной фибоначчиевой подпоследовательности»

Интересным выглядит способ, как красиво декомпозировать решение.
Для этого мы выделим итератор по всем кортежам {(x,y) | x+y=z} в отдельный метод.

use std::collections::HashMap;
use std::cmp::Ordering;

impl Solution {
    pub fn len_longest_fib_subseq(arr: Vec<i32>) -> i32 {
        let n = arr.len();
        let mut dp: HashMap<(i32, i32), i32> = HashMap::new(); // DP table storing lengths of valid subsequences

        // Iterate over each element z as a potential end of a Fibonacci-like sequence
        for k in 2..n {
            let z = arr[k];

            // Use an iterator to find all valid pairs (x, y) where x + y = z
            for (x, y) in Self::pair_sum_iterator(arr[..k].iter(), z) {
                // Apply DP transition: dp[z, y] = dp[y, x] + 1, defaulting to 2 if not found
                let cur_len = dp.get(&(y, x)).unwrap_or(&2) + 1;

                // Store computed length for (z, y)
                dp.insert((z, y), cur_len);
            }
        }

        // Return the longest found subsequence length, or 0 if none exist
        *dp.values().max().unwrap_or(&0)
    }

    /// A helper function that iterates over pairs (x, y) in a sorted array slice,
    /// finding pairs where x + y == target_sum using a two-pointer approach.
    fn pair_sum_iterator<'a>(mut iter: impl DoubleEndedIterator<Item = &'a i32>, target_sum: i32) -> impl Iterator<Item = (i32, i32)> {
        std::iter::from_fn(move || {
            let mut front = iter.next();
            let mut back = iter.next_back();

            while let (Some(&x), Some(&y)) = (front, back) {
                match (x + y).cmp(&target_sum) {
                    Ordering::Equal => return Some((x, y)), // Found a valid pair (x, y)
                    Ordering::Less => front = iter.next(),  // Increase x to increase the sum
                    Ordering::Greater => back = iter.next_back(), // Decrease y to reduce the sum
                }
            }
            None
        })
    }
}
перейти
3 finder 07-05-2024 к записи «Короткие фантастические рассказы»

1) Тед Чан

2) Если читаешь по-английски, то рекомендую qntm, особенно вот эти:
- https://qntm.org/responsibilit
- https://qntm.org/mmacevedo (есть переводы на русский, в т.ч. мой)
- https://qntm.org/gorg

перейти
2 leetcoder 03-12-2024 к записи «Эффективное добавление пробелов в строку 🚀»

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

impl Solution {
    pub fn add_spaces(s: String, spaces: Vec<i32>) -> String {
        // Convert indices to usize
        let mut spaces: Vec<usize> = spaces.into_iter().map(|s_pos| s_pos as usize).collect();

        // Add the start (0) and end (s.len()) boundaries to spaces
        spaces.insert(0, 0);
        spaces.push(s.len());

        // Create slices from spaces indices
        let slices: Vec<&str> = spaces.windows(2)
            .map(|window| &s[window[0]..window[1]])
            .collect();

        // Join the slices with spaces
        slices.join(" ")
    }
}

В этом коде есть один грустный момент - необходимость создания промежуточного вектора из слайсов исходной строки.
К сожалению, join из стандартной библиотеки позволяет только такое использование.
Но, если мы не ограничеы стандартной библиотекой, то крейт itertools спешит нам на помощь ;)

перейти
2 leetcoder 06-02-2025 к записи «🧮💥 Частотный анализ для подсчета кортежей с равными произведениями»

На практических масштабах решение со сложностью O(N²logN) (сложить все произведения в вектор, который потом отсортировать и посчитать частоты по нему) работает немного (на 20%) быстрее.
Хороший пример, когда константа от хэш-таблицы даёт больший вклад, чем логарифм от сортировки!

impl Solution {
    pub fn tuple_same_product(nums: Vec<i32>) -> i32 {
        // Build vector of products for all unique pairs.
        let mut products: Vec<_> = (1..nums.len())
            .flat_map(|j| (0..j).map(|i| nums[i] * nums[j]).collect::<Vec<_>>())
            .collect();

        // Sort to group identical products.
        products.sort_unstable();

        // Group products, calculate frequency-based contributions, and sum them.
        4 * products.chunk_by(|a, b| a == b)
            .filter_map(|group| if group.len() > 1 {Some(group.len() as i32)} else {None})
            .map(|freq| freq * (freq - 1))
            .sum::<i32>()
    }
}
перейти
2 leetcoder 03-02-2025 к записи «😊 Простое 3-х строчное решение для нахождения самой длинной монотонной последовательности»

Можно предоставить также и решение за один проход.
Мне кажется, что оно менее изящно. Но всё-равно имеет право быть упомянутым:

use std::cmp::Ordering;

impl Solution {
    pub fn longest_monotonic_subarray(nums: Vec<i32>) -> i32 {
        nums.windows(2).fold((1, 1, 1), |(max_chain, inc_chain, dec_chain), w| {
            match w[1].cmp(&w[0]) {
                // extend decreasing chain; reset increasing chain; update max_chain
                Ordering::Less => (max_chain.max(dec_chain + 1), 1, dec_chain + 1),
                // reset both chains on equal elements
                Ordering::Equal => (max_chain, 1, 1), 
                // extend increasing chain; reset decreasing chain; update max_chain
                Ordering::Greater => (max_chain.max(inc_chain + 1), inc_chain + 1, 1),
            }
        }).0
    }
}
перейти
 в ответ на чей-то комментарий к записи «Shortest write-up ever!»

 в ответ на чей-то комментарий к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

2 leetcoder 15-01-2025 к записи «🔥 Жадный побитовый подход для решения задачи минимизации XOR»

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

impl Solution {
    pub fn minimize_xor(num1: i32, num2: i32) -> i32 {
        let n1 = num1.count_ones();
        let n2 = num2.count_ones();

        let mut result = num1;
        for _ in n1..n2 {
            result |= result + 1
        }

        for _ in n2..n1 {
            result &= result -1 
        }

        result
    }
}
перейти
2 kitesh 17-12-2024 к записи «Посвящается Сепиру и Уорфу»

Кажется что мы разговариваем на сильно разных английских.

По моему опыту:
- slayer вышел из употребления, последние пару раз я видел это слово в названии группы
- triggerman, manslayer вообще ни разу в жизни не встречал
- cutthroat до сегодняшнего дня был уверен что это исключительно прилагательное
- insecurity имхо к ревности имеет крайне опосредованое отношение, оно скорее про низкую самооценку и недостаток признания
- intelligentsia видел только применительно к СССР, в дискуссиях о США это скорее cultural elite/educated class/chattering class

перейти
2 voodookiidoo 22 ч назад к записи «🚀 Анализ входящих рёбер для определения чемпиона турнира»

разрешите поделиться своим решением начальник!

use std::collections::HashSet;
use std::ops::Sub;

impl Solution {
    pub fn find_champion(n: i32, edges: Vec<Vec<i32>>) -> i32 {
        let players = (0..n).collect::<HashSet<_>>();
        let loosers: HashSet<_> = edges.iter().map(|it| it[1]).collect();
        let new = players.sub(&loosers);
        if new.len() != 1 {
            return -1;
        }
        new.into_iter().next().unwrap()
    }
}
перейти
2 someanonimcoder 07-05-2024 к записи «KAN'ы и ряды Фурье»

Fun fact, ставящий под сомнение осмысленность модели: ее не попробовали ни на каких реальных данных. Как мне кажется, вариантов три:
- оно настолько бесполезное что даже на мнисте не завелось
- завелось, но результаты такие что стремно показать
- просто забили - неправдоподобная версия(ну странно же придумать новую архитектуру, описать ее теоретическое обоснование преимуществ и не попробовать ее ну хотя бы на паре первых попавшихся датасетов с kaggle)

перейти
2 finder 03-05-2024 к записи «KAN'ы и ряды Фурье»

Вот тут чувак попробовал как раз ряды Фурье https://news.ycombinator.com/item?id=40222212

В целом насчет хайпа вокруг KAN даже не знаю, статья выглядит прямым нарушением принципа the bitter lesson: давайте перейдем на что-то не GPU-friendly ради выигрыша в размере модели.

перейти
1 voodookiidoo 18 ч назад к записи «🔄 Проверка преобразования строк с ограничениями на движение»

опять же поделюс своим решением тоже!
хотя оно не такое оптимальное судя по всему)

use std::iter::zip;

impl Solution {
    pub fn can_change(start: String, target: String) -> bool {
        {
            let s1 = start.chars().filter(|it| *it != '_').collect::<String>();
            let s2 = target.chars().filter(|it| *it != '_').collect::<String>();
            if s1 != s2 {
                return false;
            }
        };
        let lindices1 = Self::collect(&start, 'L');
        let rincides1 = Self::collect(&start, 'R');
        let lindices2 = Self::collect(&target, 'L');
        let rindices2 = Self::collect(&target, 'R');
        for (l1, l2) in zip(lindices1, lindices2){
            if l1 <= l2{
                return false
            }
        }
        for (r1, r2) in zip(rincides1, rindices2){
            if r1 >= r2{
                return false
            }
        }
        true
    }
    fn collect(s:&str, target:char)->Vec<usize>{
        s.char_indices().filter(|(_, ch)|*ch == 'L').map(|it|it.0).collect()
    }
}
перейти
2 finder 19-12-2024 к записи «Shortest write-up ever!»

Я освободил свой разум и понял первое решение. По-моему, его не стыдно и на собесе написать (разве что не в таком стиле, а циклом), оно не эзотерическое.

перейти
2 someanonimcoder 07-05-2024 к записи «Короткие фантастические рассказы»

не короткое, но советую - "Факап" Харитонова, весьма качественный фанфик-полемика со Стругацкими(конкретно миром полудня), Рубидий(аналогично с ПНВС)

перейти
2 finder 17-12-2024 к записи «Жадная сборка строки с ограничениями 😊»

Интересно, в каких компаниях такие ужасы спрашивают. У меня платного leetcode нет, не подскажешь, если у тебя есть, конечно?

перейти
2 finder 10-12-2024 к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

А в Rust нет аналога std::nth_element? Можно было бы от klogk избавиться (не то чтобы это на практике очень важно, конечно)

перейти
2 someanonimcoder 07-05-2024 к записи «Короткие фантастические рассказы»

"Тройной контакт", Юдковски
"Привключения пилота пиркса", Лем - если вдруг еще нет

перейти
1 leetcoder 18-03-2025 к записи «🔥 Поиск наибольшего «красивого» подмассива методом скользящего окна в чистом функциональном стиле»

Привычное итеративное решение, конечно, стоит также привести для сравнения

impl Solution {
    pub fn longest_nice_subarray(nums: Vec<i32>) -> i32 {
        let mut current_bitset = 0;
        let mut max_len = 0;
        let mut left = 0;

        for (right, &val) in nums.iter().enumerate() {
            // Shrink the window if nums[right] conflicts with current_bitset
            while current_bitset & val != 0 {
                current_bitset ^= nums[left];
                left += 1;
            }

            // Expand the window by including nums[right]
            current_bitset |= val;
            max_len = max_len.max((right - left + 1) as i32);
        }

        max_len
    }
}
перейти
 в ответ на чей-то комментарий к записи «Посвящается Сепиру и Уорфу»

 в ответ на чей-то комментарий к записи «Hot Take #7: Нам *нужна* евгеника»

1 heni 13-12-2024 к записи «Пятница, 13-е, чудовища из зазеркалья»

Выглядит как хайп ради хайпа. Также как было с микро черными дырами от Большого Андронного Коллайдера.

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

перейти
1 finder 27-04-2024 к записи «Fallout»

Например, сценарист - Джонатан Нолан (брат режиссера и сценарист фильмов "Мементо", "Престиж", "Темный рыцарь", "Интерстеллар").

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

перейти
1 leetcoder 02-12-2024 к записи «🔍 Найти слово по префиксу!»

Даже в этом решении, если заглянуть глубже split_whitespace не массив слайсов возвращает, а итератор по ним
sruct.SplitWhitespace. В спецификации его характеристики по дополнительной памяти не уточняются, но вполне возможно реализовать такой итератор на константных костах. И можно обсудить как сделать итератор с такими гарантиями самостоятельно.

перейти
 в ответ на чей-то комментарий к записи «Shortest write-up ever!»

1 anonymous 01-12-2024 к записи «💡 Проверка существования элемента совместно со своим удвоением»

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

перейти
 в ответ на чей-то комментарий к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

1 leetcoder 04-03-2025 к записи «🚀 Разбиение массива вокруг опорного элемента с сохранением порядка»

Стоит также обратить внимание на чуть более медленное, зато короткое решение через стабильную сортировку

impl Solution {
    pub fn pivot_array(mut nums: Vec<i32>, pivot: i32) -> Vec<i32> {
        nums.sort_by_key(|&num| num.cmp(&pivot)); nums
    }
}
перейти
 в ответ на чей-то комментарий к записи «Очередь с приоритетами для оптимальной подгонки среднего уровня студентов 🎯»

1 finder 16-12-2024 к записи «Очередь с приоритетами для оптимальной подгонки среднего уровня студентов 🎯»

Для максимизации среднего соотношения нужно жадно добавлять студентов

Почему? Это совершенно не очевидное математически утверждение. У нас тут какая-то очень ядреная функция от n переменных, почему жадным методом мы придем в её глобальный минимум, а не в локальный?

перейти
1 anonymous 02-12-2024 к записи «🔍 Найти слово по префиксу!»

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

перейти
1 leetcoder 11-02-2025 к записи «🚀 Эффективное удаление подстроки с помощью КМП»

@ finder
Посмотри, пожалуйста, почему обещаемая в документации "быстрая ссылка на википедию" не срабатывает у меня:

[[Алгоритм_Кнута_—Морриса—_Пратта]]

перейти
 в ответ на чей-то комментарий к записи «KAN'ы и ряды Фурье»

1 finder 07-02-2025 к записи «🚀 Отслеживание цветов шариков с использованием 2 HashMap»

Я, видимо, туплю, хеш-таблицы-то зачем? Двух массивов хватило бы?

перейти
1 finder 01-12-2024 к записи «Сертификат протух?»

Хм, здесь появилась жизнь! Сертификат обновил =)

перейти
1 1e9y 03-09-2024 к записи «Сертификат протух?»

Нужно было начать с чата в Телеграме!

перейти
 в ответ на чей-то комментарий к записи «Пятница, 13-е, чудовища из зазеркалья»

1 moonug 01-09-2024 к записи «Сертификат протух?»

Кто здесь? :)

перейти
 в ответ на чей-то комментарий к записи «Эффективное добавление пробелов в строку 🚀»

 в ответ на чей-то комментарий к записи «🚀 Отслеживание цветов шариков с использованием 2 HashMap»

 в ответ на чей-то комментарий к записи «🔍 Найти слово по префиксу!»

 в ответ на чей-то комментарий к записи «Пятница, 13-е, чудовища из зазеркалья»

 в ответ на чей-то комментарий к записи «🔍 Найти слово по префиксу!»

 в ответ на чей-то комментарий к записи «Hot Take #7: Нам *нужна* евгеника»

 в ответ на чей-то комментарий к записи «KAN'ы и ряды Фурье»

 в ответ на чей-то комментарий к записи «🚀 Отслеживание цветов шариков с использованием 2 HashMap»

 в ответ на чей-то комментарий к записи «KAN'ы и ряды Фурье»

 в ответ на чей-то комментарий к записи «Shortest write-up ever!»

 в ответ на чей-то комментарий к записи «🔄 Проверка преобразования строк с ограничениями на движение»

 в ответ на чей-то комментарий к записи «Hot Take #7: Нам *нужна* евгеника»

 в ответ на чей-то комментарий к записи «🚀 Отслеживание цветов шариков с использованием 2 HashMap»

 в ответ на чей-то комментарий к записи «🏆 Оптимальный анализ подстрок, состоящих из одного символа»

 в ответ на чей-то комментарий к записи «Hot Take #7: Нам *нужна* евгеника»

 в ответ на чей-то комментарий к записи «Hot Take #7: Нам *нужна* евгеника»

 в ответ на чей-то комментарий к записи «Hot Take #7: Нам *нужна* евгеника»

 в ответ на чей-то комментарий к записи «Hot Take #7: Нам *нужна* евгеника»

 в ответ на чей-то комментарий к записи «Короткие фантастические рассказы»

 в ответ на чей-то комментарий к записи «Жадная сборка строки с ограничениями 😊»

 в ответ на чей-то комментарий к записи «Короткие фантастические рассказы»

 в ответ на чей-то комментарий к записи «Совет молодому руководителю в IT»

 в ответ на чей-то комментарий к записи «Сертификат протух?»