+1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
class Values<T> {
T data;
Values() {}
Values(T data) {this.setData(data);}
public void setData(T data) {this.data = data;}
public T getData() {return this.data;}
}
public class Main {
public static void main(String[] args) {
Values[][] item = new Values[3][2];
item[0][0] = new Values("grapes");
item[0][1] = new Values(1);
item[1][0] = new Values("apples");
item[1][1] = new Values(1);
item[2][0] = new Values("peaches");
item[2][1] = new Values(1);
}
}
>>> кто меня интервьюировал на позицию Staff Engineer? Junior?
>>>
1. Если покупатель купит больше одного яблока,
то он получит скидку 20% на все яблоки в корзине;
2. Если покупатель купит пакет винограда, то второй пакет
он получит бесплатно.
Итог: посчитать стоимость корзины покупателя при выходе из магазина,
при то, что данные даны в следующем виде:
[["grapes", 1],["apples", 0],["peaches", 1]] => 12
[["grapes", 1],["apples", 1],["peaches", 1]] => 15 ...
https://habr.com/post/504638
Бля-я-я-я, это просто феерия! 1024--, зацени статью, ты оценишь!
Запостил:
gost,
31 Мая 2020
Бля, как прекратить орать?
Какой-то нудный джавашок.
Высрал зазубренное «мама мыла Раму, Рама держит маму, вышла замуж мама за индуса Раму»
Геттеры, сеттеры, оопитухи. Как до дела дошло — слился в мелочах, животное.
Отличный маркёр анскильного бездаря.
Его попросили алгоритм написать, а дрессированная абизьяна привычно надристала геттерами.
И конфигов на XML поболее.
[["grapes", 1],["apples", 0],["peaches", 1]] => 12
строка и число валяются в __одном__ массиве
> данные даны в следующем виде:
дальше ему даже прямо говорят:
> Мой первый вопрос звучал невинно:
> Какую структуру данных мне ожидать в качестве входа?
> Ответ был еще более простым:
> Arrays (массивы). Создай дополнительный метод и опиши там данные вручную.
> На самом деле в этой задаче это НЕ нужно. Зачем в лист класть И число И стоку?
потому что именно это и будет на входе
Думаешь индуса такое не устроило бы?)
просто на входе у тебя будет боксед обжект
на обсуждение чего наш рассматриваемый синиор потратил четверть интервью
Ты на сеньора собеседуешься, блджад, почему ты такие вопросы задаёшь? Выбери сам и объясни почему выбрал.
Я бы взял удобную мне структуру (массив из нормальных структур с полями). Если бы мне на это сказали "чувак, а у нас на входе всё-таки JSON а не твоя структура", то добавил бы преобразование JSONObject'ов в неё. Но я думаю, что не сказали бы.
Это что пример поколения Z? Годик там, годик сям поработал, ачивок насобирал, готов в сеньоры.
Задачка со свободным выбором языка. Т.е. это просто логику и адекватность кандидата посмотреть, не более того. Какие нафиг абстрактные внешние системы?
Было бы смешно, если бы чувак зафигачил решение на блок-схемах, посмотреть на лицо его собеседника.
"Язык на выбор" в понимании нормального человека - "выбрать какой-нибудь адекватный язык, который реально используется".
Если человек выбрал питушню вроде J, его надо гнать поганой метлой, т.к. он тролль, который только ищет слабые места в формулировках. Но его нанимали не для того, чтобы он каждое требование выполнял максимально черезжопно при формальной корректности, а наоборот, чтобы он мог работать с нечётко сформулированной задачей, вовремя выяснять про подводные камни и из мутных заданий делать прозрачные задания для своих подчинённых.
Или какой-нибудь wvxvw.
Впрочем одно другому не противоречиит.
А с другой стороны если задача требует расчёта какой-то матричной или статистической питушни.
И человек элегантно решил её именно при помощи J, напечатав при этом ответ в красиво отформатированных табличках — какой же он тролль?
Это свидетельствует о кругозоре конь-дедадта.
Как и в Сишке можно писать эзотерику. IOOCC тому пруф.
Так и в J можно писать более-менее понятно.
Ещё для не похожих на мейнстримные языки не работает питушня как, например, с сиподобными языками, когда зная один язык можно прочитать код на другом с минимумом вопросов. И анскиллябры, которым лень читнуть туториалца кукаречут: "кококо! нифига ни панятна!". Точно так же совершенно не зная ни одного сиподобного языка код на сиподобных языках будет не понятен, точно так же не зная ни одного из ML-подобных языков, не понятен код на хаскеле и т.п.
В добавок для J есть либа 'primitives' которая именует все закоряки, но она не отменяет того, что нужно знать синтакс и что делают эти примитивы.
Плюсую.
Даже не сиподобными, но вообще алголоподобными.
Бейсики, Руби, Питоны, Ады, Паскали, Фортраны и VHDLи читаются на ура.
- его ещё не наняли. Речь про собеседование. Он не работает и по сути никому ничего не должен. Если интервьюер говорит: "Выбирай любой язык", а человек берёт пусть даже J, то значит интервьюеру надо в следующий раз включать голову, чтобы не тратить хотя бы собственное время.
Ну а поиск слабых мест в формулировках это вообще-то именно то, чем обе стороны и занимаются на собеседованиях.
—– У вас там неоднозначность в формулировке.
–— Выберите любой язык программирования.
—– J подойдёт?
–— Почему в шапке?
То есть J/APL человек вообще случайно выучил - пошёл по улице, там пацаны кодили - вот и надуло. И вообще не знал, что эту питушню не везде понимают.
Если ты знаешь, на каких языках там пишут, то почему не писать задание на этом языке?
Бывает так, что ты не знаешь.
Я реально видел такое объявление, типа "нам пофиг, какие языки вы знаете, потому что вы всё равно не знаете Fantom , а мы на нем пишем"
Если не нужна работа, можно писать хоть на древнегреческом с синтаксисом 1C. Если нужна, то стоит либо выбрать что-то по теме, либо переспросить.
У нас даже в Европе есть такая глушь, где английский не все знают. Что уж говорить про языки программирования. Может, придёшь в контору, а там неучи C++ не понимают. А C++ знать надо. Это классика. А ты им ещё за r-value pituxes поясняешь, за концепты...
А он уже начал вы..бываться. Можно задать для приличия пару вопросов и пообещать перезвонить когда-нибудь потом.
Ведь если он троллит на собеседовании, то что будет, когда на нём будет несколько важных проектов и много питушни, которую кроме него больше никто не знает, и уволить его будет сложнее?
> значит интервьюеру надо в следующий раз включать голову
Зачем тогда собеседование? Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
А если всё по полочкам разложить и формулы написать, любой дурак на все вопросы ответит.
> Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
- на адекватность в принципе проверяется во время HR-интервью. А тут вообще щас наймут чуваков, которые умеют красиво фантазировать на основе кривого ТЗ, а вот по точным спецификациям работать не могут. Это будет индийский блокбастер с песнями и слонами.
В целом, будем откровенны, в большинстве языков дженерики нужны в основном для коллекций.
Зачем поддаваться троллям и подбирать формулировки, когда можно набрать адекватных людей, которые выяснят подводные камни, а не подставят потом контору выполнив что-то формально по принципу "и так сойдёт"?
Другой вопрос, что он сам выбрал язык, и сам же в нем запутался, и стал доказывать интервьюеру, что невозможно решить его задачу на этом языке, потому что там массивы статические.
Почему ревьюера это должно ебать? Он разве его заставлял джаву выбирать?
Ревуер сказал "массивы", потому что в JS массивы динамические. Питуз мог бы это понять
> он спросил
Это да. Хотя бы поначалу не стал троллить.
> Питуз мог бы это понять
Да там массив в массиве и разнотипье. Либо абстрактная математическая запись для целей проектирования, либо скриптушатня, либо легаси питушня.
Ну ладно, может в скриптушатне автор не был. Но он же проектировал питушню, он же мог хотя бы подумать, что это абстрактушня!
Вообще немного странно, что там массивы.
JSеру православнее тоже было бы сделать массив объектов:
А вот питонист как раз мог бы использовать список туплов, там издревле картежи используют для этого
Писать такое долго. Там же по легенде индус нафигачил этой питушни для тестов. А зачем для тестов длинно писать? И ещё три таких объекта на строчку влезают, но уже как-то плохо.
И в коде возить эти pitux.item, pitux.quantity.
> JSеру православнее тоже было бы сделать массив объектов
с одной стороны да, с другой в реальных задачах с этими его массивами данных из даталейка будет прилетать вообще любая дичь с недетерминированной схемой. ну и долбоебов, как мы видим, такое простое ограничение отсекает на ура.
Из той же песни: сделать как у конкурента по скриншоту из проги, додумав бизнес-логику. Хорошо это не часто бывает.
Да, ты работаешь не в вакууме прикрывшись джирой. Ты работаешь с коллегами. Зачем устраивать итальянскую забастовку и хуярить гетерогенное говно на дженериках? Ну спроси ты коллег, предложи им альтернативу. Может быть они и не против поменять этот ссаный формат данных.
Ну и опять же странно, что чел JSON во входных данных не увидел. Я думал, что у веб-разрабов это на рефлексах.
Имхо, эта "глупая" задачка всё что надо показала.
Её стопудов задают очень многим. Если так, то "недоспецифицированной" она может быть только специально, но тут возникает вопрос: зачем? Интервьюеру ехать или шашечки?
Если всё же он придумал задачу за 10 минут до звонка, то нахуй такой процесс интервью.
Чувака, который собеседовался, я не защищаю, хотя, на мой взгляд, они с этой конторой в плане пафоса друг друга нашли. Но его основной проёб это не дженерики и прочая лабуда, а то, что он просрал по тем или иным причинам собеседование и решил поплакаться на пол-рунета об этом. Это реально не L6.
> Ну спроси ты коллег, предложи им альтернативу.
- прямо на собесе? :-) А может они эти интервью как раз и проводят с той целью, чтобы найти альтернативу лол
Ты просто кмк судишь только с позиции конторы.
А еще может быть что за 123456 интервью, имея на руках описание типа:
>>Итог: посчитать стоимость корзины покупателя при выходе из магазина, при то, что данные даны в следующем виде:
ТС первый догадался спросить, в каком виде ему ожидать данные
валидный json
А это шо?
Думаю, ты где-то L2-L3. Мы перезвоним.
Бля, когда они уже начнут делать live streams с собесов. Так, шоб с кровищей, finish him и прочими няшностями
Можно баттлы устраивать где-нибудь на твиче, собеседуя друг друга по очереди.
Олд-жабоёб собеседует молодого нерешительного скриптушка
Молодая пара питонистов устроила собеседование на публике
Два камерунских PHP разработчика собеседуют хрупкого трапа фронтедера
C++ разработчики устроили на конференции групповое собеседование
https://interviewers-msk.xyz/
Спробуй ще.
Эм, лол, ну да. "Я тут вижу JSON, но мне не хочется тратить наше с вами время на бойлерплейт, давайте запишем данные вот так и представим, что мы их уже распарсили?". Это ж минута буквально.
> с позиции конторы
Х.з., меня просто задачки не напрягают вообще. В чём вообще проблема написать что-то простенькое на привычном тебе языке? Я не понимаю, почему многих людей это так бесит :)
Эта задачка особо и не бесит. Просто зачем давать на неё час? Откройте какой-то сайт для рисования или печатания онлайн, там кандидат за 5 минут накидает решение на псевдокоде.
Но тут я уже больше склоняюсь к варианту, что у чуваков был какой-то дикий miscommunication. Один не мог, второй не хотел.
Чтобы собеседуемому комфортно было. Иначе это пиздец стресс для большинства будет, только олимпиадники пройдут.
Я думаю никто не мешает решить её за 5 минут и уйти или о чём-то другом поболтать?
> решать какие входные данные
Эм, а тебе их всегда сверху присылают что ли, даже обсудить не предлагают? Какая скукота )))
> Эм, а тебе их всегда сверху присылают что ли, даже обсудить не предлагают? Какая скукота )))
- ты, я смотрю, в прикладухе мало работал. Приходишь на проект с бэкендом, который писался много лет и возвращает любую хуйню, о которой только можно "мечтать". И никто его ради тебя красивого менять конечно же не будет.
Да мне этого и в системщине хватает, если честно...
Но новые то интерфейсы всё-таки можно по-человечески делать, с обсуждением с обоих сторон.
> вызывает стресс
Да не задача вызывает стресс, а тикающий таймер. Попробуй решить задачку за час и за 10 минут и сравни. Ну вот час - это достаточный запас для большинства, я думаю. А олимпиадники просто привыкли под давлением таймера работать.
Опять-таки, это тоже может быть целью интервью. Но как бы нафиг оно нужно. Искать надо то, где комфортно, а превозмогатели вон пусть в гейдев идут.
Полностью подтверждаю. Когда таймер тикает и нельзя даже на минутку отвлечься — это жопа.
Я делал лабы людям, которые уже работали в ваб-параше, но сами были не в состоянии даже написать подпрограммку для поиска подстроки на асме или даже сях.
https://govnokod.ru/21312#comment354390
Что мешает перевести на нормальное
?
> enum Product
Азазазаза, это хозяин магазина печенья вырос до трёх категорий.
> перевести на нормальное
Конечно, в хаскелле она лучше
Или как там в джавке...
З.Ы. Всё-таки тупые задачки неплохо отсеивают долбоёбов :)
Просто понравилась такая форма представления данных
Сищники эту фишку юзали ещё когда эти ваши дата сатанисты под стол ходили.
впрочем, он нужен для аналитики, а не вытягивания целиковых записей
Давайте, сохраняйте https://itnan.ru/post.php?c=1&p=504638, и чтоб такая питушня в последний раз была!
http://web.archive.org/web/20200531094122/habr.com/ru/post/504638/
http://archive.li/PRR7A
Когда искал эту статью в кэшах поисковиков, наткнулся на заголовок «Программист с помойки»:
https://habr.com/ru/post/503458/
А то кеш гугла уже всё.
http://archive.li/JjaY4
А в кэше «Бинга» — сама статья без комментариев:
http://archive.li/NtO1Q
Сюда попадают страницы с «Хабра»:
http://archive.li/habr.com
Сюда — из кэша «Бинга»:
http://archive.li/cc.bingj.com
Сюда — из кэша «Яндекса»:
http://archive.li/yandexwebcache.net
Сюда — из вебархива (двойная архивация, ага):
http://archive.li/web.archive.org
Добавлю в коллекцию: https://gcode.space/c7349e7d.mhtml. Сумел схоронить из кэша мобильного браузера.
Вообще, какая-то питушня. Человеку предложили выбрать язык для разговора, он сам выбрал джаву, выяснял какие-то джавапроблемы, ещё и динамический массив не нашёл. Зачем? Зачем?
Или в джаве динамический массив называется "вектор", и за любое сравнение с массивом карают боги?
У конторы вообще примеры похожи на какой-то PHP по синтаксису и стрелкам. Скриптухи писали.
Автору стоило бы спросить, нахрена они сделали этот массив массивов. И могут ли дублироваться тайтлы в этих массивах длиной больше трёх - это сырой выхлоп кассы или уже сгруппировано-просуммировано (кстати, не знаю, может где-то в магазинах из-за такого акция не посчитается, если посередине двух акционных товаров затесалась питушня).
А вышел какой-то джавапердолинг.
Кстати может поэтому на продавцов и ругаются, что "скидка не прошла"?
Потому что анскилябры пишут хуёвую логику на массивах?
Кстати, а нафиг они в те годы во все объекты лочек насовали? Чтобы старый код не сдох от реальных тредов?
synchronized, wait, notify, notifyAll
Просто на переходе с файберов на треды добавление лочек внутрь старых коллекций выглядит очень логично... Типа вернули старое поведение и добавили новых не тредсейф коллекций.
> In Java 1.1, green threads were the only threading model used by the Java virtual machine (JVM),[8] at least on Solaris. As green threads have some limitations compared to native threads, subsequent Java versions dropped them in favor of native threads.
Кто на ком стоял?
Вайберы в жабе?
До 1.5 нужно было всё с нуля писать: пулы, очереди.
Кстати StringBuilder vs StringBuffer.
spurious wakeup называется
https://govnokod.ru/24867#comment435148
https://govnokod.ru/11978#comment157571
А чтобы обезьяны не проёбывали, они все коллекции, StringBufferы сделали синхронными.
Вот SimpleDateFormat не сделали синхронным и сколько багров произошло от "оптимизаций"
Блять, неужели я один котирую Iterable? Самая простая в мире вещь, ленивый список.
Человеку нужно просто проитерироваться, и начинается какое-то дрочево.
Если мне нужно N элементов, чтобы обойти их for~each я возьму Iterable и всё.
На этом жавашок и погорел, начал рассказывать про мапы, глисты.
А индус слил его как лалку.
Именно.
Принимай как можно более обобщённый тип, возвращай как можно более конкретный.
Не помню как по-научному этот принцип назвать.
> консервативен
Звучит как какая-то политота на порнхабе.
Если ты не пишешь на сильно типизированных языках в зрелости, у тебя нет мозгов.
А сильнотипизированные наоборот пытаются мимикрировать под нетипизированную скриптуху двадцатилетней гавности.
- а L8 это чтение пожеланий бизнеса ещё до того, как тот родился? :-)
Например, гугл
L3 SWE II
L4 SWE III
L5 Senior SWE
L6 Staff SWE
L7 Senior Staff SWE
L8 Principal Engineer
L9 Distinguished Engineer
L10 Google Fellow
С иерархией компании куда хотел пойти автор похоже, но не полностью: тут Staff SWE - L6 а не 7
> L4 SWE III
Вышло как-то через жопу - как с календарём.
10. Восьмябрь
11. Девябрь
12. Десябрь
Я понимаю заветы Царя и всё такое.
Но это же ЙАЖА.
PS Access to this post is restricted
You're trying to open the post, written by capjdcoder, but unfortunately it was marked as a draft (by the user himself or the UFO)
Ничего не понял.
UPD: понял, это «Cloudflare DNS» хуйню сделал. Ответ правильно доверия не заслужил.
> сколько пачек винограда я получу если куплю две
Две, лол. Сколько принес на кассу, столько и получишь. Не побежит тебе кассир третью искать.
А если ты купишь 3, то тоже оплатишь две.
Сам попадал в неё несколько раз.
Один раз купил мороженное, до меня продавщица доебалась что акция — пойди возьми второе.
Пришлось пойти взять. Хотел оставить ей на кассе, она сказала что правила запрещают брать у покупателей.
Так же несколько раз мне хотели всучить какие-то игрушки, свистоперделки за покупку на значительную сумму. Я обычно отказываюсь.
Один раз подошёл дядечка-охранник, говорит, оставь мне, я дочке отдам.
Мне кажца т.о. сбывают залежалый товар за счёт наивности копукателей.
Но он автоматом на карте срабатывает.
> за бесплатно тебе на самом деле никто ничего не даст.
Конечно. Банк просто делится профитом за эквайринг.
>Зря не берёшь, за бесплатно тебе на самом деле никто ничего не даст
Зачем мне ненужный мусор? Какие-то игрушечные фигурки гаррипоттеров или мстителей.
Я возьму, а потом кому-то не хватит.
- а ты хотел бы настоящую?
©https://bash.im/quote/410452
В этом интернет-магазинчике все акции руками вбиваются программистом, а бухгалтерию они наверное потом на абаке подсчитывают, да?
Кстати, встречал такое: цена за акционный товар считается полностью, а потом из окончательной суммы в самом конце вычитается скидка. Один раз подобное вызвало немало лулзов при попытке выяснить у польской продавщицы, не знавшей английского, чо за хрень.
Но у нас-то обычно скидки прямо после позиций указывают.
- а в какую сторону тут будет в пистоне округление?
А тьфу, int не заметил. К нулю.
Мы вам перезвоним.
Перевёл на J экмапитуз 16+.
>экмапитуз 16+.
Говно ёбанное. Даже сишка лучше и компактнее.
* Код я не компилил
Но экматушня при тех же условиях тоже компактна, ещё можно форычнуться по исходным данным:
>экматушня при тех же условиях тоже компактна
В любом случае тужились-тужились, завезли в язык тонны син. сахара а древнюю сишку уделать не могут.
> i<2
Какая-то питушня. Может вспомним, что теперь надо товары сортировать в правильном порядке, четвёртый товар взять никак нельзя, отладить или распечатать чек тоже нельзя, т.к. имена товаров просраны?
А теперь давайте то же самое, только чтобы имена товаров остались живы.
Знаю.
Длину нужно брать из енума. См. ниже.
Так же енум снимает проблему имён.
Плюс
Вот эта питушня не выкинет ошибки если написали "grapse"
А Сишка ошибку отловит:
Код скриптушков как-то отработает; для пущей адекватности туда можно добавить функцию группировки на три строки. А сиштушня будет слишком жёсткой, перед ней надо будет поставить слой дополнительной логики, чтобы сконвертировать исходные данные в царский формат.
Не понял как?
Скриптушня не даст скидку на яблоки (помним, 3 строки - и даст), а сиштушня сломается
А это не так работает.
Оно 4 раза запишет единицу.
> { {APPLES,1}, {APPLES,1}, {APPLES,1}, {APPLES,1} }
Группировка в сишке тоже тривиальна.
Это простые инкременты результирующего массива по переданному енуму.
Потому, что можно инициализировать массив нулями и безопасно суммировать без хаков вроде defaultdict или .get в пистоне или |0 в жс.
Это не принципиально. Хотел сам подход показать.
>Сишка оказалась компактнее только из-за отхода от индексушни
Экму с питоном сгубила ассоциативочка. Если бы её не было (как в Сишке), вы бы мыслили массивной индексушнёй, то написали бы программу компактнее.
>int normal(int n) { return n; }
Это кстати не нужно. Достаточно тернарником проверить функцию на nullptr и вернуть n.
Я хотел сначала написать (rules[item] || n => n)(count) без всяких тернарников.
Но с default/normal все правила находятся в одном месте.
- понимаю, что однострочность, но div_t так и просится.
Ревьювер дураку уже прямо подсказывал: используй массивы.
Не хочу массивы — хочу жрать говножавашиться.
Во-первых, это было правило для яблок.
Но не так важно. Если кто-то возьмёт три пакета винограда, то заплатит за 2, а не за 2.4.
> int apples(int n) { return (n / 2 | 0) + n % 2; }
А вот тут можно было бы сделать n - n / 2 как у восьмишка. Это в анскильном JS нет целочисленного деления, а в сишке есть.
Итого,
- а ведь и вправду заебца! Можно троллить коллег на ревью.
> .reduce((res, curr) => res + rules[curr[0]](curr[1]) * prices[curr[0]], 0)
Тоже хотел смешать map и reduce. Но смешанный вариант попахивает больше.
Кстати, в curr
> Маловато модерновой хуйни
ибо curr - это [item, count].
> get: (target, prop) => ({}).hasOwnProperty.call(target, prop) ? target[prop] : n => n
Кстати, о такой питушне думал, когда писал, но отказался в силу её громоздкости. При надобности изолировать выбор правила подойдёт банальная функция
Возможно, имя класса нужно вытаскивать как explode('::', unserialize($key)[1])[2]. Но это будет некрасиво. Лучше в константах Item::APPLES хранить экземпляры класса, но тогда их нельзя объявить константой, придётся их объявлять переменными и где-то инициализировать.
Ещё можно у класса Item сделать статический метод, который будет выполнять (new Item(unserialize($key))).
А ещё у корзины можно сделать метод __toString, чтобы писать echo $basket вместо echo $basket->getPrice();
Ещё можно сделать, чтобы корзина реализовала интерфейс ArrayAccess, тогда метод add не будет нужен, достаточно будет $basket[] = Item::APPLES;
Я плюсанул за енумы. Но это есть нюанс, который сильно раздражает.
В енумах можно писать маловербозно и без функцианальной питушни:
век живи -- век учись
спасибо
впрочем, в коко я бы взял sealed classes, а на чистой джаве я уже почти не пишу, кроме старого кода
впрочем, хлопециально сразу изменить какие-то игруппированная перформансу из-за такогда в копается. Согласть И число класса нужен, да эти вашок и потому могу изменить его окончательно и добираешься.
Ура! Рабоскрипт жив.
>хлопециально
Высокосинтаксически.
Проверил. Все словосочетанусы взязты из треда.
Хуй, как сюда метатаблы прикрутить?
Очевидно, от кандидата требовалось написать функцию (не ебу как это на джаве):
Это проверка не на знание языка программирования (т.к. это мало кого ебёт), а на адекватность. А автор, очевидно, хотел выебнуться и обосрался.
>>> Интервьюер, хотя и не сразу (не стал я выяснять причины, честно сказать — времени оставалось около 25 минут), согласился и сказал — давай на Map. Я потратил минут 10, чтобы накидать скелет кода, проверил граничные условия и сказал что закончил.
>>> Оказалось не тут-то было и все самое интересное было впереди. Помните скидки? Процитирую условие еще раз:
>>> If customer buys one grapes he gets another one for free. (Если покупатель купит один пакет винограда, то второй он получит бесплатно).
>>> В данном случае можно предположить, что имея данные в формате:
>>>["grapes", 2]
>>> в количестве данного продукта могут быть учтены и бесплатные пакеты винограда. Тогда картина должна быть следующей:
>>> ...
>>> Заметили паттерн? В корзине винограда должно быть всегда только четное количество. Однако исходя из начальных данных, в корзине также бывает и нечетное количество виограда
>>> В таком случае давайте будем исходить от противного — раз может быть нечетное количество винограда, тогда в корзине учитывается только тот виноград, который покупатель оплатил. Логично? Вроде да. Варианты когда покупатель просто не взял бесплатный виноград — не рассматриваются.
>>> А теперь внимание — правильный ответ!
>>> 1 оплаченный пакет + 1 бесплатный + 1 оплаченный
>>> Это феерично! Как? Ну как же так может быть?
Т.е. он мало того, что неправильно решил задачу (о чём ему в комментах всё же сумели донести), так ещё и проигнорировал тот факт, что на тестовых данных его решение работает неправильно, выдавая 15 + 3 + 7 = 25 вместо положенных 20. Синьор, блядь, программист, L80-датасаентист.
Жри виноград сука
Но блин, есть же здравый смысл. Чек - это отчётность, в нём нельзя взять и выкинуть "бесплатные" позиции. И кассир никогда не побежит за "бесплатными" пакетами винограда специально для тебя. Т.е. обе версии, предложенные автором статьи, сразу можно отбросить.