user12205982

user12205982

Я Сергей Смирнов. Живу и путешествую по Азии: Бали, Таиланд, Вьетнам. Снимаю влоги о жизни за границей и делюсь опытом применения ИИ в работе. Мои истории: Telegram — https://t.me/+lK9JzeZRRLo0MWRi, YouTube — https://www.youtube.com/@1smirnovsergey, Instagram — https://www.instagram.com/1smirnovsergey/
На Пикабу
в топе авторов на 516 месте
рейтинг 0 подписчиков 0 подписок 94 поста 0 в горячем

В ряду замеров потерялся один большой перерыв, потому что проверка брала пары через одну⁠⁠

Учебный отчёт получает отсортированные отметки времени: 0, 5, 20 и 24 минуты. Нужно найти паузы между соседними замерами. Если взять элементы по два без перекрытия, получатся пары 0–5 и 20–24. Важный промежуток между 5 и 20 окажется между парами, поэтому отчёт его пропустит.

from itertools import pairwise

minutes = [0, 5, 20, 24]
gaps = [(start, end, end - start) for start, end in pairwise(minutes)]
assert gaps == [(0, 5, 5), (5, 20, 15), (20, 24, 4)]
assert [g for g in gaps if g[2] > 10] == [(5, 20, 15)]
assert list(pairwise([0])) == []

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

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

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

Другие проверки отчётов — в личном Telegram.

Данные учебные; текст подготовлен с помощью ИИ.

Показать полностью
1

В списке лучших результатов новый слабый результат вытеснил более сильный⁠⁠

В учебном отчёте нужен список из трёх лучших оценок. Он хранится в минимальной куче: в корне находится наименьшая из трёх сохранённых оценок. Следующая оценка равна 4, а в списке уже 7, 9 и 12. Если вызвать heapreplace без проверки, из списка уйдёт 7, а вместо неё встанет 4. Структура останется кучей, но смысл отчёта нарушится.

from heapq import heapify, heapreplace

scores = [7, 9, 12]
heapify(scores)
wrong = scores.copy()
assert heapreplace(wrong, 4) == 7
assert sorted(wrong) == [4, 9, 12]

if 4 > scores[0]: heapreplace(scores, 4)
if 10 > scores[0]: heapreplace(scores, 10)
if 6 > scores[0]: heapreplace(scores, 6)
assert sorted(scores, reverse=True) == [12, 10, 9]

Здесь выбор состоит из двух операций. Сначала проверяем, улучшает ли новый результат список, затем заменяем его слабейший элемент. Метод сам выполняет только вторую операцию. Если куча ещё не заполнена, новые значения добавляют обычным heappush. Для пустой кучи нельзя читать корень, поэтому начальное заполнение должно идти отдельной веткой.

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

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

Другие практические проверки ответов ИИ — в Jarvis News.

Данные учебные; текст подготовлен с помощью ИИ.

Показать полностью
0

У стадиона в Бангкоке я сначала показал, где стояли фургончики с едой⁠⁠

Перед вечером муай-тай в Бангкоке я показал фургончики у площадки. В кадре назвал пиццу и бургеры и сказал, что, может быть, что-нибудь попробуем. Этот короткий отрывок полезен даже без обзора еды: зритель видит, что было рядом со входом в тот вечер. Для ролика о поездке это отдельная информация, и её можно передать за несколько кадров.

Если хочется показать окрестности события, сначала сними общий план с ориентирами. Один фургон крупным планом мало помогает человеку, который впервые выходит из такси рядом со стадионом. Когда видно, где относительно площадки стоят машины и куда направляются посетители, появляется понятная схема места. Затем можно показать вывеску или назвать пару увиденных позиций. Этого достаточно, если задача — объяснить обстановку, а не составить рейтинг продавцов.

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

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

Посмотреть подход к площадке в моём выпуске.

Текст подготовлен с помощью ИИ по записи моего влога.

Показать полностью
2

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

В учебной доске есть три столбца: входящие, проверка и готовые. Чтобы заранее создать пустые группы, разработчик вызывает dict.fromkeys и передаёт пустой список как значение. Словарь действительно содержит три ключа. Но значением у всех ключей становится одна и та же ссылка. Когда задача добавляется в «входящие», она становится видна и в двух остальных группах.

names = ["inbox", "review", "done"]
groups = dict.fromkeys(names, [])
groups["inbox"].append("task-1")
assert groups["review"] == ["task-1"]
assert groups["inbox"] is groups["done"]

isolated = {name: [] for name in names}
isolated["inbox"].append("task-1")
assert isolated["review"] == isolated["done"] == []

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

Тестировать стоит именно изменение: добавь запись в первую группу и проверь, что две другие остались пустыми. Если в каждой группе лежит объект со своими вложенными списками, проверь и их. Иногда снаружи значения уже разные, но общая ссылка спрятана глубже. Для текущего учебного примера достаточно изоляции на одном уровне.

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

Другие проверки рабочих инструментов — в моём Telegram.

Пример учебный; текст подготовлен с помощью ИИ.

