1. Java / Говнокод #26712

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 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

    Комментарии (281) RSS

    • Я сказал ОК, интервьюер спросил какой язык я предпочту,
      на что я ответил «Java» и начал оценивать задачу.
      
      
      Простите? Я конечно могу создать массив с данными динамически,
      где в качестве длины массива будет параметризированная переменная,
      но я же должен знать сколько объектов я должен буду вставить
      в массив — ведь единожды создав массив, я не могу изменить его длину.
      Поэтому тут уж мне пришлось буквально объяснить интервьюеру, как
      создаются массивы внутри JVM, почему их размер фиксирован, и почему
      их длину невозможно переопределить после создания — только создание
      нового и копирование данных.

      Бля, как прекратить орать?
      Ответить
      • показать все, что скрытоvanished
        Ответить
      • Мне ещё тонкий троллинг со стороны индуса понравился - элементов не менее трёх.
        Ответить
      • Чёт вообще не смешно.

        Какой-то нудный джавашок.

        Высрал зазубренное «мама мыла Раму, Рама держит маму, вышла замуж мама за индуса Раму»
        Values(T data) {this.setData(data);}
           public void setData(T data) {this.data = data;}
           public T getData() {return this.data;}

        Геттеры, сеттеры, оопитухи. Как до дела дошло — слился в мелочах, животное.
        Ответить
    • А разве нельзя вставить строковые и числовые данные в лист?
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • разве шарп не забоксит их в любом IEnumerable<object>?
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • у тебя не будет никакого value type, если ты мешаешь объектовый string с value type
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • По условиям задачи
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • вот здесь:

                      [["grapes", 1],["apples", 0],["peaches", 1]] => 12

                      строка и число валяются в __одном__ массиве
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • по условиям задачи
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • вы там прямо как в глаза ебетесь

                              > данные даны в следующем виде:
                              [["grapes", 1],["apples", 0],["peaches", 1]] => 12


                              дальше ему даже прямо говорят:

                              > Мой первый вопрос звучал невинно:
                              > Какую структуру данных мне ожидать в качестве входа?

                              > Ответ был еще более простым:
                              > Arrays (массивы). Создай дополнительный метод и опиши там данные вручную.
                              Ответить
                              • показать все, что скрытоvanished
                                Ответить
                                • Как это влияет на подающийся на вход жсон? Даже если это не жсон, а сразу в структуре, то это все равно массивы / списки. Че угодно можно запилить, блядь, но на входе у тебя [string, decimal]
                                  Ответить
                                  • показать все, что скрытоvanished
                                    Ответить
                                    • возвращаемся назад

                                      > На самом деле в этой задаче это НЕ нужно. Зачем в лист класть И число И стоку?

                                      потому что именно это и будет на входе
                                      Ответить
                                      • "На входе у нас очевидно json? Можно я опущу бойлерплейт с парсингом и покажу только логику задачи на удобных мне структурах данных?"

                                        Думаешь индуса такое не устроило бы?)
                                        Ответить
                                      • показать все, что скрытоvanished
                                        Ответить
                                        • можешь

                                          просто на входе у тебя будет боксед обжект

                                          на обсуждение чего наш рассматриваемый синиор потратил четверть интервью
                                          Ответить
                              • > какую структуру мне ожидать в качестве входа

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

                                Я бы взял удобную мне структуру (массив из нормальных структур с полями). Если бы мне на это сказали "чувак, а у нас на входе всё-таки JSON а не твоя структура", то добавил бы преобразование JSONObject'ов в неё. Но я думаю, что не сказали бы.
                                Ответить
                                • Измельчали синьоры.
                                  Это что пример поколения Z? Годик там, годик сям поработал, ачивок насобирал, готов в сеньоры.
                                  Ответить
                                • Всё же это вполне адекватный вопрос, потому речь идёт о работе с некой абстрактной внешней системой. Если это не было заранее описано в условии задачи, то просто говорит о том, что интервьюер не особо готовился.
                                  Ответить
                                  • Блин, что ж вы так все переусложняете...

                                    Задачка со свободным выбором языка. Т.е. это просто логику и адекватность кандидата посмотреть, не более того. Какие нафиг абстрактные внешние системы?
                                    Ответить
                                    • И при чём тут выбор языка? Язык для интервьюера это black box в данном случае, да. Это на мой взгляд глупо само по себе, но то такое. Но условия задачи, в том числе входные и выходные данные, можно как-то заранее продумать. Чувак не в вакууме будет работать. А такие задачки это хороший повод задуматься, а не будут ли потом ежедневно проверять твою логику и адекватность тикетами в джире без описания и с названием "Сделать заебато".
                                      Ответить
                                      • А можно я на алгоритмическом языке напишу? Меня так учили)))
                                        Ответить
                                        • Можно, выполняйте.

                                          Было бы смешно, если бы чувак зафигачил решение на блок-схемах, посмотреть на лицо его собеседника.
                                          Ответить
                                          • Это как взять все конфетки из вазочки. Формально ты можешь, но потом их перед твоим приходом будут прятать.

                                            "Язык на выбор" в понимании нормального человека - "выбрать какой-нибудь адекватный язык, который реально используется".

                                            Если человек выбрал питушню вроде J, его надо гнать поганой метлой, т.к. он тролль, который только ищет слабые места в формулировках. Но его нанимали не для того, чтобы он каждое требование выполнял максимально черезжопно при формальной корректности, а наоборот, чтобы он мог работать с нечётко сформулированной задачей, вовремя выяснять про подводные камни и из мутных заданий делать прозрачные задания для своих подчинённых.
                                            Ответить
                                            • > Если человек выбрал питушню вроде J, CL, Haskell, Adga, Coq его надо гнать поганой метлой, т.к. он тролль
                                              Или какой-нибудь wvxvw.
                                              Впрочем одно другому не противоречиит.
                                              Ответить
                                            • >Если человек выбрал питушню вроде J, его надо гнать поганой метлой

                                              А с другой стороны если задача требует расчёта какой-то матричной или статистической питушни.
                                              И человек элегантно решил её именно при помощи J, напечатав при этом ответ в красиво отформатированных табличках — какой же он тролль?
                                              Это свидетельствует о кругозоре конь-дедадта.

                                              Как и в Сишке можно писать эзотерику. IOOCC тому пруф.
                                              Так и в J можно писать более-менее понятно.
                                              Ответить
                                              • Подтверждаю, на самом деле J довольно простенький инфиксно-префиксный векторный комбинаторный функци-язычок. Просто APL-щики видимо не любят много писанины и заюзали вместо имён спецсимволы, конечно не зная их значений ничего и не будет понятно.

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

                                                В добавок для J есть либа 'primitives' которая именует все закоряки, но она не отменяет того, что нужно знать синтакс и что делают эти примитивы.
                                                Ответить
                                                • Плюсану этого петуха.
                                                  Ответить
                                                • >Ещё для не похожих на мейнстримные языки не работает питушня как, например, с сиподобными языками, когда зная один язык можно прочитать код на другом с минимумом вопросов

                                                  Плюсую.
                                                  Даже не сиподобными, но вообще алголоподобными.
                                                  Бейсики, Руби, Питоны, Ады, Паскали, Фортраны и VHDLи читаются на ура.
                                                  Ответить
                                            • Я бы всё же не стал сравнивать блок-схемы, которые многие знают, но мало кто рисует, с языками J, которые и знают четыре циркача, и используют они же.
                                              Ответить
                                            • > Но его нанимали
                                              - его ещё не наняли. Речь про собеседование. Он не работает и по сути никому ничего не должен. Если интервьюер говорит: "Выбирай любой язык", а человек берёт пусть даже J, то значит интервьюеру надо в следующий раз включать голову, чтобы не тратить хотя бы собственное время.

                                              Ну а поиск слабых мест в формулировках это вообще-то именно то, чем обе стороны и занимаются на собеседованиях.
                                              Ответить
                                              • –— Вот условие задачи.
                                                —– У вас там неоднозначность в формулировке.
                                                –— Выберите любой язык программирования.
                                                —– J подойдёт?
                                                –— Почему в шапке?
                                                Ответить
                                              • показать все, что скрытоvanished
                                                Ответить
                                                • С такими идеями можно устраиваться на обер-ассистента секретаря младшего программиста. Более серьёзная должность обязывает думать о том, на каких языках вообще в конторе пишут, и на каких уместно писать код для собеседования.

                                                  То есть J/APL человек вообще случайно выучил - пошёл по улице, там пацаны кодили - вот и надуло. И вообще не знал, что эту питушню не везде понимают.
                                                  Ответить
                                                  • >на каких языках вообще в конторе пишут,

                                                    Если ты знаешь, на каких языках там пишут, то почему не писать задание на этом языке?

                                                    Бывает так, что ты не знаешь.

                                                    Я реально видел такое объявление, типа "нам пофиг, какие языки вы знаете, потому что вы всё равно не знаете Fantom , а мы на нем пишем"
                                                    Ответить
                                                    • > Если ты знаешь, на каких языках там пишут, то почему не писать задание на этом языке?
                                                      Если не нужна работа, можно писать хоть на древнегреческом с синтаксисом 1C. Если нужна, то стоит либо выбрать что-то по теме, либо переспросить.

                                                      У нас даже в Европе есть такая глушь, где английский не все знают. Что уж говорить про языки программирования. Может, придёшь в контору, а там неучи C++ не понимают. А C++ знать надо. Это классика. А ты им ещё за r-value pituxes поясняешь, за концепты...
                                                      Ответить
                                              • > его ещё не наняли
                                                А он уже начал вы..бываться. Можно задать для приличия пару вопросов и пообещать перезвонить когда-нибудь потом.
                                                Ведь если он троллит на собеседовании, то что будет, когда на нём будет несколько важных проектов и много питушни, которую кроме него больше никто не знает, и уволить его будет сложнее?

                                                > значит интервьюеру надо в следующий раз включать голову
                                                Зачем тогда собеседование? Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
                                                А если всё по полочкам разложить и формулы написать, любой дурак на все вопросы ответит.
                                                Ответить
                                                • Писать на Джаве с дженериками это выёбываться? Ну ок. Ладно б ещё DSL на Руби

                                                  > Так хоть можно как-то проверить, адекватный человек или нет, умеет он голову включать или нет.
                                                  - на адекватность в принципе проверяется во время HR-интервью. А тут вообще щас наймут чуваков, которые умеют красиво фантазировать на основе кривого ТЗ, а вот по точным спецификациям работать не могут. Это будет индийский блокбастер с песнями и слонами.
                                                  Ответить
                                            • показать все, что скрытоvanished
                                              Ответить
                                              • Для этого есть возможность переспросить.
                                                Зачем поддаваться троллям и подбирать формулировки, когда можно набрать адекватных людей, которые выяснят подводные камни, а не подставят потом контору выполнив что-то формально по принципу "и так сойдёт"?
                                                Ответить
                                                • Ну он спросил вроде "можно на джаве?", и ему сказали что да, можно.

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

                                                  Ревуер сказал "массивы", потому что в JS массивы динамические. Питуз мог бы это понять
                                                  Ответить
                                                  • Вы же сами сказали про блок-схемы. Вот я и сказал, что не надо питушню разводить, а лучше взять ту питушню, с которой все знакомы и каждый день в туалет ходят.

                                                    > он спросил
                                                    Это да. Хотя бы поначалу не стал троллить.

                                                    > Питуз мог бы это понять
                                                    Да там массив в массиве и разнотипье. Либо абстрактная математическая запись для целей проектирования, либо скриптушатня, либо легаси питушня.
                                                    Ну ладно, может в скриптушатне автор не был. Но он же проектировал питушню, он же мог хотя бы подумать, что это абстрактушня!
                                                    Ответить
                                                    • Вот меня и удивило, что он не подумал, что это абстрактушня, а зачем-то стал реально хуячить гетерогенные массивы в Java, да еще и абстракцию какую-то глупую придумал, и обосрался, и стал агриться на интервьюера.

                                                      Вообще немного странно, что там массивы.
                                                      JSеру православнее тоже было бы сделать массив объектов:
                                                      [{item: "яблоко", quantity: 42}, {..}]

                                                      А вот питонист как раз мог бы использовать список туплов, там издревле картежи используют для этого
                                                      [("apple", 42), (..)]
                                                      Ответить
                                                      • > [{item: "яблоко", quantity: 42}, {..}]
                                                        Писать такое долго. Там же по легенде индус нафигачил этой питушни для тестов. А зачем для тестов длинно писать? И ещё три таких объекта на строчку влезают, но уже как-то плохо.
                                                        И в коде возить эти pitux.item, pitux.quantity.
                                                        Ответить
                                                      • > Вообще немного странно, что там массивы.
                                                        > JSеру православнее тоже было бы сделать массив объектов

                                                        с одной стороны да, с другой в реальных задачах с этими его массивами данных из даталейка будет прилетать вообще любая дичь с недетерминированной схемой. ну и долбоебов, как мы видим, такое простое ограничение отсекает на ура.
                                                        Ответить
                                      • >> "Сделать заебато"
                                        Из той же песни: сделать как у конкурента по скриншоту из проги, додумав бизнес-логику. Хорошо это не часто бывает.
                                        Ответить
                                      • Недоспецифицированные задачи везде встречаются. Нельзя всё-всё-всё учесть сразу. И чел, претендующий на сеньора, должен иметь опыт работы с такими ситуациями, имхо.

                                        Да, ты работаешь не в вакууме прикрывшись джирой. Ты работаешь с коллегами. Зачем устраивать итальянскую забастовку и хуярить гетерогенное говно на дженериках? Ну спроси ты коллег, предложи им альтернативу. Может быть они и не против поменять этот ссаный формат данных.

                                        Ну и опять же странно, что чел JSON во входных данных не увидел. Я думал, что у веб-разрабов это на рефлексах.

                                        Имхо, эта "глупая" задачка всё что надо показала.
                                        Ответить
                                        • Смотри, это не реальная работа, а задача на собесе.

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

                                          Если всё же он придумал задачу за 10 минут до звонка, то нахуй такой процесс интервью.

                                          Чувака, который собеседовался, я не защищаю, хотя, на мой взгляд, они с этой конторой в плане пафоса друг друга нашли. Но его основной проёб это не дженерики и прочая лабуда, а то, что он просрал по тем или иным причинам собеседование и решил поплакаться на пол-рунета об этом. Это реально не L6.

                                          > Ну спроси ты коллег, предложи им альтернативу.
                                          - прямо на собесе? :-) А может они эти интервью как раз и проводят с той целью, чтобы найти альтернативу лол

                                          Ты просто кмк судишь только с позиции конторы.
                                          Ответить
                                          • >Её стопудов задают очень многим. Если так, то "недоспецифицированной" она может быть только специально
                                            А еще может быть что за 123456 интервью, имея на руках описание типа:
                                            >>Итог: посчитать стоимость корзины покупателя при выходе из магазина, при то, что данные даны в следующем виде:
                                            [["grapes", 1],["apples", 0],["peaches", 1]] => 12

                                            ТС первый догадался спросить, в каком виде ему ожидать данные
                                            Ответить
                                            • Ну я думаю, ты в курсе, что приведённая строка не является, например, валидным JSON.
                                              Ответить
                                              • [["grapes", 1],["apples", 0],["peaches", 1]]

                                                валидный json
                                                Ответить
                                                • > ... => 12
                                                  А это шо?
                                                  Ответить
                                                  • Очевидно, это ожидаемый ответ который в рамках задачи входными данными являться не может ну никак
                                                    Ответить
                                                    • Это ты сам придумал.

                                                      Думаю, ты где-то L2-L3. Мы перезвоним.
                                                      Ответить
                                                    • Cnhfyyj, зачем его тогда во входные данные записали?
                                                      Ответить
                                                      • Чтобы ты, упаси господи, не спрашивал, в каком формате нужно вернуть цену: числом, строкой или генеричной структурой данных из наименований, количества, цен вхождений, скидок и хуй знает чего еще
                                                        Ответить
                                                • Ты забыл
                                                  => 12


                                                  Спробуй ще.
                                                  Ответить
                                          • > прямо на собесе

                                            Эм, лол, ну да. "Я тут вижу JSON, но мне не хочется тратить наше с вами время на бойлерплейт, давайте запишем данные вот так и представим, что мы их уже распарсили?". Это ж минута буквально.

                                            > с позиции конторы

                                            Х.з., меня просто задачки не напрягают вообще. В чём вообще проблема написать что-то простенькое на привычном тебе языке? Я не понимаю, почему многих людей это так бесит :)
                                            Ответить
                                            • Ну такое, ещё решать за них, какие у них входные и выходные данные? На суперфулстека что ли вакансия? Чем вообще staff engineer занимается?

                                              Эта задачка особо и не бесит. Просто зачем давать на неё час? Откройте какой-то сайт для рисования или печатания онлайн, там кандидат за 5 минут накидает решение на псевдокоде.

                                              Но тут я уже больше склоняюсь к варианту, что у чуваков был какой-то дикий miscommunication. Один не мог, второй не хотел.
                                              Ответить
                                              • > зачем давать на неё час

                                                Чтобы собеседуемому комфортно было. Иначе это пиздец стресс для большинства будет, только олимпиадники пройдут.

                                                Я думаю никто не мешает решить её за 5 минут и уйти или о чём-то другом поболтать?

                                                > решать какие входные данные

                                                Эм, а тебе их всегда сверху присылают что ли, даже обсудить не предлагают? Какая скукота )))
                                                Ответить
                                                • Глупая простенькая задачка, которая вызовет стресс у всех, кроме олимпиадников? Что-то пазл не складывается.

                                                  > Эм, а тебе их всегда сверху присылают что ли, даже обсудить не предлагают? Какая скукота )))
                                                  - ты, я смотрю, в прикладухе мало работал. Приходишь на проект с бэкендом, который писался много лет и возвращает любую хуйню, о которой только можно "мечтать". И никто его ради тебя красивого менять конечно же не будет.
                                                  Ответить
                                                  • > возвращает любую хуйню, о которой можно только мечтать

                                                    Да мне этого и в системщине хватает, если честно...

                                                    Но новые то интерфейсы всё-таки можно по-человечески делать, с обсуждением с обоих сторон.

                                                    > вызывает стресс

                                                    Да не задача вызывает стресс, а тикающий таймер. Попробуй решить задачку за час и за 10 минут и сравни. Ну вот час - это достаточный запас для большинства, я думаю. А олимпиадники просто привыкли под давлением таймера работать.
                                                    Ответить
                                                    • Так если тебе дают простую задачу на 5-10 минут и говорят, что у тебя есть час, разве это не вызывает бОльший стресс, потому что ты будешь подсознательно искать какой-то подвох?

                                                      Опять-таки, это тоже может быть целью интервью. Но как бы нафиг оно нужно. Искать надо то, где комфортно, а превозмогатели вон пусть в гейдев идут.
                                                      Ответить
                                                • > Чтобы собеседуемому комфортно было.
                                                  Полностью подтверждаю. Когда таймер тикает и нельзя даже на минутку отвлечься — это жопа.
                                                  Ответить
                                            • Потому что анскиллябры.

                                              Я делал лабы людям, которые уже работали в ваб-параше, но сами были не в состоянии даже написать подпрограммку для поиска подстроки на асме или даже сях.
                                              Ответить
                      • Это потому, что автор на JS написал.
                        Что мешает перевести на нормальное
                        enum Product
                            {
                                Apple,
                                Grape,
                                Orange
                            }
                        
                            struct Item
                            {
                                int Price { get; }
                                private Product ItemProduct { get; }
                        
                                public Item(int price, Product itemProduct)
                                {
                                    this.Price = price;
                                    ItemProduct = itemProduct;
                                }
                            }

                        ?
                        Ответить
                        • Какой багор )))

                          > 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
                          Ответить
                          • показать все, что скрытоvanished
                            Ответить
                            • Геттеры-сеттеры и прочая синтаксушня. Сравните хаскелевский вореант, где сам тип такой, что ключ можно положить в какую-нибудь мапу, а цену - свернуть с такой же. Хотя OK, моноид на практике - слишком пердольно, его для краткости кода можно заменить на Num. Да и стоимость легче будет считать. Это да, чтобы посчитать стоимость, надо цену Num.
                              Ответить
    • tl;dr молодой перспективный js разраб завалил душного java деда
      Ответить
    • Опуская очевидное: чувак захотел пойти работать с большими данными, но ВНЕЗАПНО сломался на задаче, где данные оказались не то что разных типов, а просто в не очень чистой структуре
      Ответить
      • Да чистейшая там структура, реляционная я бы сказал... Что мешало сделать класс с парой полей и ебануть массив - я х.з.
        class Row {
            public string name;
            public decimal cost;
        };
        
        Row[] = new Row[] { ... };
        Или как там в джавке...

        З.Ы. Всё-таки тупые задачки неплохо отсеивают долбоёбов :)
        Ответить
        • А мне понравился способ из комментариев: использовать два массива со значениями и наименованиями. Наверняка будет какое-то преимущество по перформансу из-за хранения однородных данных вместе, как раз для бигдаты актуально
          Ответить
          • Ну не знаю, я бы за такое сразу въебал пометки "олимпиадник" и "страдает преждевременной оптимизацией" и попросил бы пояснить за плюсы и минусы такого представления. Ибо нефиг выёбываться.
            Ответить
            • Согласен, это неуместно для интервью где все что надо - показать что ты код видишь не впервые в жизни.
              Просто понравилась такая форма представления данных
              Ответить
            • показать все, что скрытоvanished
              Ответить
            • не знаю, что там реляционного в предыдущей структуре, но вот это - классический колоночный подход

              впрочем, он нужен для аналитики, а не вытягивания целиковых записей
              Ответить
        • показать все, что скрытоvanished
          Ответить
    • показать все, что скрытоvanished
      Ответить
      • Кеш помнит https://webcache.googleusercontent.com/search?q=cache:ZUwfx5yvH0QJ:https://habr.com/ru/post/504638/+&cd=1&hl=ru&ct=clnk&gl=ru
        Ответить
        • показать все, что скрытоvanished
          Ответить
        • Блядь, и кэш протух. Такой эпик удолили…
          Ответить
          • Ну люди, будьте же вы людьми.
            Давайте, сохраняйте https://itnan.ru/post.php?c=1&p=504638, и чтоб такая питушня в последний раз была!
            Ответить
            • показать все, что скрытоvanished
              Ответить
            • Для кокококоллекции:
              http://web.archive.org/web/20200531094122/habr.com/ru/post/504638/
              http://archive.li/PRR7A

              Когда искал эту статью в кэшах поисковиков, наткнулся на заголовок «Программист с помойки»:
              https://habr.com/ru/post/503458/
              Ответить
              • Cпасибо.
                А то кеш гугла уже всё.
                Ответить
                • В кэше «Гугла» остались только комментарии без самой заметки:
                  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 по синтаксису и стрелкам. Скриптухи писали.
      Автору стоило бы спросить, нахрена они сделали этот массив массивов. И могут ли дублироваться тайтлы в этих массивах длиной больше трёх - это сырой выхлоп кассы или уже сгруппировано-просуммировано (кстати, не знаю, может где-то в магазинах из-за такого акция не посчитается, если посередине двух акционных товаров затесалась питушня).

      А вышел какой-то джавапердолинг.
      Ответить
      • > посреди двух аккционных товаров

        Кстати может поэтому на продавцов и ругаются, что "скидка не прошла"?
        Ответить
        • >Кстати может поэтому на продавцов и ругаются, что "скидка не прошла"?
          Потому что анскилябры пишут хуёвую логику на массивах?
          Ответить
      • показать все, что скрытоvanished
        Ответить
        • И что, динамических массивов там совсем нет?
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • > синхронизирован

              Кстати, а нафиг они в те годы во все объекты лочек насовали? Чтобы старый код не сдох от реальных тредов?
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • Ну memory model только с 1.5. А до этого реальные треды то были в джавке? Чтобы код параллельно прям исполнялся.
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                  • Были.
                    synchronized, wait, notify, notifyAll
                    Ответить
                    • А они параллельно то могли выполняться? Или как файберы.

                      Просто на переходе с файберов на треды добавление лочек внутрь старых коллекций выглядит очень логично... Типа вернули старое поведение и добавили новых не тредсейф коллекций.
                      Ответить
                      • da

                        > 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.
                        Ответить
                      • Чёт нихуя не понял.
                        Кто на ком стоял?
                        Вайберы в жабе?
                        Ответить
                      • Они эту хуйню сделали, т.к. тогда в моде был паттерн ебошить в ejb и прочие разделяемые компоненты объекты с состоянием.

                        А чтобы обезьяны не проёбывали, они все коллекции, StringBufferы сделали синхронными.

                        Вот SimpleDateFormat не сделали синхронным и сколько багров произошло от "оптимизаций"
                        static final DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
                        Ответить
            • >Так что вместо Vector нужно использовать ArrayList

              Блять, неужели я один котирую Iterable? Самая простая в мире вещь, ленивый список.

              Человеку нужно просто проитерироваться, и начинается какое-то дрочево.
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • А вот похуй на реализацию.
                  Если мне нужно N элементов, чтобы обойти их for~each я возьму Iterable и всё.
                  На этом жавашок и погорел, начал рассказывать про мапы, глисты.
                  А индус слил его как лалку.
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • >ты собираешься написать метод, который получает в качестве аргумента iterable, а кто там его заполяет -- это пофиг, да?

                      Именно.
                      Принимай как можно более обобщённый тип, возвращай как можно более конкретный.
                      Не помню как по-научному этот принцип назвать.
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • > либерален
                          > консервативен

                          Звучит как какая-то политота на порнхабе.
                          Ответить
                          • Если ты не писал на слабо типизированных языках в молодости, у тебя нет сердца.
                            Если ты не пишешь на сильно типизированных языках в зрелости, у тебя нет мозгов.
                            Ответить
                            • Ирония в том что, слаботипизированные языки сейчас пытаются выглядеть как сильнотипизированные двадцать лет назад.

                              А сильнотипизированные наоборот пытаются мимикрировать под нетипизированную скриптуху двадцатилетней гавности.
                              Ответить
    • > Если судить только по этой статье, мне не показалось, что вы готовы к уровню Staff Software Engineer (L7). Да, вы умеете программировать на Java, но это требуется и на уровне L5. Умение работать с некорректно или нечетко сформулированными условиями — на уровне L6
      - а L8 это чтение пожеланий бизнеса ещё до того, как тот родился? :-)
      Ответить
    • >Values[][] item

      Я понимаю заветы Царя и всё такое.
      Но это же ЙАЖА.

      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)
      Ответить
      • Автор в комментах вопрошал за что его так заминусили. Видимо закрыл сам, либо НЛО.
        Ответить
        • Видимо после этого вопроса его окончательно и добили.
          Ответить
          • Вот его коммент про минуса http://archive.li/PRR7A#comment_21680450
            Ответить
            • Не заслуживающий доверия ответ:
              ╚ь :     archive.li
              Addresses:  1.1.1.1
                        1.0.0.1

              Ничего не понял.
              UPD: понял, это «Cloudflare DNS» хуйню сделал. Ответ правильно доверия не заслужил.
              Ответить
    • показать все, что скрытоvanished
      Ответить
      • Результатом вроде сумма к оплате должна быть.

        > сколько пачек винограда я получу если куплю две

        Две, лол. Сколько принес на кассу, столько и получишь. Не побежит тебе кассир третью искать.
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • Ты получишь 4. Из них ты оплатишь 2. Вроде так это обычно работает.

            А если ты купишь 3, то тоже оплатишь две.
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Да не ну задачка то вполне практичная для интернет-магазинчика.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Остаток надо проверять и, если он равен нулю, выдавать кассиру уведомление "Спросить покупателя, не хочет ли он взять ещё одну - всё же акция". Есть вореятность, что жадный покупатель поведётся.
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                    • Кстати вполне житейская ситуация.
                      Сам попадал в неё несколько раз.

                      Один раз купил мороженное, до меня продавщица доебалась что акция — пойди возьми второе.
                      Пришлось пойти взять. Хотел оставить ей на кассе, она сказала что правила запрещают брать у покупателей.

                      Так же несколько раз мне хотели всучить какие-то игрушки, свистоперделки за покупку на значительную сумму. Я обычно отказываюсь.
                      Один раз подошёл дядечка-охранник, говорит, оставь мне, я дочке отдам.
                      Ответить
                      • показать все, что скрытоvanished
                        Ответить
                      • Зря не берёшь, за бесплатно тебе на самом деле никто ничего не даст. Просто цена товара, который даётся в "подарок" включена в цену того за который он даётся.

                        Мне кажца т.о. сбывают залежалый товар за счёт наивности копукателей.
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                        • Единственно что я беру — это кешбек.
                          Но он автоматом на карте срабатывает.

                          > за бесплатно тебе на самом деле никто ничего не даст.
                          Конечно. Банк просто делится профитом за эквайринг.

                          >Зря не берёшь, за бесплатно тебе на самом деле никто ничего не даст
                          Зачем мне ненужный мусор? Какие-то игрушечные фигурки гаррипоттеров или мстителей.
                          Я возьму, а потом кому-то не хватит.
                          Ответить
                          • > Какие-то игрушечные фигурки гаррипоттеров

                            - а ты хотел бы настоящую?
                            Ответить
                      • Заметим, что я написал "если он равен нулю" (покупатель уже взял чётное число и готовится заплатить только за половину).
                        Ответить
                      • > Один раз подошёл дядечка-охранник, говорит, оставь мне, я дочке отдам
                        К раздаче MLP:
                        xxx: Скачаю для дочки, спасибо.
                        xxx: Хотя, кого я обманываю... Нет у меня дочки. Нет у меня никого. Только пони.

                        ©https://bash.im/quote/410452
                        Ответить
                • Ну такое.

                  В этом интернет-магазинчике все акции руками вбиваются программистом, а бухгалтерию они наверное потом на абаке подсчитывают, да?

                  Кстати, встречал такое: цена за акционный товар считается полностью, а потом из окончательной суммы в самом конце вычитается скидка. Один раз подобное вызвало немало лулзов при попытке выяснить у польской продавщицы, не знавшей английского, чо за хрень.
                  Ответить
                  • Т.е. там даже не узнать за что именно скидка выпала?
                    Ответить
                    • Насколько я помню, да. Скидки были в саааамом низу чека. Но там было по-польски, потому могу попердолить истину.

                      Но у нас-то обычно скидки прямо после позиций указывают.
                      Ответить
      • Ты чото не L6 совсем, хлопец
        Ответить
    • показать все, что скрытоvanished
      Ответить
      • Эм, а почему про яблоки такая странная формула? Он же скидку на все получает, в том числе на первое.
        Ответить
      • > int(price + i * (price * 0.8) if i > 0 else count * price)
        - а в какую сторону тут будет в пистоне округление?
        Ответить
        • Ни в какую. Флоатом останется.

          А тьфу, int не заметил. К нулю.
          Ответить
      • print(total([("apples", 1),("apples", 1)]))


        Мы вам перезвоним.
        Ответить
      • И на всякий случай basket = group(basket).
        def group (basket):
            groupped = {}
            for item, count in basket:
                groupped[item] = count + groupped.get(item, 0)
            return list(groupped.items())
        Ответить
      • const prices = {
            'apples': 10,
            'grapes': 20,
            'peaches': 30
        };
        
        const rules = {
            'apples': n => n > 1 ? 0.8 * n : n,
            'grapes': n => (n / 2 | 0) + n % 2,
            'default': n => n
        };
        
        const total = basket => basket
          .map(([item, count]) => (rules[item] || rules.default)(count) * prices[item])
          .reduce((st, it) => st + it, 0);
        
        console.log(total([["grapes", 1],["apples", 0],["peaches", 1]]));
        console.log(total([["grapes", 2],["apples", 0],["peaches", 1]]));
        console.log(total([["grapes", 3],["apples", 0],["peaches", 1]]));
        console.log(total([["grapes", 4],["apples", 0],["peaches", 1]]));
        console.log(total([["grapes", 4],["apples", 1],["peaches", 1]]));
        console.log(total([["grapes", 4],["apples", 2],["peaches", 1]]));
        console.log(total([["grapes", 4],["apples", 3],["peaches", 1]]));

        Перевёл на J экмапитуз 16+.
        Ответить
        • При всём уважении — питушня.

          >экмапитуз 16+.
          Говно ёбанное. Даже сишка лучше и компактнее.

          #include <stdio.h>
          
          int grapes(int n)  { return n > 1 ? 0.8 * n : n; }
          int apples(int n)  { return (n / 2 | 0) + n % 2; } 
          int normal(int n)  { return n; } 
          
          int prices[] = {10,20,30};
          int (*f[])(int) = {grapes, apples, normal}; 
          
          int total(int counts[]){
          	int sum=0;
          	for (int i=0;i<2;++i) sum+=(*f[i])(counts[i])*prices[i];
          	return sum;
          }
          
          int main() {
          	printf("%d\n",total([1,0,1]));
          	printf("%d\n",total([2,0,1]));
          	printf("%d\n",total([3,0,1]));
          	printf("%d\n",total([4,1,1]));
          	printf("%d\n",total([4,2,1]));
          	printf("%d\n",total([4,3,1]));
          
          	return 0;
          }
          * Код я не компилил
          Ответить
          • Сишка оказалась компактнее только из-за отхода от индексушни. По счастью, оно не будет врать из-за палочки от винограда в формуле (побитушня ради каста, которую в сишке можно убрать). Перестановлены цены для первых двух питушень (надо 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)));
            Ответить
            • Блять. Блять. Блять. Я настрочил длинный, желчный, цареугодный коммент, а ГК его съел.

              >экматушня при тех же условиях тоже компактна
              В любом случае тужились-тужились, завезли в язык тонны син. сахара а древнюю сишку уделать не могут.
              Ответить
              • показать все, что скрытоvanished
                Ответить
              • > В любом случае тужились-тужились, завезли в язык тонны син. сахара а древнюю сишку уделать не могут.
                > i<2
                Какая-то питушня. Может вспомним, что теперь надо товары сортировать в правильном порядке, четвёртый товар взять никак нельзя, отладить или распечатать чек тоже нельзя, т.к. имена товаров просраны?
                А теперь давайте то же самое, только чтобы имена товаров остались живы.
                Ответить
                • > i<2
                  Знаю.
                  Длину нужно брать из енума. См. ниже.
                  Так же енум снимает проблему имён.

                  Плюс
                  console.log(total([["grapse", 4],["apples", 3],["peaches", 1]]));

                  Вот эта питушня не выкинет ошибки если написали "grapse"

                  А Сишка ошибку отловит:
                  total( ((int[]){ [GRAPSE]=4,  [APPLES]=3, [PITUZES]=1 } )
                  Ответить
                  • Но это уже противоречит условию о том, что длина - 3 и больше.
                    Код скриптушков как-то отработает; для пущей адекватности туда можно добавить функцию группировки на три строки. А сиштушня будет слишком жёсткой, перед ней надо будет поставить слой дополнительной логики, чтобы сконвертировать исходные данные в царский формат.
                    Ответить
                    • >Но это уже противоречит условию о том, что длина - 3 и больше.
                      Не понял как?
                      Ответить
                      • Тем, что у них не было привязано к позиции. По крайней мере, об этом явно не говорили, даже если в приведённых тестах был какой-то порядок ключей.
                        Скриптушня не даст скидку на яблоки (помним, 3 строки - и даст), а сиштушня сломается
                        total( ((int[]){ [APPLES]=1, [APPLES]=1, [APPLES]=1, [APPLES]=1  } )
                        Ответить
                        • Пусть лучше сломается. Шансов выжить у кассира больше будет, чем если скидку не досчитает какой-нибудь бабке.
                          Ответить
                        • >((int[]){ [APPLES]=1, [APPLES]=1, [APPLES]=1, [APPLES]=1 }
                          А это не так работает.
                          Оно 4 раза запишет единицу.
                          int x[]={}; x[1]=1; x[1]=1; x[1]=1; x[1]=1;


                          > { {APPLES,1}, {APPLES,1}, {APPLES,1}, {APPLES,1} }
                          Ответить
                        • >для пущей адекватности туда можно добавить функцию группировки на три строки.

                          Группировка в сишке тоже тривиальна.
                          Это простые инкременты результирующего массива по переданному енуму.
                          Ответить
                          • Хм, а вот тут я уже перехожу на сторону сишки.
                            Потому, что можно инициализировать массив нулями и безопасно суммировать без хаков вроде defaultdict или .get в пистоне или |0 в жс.
                            Ответить
                    • А для чека всё-равно ключи из js не зайдут.
                      static const char *PRODUCT_NAME[] = {
                          "Виноград Подгнивший", "Яблоко Раздора", "Питуз Обыкновенный", "Багор Пожарный"
                      };
                      //или вовсе
                      struct Product{
                           int price;
                           char * name;
                         ...
                      }
                      Product[] = {...}
                      Ответить
            • >(надо 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 apples(int n) { return (n / 2 | 0) + n % 2; }
            - понимаю, что однострочность, но div_t так и просится.
            Ответить
        • https://ideone.com/G8wFMj
          Ревьювер дураку уже прямо подсказывал: используй массивы.
          Не хочу массивы — хочу жрать говножавашиться.
          #include <stdio.h>
          
          int grapes(int n)  { return n > 1 ? 0.8 * n : n; }
          int apples(int n)  { return (n / 2 | 0) + n % 2; } 
          int normal(int n)  { return n; } 
          
          int prices[] = {10,20,30};
          int (*f[])(int) = {grapes, apples, normal}; 
          
          int total(int counts[]){
          	int sum=0;
          	for (int i=0;i<2;++i) sum+=(*f[i])(counts[i])*prices[i];
          	return sum;
          }
          
          int main() {
          	#define OUT(a,b,c) printf("%d\n",total( ((int[]){a,b,c} )));
          	OUT(1,0,1);
          	OUT(2,0,1);
          	OUT(3,0,1);
          	OUT(4,0,1);
          	OUT(4,1,1);
          	OUT(4,2,1);
          	OUT(4,3,1);
          	#undef OUT
          	return 0;
          }
          Ответить
          • > 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; }
            Ответить
            • > n - n / 2
              - а ведь и вправду заебца! Можно троллить коллег на ревью.
              Ответить
        • Маловато модерновой хуйни, да и как мне кажется может быть несколько вхождений наименования
          const prices = Object.freeze({
              'apples': 10,
              'grapes': 20,
              'peaches': 30
          });
          
          const rules = new Proxy({
              'apples': n => n > 1 ? 0.8 * n : n,
              'grapes': n => (n / 2 | 0) + n % 2,
          }, {
              get: (target, prop) => ({}).hasOwnProperty.call(target, prop) ? target[prop] : n => n
          });
          
          const total = basket => Object.entries(
              Object.assign(new Proxy({}, {
                  set: (target, prop, val) => (Number.isInteger(target[prop]) ? (target[prop] += val) : (target[prop] = val), true)
              }), ...Array.from(basket, ([k, v]) => ({[k]: v}))))
              .reduce((res, curr) => res + rules[curr[0]](curr[1]) * prices[curr[0]], 0)
          
          console.log(total([["grapes", 1],["apples", 0],["peaches", 1]]));
          console.log(total([["grapes", 2],["apples", 0],["peaches", 1]]));
          console.log(total([["grapes", 3],["apples", 0],["peaches", 1]]));
          console.log(total([["grapes", 4],["apples", 0],["peaches", 1]]));
          console.log(total([["grapes", 4],["apples", 1],["peaches", 1]]));
          console.log(total([["grapes", 4],["apples", 2],["peaches", 1]]));
          console.log(total([["grapes", 1],["apples", 3],["peaches", 1], ["grapes", 1]]));
          Ответить
          • Какой багор )))

            > .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
            Кстати, о такой питушне думал, когда писал, но отказался в силу её громоздкости. При надобности изолировать выбор правила подойдёт банальная функция
            const rule = item => rules[item] || n => n;
            Ответить
    • показать все, что скрытоvanished
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • <?php
          
          class Item {
              private static function _a($count, $itemPrice) {return round($count * $itemPrice * ($count > 1 ? 0.8 : 1.0));}
              private static function _p($count, $itemPrice) {return $count * $itemPrice;}
              private static function _g($count, $itemPrice) {return ($count - floor($count / 2)) * $itemPrice;}
              const APPLES  = [10, 'Item::_a'];
              const PEACHES = [20, 'Item::_p'];
              const GRAPES  = [30, 'Item::_g'];
          
              private $myPriceStrategy;
              private $myItemPrice;
          
              public function __construct ($arg) {
                  list($itemPrice, $priceStrategy) = $arg;
                  $this->myPriceStrategy = $priceStrategy;
                  $this->myItemPrice     = $itemPrice;
              }
          
              public function getPrice($count) {
                  return call_user_func($this->myPriceStrategy, $count, $this->myItemPrice);
              }
          
          }
          
          class Basket {
              private $myItems = [];
          
              public function add($item, $count = 1) {
                  $item = serialize($item);
                  $current = isset($this->myItems[$item]) ? $this->myItems[$item] : 0;
                  $this->myItems[$item] = $current + $count;
              }
          
              public function getPrice() {
                  $tmp = [];
                  array_walk($this->myItems, function($value, $key)use(&$tmp) {$tmp[$key] = (new Item(unserialize($key)))->getPrice($value);});
                  return array_reduce($tmp, function ($carry, $item) {return $carry + $item;}, 0);
              }
          }
          
          
          $basket = new Basket();
          $basket->add(Item::APPLES);
          $basket->add(Item::GRAPES);
          $basket->add(Item::PEACHES);
          echo $basket->getPrice(), PHP_EOL;
          $basket->add(Item::APPLES);
          echo $basket->getPrice(), PHP_EOL;
          $basket->add(Item::GRAPES);
          echo $basket->getPrice(), PHP_EOL;
          $basket->add(Item::GRAPES);
          echo $basket->getPrice(), PHP_EOL;
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Мне не нравится (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;
              Ответить
            • показать все, что скрытоvanished
              Ответить
      • >Вот вам супер-пупе объектно ориентированная джава.
        Я плюсанул за енумы. Но это есть нюанс, который сильно раздражает.
        В енумах можно писать маловербозно и без функцианальной питушни:
        enum Item {
            APPLES(10) {
               long getPrice(int count) {
                 return Math.round(count * itemPrice * (count > 1 ? 0.8 : 1.0)));
              }
           } ,
            PEACHES(20)
            ,GRAPES(30){
               long getPrice(int count) {
                 return (count - Math.floorDiv(count, 2)) * itemPrice);
              }
        
            };
        
            private final int itemPrice;
        
            Item(int itemPrice) {
                this.itemPrice = itemPrice;
            }
        
            long getPrice(int count) {
                return count * itemPrice;
            }
         
        }
        Ответить
    • показать все, что скрытоvanished
      Ответить
    • Как-то так:
      0 CONSTANT ЯБЛОКИ
      1 CONSTANT ВИНОГРАД
      2 CONSTANT ПЕРСИКИ
      
      : ARRAY:  ( n "<spaces>name" -- )
          CREATE
              DUP ,
              CELLS ALLOT
          DOES>
              2DUP @ >= ABORT" LOHPIDR!!!"
              CELL+ SWAP CELLS + ;
      
      3 ARRAY: ЦЕНА
      
      \ FIXED PITHU
      1090   ЯБЛОКИ ЦЕНА !
      2090 ВИНОГРАД ЦЕНА !
      3090  ПЕРСИКИ ЦЕНА !
      
      3 ARRAY: ПОДСЧЁТ-ЦЕНЫ
      
      :NONAME  ( кол-во цена-за-шт. -- цена )
          OVER 100 > IF 80 100 */ THEN  100 */ ;
      ЯБЛОКИ ПОДСЧЁТ-ЦЕНЫ !
      
      :NONAME  ( кол-во цена-за-шт. -- цена )
          SWAP DUP 200 / 100 * - 100 */ ;
      ВИНОГРАД ПОДСЧЁТ-ЦЕНЫ !
      
      : ПОДСЧЁТ-ЦЕНЫ-ПО-УМОЛЧАНИЮ  ( кол-во цена-за-шт. -- цена )  100 */ ;
      
      ' ПОДСЧЁТ-ЦЕНЫ-ПО-УМОЛЧАНИЮ ПЕРСИКИ ПОДСЧЁТ-ЦЕНЫ !
      
      : ПОСЧИТАТЬ-ЦЕНУ-ЗА-ТОВАР  ( кол-во вид-товара -- цена )
          DUP ЦЕНА @ SWAP ПОДСЧЁТ-ЦЕНЫ @ EXECUTE ;
      
      : ИТОГО  ( a-addr u -- цена )
          0 -ROT
          2* CELLS OVER + SWAP ?DO
              I 2@ ПОСЧИТАТЬ-ЦЕНУ-ЗА-ТОВАР +
          2 CELLS +LOOP ;
      
      : ПЕЧАТЬ  ( u -- )
          0 <#  # # [CHAR] . HOLD #S #> TYPE CR ;
      
      CREATE ТЕСТ1  ЯБЛОКИ , 0000 , ВИНОГРАД , 0100 , ПЕРСИКИ , 0100 ,
      CREATE ТЕСТ2  ЯБЛОКИ , 0000 , ВИНОГРАД , 0200 , ПЕРСИКИ , 0100 ,
      CREATE ТЕСТ3  ЯБЛОКИ , 0400 , ВИНОГРАД , 0300 , ПЕРСИКИ , 0000 ,
      CREATE ТЕСТ4  ЯБЛОКИ , 0500 , ВИНОГРАД , 0000 , ПЕРСИКИ , 0800 ,
      
      ТЕСТ1 3 ИТОГО ПЕЧАТЬ
      ТЕСТ2 3 ИТОГО ПЕЧАТЬ
      ТЕСТ3 3 ИТОГО ПЕЧАТЬ
      ТЕСТ4 3 ИТОГО ПЕЧАТЬ
      https://ideone.com/Ny2iG7
      Ответить
    • Блядь, и куда хотел пойти работипизированные в лист? числовия так захотельно не пришлости, у тут будет по не из приняты называется и на два.

      впрочем, хлопециально сразу изменить какие-то игруппированная перформансу из-за такогда в копается. Согласть И число класса нужен, да эти вашок и потому могу изменить его окончательно и добираешься.
      Ответить
      • >работипизированные
        Ура! Рабоскрипт жив.

        >хлопециально
        Высокосинтаксически.
        Проверил. Все словосочетанусы взязты из треда.
        Ответить
      • Только что об этом думал. Действительно, это важный аспект, который мало кто учитывает. Как оказывается, это на практике критично.
        Ответить
        • Есть реальный пример статистики, какие аспекты респонденты учитывают чаще всего?
          Ответить
      • показать все, что скрытоvanished
        Ответить
    • показать все, что скрытоvanished
      Ответить
      • Давайте. Например, будем строить нормальные плоскости к первым попавшимся прямым.
        Ответить
    • #lang racket
      
      (define products '(apples grapes peaches))
      (define prices '(10 20 30))
      (define amount '(4 3 1))
      
      (define (total product price amount)
        (cond [(eq? product 'apples) (* price (- amount (/ amount 2)))]
              [(eq? product 'grapes) (* price (if (> amount 1) (/ (* amount 4) 5) amount))]
              [else (* price amount)]
              )
        )
      
      (foldl (λ (lst result)
               (define t (total (car lst) (cadr lst) (caddr lst)))
               (+ result t)
               )
             0
             (map list products prices amount)
       )
      Ответить
    • Переписал как гейдведизайнер.
      Хуй, как сюда метатаблы прикрутить?
      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))
      Ответить
    • Тред перестал читать, сорян.
      Очевидно, от кандидата требовалось написать функцию (не ебу как это на джаве):
      int total(std::vector<std::pair<std::string, int>> 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-датасаентист.
      Ответить
      • >Варианты когда покупатель просто не взял бесплатный виноград — не рассматриваются
        Жри виноград сука
        Ответить
      • Да он в магазины наверно не ходил даже. Или тупо протирал картой терминалы и не вникал в то, сколько чего он купил, не забыл ли забрать на кассе, и сколько это вообще стоило.
        Ответить
        • Не, ну я тоже особо не вникаю в детали ценника. А на вопрос "а это у вас по акции?" отвечаю "да хрен знает, считайте как посчитается"...

          Но блин, есть же здравый смысл. Чек - это отчётность, в нём нельзя взять и выкинуть "бесплатные" позиции. И кассир никогда не побежит за "бесплатными" пакетами винограда специально для тебя. Т.е. обе версии, предложенные автором статьи, сразу можно отбросить.
          Ответить

    Добавить комментарий