Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
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 ...
Я сказал ОК, интервьюер спросил какой язык я предпочту,
на что я ответил «Java» и начал оценивать задачу.
Простите? Я конечно могу создать массив с данными динамически,
где в качестве длины массива будет параметризированная переменная,
но я же должен знать сколько объектов я должен буду вставить
в массив — ведь единожды создав массив, я не могу изменить его длину.
Поэтому тут уж мне пришлось буквально объяснить интервьюеру, как
создаются массивы внутри JVM, почему их размер фиксирован, и почему
их длину невозможно переопределить после создания — только создание
нового и копирование данных.
Как это влияет на подающийся на вход жсон? Даже если это не жсон, а сразу в структуре, то это все равно массивы / списки. Че угодно можно запилить, блядь, но на входе у тебя [string, decimal]
Ты на сеньора собеседуешься, блджад, почему ты такие вопросы задаёшь? Выбери сам и объясни почему выбрал.
Я бы взял удобную мне структуру (массив из нормальных структур с полями). Если бы мне на это сказали "чувак, а у нас на входе всё-таки JSON а не твоя структура", то добавил бы преобразование JSONObject'ов в неё. Но я думаю, что не сказали бы.
Всё же это вполне адекватный вопрос, потому речь идёт о работе с некой абстрактной внешней системой. Если это не было заранее описано в условии задачи, то просто говорит о том, что интервьюер не особо готовился.
Задачка со свободным выбором языка. Т.е. это просто логику и адекватность кандидата посмотреть, не более того. Какие нафиг абстрактные внешние системы?
И при чём тут выбор языка? Язык для интервьюера это black box в данном случае, да. Это на мой взгляд глупо само по себе, но то такое. Но условия задачи, в том числе входные и выходные данные, можно как-то заранее продумать. Чувак не в вакууме будет работать. А такие задачки это хороший повод задуматься, а не будут ли потом ежедневно проверять твою логику и адекватность тикетами в джире без описания и с названием "Сделать заебато".
Это как взять все конфетки из вазочки. Формально ты можешь, но потом их перед твоим приходом будут прятать.
"Язык на выбор" в понимании нормального человека - "выбрать какой-нибудь адекватный язык, который реально используется".
Если человек выбрал питушню вроде J, его надо гнать поганой метлой, т.к. он тролль, который только ищет слабые места в формулировках. Но его нанимали не для того, чтобы он каждое требование выполнял максимально черезжопно при формальной корректности, а наоборот, чтобы он мог работать с нечётко сформулированной задачей, вовремя выяснять про подводные камни и из мутных заданий делать прозрачные задания для своих подчинённых.
> Если человек выбрал питушню вроде J, CL, Haskell, Adga, Coq его надо гнать поганой метлой, т.к. он тролль
Или какой-нибудь wvxvw.
Впрочем одно другому не противоречиит.
>Если человек выбрал питушню вроде J, его надо гнать поганой метлой
А с другой стороны если задача требует расчёта какой-то матричной или статистической питушни.
И человек элегантно решил её именно при помощи J, напечатав при этом ответ в красиво отформатированных табличках — какой же он тролль?
Это свидетельствует о кругозоре конь-дедадта.
Как и в Сишке можно писать эзотерику. IOOCC тому пруф.
Так и в J можно писать более-менее понятно.
Подтверждаю, на самом деле J довольно простенький инфиксно-префиксный векторный комбинаторный функци-язычок. Просто APL-щики видимо не любят много писанины и заюзали вместо имён спецсимволы, конечно не зная их значений ничего и не будет понятно.
Ещё для не похожих на мейнстримные языки не работает питушня как, например, с сиподобными языками, когда зная один язык можно прочитать код на другом с минимумом вопросов. И анскиллябры, которым лень читнуть туториалца кукаречут: "кококо! нифига ни панятна!". Точно так же совершенно не зная ни одного сиподобного языка код на сиподобных языках будет не понятен, точно так же не зная ни одного из ML-подобных языков, не понятен код на хаскеле и т.п.
В добавок для J есть либа 'primitives' которая именует все закоряки, но она не отменяет того, что нужно знать синтакс и что делают эти примитивы.
>Ещё для не похожих на мейнстримные языки не работает питушня как, например, с сиподобными языками, когда зная один язык можно прочитать код на другом с минимумом вопросов
Плюсую.
Даже не сиподобными, но вообще алголоподобными.
Бейсики, Руби, Питоны, Ады, Паскали, Фортраны и VHDLи читаются на ура.
> Но его нанимали
- его ещё не наняли. Речь про собеседование. Он не работает и по сути никому ничего не должен. Если интервьюер говорит: "Выбирай любой язык", а человек берёт пусть даже J, то значит интервьюеру надо в следующий раз включать голову, чтобы не тратить хотя бы собственное время.
Ну а поиск слабых мест в формулировках это вообще-то именно то, чем обе стороны и занимаются на собеседованиях.
Ему сказали "выбирай любой", ну он и выбрал. Откуда он знал, что именно этот язык нельзя?
Да и дело не только в J.
Он мог выбрать ассемблер например, перл, или руби.
Во всех случаях язык для непосвященного человека выглядел бы как синтаксическая ошибка
С такими идеями можно устраиваться на обер-ассистента секретаря младшего программиста. Более серьёзная должность обязывает думать о том, на каких языках вообще в конторе пишут, и на каких уместно писать код для собеседования.
То есть J/APL человек вообще случайно выучил - пошёл по улице, там пацаны кодили - вот и надуло. И вообще не знал, что эту питушню не везде понимают.
> Если ты знаешь, на каких языках там пишут, то почему не писать задание на этом языке?
Если не нужна работа, можно писать хоть на древнегреческом с синтаксисом 1C. Если нужна, то стоит либо выбрать что-то по теме, либо переспросить.
У нас даже в Европе есть такая глушь, где английский не все знают. Что уж говорить про языки программирования. Может, придёшь в контору, а там неучи C++ не понимают. А C++ знать надо. Это классика. А ты им ещё за r-value pituxes поясняешь, за концепты...
> его ещё не наняли
А он уже начал вы..бываться. Можно задать для приличия пару вопросов и пообещать перезвонить когда-нибудь потом.
Ведь если он троллит на собеседовании, то что будет, когда на нём будет несколько важных проектов и много питушни, которую кроме него больше никто не знает, и уволить его будет сложнее?
> значит интервьюеру надо в следующий раз включать голову
Зачем тогда собеседование? Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
А если всё по полочкам разложить и формулы написать, любой дурак на все вопросы ответит.
Писать на Джаве с дженериками это выёбываться? Ну ок. Ладно б ещё DSL на Руби
> Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
- на адекватность в принципе проверяется во время HR-интервью. А тут вообще щас наймут чуваков, которые умеют красиво фантазировать на основе кривого ТЗ, а вот по точным спецификациям работать не могут. Это будет индийский блокбастер с песнями и слонами.
вот этот код не имеет смысла. Такой код никогда нигде ни зачем не нужен.
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;}
}
Для этого есть возможность переспросить.
Зачем поддаваться троллям и подбирать формулировки, когда можно набрать адекватных людей, которые выяснят подводные камни, а не подставят потом контору выполнив что-то формально по принципу "и так сойдёт"?
Ну он спросил вроде "можно на джаве?", и ему сказали что да, можно.
Другой вопрос, что он сам выбрал язык, и сам же в нем запутался, и стал доказывать интервьюеру, что невозможно решить его задачу на этом языке, потому что там массивы статические.
Почему ревьюера это должно ебать? Он разве его заставлял джаву выбирать?
Ревуер сказал "массивы", потому что в JS массивы динамические. Питуз мог бы это понять
Вы же сами сказали про блок-схемы. Вот я и сказал, что не надо питушню разводить, а лучше взять ту питушню, с которой все знакомы и каждый день в туалет ходят.
> он спросил
Это да. Хотя бы поначалу не стал троллить.
> Питуз мог бы это понять
Да там массив в массиве и разнотипье. Либо абстрактная математическая запись для целей проектирования, либо скриптушатня, либо легаси питушня.
Ну ладно, может в скриптушатне автор не был. Но он же проектировал питушню, он же мог хотя бы подумать, что это абстрактушня!
Вот меня и удивило, что он не подумал, что это абстрактушня, а зачем-то стал реально хуячить гетерогенные массивы в Java, да еще и абстракцию какую-то глупую придумал, и обосрался, и стал агриться на интервьюера.
Вообще немного странно, что там массивы.
JSеру православнее тоже было бы сделать массив объектов:
[{item: "яблоко", quantity: 42}, {..}]
А вот питонист как раз мог бы использовать список туплов, там издревле картежи используют для этого
> [{item: "яблоко", quantity: 42}, {..}]
Писать такое долго. Там же по легенде индус нафигачил этой питушни для тестов. А зачем для тестов длинно писать? И ещё три таких объекта на строчку влезают, но уже как-то плохо.
И в коде возить эти pitux.item, pitux.quantity.
> Вообще немного странно, что там массивы.
> JSеру православнее тоже было бы сделать массив объектов
с одной стороны да, с другой в реальных задачах с этими его массивами данных из даталейка будет прилетать вообще любая дичь с недетерминированной схемой. ну и долбоебов, как мы видим, такое простое ограничение отсекает на ура.
Недоспецифицированные задачи везде встречаются. Нельзя всё-всё-всё учесть сразу. И чел, претендующий на сеньора, должен иметь опыт работы с такими ситуациями, имхо.
Да, ты работаешь не в вакууме прикрывшись джирой. Ты работаешь с коллегами. Зачем устраивать итальянскую забастовку и хуярить гетерогенное говно на дженериках? Ну спроси ты коллег, предложи им альтернативу. Может быть они и не против поменять этот ссаный формат данных.
Ну и опять же странно, что чел JSON во входных данных не увидел. Я думал, что у веб-разрабов это на рефлексах.
Смотри, это не реальная работа, а задача на собесе.
Её стопудов задают очень многим. Если так, то "недоспецифицированной" она может быть только специально, но тут возникает вопрос: зачем? Интервьюеру ехать или шашечки?
Если всё же он придумал задачу за 10 минут до звонка, то нахуй такой процесс интервью.
Чувака, который собеседовался, я не защищаю, хотя, на мой взгляд, они с этой конторой в плане пафоса друг друга нашли. Но его основной проёб это не дженерики и прочая лабуда, а то, что он просрал по тем или иным причинам собеседование и решил поплакаться на пол-рунета об этом. Это реально не L6.
> Ну спроси ты коллег, предложи им альтернативу.
- прямо на собесе? 🙂 А может они эти интервью как раз и проводят с той целью, чтобы найти альтернативу лол
>Её стопудов задают очень многим. Если так, то "недоспецифицированной" она может быть только специально
А еще может быть что за 123456 интервью, имея на руках описание типа:
>>Итог: посчитать стоимость корзины покупателя при выходе из магазина, при то, что данные даны в следующем виде:
Олд-жабоёб собеседует молодого нерешительного скриптушка Молодая пара питонистов устроила собеседование на публике Два камерунских PHP разработчика собеседуют хрупкого трапа фронтедера C++ разработчики устроили на конференции групповое собеседование
Чтобы ты, упаси господи, не спрашивал, в каком формате нужно вернуть цену: числом, строкой или генеричной структурой данных из наименований, количества, цен вхождений, скидок и хуй знает чего еще
Эм, лол, ну да. "Я тут вижу JSON, но мне не хочется тратить наше с вами время на бойлерплейт, давайте запишем данные вот так и представим, что мы их уже распарсили?". Это ж минута буквально.
> с позиции конторы
Х.з., меня просто задачки не напрягают вообще. В чём вообще проблема написать что-то простенькое на привычном тебе языке? Я не понимаю, почему многих людей это так бесит 🙂
Ну такое, ещё решать за них, какие у них входные и выходные данные? На суперфулстека что ли вакансия? Чем вообще staff engineer занимается?
Эта задачка особо и не бесит. Просто зачем давать на неё час? Откройте какой-то сайт для рисования или печатания онлайн, там кандидат за 5 минут накидает решение на псевдокоде.
Но тут я уже больше склоняюсь к варианту, что у чуваков был какой-то дикий miscommunication. Один не мог, второй не хотел.
Глупая простенькая задачка, которая вызовет стресс у всех, кроме олимпиадников? Что-то пазл не складывается.
> Эм, а тебе их всегда сверху присылают что ли, даже обсудить не предлагают? Какая скукота )))
- ты, я смотрю, в прикладухе мало работал. Приходишь на проект с бэкендом, который писался много лет и возвращает любую хуйню, о которой только можно "мечтать". И никто его ради тебя красивого менять конечно же не будет.
> возвращает любую хуйню, о которой можно только мечтать
Да мне этого и в системщине хватает, если честно...
Но новые то интерфейсы всё-таки можно по-человечески делать, с обсуждением с обоих сторон.
> вызывает стресс
Да не задача вызывает стресс, а тикающий таймер. Попробуй решить задачку за час и за 10 минут и сравни. Ну вот час - это достаточный запас для большинства, я думаю. А олимпиадники просто привыкли под давлением таймера работать.
Так если тебе дают простую задачу на 5-10 минут и говорят, что у тебя есть час, разве это не вызывает бОльший стресс, потому что ты будешь подсознательно искать какой-то подвох?
Опять-таки, это тоже может быть целью интервью. Но как бы нафиг оно нужно. Искать надо то, где комфортно, а превозмогатели вон пусть в гейдев идут.
Я делал лабы людям, которые уже работали в ваб-параше, но сами были не в состоянии даже написать подпрограммку для поиска подстроки на асме или даже сях.
> enum Product
Азазазаза, это хозяин магазина печенья вырос до трёх категорий.
> перевести на нормальное
-- питухи выпилили понятное
-- {-# LANGUAGE DatatypeContexts #-}
-- data (Ord a, Monoid b) => Item a b = Item a b
-- оставили какую-то питушню, но она всё равно адекватнее
{-# LANGUAGE GADTs #-}
data Item a b where
Item :: (Ord a, Monoid b) => a -> b -> Item a b
Геттеры-сеттеры и прочая синтаксушня. Сравните хаскелевский вореант, где сам тип такой, что ключ можно положить в какую-нибудь мапу, а цену - свернуть с такой же. Хотя OK, моноид на практике - слишком пердольно, его для краткости кода можно заменить на Num. Да и стоимость легче будет считать. Это да, чтобы посчитать стоимость, надо цену Num.
Я бы его тоже завалил, нахуй он нужен, да ещё и на сеньора? Данные в код вбить не может. В каких-то деталях реализации копается. Механику скидок с третьего раза не понял, даже когда в комментах на пальцах пояснили. Спорит до последнего...
Опуская очевидное: чувак захотел пойти работать с большими данными, но ВНЕЗАПНО сломался на задаче, где данные оказались не то что разных типов, а просто в не очень чистой структуре
А мне понравился способ из комментариев: использовать два массива со значениями и наименованиями. Наверняка будет какое-то преимущество по перформансу из-за хранения однородных данных вместе, как раз для бигдаты актуально
Ну не знаю, я бы за такое сразу въебал пометки "олимпиадник" и "страдает преждевременной оптимизацией" и попросил бы пояснить за плюсы и минусы такого представления. Ибо нефиг выёбываться.
Согласен, это неуместно для интервью где все что надо - показать что ты код видишь не впервые в жизни.
Просто понравилась такая форма представления данных
Это новомодная сейчас тема data orietnted или как-то так. Если ты миллиад раз итерируешься по массиву цен, то логичнее действительно иметь два отдельных маасива
С год назад я считал статью гейдева, который говорил, что теперь вот дескать нужно делать так.
Ну и приводил пример. Есть сколько-то питухов в комнате, у каждого координаты.
Питуз сделает класс для питуха, положит питухов в коллекцию, и чтобы проверить не сталкивается-ли герой с питухом -- будет по ней итерироваться.
А ведь в классе, кроме координат, еще 42 разных значения лежат, и они нахуй не нужны тащемто, и по ним процессор прыгает, и в кеш меньше всего помещается итд
Вот и предлагается отдельно хранить координаты питузов
Доступ к публикации закрыт
Вы пытаетесь открыть публикацию, написанную пользователем capjdcoder, однако, публикация скрыта в черновики (самим автором или НЛО)
Ебать дебил. Какие в пизду дженерики? Что мешало написать функцию f(int yablokiCount, int bananiCount, int vinogradCount)?
Или f(vector<pair<string, int>>)?
Почитал статью ещё когда она была открыта. Узнал много нового про Джаву.
Вообще, какая-то питушня. Человеку предложили выбрать язык для разговора, он сам выбрал джаву, выяснял какие-то джавапроблемы, ещё и динамический массив не нашёл. Зачем? Зачем?
Или в джаве динамический массив называется "вектор", и за любое сравнение с массивом карают боги?
У конторы вообще примеры похожи на какой-то PHP по синтаксису и стрелкам. Скриптухи писали.
Автору стоило бы спросить, нахрена они сделали этот массив массивов. И могут ли дублироваться тайтлы в этих массивах длиной больше трёх - это сырой выхлоп кассы или уже сгруппировано-просуммировано (кстати, не знаю, может где-то в магазинах из-за такого акция не посчитается, если посередине двух акционных товаров затесалась питушня).
Vector это обертка вокруг статического массива, которая расширияет его копированием при надобности (как в плюсах примерно)
Но Vector синхонизирован, и потому может просаживаться по перформансу.
Потому во второй джаве сделали интерфейс List, и несколько его реализаций. Аналогом vectorа там стал ArrayList. Он тоже растет копируя, но он не синхронизирован по умолчанию.
Так что вместо Vector нужно использовать ArrayList
А они параллельно то могли выполняться? Или как файберы.
Просто на переходе с файберов на треды добавление лочек внутрь старых коллекций выглядит очень логично... Типа вернули старое поведение и добавили новых не тредсейф коллекций.
> 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.
А вот похуй на реализацию.
Если мне нужно N элементов, чтобы обойти их for~each я возьму Iterable и всё.
На этом жавашок и погорел, начал рассказывать про мапы, глисты.
А индус слил его как лалку.
Если ты не писал на слабо типизированных языках в молодости, у тебя нет сердца.
Если ты не пишешь на сильно типизированных языках в зрелости, у тебя нет мозгов.
> Если судить только по этой статье, мне не показалось, что вы готовы к уровню Staff Software Engineer (L7). Да, вы умеете программировать на Java, но это требуется и на уровне L5. Умение работать с некорректно или нечетко сформулированными условиями — на уровне L6
- а 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
Хочу написать тулу, которая умеет умножать цену на 0.8 и проверять размер списка на чотность (посредством проверки остатка от деления на 2).
Можно сразу и собеседование в shopify пройти, и информатику за 11 класс сдать
Остаток надо проверять и, если он равен нулю, выдавать кассиру уведомление "Спросить покупателя, не хочет ли он взять ещё одну - всё же акция". Есть вореятность, что жадный покупатель поведётся.
Пару раз в «Пятерочке» сталкивался, что кассир с недовольной рожей говорил «Ты долбоёб. Иди бери ещё одну или отменяй» (не прямым текстом, но смысл такой).
Кстати вполне житейская ситуация.
Сам попадал в неё несколько раз.
Один раз купил мороженное, до меня продавщица доебалась что акция — пойди возьми второе.
Пришлось пойти взять. Хотел оставить ей на кассе, она сказала что правила запрещают брать у покупателей.
Так же несколько раз мне хотели всучить какие-то игрушки, свистоперделки за покупку на значительную сумму. Я обычно отказываюсь.
Один раз подошёл дядечка-охранник, говорит, оставь мне, я дочке отдам.
Зря не берёшь, за бесплатно тебе на самом деле никто ничего не даст. Просто цена товара, который даётся в "подарок" включена в цену того за который он даётся.
Мне кажца т.о. сбывают залежалый товар за счёт наивности копукателей.
Единственно что я беру — это кешбек.
Но он автоматом на карте срабатывает.
> за бесплатно тебе на самом деле никто ничего не даст.
Конечно. Банк просто делится профитом за эквайринг.
>Зря не берёшь, за бесплатно тебе на самом деле никто ничего не даст
Зачем мне ненужный мусор? Какие-то игрушечные фигурки гаррипоттеров или мстителей.
Я возьму, а потом кому-то не хватит.
В этом интернет-магазинчике все акции руками вбиваются программистом, а бухгалтерию они наверное потом на абаке подсчитывают, да?
Кстати, встречал такое: цена за акционный товар считается полностью, а потом из окончательной суммы в самом конце вычитается скидка. Один раз подобное вызвало немало лулзов при попытке выяснить у польской продавщицы, не знавшей английского, чо за хрень.
Сишка оказалась компактнее только из-за отхода от индексушни. По счастью, оно не будет врать из-за палочки от винограда в формуле (побитушня ради каста, которую в сишке можно убрать). Перестановлены цены для первых двух питушень (надо 20, 10, 30), остальное вроде нормально.
Но экматушня при тех же условиях тоже компактна, ещё можно форычнуться по исходным данным:
const prices = [20, 10, 30];
const rules = [n => n > 1 ? 0.8 * n : n, n => (n / 2 | 0) + n % 2, n => n];
const total = basket => basket
.map((count, item) => rules[item](count) * prices[item])
.reduce((st, it) => st + it, 0);
[[1, 0, 1], [2, 0, 1], [3, 0, 1], [4, 0, 1], [4, 1, 1], [4, 2, 1], [4, 3, 1]]
.forEach(b => console.log(total(b)));
> В любом случае тужились-тужились, завезли в язык тонны син. сахара а древнюю сишку уделать не могут.
> i<2
Какая-то питушня. Может вспомним, что теперь надо товары сортировать в правильном порядке, четвёртый товар взять никак нельзя, отладить или распечатать чек тоже нельзя, т.к. имена товаров просраны?
А теперь давайте то же самое, только чтобы имена товаров остались живы.
Но это уже противоречит условию о том, что длина - 3 и больше.
Код скриптушков как-то отработает; для пущей адекватности туда можно добавить функцию группировки на три строки. А сиштушня будет слишком жёсткой, перед ней надо будет поставить слой дополнительной логики, чтобы сконвертировать исходные данные в царский формат.
Тем, что у них не было привязано к позиции. По крайней мере, об этом явно не говорили, даже если в приведённых тестах был какой-то порядок ключей.
Скриптушня не даст скидку на яблоки (помним, 3 строки - и даст), а сиштушня сломается
Хм, а вот тут я уже перехожу на сторону сишки.
Потому, что можно инициализировать массив нулями и безопасно суммировать без хаков вроде defaultdict или .get в пистоне или |0 в жс.
>(надо 20, 10, 30)
Это не принципиально. Хотел сам подход показать.
>Сишка оказалась компактнее только из-за отхода от индексушни
Экму с питоном сгубила ассоциативочка. Если бы её не было (как в Сишке), вы бы мыслили массивной индексушнёй, то написали бы программу компактнее.
>int normal(int n) { return n; }
Это кстати не нужно. Достаточно тернарником проверить функцию на nullptr и вернуть n.
enum Type{
GRAPES(0), APPLES, PITUZES, BAGORS, KOKOS
}
//акции для избранных продуктов
int (*discounts[])(int) = {
[GRAPES]=grapes,
[BAGORS]=apples
};
int prices[] = {20,10,30,15,42};
> Это кстати не нужно. Достаточно тернарником проверить функцию на nullptr и вернуть n.
Я хотел сначала написать (rules[item] || n => n)(count) без всяких тернарников.
Но с default/normal все правила находятся в одном месте.
> int grapes(int n) { return n > 1 ? 0.8 * n : n; }
Во-первых, это было правило для яблок.
Но не так важно. Если кто-то возьмёт три пакета винограда, то заплатит за 2, а не за 2.4.
> int apples(int n) { return (n / 2 | 0) + n % 2; }
А вот тут можно было бы сделать n - n / 2 как у восьмишка. Это в анскильном JS нет целочисленного деления, а в сишке есть.
Итого,
double apples(int n) { return n > 1 ? 0.8 * n : n; }
double grapes(int n) { return n - n / 2; }
> .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
Кстати, о такой питушне думал, когда писал, но отказался в силу её громоздкости. При надобности изолировать выбор правила подойдёт банальная функция
Мне не нравится (new Item(unserialize($key)))
Возможно, имя класса нужно вытаскивать как explode('::', unserialize($key)[1])[2]. Но это будет некрасиво. Лучше в константах Item::APPLES хранить экземпляры класса, но тогда их нельзя объявить константой, придётся их объявлять переменными и где-то инициализировать.
Ещё можно у класса Item сделать статический метод, который будет выполнять (new Item(unserialize($key))).
А ещё у корзины можно сделать метод __toString, чтобы писать echo $basket вместо echo $basket->getPrice();
Ещё можно сделать, чтобы корзина реализовала интерфейс ArrayAccess, тогда метод add не будет нужен, достаточно будет $basket[] = Item::APPLES;
>Вот вам супер-пупе объектно ориентированная джава.
Я плюсанул за енумы. Но это есть нюанс, который сильно раздражает.
В енумах можно писать маловербозно и без функцианальной питушни:
Блядь, и куда хотел пойти работипизированные в лист? числовия так захотельно не пришлости, у тут будет по не из приняты называется и на два.
впрочем, хлопециально сразу изменить какие-то игруппированная перформансу из-за такогда в копается. Согласть И число класса нужен, да эти вашок и потому могу изменить его окончательно и добираешься.
Переписал как гейдведизайнер.
Хуй, как сюда метатаблы прикрутить?
local apples = {
name = "apples",
price = 10,
get_price = function(self, count) return self.price * count * (count > 1 and 0.8 or 1) end
}
local grapes = {
name = "grapes",
price = 20,
get_price = function(self, count) return (count - math.floor(count / 2)) * self.price end
}
local peaches = {
name = "peaches",
price = 20,
get_price = function(self, count) return count * self.price end
}
function total(basket)
local total = 0
for _, item_and_quantity in pairs(basket) do
local item = item_and_quantity[1]
local quantity = item_and_quantity[2]
local price = item:get_price(quantity)
print(quantity .. " " .. item.name .. " is "..price)
total = total + price
end
return total
end
basket = {{peaches, 20}, {grapes, 2}, {apples, 10}}
print("Total is ".. total(basket))
Кстати, самую мякотку-то забыли:
>>> Интервьюер, хотя и не сразу (не стал я выяснять причины, честно сказать — времени оставалось около 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-датасаентист.
Да он в магазины наверно не ходил даже. Или тупо протирал картой терминалы и не вникал в то, сколько чего он купил, не забыл ли забрать на кассе, и сколько это вообще стоило.
Не, ну я тоже особо не вникаю в детали ценника. А на вопрос "а это у вас по акции?" отвечаю "да хрен знает, считайте как посчитается"...
Но блин, есть же здравый смысл. Чек - это отчётность, в нём нельзя взять и выкинуть "бесплатные" позиции. И кассир никогда не побежит за "бесплатными" пакетами винограда специально для тебя. Т.е. обе версии, предложенные автором статьи, сразу можно отбросить.
gost # 0
Бля, как прекратить орать?
guest # 0 ⇈
bormand # 0 ⇈
3.14159265 # 0 ⇈
Какой-то нудный джавашок.
Высрал зазубренное «мама мыла Раму, Рама держит маму, вышла замуж мама за индуса Раму»
Геттеры, сеттеры, оопитухи. Как до дела дошло — слился в мелочах, животное.
guest # 0 ⇈
bormand # 0 ⇈
jojaxon # 0 ⇈
3.14159265 # 0 ⇈
Отличный маркёр анскильного бездаря.
Его попросили алгоритм написать, а дрессированная абизьяна привычно надристала геттерами.
guest # 0 ⇈
удивительно, что он toString и equals с hashCode не реализовал
и этот еще
которырй для сериализации
serialVersionUID
bormand # 0 ⇈
jojaxon # 0 ⇈
И конфигов на XML поболее.
bormand # 0 ⇈
bormand # 0
guest # 0 ⇈
Fike # 0 ⇈
guest # 0 ⇈
Умненький шарп в отличие от тупой жабы умеет инстанцииовать генерики правильно. Там получится отдельный класс с valuetype под капотом
Fike # 0 ⇈
guest # 0 ⇈
На самом деле в этой задаче это НЕ нужно. Зачем в лист класть И число И стоку?
Fike # 0 ⇈
guest # 0 ⇈
там где-то сказано, что количество может быть строкой?
Fike # 0 ⇈
[["grapes", 1],["apples", 0],["peaches", 1]] => 12
строка и число валяются в __одном__ массиве
guest # 0 ⇈
Fike # 0 ⇈
guest # 0 ⇈
Нельзя
?
не будет работать?
Fike # 0 ⇈
> данные даны в следующем виде:
дальше ему даже прямо говорят:
> Мой первый вопрос звучал невинно:
> Какую структуру данных мне ожидать в качестве входа?
> Ответ был еще более простым:
> Arrays (массивы). Создай дополнительный метод и опиши там данные вручную.
guest # 0 ⇈
Разумеется блядь интервьюер предлагает массив: он джаваскриптер, для него это нормальная структура.
Но если ты пишешь на си, то очевидно ты не будешь делать гетерогенный массив вместо структуры из двух полей, нет?
Fike # 0 ⇈
guest # 0 ⇈
давай снова попробую
Моя задача сохранить данные, и чото по ним посчить.
Я сам могу выбирать структуы и алгоритмы.
Если мне на вход придет json, я его просто прреобразую в нужные мне структуры.
Нет никаких необходимостей хранить в языке со статической типизацией данные в массиве из двух разнотипных элементов. Никто так не делает.
В питоне и JS делают, а в Java и C# нет.
Мне пришли данные json, toml, yaml, хуямл, xml, а я их трансформировал в нужное мне. Понимаешь?
Fike # 0 ⇈
> На самом деле в этой задаче это НЕ нужно. Зачем в лист класть И число И стоку?
потому что именно это и будет на входе
bormand # 0 ⇈
Думаешь индуса такое не устроило бы?)
guest # 0 ⇈
Массив Object[][] я могу преобразовать в список нужных мне структур?
Fike # 0 ⇈
просто на входе у тебя будет боксед обжект
на обсуждение чего наш рассматриваемый синиор потратил четверть интервью
bormand # 0 ⇈
Ты на сеньора собеседуешься, блджад, почему ты такие вопросы задаёшь? Выбери сам и объясни почему выбрал.
Я бы взял удобную мне структуру (массив из нормальных структур с полями). Если бы мне на это сказали "чувак, а у нас на входе всё-таки JSON а не твоя структура", то добавил бы преобразование JSONObject'ов в неё. Но я думаю, что не сказали бы.
jojaxon # 0 ⇈
Это что пример поколения Z? Годик там, годик сям поработал, ачивок насобирал, готов в сеньоры.
Desktop # 0 ⇈
bormand # 0 ⇈
Задачка со свободным выбором языка. Т.е. это просто логику и адекватность кандидата посмотреть, не более того. Какие нафиг абстрактные внешние системы?
Desktop # 0 ⇈
jojaxon # 0 ⇈
Desktop # 0 ⇈
Было бы смешно, если бы чувак зафигачил решение на блок-схемах, посмотреть на лицо его собеседника.
1024-- # 0 ⇈
"Язык на выбор" в понимании нормального человека - "выбрать какой-нибудь адекватный язык, который реально используется".
Если человек выбрал питушню вроде J, его надо гнать поганой метлой, т.к. он тролль, который только ищет слабые места в формулировках. Но его нанимали не для того, чтобы он каждое требование выполнял максимально черезжопно при формальной корректности, а наоборот, чтобы он мог работать с нечётко сформулированной задачей, вовремя выяснять про подводные камни и из мутных заданий делать прозрачные задания для своих подчинённых.
3.14159265 # 0 ⇈
Или какой-нибудь wvxvw.
Впрочем одно другому не противоречиит.
3.14159265 # 0 ⇈
А с другой стороны если задача требует расчёта какой-то матричной или статистической питушни.
И человек элегантно решил её именно при помощи J, напечатав при этом ответ в красиво отформатированных табличках — какой же он тролль?
Это свидетельствует о кругозоре конь-дедадта.
Как и в Сишке можно писать эзотерику. IOOCC тому пруф.
Так и в J можно писать более-менее понятно.
HIV # 0 ⇈
Ещё для не похожих на мейнстримные языки не работает питушня как, например, с сиподобными языками, когда зная один язык можно прочитать код на другом с минимумом вопросов. И анскиллябры, которым лень читнуть туториалца кукаречут: "кококо! нифига ни панятна!". Точно так же совершенно не зная ни одного сиподобного языка код на сиподобных языках будет не понятен, точно так же не зная ни одного из ML-подобных языков, не понятен код на хаскеле и т.п.
В добавок для J есть либа 'primitives' которая именует все закоряки, но она не отменяет того, что нужно знать синтакс и что делают эти примитивы.
xyi # 0 ⇈
3.14159265 # 0 ⇈
Плюсую.
Даже не сиподобными, но вообще алголоподобными.
Бейсики, Руби, Питоны, Ады, Паскали, Фортраны и VHDLи читаются на ура.
Desktop # 0 ⇈
Desktop # 0 ⇈
- его ещё не наняли. Речь про собеседование. Он не работает и по сути никому ничего не должен. Если интервьюер говорит: "Выбирай любой язык", а человек берёт пусть даже J, то значит интервьюеру надо в следующий раз включать голову, чтобы не тратить хотя бы собственное время.
Ну а поиск слабых мест в формулировках это вообще-то именно то, чем обе стороны и занимаются на собеседованиях.
TEH3OPHblu_nemyx # 0 ⇈
—– У вас там неоднозначность в формулировке.
–— Выберите любой язык программирования.
—– J подойдёт?
–— Почему в шапке?
guest # 0 ⇈
Ему сказали "выбирай любой", ну он и выбрал. Откуда он знал, что именно этот язык нельзя?
Да и дело не только в J.
Он мог выбрать ассемблер например, перл, или руби.
Во всех случаях язык для непосвященного человека выглядел бы как синтаксическая ошибка
1024-- # 0 ⇈
То есть J/APL человек вообще случайно выучил - пошёл по улице, там пацаны кодили - вот и надуло. И вообще не знал, что эту питушню не везде понимают.
MAKAKA # 0 ⇈
Если ты знаешь, на каких языках там пишут, то почему не писать задание на этом языке?
Бывает так, что ты не знаешь.
Я реально видел такое объявление, типа "нам пофиг, какие языки вы знаете, потому что вы всё равно не знаете Fantom , а мы на нем пишем"
1024-- # 0 ⇈
Если не нужна работа, можно писать хоть на древнегреческом с синтаксисом 1C. Если нужна, то стоит либо выбрать что-то по теме, либо переспросить.
У нас даже в Европе есть такая глушь, где английский не все знают. Что уж говорить про языки программирования. Может, придёшь в контору, а там неучи C++ не понимают. А C++ знать надо. Это классика. А ты им ещё за r-value pituxes поясняешь, за концепты...
1024-- # 0 ⇈
А он уже начал вы..бываться. Можно задать для приличия пару вопросов и пообещать перезвонить когда-нибудь потом.
Ведь если он троллит на собеседовании, то что будет, когда на нём будет несколько важных проектов и много питушни, которую кроме него больше никто не знает, и уволить его будет сложнее?
> значит интервьюеру надо в следующий раз включать голову
Зачем тогда собеседование? Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
А если всё по полочкам разложить и формулы написать, любой дурак на все вопросы ответит.
Desktop # 0 ⇈
> Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
- на адекватность в принципе проверяется во время HR-интервью. А тут вообще щас наймут чуваков, которые умеют красиво фантазировать на основе кривого ТЗ, а вот по точным спецификациям работать не могут. Это будет индийский блокбастер с песнями и слонами.
guest # 0 ⇈
вот этот код не имеет смысла. Такой код никогда нигде ни зачем не нужен.
Desktop # 0 ⇈
В целом, будем откровенны, в большинстве языков дженерики нужны в основном для коллекций.
guest # 0 ⇈
Нельзя сделать массив Values<String>. Можно только Values, то-есть Values<Object>.
Так что Values можно использовать только в параметризируемых коллекциях типа *List<>, но их самих можно параметризировать.
List<Stirng> ничем не хуже List<Values<String>>
guest # 0 ⇈
Любой из них обычно понимаем
1024-- # 0 ⇈
Зачем поддаваться троллям и подбирать формулировки, когда можно набрать адекватных людей, которые выяснят подводные камни, а не подставят потом контору выполнив что-то формально по принципу "и так сойдёт"?
MAKAKA # 0 ⇈
Другой вопрос, что он сам выбрал язык, и сам же в нем запутался, и стал доказывать интервьюеру, что невозможно решить его задачу на этом языке, потому что там массивы статические.
Почему ревьюера это должно ебать? Он разве его заставлял джаву выбирать?
Ревуер сказал "массивы", потому что в JS массивы динамические. Питуз мог бы это понять
1024-- # 0 ⇈
> он спросил
Это да. Хотя бы поначалу не стал троллить.
> Питуз мог бы это понять
Да там массив в массиве и разнотипье. Либо абстрактная математическая запись для целей проектирования, либо скриптушатня, либо легаси питушня.
Ну ладно, может в скриптушатне автор не был. Но он же проектировал питушню, он же мог хотя бы подумать, что это абстрактушня!
MAKAKA # 0 ⇈
Вообще немного странно, что там массивы.
JSеру православнее тоже было бы сделать массив объектов:
А вот питонист как раз мог бы использовать список туплов, там издревле картежи используют для этого
1024-- # 0 ⇈
Писать такое долго. Там же по легенде индус нафигачил этой питушни для тестов. А зачем для тестов длинно писать? И ещё три таких объекта на строчку влезают, но уже как-то плохо.
И в коде возить эти pitux.item, pitux.quantity.
Fike # 0 ⇈
> JSеру православнее тоже было бы сделать массив объектов
с одной стороны да, с другой в реальных задачах с этими его массивами данных из даталейка будет прилетать вообще любая дичь с недетерминированной схемой. ну и долбоебов, как мы видим, такое простое ограничение отсекает на ура.
guest # 0 ⇈
Fike # 0 ⇈
jojaxon # 0 ⇈
Из той же песни: сделать как у конкурента по скриншоту из проги, додумав бизнес-логику. Хорошо это не часто бывает.
bormand # 0 ⇈
Да, ты работаешь не в вакууме прикрывшись джирой. Ты работаешь с коллегами. Зачем устраивать итальянскую забастовку и хуярить гетерогенное говно на дженериках? Ну спроси ты коллег, предложи им альтернативу. Может быть они и не против поменять этот ссаный формат данных.
Ну и опять же странно, что чел JSON во входных данных не увидел. Я думал, что у веб-разрабов это на рефлексах.
Имхо, эта "глупая" задачка всё что надо показала.
Desktop # 0 ⇈
Её стопудов задают очень многим. Если так, то "недоспецифицированной" она может быть только специально, но тут возникает вопрос: зачем? Интервьюеру ехать или шашечки?
Если всё же он придумал задачу за 10 минут до звонка, то нахуй такой процесс интервью.
Чувака, который собеседовался, я не защищаю, хотя, на мой взгляд, они с этой конторой в плане пафоса друг друга нашли. Но его основной проёб это не дженерики и прочая лабуда, а то, что он просрал по тем или иным причинам собеседование и решил поплакаться на пол-рунета об этом. Это реально не L6.
> Ну спроси ты коллег, предложи им альтернативу.
- прямо на собесе? 🙂 А может они эти интервью как раз и проводят с той целью, чтобы найти альтернативу лол
Ты просто кмк судишь только с позиции конторы.
bootcamp_dropout # 0 ⇈
А еще может быть что за 123456 интервью, имея на руках описание типа:
>>Итог: посчитать стоимость корзины покупателя при выходе из магазина, при то, что данные даны в следующем виде:
ТС первый догадался спросить, в каком виде ему ожидать данные
Desktop # 0 ⇈
bootcamp_dropout # 0 ⇈
валидный json
HIV # 0 ⇈
А это шо?
bootcamp_dropout # 0 ⇈
Desktop # 0 ⇈
Думаю, ты где-то L2-L3. Мы перезвоним.
bootcamp_dropout # 0 ⇈
bormand # 0 ⇈
Desktop # 0 ⇈
Бля, когда они уже начнут делать live streams с собесов. Так, шоб с кровищей, finish him и прочими няшностями
bormand # 0 ⇈
Можно баттлы устраивать где-нибудь на твиче, собеседуя друг друга по очереди.
jojaxon # 0 ⇈
guest # 0 ⇈
bormand # 0 ⇈
guest # 0 ⇈
jojaxon # 0 ⇈
guest # 0 ⇈
Покорные питонистки выполнят любое твое тестовое задание
Отсобеседую в Москве Ж, Ж+Ж
Интересует: алгоритмическая сложность, хайлоад, распределенные системы.
Табу: ПХП
jojaxon # 0 ⇈
Desktop # 0 ⇈
guest # 0 ⇈
Fike # 0 ⇈
HIV # 0 ⇈
Олд-жабоёб собеседует молодого нерешительного скриптушка
Молодая пара питонистов устроила собеседование на публике
Два камерунских PHP разработчика собеседуют хрупкого трапа фронтедера
C++ разработчики устроили на конференции групповое собеседование
HIV # 0 ⇈
https://interviewers-msk.xyz/
guest # 0 ⇈
1024-- # 0 ⇈
HIV # 0 ⇈
bootcamp_dropout # 0 ⇈
Desktop # 0 ⇈
Спробуй ще.
bootcamp_dropout # 0 ⇈
bormand # 0 ⇈
Эм, лол, ну да. "Я тут вижу JSON, но мне не хочется тратить наше с вами время на бойлерплейт, давайте запишем данные вот так и представим, что мы их уже распарсили?". Это ж минута буквально.
> с позиции конторы
Х.з., меня просто задачки не напрягают вообще. В чём вообще проблема написать что-то простенькое на привычном тебе языке? Я не понимаю, почему многих людей это так бесит 🙂
Desktop # 0 ⇈
Эта задачка особо и не бесит. Просто зачем давать на неё час? Откройте какой-то сайт для рисования или печатания онлайн, там кандидат за 5 минут накидает решение на псевдокоде.
Но тут я уже больше склоняюсь к варианту, что у чуваков был какой-то дикий miscommunication. Один не мог, второй не хотел.
bormand # 0 ⇈
Чтобы собеседуемому комфортно было. Иначе это пиздец стресс для большинства будет, только олимпиадники пройдут.
Я думаю никто не мешает решить её за 5 минут и уйти или о чём-то другом поболтать?
> решать какие входные данные
Эм, а тебе их всегда сверху присылают что ли, даже обсудить не предлагают? Какая скукота )))
Desktop # 0 ⇈
> Эм, а тебе их всегда сверху присылают что ли, даже обсудить не предлагают? Какая скукота )))
- ты, я смотрю, в прикладухе мало работал. Приходишь на проект с бэкендом, который писался много лет и возвращает любую хуйню, о которой только можно "мечтать". И никто его ради тебя красивого менять конечно же не будет.
bormand # 0 ⇈
Да мне этого и в системщине хватает, если честно...
Но новые то интерфейсы всё-таки можно по-человечески делать, с обсуждением с обоих сторон.
> вызывает стресс
Да не задача вызывает стресс, а тикающий таймер. Попробуй решить задачку за час и за 10 минут и сравни. Ну вот час - это достаточный запас для большинства, я думаю. А олимпиадники просто привыкли под давлением таймера работать.
Desktop # 0 ⇈
Опять-таки, это тоже может быть целью интервью. Но как бы нафиг оно нужно. Искать надо то, где комфортно, а превозмогатели вон пусть в гейдев идут.
gost # 0 ⇈
Полностью подтверждаю. Когда таймер тикает и нельзя даже на минутку отвлечься — это жопа.
HIV # 0 ⇈
Я делал лабы людям, которые уже работали в ваб-параше, но сами были не в состоянии даже написать подпрограммку для поиска подстроки на асме или даже сях.
Desktop # 0 ⇈
HIV # 0 ⇈
Desktop # 0 ⇈
guest # 0 ⇈
Но перед собеседой я бы конечно надрочился по основным алгоритмам и структурам данных
TEH3OPHblu_nemyx # 0 ⇈
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
https://govnokod.ru/21312#comment354390
MAKAKA # 0 ⇈
Что мешает перевести на нормальное
?
1024-- # 0 ⇈
> enum Product
Азазазаза, это хозяин магазина печенья вырос до трёх категорий.
> перевести на нормальное
guest # 0 ⇈
1024-- # 0 ⇈
MAKAKA # 0 ⇈
Конечно, в хаскелле она лучше
guest # 0 ⇈
на коко чуть лучше
bootcamp_dropout # 0
bormand # 0 ⇈
HIV # 0 ⇈
guest # 0 ⇈
HIV # 0 ⇈
guest # 0 ⇈
Fike # 0
bormand # 0 ⇈
Или как там в джавке...
З.Ы. Всё-таки тупые задачки неплохо отсеивают долбоёбов 🙂
bootcamp_dropout # 0 ⇈
bormand # 0 ⇈
bootcamp_dropout # 0 ⇈
Просто понравилась такая форма представления данных
guest # 0 ⇈
bormand # 0 ⇈
Сищники эту фишку юзали ещё когда эти ваши дата сатанисты под стол ходили.
guest # 0 ⇈
С год назад я считал статью гейдева, который говорил, что теперь вот дескать нужно делать так.
Ну и приводил пример. Есть сколько-то питухов в комнате, у каждого координаты.
Питуз сделает класс для питуха, положит питухов в коллекцию, и чтобы проверить не сталкивается-ли герой с питухом -- будет по ней итерироваться.
А ведь в классе, кроме координат, еще 42 разных значения лежат, и они нахуй не нужны тащемто, и по ним процессор прыгает, и в кеш меньше всего помещается итд
Вот и предлагается отдельно хранить координаты питузов
Fike # 0 ⇈
впрочем, он нужен для аналитики, а не вытягивания целиковых записей
guest # 0 ⇈
guest # 0
Вы пытаетесь открыть публикацию, написанную пользователем capjdcoder, однако, публикация скрыта в черновики (самим автором или НЛО)
Что там было? Тоже хочу поорать.
jojaxon # 0 ⇈
guest # 0 ⇈
Или f(vector<pair<string, int>>)?
guest # 0 ⇈
gost # 0 ⇈
1024-- # 0 ⇈
Давайте, сохраняйте https://itnan.ru/post.php?c=1&p=504638, и чтоб такая питушня в последний раз была!
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
http://web.archive.org/web/20200531094122/habr.com/ru/post/504638/
http://archive.li/PRR7A
Когда искал эту статью в кэшах поисковиков, наткнулся на заголовок «Программист с помойки»:
https://habr.com/ru/post/503458/
3.14159265 # 0 ⇈
А то кеш гугла уже всё.
TEH3OPHblu_nemyx # 0 ⇈
http://archive.li/JjaY4
А в кэше «Бинга» — сама статья без комментариев:
http://archive.li/NtO1Q
TEH3OPHblu_nemyx # 0 ⇈
Сюда попадают страницы с «Хабра»:
http://archive.li/habr.com
Сюда — из кэша «Бинга»:
http://archive.li/cc.bingj.com
Сюда — из кэша «Яндекса»:
http://archive.li/yandexwebcache.net
Сюда — из вебархива (двойная архивация, ага):
http://archive.li/web.archive.org
gost # 0 ⇈
Добавлю в коллекцию: https://gcode.space/c7349e7d.mhtml. Сумел схоронить из кэша мобильного браузера.
1024-- # 0
Вообще, какая-то питушня. Человеку предложили выбрать язык для разговора, он сам выбрал джаву, выяснял какие-то джавапроблемы, ещё и динамический массив не нашёл. Зачем? Зачем?
Или в джаве динамический массив называется "вектор", и за любое сравнение с массивом карают боги?
У конторы вообще примеры похожи на какой-то PHP по синтаксису и стрелкам. Скриптухи писали.
Автору стоило бы спросить, нахрена они сделали этот массив массивов. И могут ли дублироваться тайтлы в этих массивах длиной больше трёх - это сырой выхлоп кассы или уже сгруппировано-просуммировано (кстати, не знаю, может где-то в магазинах из-за такого акция не посчитается, если посередине двух акционных товаров затесалась питушня).
А вышел какой-то джавапердолинг.
bormand # 0 ⇈
Кстати может поэтому на продавцов и ругаются, что "скидка не прошла"?
3.14159265 # 0 ⇈
Потому что анскилябры пишут хуёвую логику на массивах?
guest # 0 ⇈
он депреейте с 1998-го года
а код действительно очень хуевый
1024-- # 0 ⇈
guest # 0 ⇈
Vector это обертка вокруг статического массива, которая расширияет его копированием при надобности (как в плюсах примерно)
Но Vector синхонизирован, и потому может просаживаться по перформансу.
Потому во второй джаве сделали интерфейс List, и несколько его реализаций. Аналогом vectorа там стал ArrayList. Он тоже растет копируя, но он не синхронизирован по умолчанию.
Так что вместо Vector нужно использовать ArrayList
bormand # 0 ⇈
Кстати, а нафиг они в те годы во все объекты лочек насовали? Чтобы старый код не сдох от реальных тредов?
guest # 0 ⇈
ну вот они боялись, что ты сломаешь небезопасный класс
bormand # 0 ⇈
guest # 0 ⇈
https://github.com/AdoptOpenJDK/openjdk-jdk9u/blob/master/jdk/src/java.base/share/classes/java/lang/Thread.java
3.14159265 # 0 ⇈
synchronized, wait, notify, notifyAll
bormand # 0 ⇈
Просто на переходе с файберов на треды добавление лочек внутрь старых коллекций выглядит очень логично... Типа вернули старое поведение и добавили новых не тредсейф коллекций.
Fike # 0 ⇈
> 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.
3.14159265 # 0 ⇈
Кто на ком стоял?
Вайберы в жабе?
jojaxon # 0 ⇈
guest # 0 ⇈
3.14159265 # 0 ⇈
До 1.5 нужно было всё с нуля писать: пулы, очереди.
Кстати StringBuilder vs StringBuffer.
guest # 0 ⇈
А потом завезли java.util.concurrent или как там его, и появились пулы экзекуторов, высокоуровневые примитивы типа Latch, и стало хорошо
3.14159265 # 0 ⇈
spurious wakeup называется
https://govnokod.ru/24867#comment435148
https://govnokod.ru/11978#comment157571
3.14159265 # 0 ⇈
А чтобы обезьяны не проёбывали, они все коллекции, StringBufferы сделали синхронными.
Вот SimpleDateFormat не сделали синхронным и сколько багров произошло от "оптимизаций"
guest # 0 ⇈
3.14159265 # 0 ⇈
Блять, неужели я один котирую Iterable? Самая простая в мире вещь, ленивый список.
Человеку нужно просто проитерироваться, и начинается какое-то дрочево.
guest # 0 ⇈
3.14159265 # 0 ⇈
Если мне нужно N элементов, чтобы обойти их for~each я возьму Iterable и всё.
На этом жавашок и погорел, начал рассказывать про мапы, глисты.
А индус слил его как лалку.
guest # 0 ⇈
как ты инстанцииурешь iterable?
или ты собираешься написать метод, который получает в качестве аргумента iterable, а кто там его заполяет -- это пофиг, да?
Я тогда согласен, потому что iterable может быть ленивым. То-есть если я вдруг один миллард товаров куплю, то не обязательно всю корзину в память
3.14159265 # 0 ⇈
Именно.
Принимай как можно более обобщённый тип, возвращай как можно более конкретный.
Не помню как по-научному этот принцип назвать.
guest # 0 ⇈
Будь либерален к тому, что дают тебе на вход
И консервативен к тому, что ты возвращаешь
bormand # 0 ⇈
> консервативен
Звучит как какая-то политота на порнхабе.
TEH3OPHblu_nemyx # 0 ⇈
Если ты не пишешь на сильно типизированных языках в зрелости, у тебя нет мозгов.
3.14159265 # 0 ⇈
А сильнотипизированные наоборот пытаются мимикрировать под нетипизированную скриптуху двадцатилетней гавности.
Desktop # 0
- а L8 это чтение пожеланий бизнеса ещё до того, как тот родился? 🙂
guest # 0 ⇈
guest # 0 ⇈
guest # 0 ⇈
bootcamp_dropout # 0 ⇈
Например, гугл
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
bormand # 0 ⇈
bootcamp_dropout # 0 ⇈
Fike # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
guest # 0 ⇈
ну и авторитеты,само собой
газюнюх еще есть
https://zen.yandex.ru/media/id/5abb6640256d5c2ff6d4a2f6/kasty-kogo-ia-vstretil-na-maloletke--5ac4a9e71aa80cdd7d52a6db
его заставляют править баги в коде на пхп
1024-- # 0 ⇈
> L4 SWE III
Вышло как-то через жопу - как с календарём.
10. Восьмябрь
11. Девябрь
12. Десябрь
3.14159265 # 0
Я понимаю заветы Царя и всё такое.
Но это же ЙАЖА.
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)
jojaxon # 0 ⇈
bormand # 0 ⇈
jojaxon # 0 ⇈
gost # 0 ⇈
Ничего не понял.
UPD: понял, это «Cloudflare DNS» хуйню сделал. Ответ правильно доверия не заслужил.
guest # 0
что должно быть результатом? цена или количество товаров? сколько товаы стоят? Сколько пачек винограда я получу, если куплю две?
bormand # 0 ⇈
> сколько пачек винограда я получу если куплю две
Две, лол. Сколько принес на кассу, столько и получишь. Не побежит тебе кассир третью искать.
guest # 0 ⇈
и сколько они стоят?
bormand # 0 ⇈
А если ты купишь 3, то тоже оплатишь две.
guest # 0 ⇈
а цены-то где взять?
Хочу написать тулу, которая умеет умножать цену на 0.8 и проверять размер списка на чотность (посредством проверки остатка от деления на 2).
Можно сразу и собеседование в shopify пройти, и информатику за 11 класс сдать
bormand # 0 ⇈
guest # 0 ⇈
Fike # 0 ⇈
guest # 0 ⇈
Fike # 0 ⇈
MAuCKuu_nemyx # 0 ⇈
guest # 0 ⇈
MAuCKuu_nemyx # 0 ⇈
guest # 0 ⇈
не надо там проверять остаток, достаточно нацело поделить на два.
во
https://govnokod.xyz/_26712/#comment-534289
1024-- # 0 ⇈
guest # 0 ⇈
3.14159265 # 0 ⇈
Сам попадал в неё несколько раз.
Один раз купил мороженное, до меня продавщица доебалась что акция — пойди возьми второе.
Пришлось пойти взять. Хотел оставить ей на кассе, она сказала что правила запрещают брать у покупателей.
Так же несколько раз мне хотели всучить какие-то игрушки, свистоперделки за покупку на значительную сумму. Я обычно отказываюсь.
Один раз подошёл дядечка-охранник, говорит, оставь мне, я дочке отдам.
guest # 0 ⇈
HIV # 0 ⇈
Мне кажца т.о. сбывают залежалый товар за счёт наивности копукателей.
guest # 0 ⇈
3.14159265 # 0 ⇈
Но он автоматом на карте срабатывает.
> за бесплатно тебе на самом деле никто ничего не даст.
Конечно. Банк просто делится профитом за эквайринг.
>Зря не берёшь, за бесплатно тебе на самом деле никто ничего не даст
Зачем мне ненужный мусор? Какие-то игрушечные фигурки гаррипоттеров или мстителей.
Я возьму, а потом кому-то не хватит.
Desktop # 0 ⇈
- а ты хотел бы настоящую?
1024-- # 0 ⇈
gost # 0 ⇈
©https://bash.im/quote/410452
Desktop # 0 ⇈
В этом интернет-магазинчике все акции руками вбиваются программистом, а бухгалтерию они наверное потом на абаке подсчитывают, да?
Кстати, встречал такое: цена за акционный товар считается полностью, а потом из окончательной суммы в самом конце вычитается скидка. Один раз подобное вызвало немало лулзов при попытке выяснить у польской продавщицы, не знавшей английского, чо за хрень.
bormand # 0 ⇈
Desktop # 0 ⇈
Но у нас-то обычно скидки прямо после позиций указывают.
Desktop # 0 ⇈
guest # 0 ⇈
Fike # 0 ⇈
guest # 0
мама, я сделаль
bormand # 0 ⇈
guest # 0 ⇈
Сделаешь патч?
Desktop # 0 ⇈
- а в какую сторону тут будет в пистоне округление?
bormand # 0 ⇈
А тьфу, int не заметил. К нулю.
MAuCKuu_nemyx # 0 ⇈
Мы вам перезвоним.
guest # 0 ⇈
вам к java варианту, там я это учел
1024-- # 0 ⇈
1024-- # 0 ⇈
Перевёл на J экмапитуз 16+.
3.14159265 # 0 ⇈
>экмапитуз 16+.
Говно ёбанное. Даже сишка лучше и компактнее.
* Код я не компилил
1024-- # 0 ⇈
Но экматушня при тех же условиях тоже компактна, ещё можно форычнуться по исходным данным:
3.14159265 # 0 ⇈
>экматушня при тех же условиях тоже компактна
В любом случае тужились-тужились, завезли в язык тонны син. сахара а древнюю сишку уделать не могут.
guest # 0 ⇈
1024-- # 0 ⇈
> i<2
Какая-то питушня. Может вспомним, что теперь надо товары сортировать в правильном порядке, четвёртый товар взять никак нельзя, отладить или распечатать чек тоже нельзя, т.к. имена товаров просраны?
А теперь давайте то же самое, только чтобы имена товаров остались живы.
3.14159265 # 0 ⇈
Знаю.
Длину нужно брать из енума. См. ниже.
Так же енум снимает проблему имён.
Плюс
Вот эта питушня не выкинет ошибки если написали "grapse"
А Сишка ошибку отловит:
1024-- # 0 ⇈
Код скриптушков как-то отработает; для пущей адекватности туда можно добавить функцию группировки на три строки. А сиштушня будет слишком жёсткой, перед ней надо будет поставить слой дополнительной логики, чтобы сконвертировать исходные данные в царский формат.
3.14159265 # 0 ⇈
Не понял как?
1024-- # 0 ⇈
Скриптушня не даст скидку на яблоки (помним, 3 строки - и даст), а сиштушня сломается
bormand # 0 ⇈
3.14159265 # 0 ⇈
А это не так работает.
Оно 4 раза запишет единицу.
> { {APPLES,1}, {APPLES,1}, {APPLES,1}, {APPLES,1} }
3.14159265 # 0 ⇈
Группировка в сишке тоже тривиальна.
Это простые инкременты результирующего массива по переданному енуму.
1024-- # 0 ⇈
Потому, что можно инициализировать массив нулями и безопасно суммировать без хаков вроде defaultdict или .get в пистоне или |0 в жс.
3.14159265 # 0 ⇈
3.14159265 # 0 ⇈
Это не принципиально. Хотел сам подход показать.
>Сишка оказалась компактнее только из-за отхода от индексушни
Экму с питоном сгубила ассоциативочка. Если бы её не было (как в Сишке), вы бы мыслили массивной индексушнёй, то написали бы программу компактнее.
>int normal(int n) { return n; }
Это кстати не нужно. Достаточно тернарником проверить функцию на nullptr и вернуть n.
1024-- # 0 ⇈
Я хотел сначала написать (rules[item] || n => n)(count) без всяких тернарников.
Но с default/normal все правила находятся в одном месте.
Desktop # 0 ⇈
- понимаю, что однострочность, но div_t так и просится.
3.14159265 # 0 ⇈
Ревьювер дураку уже прямо подсказывал: используй массивы.
Не хочу массивы — хочу жрать говножавашиться.
1024-- # 0 ⇈
Во-первых, это было правило для яблок.
Но не так важно. Если кто-то возьмёт три пакета винограда, то заплатит за 2, а не за 2.4.
> int apples(int n) { return (n / 2 | 0) + n % 2; }
А вот тут можно было бы сделать n - n / 2 как у восьмишка. Это в анскильном JS нет целочисленного деления, а в сишке есть.
Итого,
Desktop # 0 ⇈
- а ведь и вправду заебца! Можно троллить коллег на ревью.
bootcamp_dropout # 0 ⇈
1024-- # 0 ⇈
> .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
Кстати, о такой питушне думал, когда писал, но отказался в силу её громоздкости. При надобности изолировать выбор правила подойдёт банальная функция
guest # 0
Вот вам супер-пупе объектно ориентированная джава.
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
guest # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
Возможно, имя класса нужно вытаскивать как explode('::', unserialize($key)[1])[2]. Но это будет некрасиво. Лучше в константах Item::APPLES хранить экземпляры класса, но тогда их нельзя объявить константой, придётся их объявлять переменными и где-то инициализировать.
Ещё можно у класса Item сделать статический метод, который будет выполнять (new Item(unserialize($key))).
А ещё у корзины можно сделать метод __toString, чтобы писать echo $basket вместо echo $basket->getPrice();
Ещё можно сделать, чтобы корзина реализовала интерфейс ArrayAccess, тогда метод add не будет нужен, достаточно будет $basket[] = Item::APPLES;
guest # 0 ⇈
он проще намного
3.14159265 # 0 ⇈
Я плюсанул за енумы. Но это есть нюанс, который сильно раздражает.
В енумах можно писать маловербозно и без функцианальной питушни:
guest # 0 ⇈
3.14159265 # 0 ⇈
3.14159265 # 0 ⇈
MAKAKA # 0 ⇈
век живи -- век учись
спасибо
впрочем, в коко я бы взял sealed classes, а на чистой джаве я уже почти не пишу, кроме старого кода
guest # 0
HIV # 0
MAuCKuu_nemyx # 0 ⇈
HIV # 0
впрочем, хлопециально сразу изменить какие-то игруппированная перформансу из-за такогда в копается. Согласть И число класса нужен, да эти вашок и потому могу изменить его окончательно и добираешься.
3.14159265 # 0 ⇈
Ура! Рабоскрипт жив.
>хлопециально
Высокосинтаксически.
Проверил. Все словосочетанусы взязты из треда.
1024-- # 0 ⇈
TEH3OPHblu_nemyx # 0 ⇈
guest # 0 ⇈
Ты Велимир Хлебников что-ли?
guest # 0
TEH3OPHblu_nemyx # 0 ⇈
Desktop # 0
MAKAKA # 0
Хуй, как сюда метатаблы прикрутить?
KO6EHHbIu_nemyx # 0
Очевидно, от кандидата требовалось написать функцию (не ебу как это на джаве):
Это проверка не на знание языка программирования (т.к. это мало кого ебёт), а на адекватность. А автор, очевидно, хотел выебнуться и обосрался.
gost # 0
>>> Интервьюер, хотя и не сразу (не стал я выяснять причины, честно сказать — времени оставалось около 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-датасаентист.
bootcamp_dropout # 0 ⇈
Жри виноград сука
1024-- # 0 ⇈
bormand # 0 ⇈
Но блин, есть же здравый смысл. Чек - это отчётность, в нём нельзя взять и выкинуть "бесплатные" позиции. И кассир никогда не побежит за "бесплатными" пакетами винограда специально для тебя. Т.е. обе версии, предложенные автором статьи, сразу можно отбросить.