Задача на сегодня 3152. Special Array II.
📝 Условие:
- Нам дан массив
nums
и запросы queries
.
- Для каждого запроса
[from, to]
нужно проверить, является ли подмассив nums[from..=to]
"особым".
- Подмассив считается "особым", если каждая пара соседних элементов в нём имеет разную чётность (один чётный, другой нечётный).
🧠 Идея:
- Решение основано на идее "вычисли один раз — используй много раз".
- Сначала выполняем линейные предвычисления префиксных количеств пар соседних элементов разной чётности.
- Затём каждый запрос обрабатывается мгновенно за
O(1)
, что делает решение особенно эффективным для больших массивов и множества запросов 😊
💡 Подход:
-
Префиксная сумма:
- Создаём массив
prefix_count
, где prefix_count[i]
хранит количество пар соседних элементов с разной чётностью от начала массива до индекса i
.
- Заполняем его за
O(n)
в одном проходе.
-
Обработка запросов:
- Для каждого запроса
[from, to]
считаем количество таких пар в диапазоне через разность: prefix_count[to] - prefix_count[from]
.
Читать дальше →
ответить
Сегодня решаем задачу 2054. Two Best Non-Overlapping Events. Будем закреплять двоичный поиск ;)
😇 Описание задачи
Дан список событий с известными для них start_time
, end_time
и value
. Нужно выбрать максимум два непересекающихся события с максимальной общей ценностью. События пересекаются, если одно начинается до окончания другого.
💡 Идея
Сортируем события по end_time
(в убывающем порядке). Для каждого события используем двоичный поиск, чтобы найти все заканчивающиеся до его начала. Остаётся найти среди них событие с максимальной ценностью, для этого будем хранить накопленные максимальные ценности в отдельном массиве max_vals
.
🛠️ Подход
-
Сортировка событий: По
end_time
в порядке убывания.
-
Предобработка максимальных ценностей: Создаём массив
max_vals
с накопленной максимальной ценностью событий (справа-налево).
-
Итерация и поиск:
- Для каждого события находим первое, заканчивающееся раньше его, через двоичный поиск.
- Суммируем ценности текущего события и накопленной максимальной ценности по найденному индексу, обновляя общий максимум.
Читать дальше →
ответить
Сегодня чуток похулиганим и предоставим переоптимизированное решение для задачи 2554. Maximum Number of Integers to Choose From a Range I. В реальном интервью такое могут потребовать лишь на уровне идеи, но нам интересно запрограммировать самим :)
Описание задачи 📋
Необходимо выбрать максимально возможное количество чисел из диапазона [1,n]
, при этом соблюдая ограничения:
- Числа из списка banned
выбирать нельзя.
- Каждое число можно использовать не более одного раза.
- Сумма выбранных чисел не должна превышать maxSum
.
Результатом должно быть количество чисел, которые можно выбрать, удовлетворяя этим условиям.
Идея решения 💡
Предвычисляем суммы запрещённых чисел и используем двоичный поиск, чтобы найти максимальное k
, для которого сумма допустимых чисел в диапазоне [1,k]
не превышает maxSum
. Это позволяет эффективно учитывать ограничения и избежать лишних вычислений.
Обзор решения 🧠
-
Сортировка и удаление дубликатов:
- Сортируем массив
banned
и удаляем повторяющиеся элементы.
-
Предвычисление кумулятивных сумм:
- Создаем массив
ban_sums
, где на позиции i
содержится сумма первых i
запрещённых чисел. Это позволяет быстро вычислять сумму запрещённых чисел до любого предела.
Читать дальше →
ответить
Сегодня разберём ещё одну простую задачу 1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence.
Описание задачи 📜
Дана строка sentence, состоящая из слов, разделённых пробелами, и строка searchWord
. Нужно определить индекс (считаем с 1), где searchWord
является префиксом какого-либо слова в sentence. Если такого слова нет — вернуть -1
.
Решение 🛠️
Идея 💡
Задача сводится к простому проходу по словам строки. Мы должны проверить каждое слово: начинается ли оно с searchWord
. Возвращаем индекс первого подходящего слова.
Алгоритм 🚀
- Разделяем строку
sentence
на слова с помощью метода split_whitespace
, который возвращает ссылки на части исходной строки.
- Проходим по словам с их индексами через
enumerate
.
- Для каждого слова проверяем, начинается ли оно с
searchWord
с помощью метода starts_with
.
- Если находим соответствие, возвращаем индекс (преобразуем его в формат 1-based). Если совпадений нет, возвращаем
-1
.
Анализ Сложности 📊
-
Временная сложность:
O(n)
, где n
— длина строки sentence. Разделение строки и проверка префикса выполняются за линейное время.
-
Пространственная сложность:
O(k)
, где k
— количество слов в предложении. Дополнительная память используется только для хранения указателей на слова, а не самих слов.
Исходный код решения
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 ответа
Сегодня у нас еще одна задача на аккуратное манипулирование индексами 2337. Move Pieces to Obtain a String.
Описание задачи
Даны две строки start
и target
длины n
, содержащие символы 'L'
, 'R'
и '_'
.
- Символ
'L'
может двигаться только влево, если есть пустое место ('_'
) слева.
- Символ
'R'
может двигаться только вправо, если есть пустое место ('_'
) справа.
- Необходимо определить, можно ли преобразовать строку
start
в строку target
с соблюдением этих правил.
Идея 🧠
Задача сводится к тому, чтобы проверить, совпадают ли позиции и направления символов 'L'
и 'R'
в двух строках с учётом их ограничений на движение. Мы используем итерацию по строкам одновременно, отслеживая доступные символы 'L'
и 'R'
через счётчики.
Подход 🛠️
- Используем метод
as_bytes()
, чтобы быстро перебрать символы в виде байтов.
- Одновременно проходим по обеим строкам:
- Если видим
'L'
в target
, увеличиваем счётчик доступных 'L'
.
- Если видим
'L'
в start
, проверяем, есть ли доступный 'L'
, и уменьшаем счётчик.
Читать дальше →
ответить
Новый день - новая задача 2109. Adding Spaces to a String.
Условие 🧩
Дана строка s
и массив индексов spaces
. Нужно добавить пробелы перед символами строки, расположенными по данным индексам, и вернуть новую строку. Например, для s = "EnjoyYourCoffee"
и spaces = [5, 9]
результатом будет "Enjoy Your Coffee"
.
Если решать абы как, то можно и в ней запутаться в индексах. Мы же будем делать все максимально просто.
Идея решения 🧠
Вместо создания промежуточных строк или модификации исходной строки, мы используем построение строки с выделением памяти заранее, чтобы минимизировать накладные расходы.
Подход 🔍
- Предварительно выделяем память для результирующей строки с помощью
String::with_capacity
, учитывая длину строки и количество пробелов.
- Проходим по массиву индексов spaces:
- Добавляем в результат подстроку от предыдущей позиции до текущего индекса.
- Добавляем пробел.
- После цикла добавляем оставшуюся часть строки.
- Возвращаем итоговую строку.
Анализ сложности 📊
- Временная сложность:
O(n)
, где n=длина строки+количество пробелов
. Все операции выполняются за один проход.
- Пространственная сложность:
O(n)
, поскольку результирующая строка создаётся с заранее выделенной памятью.
Исходный код решения
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 ответа
Сегодня на очереди задача 2825. Make String a Subsequence Using Cyclic Increments.
Описание задачи 📝
Даны две строки str1
и str2
. Нужно определить, можно ли сделать str2
подпоследовательностью строки str1
, выполнив не более одной операции циклического увеличения произвольного набора символов в str1
.
Циклический сдвиг означает, что 'a'
становится 'b'
, 'b'
— 'c'
, ..., 'z'
— 'a'
.
Идея решения 💡
Задача почти идентична проверке подпоследовательности в строке. Единственное отличие — сравнение символов становится чуть сложнее из-за необходимости учитывать циклический сдвиг.
Мы выделяем проверку совпадения символов в отдельный метод, а в остальном используем стандартный алгоритм проверки подпоследовательности.
Реализация подхода 🚀
- Используем два итератора для последовательного прохода по символам строк.
- Для сравнения символов применяем отдельную функцию, учитывающую как прямое совпадение, так и циклический сдвиг.
- При совпадении текущего символа строки
str2
с символом из str1
, переходим к следующему символу в str2
.
- Если все символы
str2
найдены в str1
в правильном порядке, возвращаем true
, иначе — false
.
Сложность алгоритма 📊
Читать дальше →
ответить
Спасибо загадочному пользователю
leetcoder, здесь опять есть какая-то жизнь. По такому случаю попробуем сюда писать в формате классического web log, вдруг получится не бросить?
Прикольная статья про силу воли и выгорание. Как всегда на lesswrong, длинновато и напоминает домашнюю философию, но основная мысль крайне простая и что-то в ней есть.
У каждого человека есть "бюджет" силы воли. Внутренний нарратор-планировщик, он же "Система 2", когда вы хотите сделать что-то неприятное, берёт кредит из этого "бюджета". Когда в вашей жизни происходит что-то приятное (приятное на базовом, бессознательном уровне), связанное с предыдущими решениями планировщика, бюджет пополняется. Если в бюджете нет средств, вы "выгорели", у вас "не хватает силы воли". Важная часть мысли состоит в том, что "приятное" определяется бессознательно, "системой 1". Например, вы очень любите мороженое; съесть мороженое и заработать $1000 могут оказаться одинаково ценными пополнениями бессознательного бюджета, хотя объективно первое примерно в тысячу раз дешевле. Это позволяет управлять "бюджетом" на сознательном уровне, решая оптимизационную задачу, и помогать другим в том же. Например, взрослые люди, как правило, недохвалены: если они делают свою работу профессионально, затратив на это немало усилий, в том числе и волевых, то это "само собой разумеется".
ответить
Наступление зимы отметим разбором простой задачи 1346. Check If N and Its Double Exist.
Описание задачи 🧮
Дан массив целых чисел arr
. Нужно определить, существуют ли такие индексы i
и j
, что:
- i≠j
,
- arr[i]=2⋅arr[j]
.
Обзор решения 🚀
Решение использует два простых прохода по массиву:
-
Первый проход:
- Создаем хеш-таблицу, где для каждого элемента записываем количество его удвоенных значений.
-
Второй проход:
- Проверяем, существует ли текущий элемент в хеш-таблице.
- Для нуля (
0
) дополнительно проверяем, встречается ли он в массиве как минимум дважды (так как 2⋅0=0
).
Временная сложность ⏱️
- Первый проход:
O(n)
— построение хеш-таблицы.
- Второй проход:
O(n)
— проверка условий.
- Итоговая сложность:
O(n)
.
Пространственная сложность 📦
O(n)
— память для хеш-таблицы.
Исходый код решения
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 ответ
notq - коллективный блог. Я сделал его для людей, которые мне нравятся. Скорее всего, это и вы.
И лентой, и ранжированием комментариев управляют посетители с помощью голосования (примерно как на hackernews или на старом реддите). Пишите о чем угодно и как угодно. Вообще-то все свои, но некоторые иногда стесняются, поэтому можете писать анонимно.
Действует единственное правило: не пишите чего-нибудь такого, за что меня или вас посадят. Модерация есть, но предназначена только для решения этой задачи. Upd: правило отменено
notq - проект личный, некоммерческий, не связанный ни с какой компанией или организацией. Честно!
Баги и предложения о развитии можете кидать в комментарии.
Peace.
- Почему notq? В честь моей бывшей. В каком-то смысле. Потому что всего 4 буквы, не занято, вполне приличные ассоциации с нотами и заметками. Читается "нотка", а впрочем, читайте как хотите
- Что на логотипе? Глайдер из игры "Жизнь"
28 ответов
Задача на выходные - 2097. Valid Arrangement of Pairs
Описание задачи 📜
Нужно переставить заданные пары [starti,endi]
так, чтобы получилось корректное расположение,
где для каждой пары i: endi−1=starti
. Гарантируется, что такое расположение существует.
Обзор решения 🛠
Для решения задачи используется алгоритм Хирхольцера, который позволяет построить Эйлеров путь (или цикл) в ориентированном графе. Основная идея — удалять рёбра во время обхода, что упрощает структуру данных и предотвращает повторное использование рёбер.
Ключевые шаги 🚀
-
Построение графа:
- Граф представляется в виде списка смежности (
HashMap<i32, Vec<i32>>
), где каждая вершина хранит список своих исходящих рёбер.
- Параллельно вычисляются разницы степеней вершин (входящих и исходящих рёбер) для определения начальной вершины пути.
-
Поиск начальной вершины:
- Начальная вершина — это вершина с положительным балансом исходящих рёбер. Если таких нет, берётся любая вершина из входных данных.
-
Итеративный DFS с удалением рёбер:
- Вместо стандартного рекурсивного DFS используется итеративный подход с явным стеком. Это повышает эффективность памяти и скорость.
- При посещении вершины рёбра удаляются из списка смежности, что гарантирует, что каждое ребро используется ровно один раз.
Читать дальше →
ответить
Сегодня нам предстоит решить задачу 2577. Minimum Time to Visit a Cell In a Grid.
📝 Описание задачи
- Дана матрица
grid
размером m x n
, где каждая ячейка (row
, col
) содержит время открытия ворот, ведущих в эту ячейку. До этого времени в ячейку попасть нельзя.
- Вы начинаете в ячейке (
0
, 0
) с временем 0
и можете двигаться на 1 ячейку за секунду в любом из 4 направлений (вверх, вниз, влево, вправо).
- Важно: стоять на месте запрещено — вы должны перемещаться на каждое движение.
- Цель — найти минимальное время, чтобы добраться до ячейки (
m-1
, n-1
). Если это невозможно, вернуть -1
.
💡 Идея
Задача сводится к поиску кратчайшего пути с учётом времени открытия ворот в каждой ячейке. Можно представить задачу как динамический граф, где вершины — это пары (время, ячейка), а рёбра — это возможные переходы между ячейками. Вместо того чтобы хранить весь граф, мы динамически вычисляем возможные переходы из посещаемых вершин. Вершины будем перебирать в порядке времён достижимости ячейки (как в алгоритме Дейкстры).
🔑 Подход к решению
- 🧑💻 Графовая модель:
- Ячейки матрицы — вершины графа.
- Рёбра между вершинами имеют вес
1
.
Читать дальше →
ответить
Очередная задача: 2290. Minimum Obstacle Removal to Reach Corner.
📄 Описание задачи
Дана двумерная матрица grid
размером m x n
, где каждая клетка может быть либо пустой (0
), либо препятствием (1
), которое можно удалить. Задача заключается в том, чтобы найти минимальное количество препятствий, которые нужно удалить, чтобы пройти из верхнего левого угла (0, 0)
в нижний правый угол (m-1, n-1)
, передвигаясь только по пустым клеткам или удаляя препятствия.
🔑 Идея
Для решения задачи используем модификацию алгоритма поиска в ширину (BFS), который эффективно обрабатывает препятствия. Вместо приоритизации клеток по расстоянию, как в стандартном алгоритме Дейкстры, в 0-1 BFS (именно так эту модификацию принято называть) мы обрабатываем сначала пустые клетки, а затем клетки с препятствиями, что позволяет нам минимизировать количество удаляемых препятствий.
📋 Подробное описание подхода
-
Инициализация: Мы создаем две очереди:
front
и back
. Во front
помещаем клетки, которые можно пройти без удаления препятствий, а в back
— клетки, для которых потребуется удалить препятствие.
-
Поиск в ширину (BFS):
- Начинаем с верхнего левого угла и устанавливаем расстояние для этой клетки в
0
(т.е. препятствий еще не удалено).
- Если клетка пустая (значение
0
), мы добавляем её в front
. Если клетка — препятствие (значение 1
), то в back
.
Читать дальше →
ответить
Сегодня мы решаем задачу 3243. Shortest Distance After Road Addition Queries I
Постановка
В задаче требуется вычислить кратчайший путь от города 0
до города n-1
после каждой из последовательных добавлений новых дорог в граф. Изначально города соединены цепочкой дорог, и после каждой операции добавляется новая односторонняя дорога между двумя городами. Необходимо после каждой операции находить кратчайшее расстояние от города 0
до города n-1
.
🔍 Идея
Данное решение использует оптимизированный подход с поочередным обновлением расстояний с помощью BFS и ранним выходом при нахождении цели (города n-1
). Мы обновляем граф и расстояния только при необходимости, что позволяет сократить количество ненужных вычислений и повысить производительность.
📚 Обзор решения
-
Инициализация графа и расстояний:
- Сначала создаем список смежности
succ
, который представляет дороги между городами, инициализируем его так, чтобы города были соединены цепочкой (каждый город соединен с следующим).
- Массив
dist
инициализируется так, что расстояние от города 0
до города i
равно i
(для начальной цепочки).
-
Обработка запросов:
- Для каждого запроса добавляется новая дорога между городами
u
и v
. После этого запускается BFS с города v
для обновления кратчайших расстояний до всех достижимых городов.
Читать дальше →
ответить
Сегодня мы решаем задачу 2924. Find Champion II
🏆 Задача:
В турнире n
команд представлены как вершины DAG (ориентированного ацикличного графа). Если команда a
сильнее команды b
, это отображается направленным ребром от a
к b
. Требуется найти чемпиона турнира — вершину, из которой достижимы все остальные вершины. Если чемпиона нет или их несколько, вернуть −1
.
😊 Идея:
В DAG вершина с отсутствующими входящими рёбрами (in_degree = 0
) является источником. Если в графе ровно один источник, он становится кандидатом в чемпионы, так как из него достижимы все остальные вершины
(Нетривиальный момент: это утверждение не верно в общем случе, но в случае DAG его несложно доказать).
Если источников больше или ни одного, чемпиона не существует.
Сложность
-
🕒 Временная сложность:
O(m)
: Обход рёбер для подсчёта входящих рёбер.
O(n)
: Проход по массиву in_degree.
- Итого:
O(n+m)
.
-
🗂️ Пространственная сложность:
O(n)
: Для хранения массива in_degree
.
Исходный код решения
impl Solution {
pub fn find_champion(n: i32, edges: Vec<Vec<i32>>) -> i32 {
let mut in_degree = vec![0; n as usize];
// Calculate in-degrees for each node
for e in &edges {
in_degree[e[1] as usize] += 1;
}
// Identify the potential champion
let mut champion = -1;
let mut n_champions = 0;
for (node, °ree) in in_degree.iter().enumerate() {
if degree == 0 {
champion = node as i32;
n_champions += 1;
}
}
// There must be exactly one node with in-degree 0
if n_champions == 1 {
champion
} else {
-1
}
}
}
ответить
Начну-ка я минипроект по разбору ежедневных задач с LeetCode.
Решения будут на раст, ибо: модно, стильно, молодёжно!
Rust идеально подходит для задач с LeetCode благодаря высокой производительности, безопасному управлению памятью и удобным инструментам для работы с данными, обеспечивая компактный и надёжный код.
Надеюсь, такой контент будет полезен аудитории.
ответить
Предположительно, тебя повысили за то, что ты что-то делал руками лучше всех. Ты будешь много где встречать советы вроде "теперь всё изменилось, у тебя другая работа, прекращай работать руками" и т.п. Это может быть верно, но может быть и херней. До тех пор, пока ты можешь лично создавать 30% или больше от артефактов (строчек кода, фичей, смысла), которые требуются от команды, забей на всякую муть типа методологий и пиплменеджмента и просто продолжай. Да, так ты "на самом деле" "не руководитель", а просто мощный волчара, но шансы на успех будут гораздо выше, чем если ты будешь всё делать как в книжке. Дело даже не в том, что ты напишешь кучу кода, а в том, что это будет твой код, ты будешь хорошо понимать, что в нем и вокруг вообще происходит, и что сколько стоит. Когда у тебя в команде будет 50 человек или больше, это тебе очень пригодится.
В какой-то момент тебе захочется, чтобы команда перестала тебя ограничивать. Для этого нужно, чтобы в ней не было идиотов, и чтобы хватало рабочих рук. Поэтому придется этим заняться самому. В твоей компании на эту тему наверняка есть куча странных ритуалов, их, по возможности, нужно обойти, чтобы как можно быстрее выгнать некомпетентных кретинов. Обычно можно научиться делать их работу за них в 10 раз быстрее, тогда можно будет их сначала выгнать, а потом нанять замену, а не наоборот. Нанимать лучше "умных", а не "опытных" (еще лучше и то и другое, но у вас столько денег нет). Сделать из умных опытных легко, а в обратную сторону невозможно, ну или я не умею.
Вновь нанятых нужно научить работать. Единственный способ это сделать это кодревью, местами переходящий в парное программирование (это единственный смысл в парном программировании). В этот момент можно научить нового человека работать втрое быстрее, чем его предшественник. Главное, чтобы он об этом не догадался.
Где-то в этот момент ты обнаружишь, что лично создаешь уже не очень значимую часть финальных артефактов. Это хорошо, ты стал руководителем, только не методом "давайте всё сломаем, потому что так в книжке написано", а естественным образом.
В этот момент надо заставить команду набрать импульс самостоятельно. Чтобы каждый день в проекте происходило что-то ценное, даже если ты за этим не следишь детально.
Типичные примеры такие:
- придумать каждому хорошему человеку задачу на вырост, в рамках которой он, если захочет зажечь, будет заниматься чем-то полезным (иначе он займется рандомом типа "переписать всё на расте")
- научить людей содержательно ревьюить код друг друга, чтобы они не ждали твоего ценного мнения
- научить людей строить системы так, как ты бы сам их строил (то есть простые и работающие)
- (специфично для ML) настроить сбор обучающих данных с максимальной скоростью
Ну вот в принципе и всё, таким способом ты сможешь собрать крутую команду, создавать с ней офигительный хайтек и менять мир к лучшему. Потом повысят все равно не тебя, потому что топ-менеджмент формируется не так, но это уже совсем другая история.
9 ответов
Я понятия не имею, как это делается "правильно", поскольку последние 15 лет провел в корпорации и коммитил только взакрытую.
Тем не менее, если не попробовать, то ведь никогда и не научусь, правда? Поэтому вот:
https://github.com/aplakhov/notq
Кидайте свои помидоры, заводите issues, пилите пулреквесты и всё такое. README "как развернуть и протестировать" постараюсь дописать в ближайшее время.
2 ответа
Я не знаю ответ на этот вопрос, зато сегодня я узнал кое-что другое, чем-то связанное.
В 1716 году астроном Галлей (в честь которого названа комета) придумал способ определения размеров Солнечной системы. Для этого нужно подгадать момент, когда Венера проходит по солнечному диску, и пронаблюдать его из двух достаточно далеких мест на поверхности Земли. Из-за параллакса геометрия прохождения будет слегка отличаться, и используя это отличие, можно будет вычислить расстояния в тройке Земля - Венера - Солнце, зная расстояния между точками, откуда производились наблюдения на Земле. Дальше на основе расстояния от Земли до Солнца можно посчитать и размеры орбит остальных планет.
(если нужно, тут подробное и более-менее понятное описание того, как именно всё это считается, с картинками)
Ну и вот, наверное, какие-то два джентльмена-астронома проделали этот опыт и получили ответ, да? Не совсем так...
В реальности произошло вот что. Во-первых, подходящего транзита пришлось ждать 50 лет, но за это время идею не забыли и не похоронили. Во-вторых, более того:
Чешский астроном Кристиан Майер был приглашен российской императрицей Екатериной Великой наблюдать за прохождением Венеры в Санкт-Петербурге вместе с Андерсом Йоханом Лекселлом, в то время как другие члены Российской академии наук отправились в восемь других мест Российской империи под общим руководством Степана Румовского.
Король Соединенного Королевства Георг III приказал построить королевскую обсерваторию рядом со своей летней резиденцией в Ричмонд-Лодж, чтобы он и королевский астроном Стивен Деменбрей могли наблюдать за прохождением Венеры.
Читать дальше →
ответить
Но и постов давно не было. Не уверен, что получилось коммьюнити :-(
4 ответа
Внезапно обнаружил, что понятие «шуньята» или «пустота» из буддизма практически равнозначно любимому void*
Керниган и Ричи обучили нас азам буддизма?
ответить
Статья спасена из Яндекс.Кью
Чтобы лучше понимать космические новости, полезно выработать интуицию: что вообще означает "полететь в космос", почему это сложно и от чего эта сложность зависит. После этого вы также начнете получать больше удовольствия от "Марсианина", "Семиевия" и вообще книг Энди Вейера и Нила Стивенсона (и меньше от другой космической фантастики)
Космос не наверху
Большинство людей интуитивно представляют себе полёт в космос совсем неправильно, так, как будто задача состоит в том, чтобы взлететь куда-то очень высоко. Это не так, и подобное интуитивное заблуждение мешает понимать почти всё, что с космосом связано. Например, чем полёты на МКС, на Луну и на Марс отличаются друг от друга, и что из этого во сколько раз сложнее и дороже. Например, почему противоракетная оборона от межконтинентальных баллистических ракет настолько безумно сложна, хотя сами они являются технологией середины прошлого века. Тем более это касается полуфантастических вещей вроде космических лифтов и орбитальных поселений.

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

Но станция не только "падает вниз", она ещё и "летит вбок" со скоростью несколько километров в секунду. Поэтому "падение" её всё время только заворачивает, и мимо поверхности она "промахивается". Это и есть орбита.
Чтобы полететь в космос, не нужно улетать далеко, достаточно оказаться за пределами атмосферы, а это пустяки, километров сто, в границах Москвы есть точки, находящиеся на таком расстоянии друг от друга. Но ещё нужно не упасть сразу же обратно, а вот это уже требует очень, очень быстро двигаться "вбок". Это "очень-очень" как раз и называется "первой космической скоростью", чуть меньше 8 километров в секунду. Почему это так сложно?
Читать дальше →
2 ответа
Disclaimer: написанное ниже не является инвестиционной рекомендацией! Перепроверяйте всё, что читаете в интернете, особенно связанное с деньгами.
Несколько раз сталкивался с тем, что достаточно умные, на мой взгляд, люди не умеют посчитать стоимость того или иного дериватива. Но это ладно, гораздо хуже, когда эти люди считают, что это не нужно, или сложно. Хочу попробовать себя в жанре "простые ответы на простые вопросы", и показать, что это А) не сложно и Б) может пригодиться.
Упрощённый пример
Рассмотрим простую ситуацию. Некто предлагает вам, на выбор, два варианта: либо он даёт вам 100 рублей сейчас, либо X рублей ровно через 1 год. Предположим, что это кто-то, известный своей кристальной честностью и приверженностью обязательствам (например, компания Яндекс), и вы полностью уверены в том, что получите свои X рублей. Какой вариант стоит выбрать?
Очевидно, что ответ зависит от X, причём монотонно: нет смысла брать 105 рублей через год вместо 100 сейчас, но выбирать 100 рублей сейчас вместо 110 рублей через год. Также понятно, что если X < 100, то нужно брать 100 сейчас, а если X очень большое, например, миллиард, то нужно выбрать его. Как выбрать точку отсечения?
На первый взгляд, нужно попробовать понять, какая будет инфляция, что же мы сможем купить на эти деньги через год. Но на самом деле правильный ответ можно вывести почти "из первых принципов", и инфляция будет играть в нём роль стороннего наблюдателя.
Первые принципы
Читать дальше →
5 ответов
Все мы хотим жить долго и быть здоровыми. Сейчас я научу вас, как это делается. Или нет.
Человеческое тело - гомеостатическая машина. Чтобы не упасть замертво на ровном месте, ему нужно, независимо от происходящего вокруг, держать в узких пределах много различных показателей (намного больше, чем у Боинга 747). Температуру тела, давление, уровень глюкозы в крови, уровень CO2, кислотно-щелочной баланс крови (все они, выйдя за пределы, убьют вас на месте). В табличке "Список основных гормонов" в Википедии несколько десятков строчек, к ним относятся, например, инсулин (при выходе за пределы шприц каждый день, несколько раз в день, до конца жизни) или серотонин (при выходе за пределы выход только в окно, если хоть на это хватит сил); про остальные вы слышали реже, но это не значит, что они менее важные. А ещё свои строгие пределы и сверху, и снизу положены всяким липидам (например, холестерину), ферментам ("генетическое заболевание" это обычно про них), витаминам и т.п.
Очень здорово, что, как правило, человеку не нужно всё это изучать, чтобы просто существовать. Организм сам поддерживает гомеостаз с помощью разных своих органов и систем. В общем-то не "разных", а "всех", в этом и заключается его работа. Можно себе представить такую машину с разными узлами, в каждом из которых множество датчиков и актуаторов: стал снижаться уровень клюмбума в шесячнице? Впрыснем чуть больше преклюмбума в подзазульник, пусть перерабатывает в клюмбум. Обратных связей подобного рода много.
Ну, дальше вам исполняется 40 лет, датчик заклинивает, потому что в нем скопилась копоть, и всегда показывает "БОЛЬШЕ КЛЮМБУМА". Подзазульник начинает работать с удвоенной мощностью, и от этого с высокой вероятностью сломается лет через пять; лишний клюмбум из организма теперь нужно как-то удалять, и пощенки вынуждены тратить на это по меньшей мере половину своей пропускной способности, выполняя остальную свою работу хуже. Проблемы в организме накапливаются, пока не откажет совсем кто-то из вышеперечисленных, или даже какой-то узел, на первый взгляд с ними слабо связанный. И тогда человек впервые понимает, что у него не просто временами побаливал живот и была изжога, и идет к врачу, или вызывает скорую, или вызывают скорую его родственники.
Читать дальше →
3 ответа
-
в какой-то момент в notq начнут приходить новые пользователи. Чтобы истинная аудитория не растворилась среди случайных людей, на сервисе появится разделение на ценных пользователей и всех остальных. Ценные пользователи влияют на ранжирование и карму в десятки раз сильнее. Все пользователи, приглашенные изначально (технически, зарегистрировавшиеся до определенной даты), станут ценными пользователями автоматически. Дальше статус ценного пользователя будут получать те, кого ценят (то есть за чей контент голосуют) другие ценные пользователи. Система определения ценного пользователя может меняться и дорабатываться, основная цель всего этого - сделать так, чтобы сервис продолжал нравиться мне и вам и хорошо отделял сигнал от шума. Ну и цветовая дифференциация штанов, конечно
-
появится тг-ботик, который умеет присылать лучшие посты
-
когда контента станет много, появится больше способов ориентироваться в нем. Будут ли это улучшения механик тэгов, какие-то подписки, или "сообщества", аналогичные сабреддитам, я пока не знаю и с удовольствием с кем-нибудь посоветуюсь на этот счёт
Ваши соображения можете писать в комменты. Если вам нужны какие-то мелкие улучшения, типа поддержки TeX или шахматной нотации, displayname или аватарок для пользователей и так далее, пишите. Если вы хотите сделать сервис гораздо красивее и готовы помочь, тоже пишите. Особенно если этого можно добиться простым улучшением css (а я совершенно уверен, что можно).
18 ответов
Страница
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17