Показать полностью

Два кода хотели поменять местами, но второй шаг переписал первый⁠⁠

В учебной выгрузке есть короткие метки A и B. Для новой версии нужно обменять их значения: A становится B, B становится A. Два вызова replace подряд не дают обмена. После первого вызова все A уже стали B, поэтому второй меняет и исходные B, и только что записанные. Данные становятся однородными, хотя исходный порядок нужно сохранить.

labels = "ABBA"
assert labels.replace("A", "B").replace("B", "A") == "AAAA"

swap = str.maketrans({"A": "B", "B": "A"})
assert labels.translate(swap) == "BAAB"
assert "C-A".translate(swap) == "C-B"

translate обрабатывает символы исходной строки по таблице. Результат замены не проходит через неё повторно. Для обмена отдельных символов это прямое описание правила. Если нужно обменять не символы, а полные слова или коды переменной длины, сначала раздели строку на поля либо токены и применяй словарь к целому полю. Иначе буква внутри названия может измениться вместе с самостоятельной меткой.

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

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

Другие разборы преобразования данных — в Jarvis News.

Пример учебный; текст подготовлен с помощью ИИ.

Показать полностью

В конце выступления я оставил время на пару вопросов перед следующим спикером⁠⁠

В конце записи выступления слышно, как я проверяю остаток времени. Говорю, что успел показать 35 слайдов и осталось примерно одна или две минуты. Вместо новой части предлагаю задать пару вопросов, а потом передать слово следующему спикеру. Один из первых вопросов оказался практическим: где найти презентацию.

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

На сцене можно прямо назвать границу: «Есть время на два коротких вопроса». Если ответ требует отдельного примера или другой встречи, скажи об этом сразу. Тогда вопрос не превращается в новую презентацию. Для частого вопроса вроде «где взять слайды?» подготовь понятный адрес или способ найти запись и покажи его крупно. Если материал ещё не выложен, пообещай только то, что действительно сможешь выполнить.

Перед выходом я бы проверил ещё один момент: есть ли у организатора сигнал за пару минут до конца. Его легко пропустить, если читаешь со слайдов или отвечаешь из зала. Удобно знать, кто даст знак и каким он будет. Тогда можно закончить по смыслу, выслушать вопросы и передать слово вовремя.

Посмотреть финал моего выступления.

Текст подготовлен с помощью ИИ по записи выступления.

Показать полностью

В опросе два ответа разделили первое место, а отчёт показал одного победителя⁠⁠

В учебном опросе четыре человека выбрали удобное время. Двое выбрали утро, двое вечер. Если вывести одно наиболее частое значение, итог выглядит определённым. Поменяй порядок строк, и единственный результат может поменяться. Это свойство алгоритма выбора при равной частоте, а не новое предпочтение респондентов.

from statistics import mode, multimode

choices = ["утро", "вечер", "вечер", "утро"]
assert mode(choices) == "утро"
assert mode(choices[1:] + choices[:1]) == "вечер"
assert set(multimode(choices)) == {"утро", "вечер"}
assert multimode([]) == []

Если в отчёте требуется честно показать все лидирующие варианты, сначала получи их через multimode. Для людей полезно вывести и число голосов. Если система обязана выбрать один слот, опиши отдельное правило: учитывается доступность помещения, заранее заданный приоритет или решение организатора. Порядок загрузки записей сам по себе редко является понятным правилом выбора.

Пустой опрос требует отдельной подписи. Пустой список от multimode означает, что из чего выбирать пока нет. В интерфейсе удобно показать «нет ответов». При одинаковой частоте нескольких вариантов покажи «первое место разделили» и перечисли их. Тогда люди смогут понять, какой выбор действительно следует из опроса, а какой сделал организатор.

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

Больше примеров проверки данных — в личном Telegram.

Данные учебные; текст подготовлен с помощью ИИ.

Показать полностью
0

Проверка сравнила начало строки и перепутала соседнюю папку с рабочей⁠⁠

В учебном инструменте два файла находятся в разных папках: /jobs/run/report.csv и /jobs/run-old/report.csv. Проверка через startswith("/jobs/run") принимает оба. Она смотрит на символы, а не на границы компонентов пути. Поэтому папка со старым отчётом выглядит как часть рабочей.

from posixpath import commonpath, commonprefix

root = "/jobs/run"
good = "/jobs/run/report.csv"
old = "/jobs/run-old/report.csv"

assert commonprefix([root, old]) == root
assert commonpath([root, good]) == root
assert commonpath([root, old]) == "/jobs"

commonpath сравнивает целые компоненты пути. В примере используется синтаксис POSIX, чтобы обозначения были одинаковыми на разных компьютерах. Если сравниваешь фактические файлы на своей системе, сначала определи, откуда берётся базовая папка и как нормализуются пути. Для смеси абсолютных и относительных путей функция может вернуть ошибку, поэтому это отдельный случай для проверки.

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

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

Практические проверки инструментов с ИИ — в Jarvis News.

Пример учебный; текст подготовлен с помощью ИИ.

Показать полностью
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества