главная новое лучшее написать
3

Сегодня нам предстоит несложная задача - 2182. Construct String With Repeat Limit. Но технически она получилась муторной - требует от программиста очень аккуратного подхода к себе :)

Задача 📜

Дана строка s, состоящая из произвольных символов, и число repeat_limit. Необходимо построить лексикографически максимальную строку, используя символы из s, но с ограничением:

Подход 🚀

  1. Подсчёт частоты символов:
    • Используем массив размера 256, чтобы подсчитать количество вхождений каждого байта (символа).
  2. Жадный выбор символов:
    • Обходим пространство символов (0–255), начиная с самого большого.
    • Добавляем текущий символ в результат до repeat_limit раз или пока его количество не исчерпается.
    • Если нужно "разорвать" последовательность, вставляем следующий по величине символ, уменьшая его количество.
  3. Эффективный поиск следующего символа:
    • Вспомогательная функция find_last_valid_index ищет ближайший допустимый символ с ненулевой частотой, используя знание о текущем символе как ускоряющую подсказку.

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

2 ответа
3

На нашей новой задаче 2415. Reverse Odd Levels of Binary Tree есть повод продемонстировать продвинутые методы Rust работы с итераторами (std::iter::successors & std::iter::zip), а также "непристойную" работу c реф-каунт ячейками :(

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

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

💡 Идея

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

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

  1. Вспомогательная функция next_level:
    • Формирует следующий уровень дерева, собирая всех левых и правых потомков текущих узлов.
  2. Завершение обработки:
    • Проверка, что текущий уровень является листовым, выполняется через условие nodes[0].borrow().left.is_none().
    • При достижении уровня листьев обработка завершается.
  3. Обход уровней с помощью std::iter::successors:
    • Используется функциональный подход для последовательного формирования уровней дерева. Итератор автоматически останавливается при достижении листового уровня.

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

ответить
3

Сегодня нам предстоит решить задачу 1792. Maximum Average Pass Ratio.

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

У нас есть школа, где классы проводят итоговые экзамены. Каждый класс описывается массивом [pass_i,total_i], где:

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

2 ответа
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

На этот раз наша задача выглядит заковыристо - 2982. Find Longest Special Substring That Occurs Thrice II.

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

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

"Особенная" подстрока — это подстрока, содержащая один и тот же символ.

😊 Идея

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

🚀 Подход

  1. Перебираем все строчные английские буквы ('a' до 'z').
  2. Для каждой буквы:
    • Находим все её подряд идущие сегменты (например, для 'aaaabbaab' сегменты: [4,2], [2,1] для 'a' и 'b').
    • Сортируем длины сегментов по убыванию.
    • Вычисляем максимальную возможную длину "особенной" подстроки, встречающейся как минимум три раза, используя метод get_triple_length.

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

4 ответа
4

Сегодня нам предстоит решить задачу 2577. Minimum Time to Visit a Cell In a Grid.

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

💡 Идея

Задача сводится к поиску кратчайшего пути с учётом времени открытия ворот в каждой ячейке. Можно представить задачу как динамический граф, где вершины — это пары (время, ячейка), а рёбра — это возможные переходы между ячейками. Вместо того чтобы хранить весь граф, мы динамически вычисляем возможные переходы из посещаемых вершин. Вершины будем перебирать в порядке времён достижимости ячейки (как в алгоритме Дейкстры).

🔑 Подход к решению

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

ответить
3

Очередная наша задача - 2593. Find Score of an Array After Marking All Elements. Ну и так как наша цель не просто решать, а показывать имплементацию разных техник, то воспользуемся-ка мы идеей битового множества (его в стандартную библиотеку Rust еще "не подвезли", так что и операции имплементируем сами).

Задача 🧩

Дан массив положительных целых чисел nums. Ваша цель — получить максимальное значение score, выполняя следующие действия:

  1. Выберите наименьший немаркированный элемент массива (при равенстве — элемент с меньшим индексом).
  2. Добавьте значение этого элемента к score.
  3. Пометьте выбранный элемент и его двух соседей (если они существуют).
  4. Повторяйте, пока все элементы не будут помечены.

Необходимо вернуть итоговое значение score.

Идея 💡

В данной задаче нужно эффективно следовать указанным правилам. Чтобы сделать это:

Подход 🚀

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

ответить
4

Очередная задача: 2290. Minimum Obstacle Removal to Reach Corner.

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

Дана двумерная матрица grid размером m x n, где каждая клетка может быть либо пустой (0), либо препятствием (1), которое можно удалить. Задача заключается в том, чтобы найти минимальное количество препятствий, которые нужно удалить, чтобы пройти из верхнего левого угла (0, 0) в нижний правый угол (m-1, n-1), передвигаясь только по пустым клеткам или удаляя препятствия.

🔑 Идея

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

📋 Подробное описание подхода

  1. Инициализация: Мы создаем две очереди: front и back. Во front помещаем клетки, которые можно пройти без удаления препятствий, а в back — клетки, для которых потребуется удалить препятствие.
  2. Поиск в ширину (BFS):
    • Начинаем с верхнего левого угла и устанавливаем расстояние для этой клетки в 0 (т.е. препятствий еще не удалено).
    • Если клетка пустая (значение 0), мы добавляем её в front. Если клетка — препятствие (значение 1), то в back.

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

ответить
3

Очередная наша задача - 3381. Maximum Subarray Sum With Length Divisible by K

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

Дано целое число k и массив чисел nums. Необходимо найти максимальную сумму подмассива, длина которого кратна k.

🚀 Идея

Данная задача расширяет классический алгоритм нахождения максимальной суммы подмассива (алгоритм Кадане) для случаев, когда длина подмассива должна быть кратной k. Чтобы учесть это условие, мы перебираем все смещения в полуинтервале [0,k) и анализируем подмассивы с шагом k.

🔍 Подход

  1. Префиксные суммы:
    • Вычисляем массив префиксных сумм, чтобы быстро находить сумму любого подмассива.
  2. Перебор смещений:
    • Итерируем по всем возможным начальным смещениям [0,k), чтобы обрабатывать подмассивы длиной, кратной k.
  3. Модификация алгоритма Кадане:
    • Для каждого смещения применяем алгоритм нахождения максимальной суммы подмассива.
    • Если текущая сумма становится отрицательной, начинаем новый расчет с текущей позиции (сброс индекса начала подмассива).

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

ответить
3

Сегодня рассмотрим достаточно простое решение задачи 2779. Maximum Beauty of an Array After Applying Operation.

Условие 📋

Дан массив nums и целое неотрицательное число k. Разрешается заменить каждый элемент массива (не более одного раза) любым числом из диапазона [nums[i]−k,nums[i]+k]. Требуется найти максимальную длину подпоследовательности массива, состоящей из одинаковых элементов (это называется "красота массива").

Идея 💡

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

Подход 🛠️

  1. Сортировка массива: Упорядочиваем массив, чтобы элементы, которые могут принадлежать одному диапазону, оказались рядом.
  2. Скользящее окно: Используем два указателя (l и r) для определения максимального диапазона, удовлетворяющего условию nums[r]−nums[l]≤2×k.
  3. Подсчёт длины диапазона: На каждом шаге обновляем результат как максимум текущей длины окна r−l.

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

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

impl Solution {
    pub fn maximum_beauty(nums: Vec<i32>, k: i32) -> i32 {
        // Create a mutable copy of nums and sort it
        let mut sorted_nums = nums.clone();
        sorted_nums.sort_unstable();

        let mut max_beauty = 0;
        let mut right = 0;

        // Iterate over each number in the sorted array
        for left in 0..sorted_nums.len() {
            // Expand the right pointer as long as the difference is within the allowed range
            while right < sorted_nums.len() && sorted_nums[right] <= sorted_nums[left] + 2 * k {
                right += 1;
            }
            // Update the maximum beauty based on the current window size
            max_beauty = max_beauty.max((right - left) as i32);
        }

        max_beauty
    }
}

ответить
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 ответа
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

Сегодня на очереди задача 2825. Make String a Subsequence Using Cyclic Increments.

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

Даны две строки str1 и str2. Нужно определить, можно ли сделать str2 подпоследовательностью строки str1, выполнив не более одной операции циклического увеличения произвольного набора символов в str1.
Циклический сдвиг означает, что 'a' становится 'b', 'b''c', ..., 'z''a'.

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

Задача почти идентична проверке подпоследовательности в строке. Единственное отличие — сравнение символов становится чуть сложнее из-за необходимости учитывать циклический сдвиг.
Мы выделяем проверку совпадения символов в отдельный метод, а в остальном используем стандартный алгоритм проверки подпоследовательности.

Реализация подхода 🚀

  1. Используем два итератора для последовательного прохода по символам строк.
  2. Для сравнения символов применяем отдельную функцию, учитывающую как прямое совпадение, так и циклический сдвиг.
  3. При совпадении текущего символа строки str2 с символом из str1, переходим к следующему символу в str2.
  4. Если все символы str2 найдены в str1 в правильном порядке, возвращаем true, иначе — false.

Сложность алгоритма 📊

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

ответить
3

Спасибо загадочному пользователюleetcoder, здесь опять есть какая-то жизнь. По такому случаю попробуем сюда писать в формате классического web log, вдруг получится не бросить?

Прикольная статья про силу воли и выгорание. Как всегда на lesswrong, длинновато и напоминает домашнюю философию, но основная мысль крайне простая и что-то в ней есть.

У каждого человека есть "бюджет" силы воли. Внутренний нарратор-планировщик, он же "Система 2", когда вы хотите сделать что-то неприятное, берёт кредит из этого "бюджета". Когда в вашей жизни происходит что-то приятное (приятное на базовом, бессознательном уровне), связанное с предыдущими решениями планировщика, бюджет пополняется. Если в бюджете нет средств, вы "выгорели", у вас "не хватает силы воли". Важная часть мысли состоит в том, что "приятное" определяется бессознательно, "системой 1". Например, вы очень любите мороженое; съесть мороженое и заработать $1000 могут оказаться одинаково ценными пополнениями бессознательного бюджета, хотя объективно первое примерно в тысячу раз дешевле. Это позволяет управлять "бюджетом" на сознательном уровне, решая оптимизационную задачу, и помогать другим в том же. Например, взрослые люди, как правило, недохвалены: если они делают свою работу профессионально, затратив на это немало усилий, в том числе и волевых, то это "само собой разумеется".

ответить
3

Наступление зимы отметим разбором простой задачи 1346. Check If N and Its Double Exist.

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

Дан массив целых чисел arr. Нужно определить, существуют ли такие индексы i и j, что:
- i≠j,
- arr[i]=2⋅arr[j].

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

Решение использует два простых прохода по массиву:

  1. Первый проход:
    • Создаем хеш-таблицу, где для каждого элемента записываем количество его удвоенных значений.
  2. Второй проход:
    • Проверяем, существует ли текущий элемент в хеш-таблице.
    • Для нуля (0) дополнительно проверяем, встречается ли он в массиве как минимум дважды (так как 2⋅0=0).

Временная сложность ⏱️

Пространственная сложность 📦

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

use std::collections::HashMap;

impl Solution {
    pub fn check_if_exist(arr: Vec<i32>) -> bool {
        let mut double_map = HashMap::new();

        // Populate the map with counts of doubled values
        for &num in &arr {
            *double_map.entry(2 * num).or_insert(0) += 1;
        }

        // Check for the required condition
        for &num in &arr {
            if num == 0 {
                // Special case for 0 (2 * 0 == 0)
                if *double_map.get(&0).unwrap_or(&0) > 1 {
                    return true;
                }
            } else if double_map.get(&num).is_some() {
                return true;
            }
        }

        false
    }
}

1 ответ
3

Задача на выходные - 2097. Valid Arrangement of Pairs

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

Нужно переставить заданные пары [starti,endi] так, чтобы получилось корректное расположение,
где для каждой пары i: endi−1=starti​. Гарантируется, что такое расположение существует.

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

Для решения задачи используется алгоритм Хирхольцера, который позволяет построить Эйлеров путь (или цикл) в ориентированном графе. Основная идея — удалять рёбра во время обхода, что упрощает структуру данных и предотвращает повторное использование рёбер.

Ключевые шаги 🚀

  1. Построение графа:
    • Граф представляется в виде списка смежности (HashMap<i32, Vec<i32>>), где каждая вершина хранит список своих исходящих рёбер.
    • Параллельно вычисляются разницы степеней вершин (входящих и исходящих рёбер) для определения начальной вершины пути.
  2. Поиск начальной вершины:
    • Начальная вершина — это вершина с положительным балансом исходящих рёбер. Если таких нет, берётся любая вершина из входных данных.
  3. Итеративный DFS с удалением рёбер:
    • Вместо стандартного рекурсивного DFS используется итеративный подход с явным стеком. Это повышает эффективность памяти и скорость.
    • При посещении вершины рёбра удаляются из списка смежности, что гарантирует, что каждое ребро используется ровно один раз.

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

ответить
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

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

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

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

ответить
17

Open source

finder, 07-02-2024

Я понятия не имею, как это делается "правильно", поскольку последние 15 лет провел в корпорации и коммитил только взакрытую.
Тем не менее, если не попробовать, то ведь никогда и не научусь, правда? Поэтому вот:

https://github.com/aplakhov/notq

Кидайте свои помидоры, заводите issues, пилите пулреквесты и всё такое. README "как развернуть и протестировать" постараюсь дописать в ближайшее время.

2 ответа
7

Я не знаю ответ на этот вопрос, зато сегодня я узнал кое-что другое, чем-то связанное.

В 1716 году астроном Галлей (в честь которого названа комета) придумал способ определения размеров Солнечной системы. Для этого нужно подгадать момент, когда Венера проходит по солнечному диску, и пронаблюдать его из двух достаточно далеких мест на поверхности Земли. Из-за параллакса геометрия прохождения будет слегка отличаться, и используя это отличие, можно будет вычислить расстояния в тройке Земля - Венера - Солнце, зная расстояния между точками, откуда производились наблюдения на Земле. Дальше на основе расстояния от Земли до Солнца можно посчитать и размеры орбит остальных планет.

(если нужно, тут подробное и более-менее понятное описание того, как именно всё это считается, с картинками)

Ну и вот, наверное, какие-то два джентльмена-астронома проделали этот опыт и получили ответ, да? Не совсем так...

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

Чешский астроном Кристиан Майер был приглашен российской императрицей Екатериной Великой наблюдать за прохождением Венеры в Санкт-Петербурге вместе с Андерсом Йоханом Лекселлом, в то время как другие члены Российской академии наук отправились в восемь других мест Российской империи под общим руководством Степана Румовского.

Король Соединенного Королевства Георг III приказал построить королевскую обсерваторию рядом со своей летней резиденцией в Ричмонд-Лодж, чтобы он и королевский астроном Стивен Деменбрей могли наблюдать за прохождением Венеры.

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

ответить
17

Статья спасена из Яндекс.Кью

Чтобы лучше понимать космические новости, полезно выработать интуицию: что вообще означает "полететь в космос", почему это сложно и от чего эта сложность зависит. После этого вы также начнете получать больше удовольствия от "Марсианина", "Семиевия" и вообще книг Энди Вейера и Нила Стивенсона (и меньше от другой космической фантастики)

Космос не наверху

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

image.png

это высоко, но это не космос

Даже люди с высшим физико-математическим образованием часто в теории знают, как оно на самом деле, но интуицией на этот счёт не обладают, потому что никто не научил их простому мнемоническому правилу: космос это не высоко, космос это быстро.

Например, международная космическая станция летает примерно на высоте 400 километров над поверхностью. А радиус Земли почти в 20 раз больше. Если представить себе Землю как баскетбольный мяч, то МКС от него на расстоянии меньше сантиметра. Гравитация там во всех смыслах такая же, как и "внизу". Невесомость на станции не потому, что станция высоко, а потому что она находится в свободном падении. Невесомость, которую можно чувствовать до раскрытия парашюта или в падающем самолёте, это не какое-то похожее ощущение или имитация, это в точности тот же самый эффект.

image.png

Но станция не только "падает вниз", она ещё и "летит вбок" со скоростью несколько километров в секунду. Поэтому "падение" её всё время только заворачивает, и мимо поверхности она "промахивается". Это и есть орбита.

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

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

2 ответа
16

Disclaimer: написанное ниже не является инвестиционной рекомендацией! Перепроверяйте всё, что читаете в интернете, особенно связанное с деньгами.

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

Упрощённый пример

Рассмотрим простую ситуацию. Некто предлагает вам, на выбор, два варианта: либо он даёт вам 100 рублей сейчас, либо X рублей ровно через 1 год. Предположим, что это кто-то, известный своей кристальной честностью и приверженностью обязательствам (например, компания Яндекс), и вы полностью уверены в том, что получите свои X рублей. Какой вариант стоит выбрать?

Очевидно, что ответ зависит от X, причём монотонно: нет смысла брать 105 рублей через год вместо 100 сейчас, но выбирать 100 рублей сейчас вместо 110 рублей через год. Также понятно, что если X < 100, то нужно брать 100 сейчас, а если X очень большое, например, миллиард, то нужно выбрать его. Как выбрать точку отсечения?

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

Первые принципы

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

5 ответов
6

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

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

ответить
16

Ваши соображения можете писать в комменты. Если вам нужны какие-то мелкие улучшения, типа поддержки TeX или шахматной нотации, displayname или аватарок для пользователей и так далее, пишите. Если вы хотите сделать сервис гораздо красивее и готовы помочь, тоже пишите. Особенно если этого можно добиться простым улучшением css (а я совершенно уверен, что можно).

18 ответов
8

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

Человеческое тело - гомеостатическая машина. Чтобы не упасть замертво на ровном месте, ему нужно, независимо от происходящего вокруг, держать в узких пределах много различных показателей (намного больше, чем у Боинга 747). Температуру тела, давление, уровень глюкозы в крови, уровень CO2, кислотно-щелочной баланс крови (все они, выйдя за пределы, убьют вас на месте). В табличке "Список основных гормонов" в Википедии несколько десятков строчек, к ним относятся, например, инсулин (при выходе за пределы шприц каждый день, несколько раз в день, до конца жизни) или серотонин (при выходе за пределы выход только в окно, если хоть на это хватит сил); про остальные вы слышали реже, но это не значит, что они менее важные. А ещё свои строгие пределы и сверху, и снизу положены всяким липидам (например, холестерину), ферментам ("генетическое заболевание" это обычно про них), витаминам и т.п.

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

Ну, дальше вам исполняется 40 лет, датчик заклинивает, потому что в нем скопилась копоть, и всегда показывает "БОЛЬШЕ КЛЮМБУМА". Подзазульник начинает работать с удвоенной мощностью, и от этого с высокой вероятностью сломается лет через пять; лишний клюмбум из организма теперь нужно как-то удалять, и пощенки вынуждены тратить на это по меньшей мере половину своей пропускной способности, выполняя остальную свою работу хуже. Проблемы в организме накапливаются, пока не откажет совсем кто-то из вышеперечисленных, или даже какой-то узел, на первый взгляд с ними слабо связанный. И тогда человек впервые понимает, что у него не просто временами побаливал живот и была изжога, и идет к врачу, или вызывает скорую, или вызывают скорую его родственники.

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

3 ответа

Страница 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19