"LLM — это производные от продуктов человеческого мышления; они не могут превзойти эту основу, как бы ни старались специалисты в OpenAI, Google или Anthropic, помешивая свои цифровые зелья в котлах." Звучит безапелляционно, однако, все же, вызывает сомнения. Было бы неплохо привести хоть какую-то аргументацию в пользу этого сильного утверждения.
Лично я вполне "говорливый", но объяснить решение могу только после того, как представил его, либо, если образ получается достаточно сложный, после того, как уже закодировал. Не стОит, пожалуй, углубляться здесь в мои персональные практики решения сложных задач, я лишь хотел сказать, что требование "рассуждать вслух" - это не самый лучший фильтр, как мне кажется. Понимаю, что это сложившаяся практика, и претензий лично к вам не имею), но захотелось замолвить словечко за совсем неглупых "визуалов", которые способны на многое, но так и не получают шанса проявить себя.
"Мыслите вслух" - для меня это звучит как приговор, и подозреваю, что таких, как я, немало. Мне, чтобы решить любую задачу, надо "увидеть" ее. А чтобы "увидеть" сложную задачу, надо хорошенько сосредоточиться. А чтобы сконцентрироваться по-настоящему и "слиться" с задачей, крайне желательно остаться наедине. Любые попытки "рассуждать вслух", да еще и под пристальным надзором, убивают мою креативность. Вполне возможно, что таким людям надо "просто тренировать" способность рассуждать вслух, но зачем ломать то, что дано природой, и прошло проверку школой, физматом университета, самим программированием, да и жизнью в целом?..
Сильное утверждение, но настоящим провидцам можно и не такое. Однако в данном случае ваши телепатические возможности вас несколько подвели. Я бы сказал, что подвели буквально по всем пунктам.
Я не утверждаю, что ваше решение головоломно сложно, я лишь хотел сказать, что сегодня можно сделать проще, да еще и с лучшим - мне так кажется, утверждаю бездоказательно - результатом. За сим позвольте откланяться.
А если давать не большие объемы, а адекватные?.. Помня о крайне ограниченном размере возможного ответа, какой смысл давать большие объемы для этой задачи?.. Если отправлять небольшими порциями, используя API, да еще и организовав проверку ответов с коррекцией в случае необходимости?.. А скрипт для решения вашей задачи нужен, а иначе как вы будете использовать API? Но этот скрипт будет несравенно проще, нежели те, что вы используете для решения этой задачи. Ну и уточню, что ответы ChatGPT и Sonnet 3.5 я привел в качестве демонстрации возможности LLM решить эту задачу. Для большого объема входных данных надо будет использовать API, я подумал, что это достаточно очевидно, но, судя по комментариям, я ошибался в этом.
Гружу. Получаю результат - аж дух захватывает. Но я не настаиваю, пусть каждый пользуется теми инструментами, которые ему нравятся, и с которыми у него получается лучше.
Кажется, что в наше время такого рода задачки уже можно решать гораздо менее скромными усилиями, с лУчшим результатом и за гораздо мЕньшее время. Посудите сами. Любопытства ради, не заморачиваясь сколь-нибудь всерьез, я взял ваш пример из начала статьи, на быструю руку накидал промпт, и попросил LLM решить вашу задачку. Промпт выглядит так: "Я дам тебе список адресов, среди которых встречаются одинаковые, на записанные по-разному. Найди адреса, которые являются одними и теми же, пусть и записанными по-разному, и составь из них новый список, в котором будут присутствовать только уникальные адреса. Запиши адреса в этот список единообразно по следующему шаблону: {Населенный пункт}, {Улица}, {Дом/квартира и т.п.} <адреса>"д. Малое Шилово, ул. Березовая, д. 7"; "п. Ласьва, ул. Весенняя, д. 5"; "Луговой пер 5, Краснокамск г"; "д. Новая Ивановка, ул. Солнечная, 18"; "Весенняя 5Ласьва"; "д.Новая Ивановка, ул.Солнечная, 18"; "Березовая 7М Шилово"; "г. Краснокамск, пер. Луговой, 5"</адреса> Мой список адресов слегка отличается от вашего, я решил, что не стоит облегчать задачу ИИ, и разбил пары похожих адресов. Ответ ChatGPT-4: "
Для составления списка уникальных адресов необходимо:
Привести все адреса к единому шаблону.
Удалить дубликаты, учитывая их разные написания.
Общий шаблон: {Населенный пункт}, {Улица}, {Дом/квартира}. Результат обработки:
д. Малое Шилово, ул. Березовая, д. 7
п. Ласьва, ул. Весенняя, д. 5
г. Краснокамск, пер. Луговой, д. 5
д. Новая Ивановка, ул. Солнечная, д. 18
Если требуется пояснение, как именно это было сделано, дайте знать!"
Этот же промпт я отправил в Claude Sonnet 3.5 и получил такой ответ: "
д. Малое Шилово, ул. Березовая, д. 7
Исходные варианты:
"д. Малое Шилово, ул. Березовая, д. 7"
"Березовая 7_М Шилово"
п. Ласьва, ул. Весенняя, д. 5
Исходные варианты:
"п. Ласьва, ул. Весенняя, д. 5"
"Весенняя 5_Ласьва"
г. Краснокамск, пер. Луговой, д. 5
Исходные варианты:
"Луговой пер 5, Краснокамск г"
"г. Краснокамск, пер. Луговой, 5"
д. Новая Ивановка, ул. Солнечная, д. 18
Исходные варианты:
"д. Новая Ивановка, ул. Солнечная, 18"
"д.Новая Ивановка, ул.Солнечная, 18"
"
Получив такой ответ, я попросил Sonnet очистить вывод: "Ок, верни только список, без исходных вариантов и твоих комментариев." Ответ: "
д. Малое Шилово, ул. Березовая, д. 7
п. Ласьва, ул. Весенняя, д. 5
г. Краснокамск, пер. Луговой, д. 5
д. Новая Ивановка, ул. Солнечная, д. 18
"
На самом деле, если потратить чуть больше времени, то можно добиться от LLM ответов в любом желаемом формате. А если еще навостриться использовать API, то можно решать и не такие задачки.
Когда выяснится, что добровольный отказ от зарплаты не привел к ожидаемому повышению производительности труда и прибыли компаний, то можно будет последовать примеру северных собратьев и организовать трудовые лагеря. "Верной дорогой идете, товарищи!"
В этой связи стоит обратить внимание и на засилье "отставников" - бывших силовиков - в различных органах власти и бизнесе. Вот и еще один неиссякаемый - а может быть, в известной степени, и ведущий - источник "жесткого стиля руководства".
Можно написать следующую статью, которая может вызвать более живой отклик у аудитории: "Как собеседовали бы при приеме на работу в пекарню, если бы к работникам пекарен подходили как к работникам it". Кажется, что типичное описание вакансии могло бы выглядеть как-то примерно так: "В нашу молодую, активно развивающуюся пекарню требуется тестомес. Знание механики, химии, микробиологии, санитарии, основ медицины обязательно. Хорошее знание сопромата будет плюсом. Требуется отличная физическая подготовка и развитые коммуникативные навыки. Обязателен опыт в замесе теста из муки разных сортов от ведущих производителей..." Ну и т.д. и т.п., чтобы никто не вздумал думать, что может месить тесто в нашей пекарне запросто так.
Я бы посоветовал начинающему автору отложить пока leetcode в сторону, а вместо этого сосредоточиться на каком-нибудь хорошем курсе по алгоритмам и структурам данных. Как осилите - возвращайтесь на leetcode. Иначе, скорее всего, вас ожидает скорая фрустрация. Дальше будут задачки посложнее, и решить их с "наскока", не зная классических методов, приемов, алгоритмов и структур данных, дело практически безнадежное.
Есть мнение, что одна из ключевых проблем заключается в том, что даже если условное бессмертие и возможно, то обретут его те, кому и рождаться-то не следовало. А условные "хорошие люди" так и будут пахать и умирать, в извечной пустой надежде, что пусть они сами и не пожили, "как люди", но их дети уж точно обретут блага, ведь им так убедительно обещают...
Есть мнение, что подобное решение - основанное на "сторонних" библиотеках - на "стандартном" алгоритмическом собеседовании не приняли бы. Насколько я знаю, для решения алгоритмических задачек иногда разрешают использовать стандартную библиотеку, и только.
Я прямо растерялся. Но попробую ответить. Я думаю, что при решении подобного рода задач не стоит гнаться за микрооптимизацией, которая то-ли случится, то-ли нет (у нас нет никаких дополнительных сведений о данных). К тому же, о такого рода оптимизации в формулировке задачи нет ни единого намека. При решении такого рода задач стремятся получить приемлемую сложность "О-большое", и при этом было бы очень желательно, чтобы реализация выглядела "лаконично" и понятно. Было бы здорово, если бы реализация допускала легкую модификацию при небольшом изменении входных данных. Например, у нас данные были бы не за 2 дня, а за 17. И "лояльным" пользователем следовало бы считать того, кто посещал не все дни, а хотя бы 8 из 17, и посмотрел за это время хотя бы 25 уникальных статей. Думаю, что предложенное мной решение в целом удовлетворяет требованиям, которые я перечислил выше. Ну и стоит сделать поправку на то, что я приступил к решению задачи, стараясь решить ее как можно быстрее и проще, имея при этом приемлемое значение "О-большое", так, как я бы делал это на собеседовании. Должен заметить, что я сначала я даже не стал читать комментариев автора, мне хватило условия задачи, оно показалось мне вполне понятным и достаточно определенным для того, чтобы можно было приступить к решению. А для любой микрооптимизации нужны веские основания и глубокое погружение в проблему, вряд ли стоит углубляться в это дело на собеседовании по собственной инициативе. Можно легко самого себя закопать, если начать придумывать себе проблемы на пустом месте. Но я не настаиваю, если вы способны предусмотреть всевозможные нюансы, убедительно объяснить необходимость их учета, и мастерски разрешить их прямо во время собеседования, то конечно, вы будете иметь преимущество.
Удивительное по-прежнему рядом. Насколько я могу судить - это задачка уровня easy на leetcode. Если бы мне предложили ее, то я бы именно так ее и воспринял и сходу наколотил бы что-то подобно тому, что под спойлером.
Спойлер
# O(n) - time complexity
# O(n) - space complexity
day1 = [
{"t": 10, "page": 1, "user": 1},
{"t": 11, "page": 2, "user": 3},
{"t": 12, "page": 1, "user": 4},
{"t": 13, "page": 1, "user": 5},
{"t": 14, "page": 2, "user": 6},
{"t": 15, "page": 2, "user": 7},
]
day2 = [
{"t": 10, "page": 1, "user": 3},
{"t": 11, "page": 2, "user": 7},
{"t": 12, "page": 1, "user": 8},
{"t": 13, "page": 1, "user": 1},
{"t": 14, "page": 2, "user": 3},
{"t": 15, "page": 2, "user": 2},
]
users = {}
for d, day in enumerate([day1, day2]):
for record in day:
user = record["user"]
page = record["page"]
if user in users:
users[user]["days"].add(d)
users[user]["pages"].add(page)
else:
users[user] = {"days": set([d]), "pages": set([page])}
for user in users:
if len(users[user]["days"]) == 2 and (len(users[user]["pages"]) >= 2):
print(f'userId={user}', users[user])
Не так давно видел предложение о многоуровневом собеседовании, на котором обещались задачки уровня hard, и это далеко не Amazon, Google и даже Microsoft.
"LLM — это производные от продуктов человеческого мышления; они не могут превзойти эту основу, как бы ни старались специалисты в OpenAI, Google или Anthropic, помешивая свои цифровые зелья в котлах." Звучит безапелляционно, однако, все же, вызывает сомнения. Было бы неплохо привести хоть какую-то аргументацию в пользу этого сильного утверждения.
Лично я вполне "говорливый", но объяснить решение могу только после того, как представил его, либо, если образ получается достаточно сложный, после того, как уже закодировал. Не стОит, пожалуй, углубляться здесь в мои персональные практики решения сложных задач, я лишь хотел сказать, что требование "рассуждать вслух" - это не самый лучший фильтр, как мне кажется. Понимаю, что это сложившаяся практика, и претензий лично к вам не имею), но захотелось замолвить словечко за совсем неглупых "визуалов", которые способны на многое, но так и не получают шанса проявить себя.
"Мыслите вслух" - для меня это звучит как приговор, и подозреваю, что таких, как я, немало. Мне, чтобы решить любую задачу, надо "увидеть" ее. А чтобы "увидеть" сложную задачу, надо хорошенько сосредоточиться. А чтобы сконцентрироваться по-настоящему и "слиться" с задачей, крайне желательно остаться наедине. Любые попытки "рассуждать вслух", да еще и под пристальным надзором, убивают мою креативность. Вполне возможно, что таким людям надо "просто тренировать" способность рассуждать вслух, но зачем ломать то, что дано природой, и прошло проверку школой, физматом университета, самим программированием, да и жизнью в целом?..
Сильное утверждение, но настоящим провидцам можно и не такое. Однако в данном случае ваши телепатические возможности вас несколько подвели. Я бы сказал, что подвели буквально по всем пунктам.
Я не утверждаю, что ваше решение головоломно сложно, я лишь хотел сказать, что сегодня можно сделать проще, да еще и с лучшим - мне так кажется, утверждаю бездоказательно - результатом. За сим позвольте откланяться.
А если давать не большие объемы, а адекватные?.. Помня о крайне ограниченном размере возможного ответа, какой смысл давать большие объемы для этой задачи?.. Если отправлять небольшими порциями, используя API, да еще и организовав проверку ответов с коррекцией в случае необходимости?.. А скрипт для решения вашей задачи нужен, а иначе как вы будете использовать API? Но этот скрипт будет несравенно проще, нежели те, что вы используете для решения этой задачи. Ну и уточню, что ответы ChatGPT и Sonnet 3.5 я привел в качестве демонстрации возможности LLM решить эту задачу. Для большого объема входных данных надо будет использовать API, я подумал, что это достаточно очевидно, но, судя по комментариям, я ошибался в этом.
Гружу. Получаю результат - аж дух захватывает. Но я не настаиваю, пусть каждый пользуется теми инструментами, которые ему нравятся, и с которыми у него получается лучше.
Кажется, что в наше время такого рода задачки уже можно решать гораздо менее скромными усилиями, с лУчшим результатом и за гораздо мЕньшее время. Посудите сами. Любопытства ради, не заморачиваясь сколь-нибудь всерьез, я взял ваш пример из начала статьи, на быструю руку накидал промпт, и попросил LLM решить вашу задачку. Промпт выглядит так: "Я дам тебе список адресов, среди которых встречаются одинаковые, на записанные по-разному. Найди адреса, которые являются одними и теми же, пусть и записанными по-разному, и составь из них новый список, в котором будут присутствовать только уникальные адреса. Запиши адреса в этот список единообразно по следующему шаблону: {Населенный пункт}, {Улица}, {Дом/квартира и т.п.} <адреса>"д. Малое Шилово, ул. Березовая, д. 7"; "п. Ласьва, ул. Весенняя, д. 5"; "Луговой пер 5, Краснокамск г"; "д. Новая Ивановка, ул. Солнечная, 18"; "Весенняя 5Ласьва"; "д.Новая Ивановка, ул.Солнечная, 18"; "Березовая 7М Шилово"; "г. Краснокамск, пер. Луговой, 5"</адреса> Мой список адресов слегка отличается от вашего, я решил, что не стоит облегчать задачу ИИ, и разбил пары похожих адресов. Ответ ChatGPT-4: "
Для составления списка уникальных адресов необходимо:
Привести все адреса к единому шаблону.
Удалить дубликаты, учитывая их разные написания.
Общий шаблон:
{Населенный пункт}, {Улица}, {Дом/квартира}
.Результат обработки:
д. Малое Шилово, ул. Березовая, д. 7
п. Ласьва, ул. Весенняя, д. 5
г. Краснокамск, пер. Луговой, д. 5
д. Новая Ивановка, ул. Солнечная, д. 18
Если требуется пояснение, как именно это было сделано, дайте знать!"
Этот же промпт я отправил в Claude Sonnet 3.5 и получил такой ответ: "
д. Малое Шилово, ул. Березовая, д. 7
Исходные варианты:
"д. Малое Шилово, ул. Березовая, д. 7"
"Березовая 7_М Шилово"
п. Ласьва, ул. Весенняя, д. 5
Исходные варианты:
"п. Ласьва, ул. Весенняя, д. 5"
"Весенняя 5_Ласьва"
г. Краснокамск, пер. Луговой, д. 5
Исходные варианты:
"Луговой пер 5, Краснокамск г"
"г. Краснокамск, пер. Луговой, 5"
д. Новая Ивановка, ул. Солнечная, д. 18
Исходные варианты:
"д. Новая Ивановка, ул. Солнечная, 18"
"д.Новая Ивановка, ул.Солнечная, 18"
"
Получив такой ответ, я попросил Sonnet очистить вывод: "Ок, верни только список, без исходных вариантов и твоих комментариев." Ответ: "
д. Малое Шилово, ул. Березовая, д. 7
п. Ласьва, ул. Весенняя, д. 5
г. Краснокамск, пер. Луговой, д. 5
д. Новая Ивановка, ул. Солнечная, д. 18
"
На самом деле, если потратить чуть больше времени, то можно добиться от LLM ответов в любом желаемом формате. А если еще навостриться использовать API, то можно решать и не такие задачки.
пардон, удалено.
Когда выяснится, что добровольный отказ от зарплаты не привел к ожидаемому повышению производительности труда и прибыли компаний, то можно будет последовать примеру северных собратьев и организовать трудовые лагеря. "Верной дорогой идете, товарищи!"
В этой связи стоит обратить внимание и на засилье "отставников" - бывших силовиков - в различных органах власти и бизнесе. Вот и еще один неиссякаемый - а может быть, в известной степени, и ведущий - источник "жесткого стиля руководства".
Можно написать следующую статью, которая может вызвать более живой отклик у аудитории: "Как собеседовали бы при приеме на работу в пекарню, если бы к работникам пекарен подходили как к работникам it". Кажется, что типичное описание вакансии могло бы выглядеть как-то примерно так: "В нашу молодую, активно развивающуюся пекарню требуется тестомес. Знание механики, химии, микробиологии, санитарии, основ медицины обязательно. Хорошее знание сопромата будет плюсом. Требуется отличная физическая подготовка и развитые коммуникативные навыки. Обязателен опыт в замесе теста из муки разных сортов от ведущих производителей..." Ну и т.д. и т.п., чтобы никто не вздумал думать, что может месить тесто в нашей пекарне запросто так.
del
deleted
Я бы посоветовал начинающему автору отложить пока leetcode в сторону, а вместо этого сосредоточиться на каком-нибудь хорошем курсе по алгоритмам и структурам данных. Как осилите - возвращайтесь на leetcode. Иначе, скорее всего, вас ожидает скорая фрустрация. Дальше будут задачки посложнее, и решить их с "наскока", не зная классических методов, приемов, алгоритмов и структур данных, дело практически безнадежное.
deleted
Есть мнение, что одна из ключевых проблем заключается в том, что даже если условное бессмертие и возможно, то обретут его те, кому и рождаться-то не следовало. А условные "хорошие люди" так и будут пахать и умирать, в извечной пустой надежде, что пусть они сами и не пожили, "как люди", но их дети уж точно обретут блага, ведь им так убедительно обещают...
Есть мнение, что подобное решение - основанное на "сторонних" библиотеках - на "стандартном" алгоритмическом собеседовании не приняли бы. Насколько я знаю, для решения алгоритмических задачек иногда разрешают использовать стандартную библиотеку, и только.
Я прямо растерялся. Но попробую ответить. Я думаю, что при решении подобного рода задач не стоит гнаться за микрооптимизацией, которая то-ли случится, то-ли нет (у нас нет никаких дополнительных сведений о данных). К тому же, о такого рода оптимизации в формулировке задачи нет ни единого намека. При решении такого рода задач стремятся получить приемлемую сложность "О-большое", и при этом было бы очень желательно, чтобы реализация выглядела "лаконично" и понятно. Было бы здорово, если бы реализация допускала легкую модификацию при небольшом изменении входных данных. Например, у нас данные были бы не за 2 дня, а за 17. И "лояльным" пользователем следовало бы считать того, кто посещал не все дни, а хотя бы 8 из 17, и посмотрел за это время хотя бы 25 уникальных статей. Думаю, что предложенное мной решение в целом удовлетворяет требованиям, которые я перечислил выше. Ну и стоит сделать поправку на то, что я приступил к решению задачи, стараясь решить ее как можно быстрее и проще, имея при этом приемлемое значение "О-большое", так, как я бы делал это на собеседовании. Должен заметить, что я сначала я даже не стал читать комментариев автора, мне хватило условия задачи, оно показалось мне вполне понятным и достаточно определенным для того, чтобы можно было приступить к решению. А для любой микрооптимизации нужны веские основания и глубокое погружение в проблему, вряд ли стоит углубляться в это дело на собеседовании по собственной инициативе. Можно легко самого себя закопать, если начать придумывать себе проблемы на пустом месте. Но я не настаиваю, если вы способны предусмотреть всевозможные нюансы, убедительно объяснить необходимость их учета, и мастерски разрешить их прямо во время собеседования, то конечно, вы будете иметь преимущество.
Удивительное по-прежнему рядом. Насколько я могу судить - это задачка уровня easy на leetcode. Если бы мне предложили ее, то я бы именно так ее и воспринял и сходу наколотил бы что-то подобно тому, что под спойлером.
Спойлер
Не так давно видел предложение о многоуровневом собеседовании, на котором обещались задачки уровня hard, и это далеко не Amazon, Google и даже Microsoft.