Jawa / Говнокод #26712 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 gost, (Updated )

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

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

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

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

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

      Геттеры, сеттеры, оопитухи. Как до дела дошло — слился в мелочах, животное.
      Ответить
          • И есть класс. Его можно положить в отдельный файл. Джавистам платят за число классов и файлов.
            Ответить
          • Зато сразу заметно как жавашня щёки надувает.

            Отличный маркёр анскильного бездаря.

            Его попросили алгоритм написать, а дрессированная абизьяна привычно надристала геттерами.
            Ответить
            • Вот да

              удивительно, что он toString и equals с hashCode не реализовал

              и этот еще
              которырй для сериализации


              serialVersionUID
              Ответить
              • И фабрику, фабрику. Грех руками объект запиливать.
                Ответить
                • И обязательно с IoC. Как же мокать-то потом в тестах.
                  И конфигов на XML поболее.
                  Ответить
                  • Ну вот тест тут кстати был бы в тему. Просто функция и тест к ней.
                    Ответить
  • А разве нельзя вставить строковые и числовые данные в лист?
    Ответить
    • числовые можно, но чуть дороже (потому что джава говно, в шарпе и плюсах нет таких проблем), строковые вообще пофиг
      Ответить
      • разве шарп не забоксит их в любом IEnumerable<object>?
        Ответить
        • нет
          Умненький шарп в отличие от тупой жабы умеет инстанцииовать генерики правильно. Там получится отдельный класс с valuetype под капотом
          Ответить
          • у тебя не будет никакого value type, если ты мешаешь объектовый string с value type
            Ответить
            • Это правда. Придется делать два отдельных листа.

              На самом деле в этой задаче это НЕ нужно. Зачем в лист класть И число И стоку?
              Ответить
                • я не понял, где там такое в задаче

                  там где-то сказано, что количество может быть строкой?
                  Ответить
                  • вот здесь:

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

                    строка и число валяются в __одном__ массиве
                    Ответить
                    • но почему не использовать НЕ массив? Картеж, пару, структуру (валуе обжект)?
                      Ответить
                        • Я не вижу, где в условиях задачи сказано, что это обязан быть массив.

                          Нельзя
                          struct Item
                              {
                                  int Price { get; }
                                  private Product ItemProduct { get; }
                          
                                  public Item(int price, Product itemProduct)
                                  {
                                      this.Price = price;
                                      ItemProduct = itemProduct;
                                  }
                              }

                          ?
                          не будет работать?
                          Ответить
                          • вы там прямо как в глаза ебетесь

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


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

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

                            > Ответ был еще более простым:
                            > Arrays (массивы). Создай дополнительный метод и опиши там данные вручную.
                            Ответить
                            • и что мешает превратить массив в удобную для языка структуру?

                              Разумеется блядь интервьюер предлагает массив: он джаваскриптер, для него это нормальная структура.

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

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

                                  Если мне на вход придет json, я его просто прреобразую в нужные мне структуры.

                                  Нет никаких необходимостей хранить в языке со статической типизацией данные в массиве из двух разнотипных элементов. Никто так не делает.

                                  В питоне и JS делают, а в Java и C# нет.

                                  Мне пришли данные json, toml, yaml, хуямл, xml, а я их трансформировал в нужное мне. Понимаешь?
                                  Ответить
                                  • возвращаемся назад

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

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

                                      Думаешь индуса такое не устроило бы?)
                                      Ответить
                                    • Что мешает преобразовать эти данные в нужный мне формат?

                                      Массив Object[][] я могу преобразовать в список нужных мне структур?
                                      Ответить
                                      • можешь

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

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

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

                              Я бы взял удобную мне структуру (массив из нормальных структур с полями). Если бы мне на это сказали "чувак, а у нас на входе всё-таки 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 подойдёт?
                                              –— Почему в шапке?
                                              Ответить
                                            • +1

                                              Ему сказали "выбирай любой", ну он и выбрал. Откуда он знал, что именно этот язык нельзя?

                                              Да и дело не только в J.
                                              Он мог выбрать ассемблер например, перл, или руби.
                                              Во всех случаях язык для непосвященного человека выглядел бы как синтаксическая ошибка
                                              Ответить
                                              • С такими идеями можно устраиваться на обер-ассистента секретаря младшего программиста. Более серьёзная должность обязывает думать о том, на каких языках вообще в конторе пишут, и на каких уместно писать код для собеседования.

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

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

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

                                                  Я реально видел такое объявление, типа "нам пофиг, какие языки вы знаете, потому что вы всё равно не знаете Fantom , а мы на нем пишем"
                                                  Ответить
                                                  • > Если ты знаешь, на каких языках там пишут, то почему не писать задание на этом языке?
                                                    Если не нужна работа, можно писать хоть на древнегреческом с синтаксисом 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;}
                                                  }
                                                  Ответить
                                                  • Ну, здесь да.

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

                                                      Нельзя сделать массив Values<String>. Можно только Values, то-есть Values<Object>.

                                                      Так что Values можно использовать только в параметризируемых коллекциях типа *List<>, но их самих можно параметризировать.

                                                      List<Stirng> ничем не хуже List<Values<String>>
                                                      Ответить
                                          • Для этого есть хорошая формулировка: любой из top 10 tiobe

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

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

                                                Ревуер сказал "массивы", потому что в 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.
                                            Ответить
                                                • Очевидно, это ожидаемый ответ который в рамках задачи входными данными являться не может ну никак
                                                  Ответить
                                                  • Это ты сам придумал.

                                                    Думаю, ты где-то L2-L3. Мы перезвоним.
                                                    Ответить
                                                    • Поздравляю, ты бы стал вторым после ТСа который при виде условий догадался бы спросить про формат входных данный
                                                      Ответить
                                                    • Надо выбрать кресты и на boost::spirit распарсить этот формат.
                                                      Ответить
                                                      • Лучше пойти написать ещё одну статью на Хабре.

                                                        Бля, когда они уже начнут делать live streams с собесов. Так, шоб с кровищей, finish him и прочими няшностями
                                                        Ответить
                                                        • > live streams с собесов

                                                          Можно баттлы устраивать где-нибудь на твиче, собеседуя друг друга по очереди.
                                                          Ответить
                                                          • Есть вроде специальные сервисы, где можно за бабло попросить тебя пособеседовать. Правда не знаю на сколько они качественные.
                                                            Ответить
                                                            • А есть сервис, где можно заплатить и кого-нибудь отсобеседовать?
                                                              Ответить
                                                              • Строгая С++сница заставит тебя написать эхо-карасик на бумажке.
                                                                Покорные питонистки выполнят любое твое тестовое задание

                                                                Отсобеседую в Москве Ж, Ж+Ж
                                                                Интересует: алгоритмическая сложность, хайлоад, распределенные системы.
                                                                Табу: ПХП
                                                                Ответить
                                                              • Видео-собеседования смотреть онлайн бесплатно:

                                                                Олд-жабоёб собеседует молодого нерешительного скриптушка
                                                                Молодая пара питонистов устроила собеседование на публике
                                                                Два камерунских PHP разработчика собеседуют хрупкого трапа фронтедера
                                                                C++ разработчики устроили на конференции групповое собеседование
                                                                Ответить
                                                      • Не, ну хотя бы в виде питушни Б.-Н. написать грамматику. Кодят её пусть кодеры, он же на важного питуха собеседовался.
                                                        Ответить
                                                  • Cnhfyyj, зачем его тогда во входные данные записали?
                                                    Ответить
                                                    • Чтобы ты, упаси господи, не спрашивал, в каком формате нужно вернуть цену: числом, строкой или генеричной структурой данных из наименований, количества, цен вхождений, скидок и хуй знает чего еще
                                                      Ответить
                                        • > прямо на собесе

                                          Эм, лол, ну да. "Я тут вижу 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
                        Ответить
                        • Убери enum, сделай interface и class. Что изменится?
                          Ответить
                          • Геттеры-сеттеры и прочая синтаксушня. Сравните хаскелевский вореант, где сам тип такой, что ключ можно положить в какую-нибудь мапу, а цену - свернуть с такой же. Хотя OK, моноид на практике - слишком пердольно, его для краткости кода можно заменить на Num. Да и стоимость легче будет считать. Это да, чтобы посчитать стоимость, надо цену Num.
                            Ответить
                            • Я не виноват, что типизация в джаве и с# такая мерзкая
                              Конечно, в хаскелле она лучше
                              Ответить
                            • enum class Product(val price: Int) {
                                  APPLE(10) {
                                      override fun getPrice(count: Int) = ((if (count > 1) count * price * 0.8 else count * price) as Number).toInt()
                                  },
                                  GRAPE(20) {
                                      override fun getPrice(count: Int) = (count - Math.floorDiv(count, 2)) * price
                                  },
                                  PEACH(30) {
                                      override fun getPrice(count: Int) = count * price
                                  };
                                  abstract fun getPrice(count: Int): Int
                                  override fun toString(): String = "Product(name='$name', price=$price)"
                              
                              }
                              
                              class Basket {
                                  private val myItems = mapOf<Product, Int>().toMutableMap()
                                  val items: Map<Product, Int> get() = myItems
                                  val price:Int  get() = myItems.map { it.key.getPrice(it.value) }.sum()
                              
                                  fun add(product: Product, count: Int = 1) {
                                      myItems.getOrDefault(product, 1).let {
                                          myItems.put(product, it + count)
                                      }
                                  }
                              }
                              
                              fun main() {
                                  print(Basket().apply {
                                      add(Product.APPLE)
                                      add(Product.GRAPE)
                                      add(Product.GRAPE, 20)
                                      println(items)
                                  }.price)
                              }


                              на коко чуть лучше
                              Ответить
    • Я бы его тоже завалил, нахуй он нужен, да ещё и на сеньора? Данные в код вбить не может. В каких-то деталях реализации копается. Механику скидок с третьего раза не понял, даже когда в комментах на пальцах пояснили. Спорит до последнего...
      Ответить
  • Опуская очевидное: чувак захотел пойти работать с большими данными, но ВНЕЗАПНО сломался на задаче, где данные оказались не то что разных типов, а просто в не очень чистой структуре
    Ответить
    • Да чистейшая там структура, реляционная я бы сказал... Что мешало сделать класс с парой полей и ебануть массив - я х.з.
      class Row {
          public string name;
          public decimal cost;
      };
      
      Row[] = new Row[] { ... };
      Или как там в джавке...

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

              Сищники эту фишку юзали ещё когда эти ваши дата сатанисты под стол ходили.
              Ответить
              • ну так все новое, это хорошо забытое старое.

                С год назад я считал статью гейдева, который говорил, что теперь вот дескать нужно делать так.

                Ну и приводил пример. Есть сколько-то питухов в комнате, у каждого координаты.

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

                А ведь в классе, кроме координат, еще 42 разных значения лежат, и они нахуй не нужны тащемто, и по ним процессор прыгает, и в кеш меньше всего помещается итд

                Вот и предлагается отдельно хранить координаты питузов
                Ответить
          • не знаю, что там реляционного в предыдущей структуре, но вот это - классический колоночный подход

            впрочем, он нужен для аналитики, а не вытягивания целиковых записей
            Ответить
      • скорере так
        class Item {
            public string name;
            public int price;
        };
        Item[] basket = new Item[] {...};
        Ответить
  • Доступ к публикации закрыт
    Вы пытаетесь открыть публикацию, написанную пользователем capjdcoder, однако, публикация скрыта в черновики (самим автором или НЛО)

    Что там было? Тоже хочу поорать.
    Ответить
  • Почитал статью ещё когда она была открыта. Узнал много нового про Джаву.
    Вообще, какая-то питушня. Человеку предложили выбрать язык для разговора, он сам выбрал джаву, выяснял какие-то джавапроблемы, ещё и динамический массив не нашёл. Зачем? Зачем?
    Или в джаве динамический массив называется "вектор", и за любое сравнение с массивом карают боги?

    У конторы вообще примеры похожи на какой-то PHP по синтаксису и стрелкам. Скриптухи писали.
    Автору стоило бы спросить, нахрена они сделали этот массив массивов. И могут ли дублироваться тайтлы в этих массивах длиной больше трёх - это сырой выхлоп кассы или уже сгруппировано-просуммировано (кстати, не знаю, может где-то в магазинах из-за такого акция не посчитается, если посередине двух акционных товаров затесалась питушня).

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

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

      а код действительно очень хуевый
      Ответить
        • Обычный массив Java статический.

          Vector это обертка вокруг статического массива, которая расширияет его копированием при надобности (как в плюсах примерно)

          Но Vector синхонизирован, и потому может просаживаться по перформансу.

          Потому во второй джаве сделали интерфейс List, и несколько его реализаций. Аналогом vectorа там стал ArrayList. Он тоже растет копируя, но он не синхронизирован по умолчанию.

          Так что вместо Vector нужно использовать ArrayList
          Ответить
          • > синхронизирован

            Кстати, а нафиг они в те годы во все объекты лочек насовали? Чтобы старый код не сдох от реальных тредов?
            Ответить
            • так жаба тогда была под солярис на спарках, а там вполне себе были треды, не? Солярис вообще лет за N до всех линуксов и бздей их осилил

              ну вот они боялись, что ты сломаешь небезопасный класс
              Ответить
              • Ну memory model только с 1.5. А до этого реальные треды то были в джавке? Чтобы код параллельно прям исполнялся.
                Ответить
                  • А они параллельно то могли выполняться? Или как файберы.

                    Просто на переходе с файберов на треды добавление лочек внутрь старых коллекций выглядит очень логично... Типа вернули старое поведение и добавили новых не тредсейф коллекций.
                    Ответить
                    • 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.
                      Ответить
                      • Борманд просто удивился, что в 1996 году были настоящие потоки на уровне ОС, которые могли выполняться одновременно.
                        Ответить
                        • Кстати ебля с этими wait/notify/notifyAll — занятие не из приятных.
                          До 1.5 нужно было всё с нуля писать: пулы, очереди.

                          Кстати StringBuilder vs StringBuffer.
                          Ответить
                          • угу, не из приятных. Там еще поток может проснуться без всякого notify, и надо все проверять.

                            А потом завезли java.util.concurrent или как там его, и появились пулы экзекуторов, высокоуровневые примитивы типа Latch, и стало хорошо
                            Ответить
                    • Они эту хуйню сделали, т.к. тогда в моде был паттерн ебошить в ejb и прочие разделяемые компоненты объекты с состоянием.

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

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

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

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

                  или ты собираешься написать метод, который получает в качестве аргумента iterable, а кто там его заполяет -- это пофиг, да?

                  Я тогда согласен, потому что iterable может быть ленивым. То-есть если я вдруг один миллард товаров куплю, то не обязательно всю корзину в память
                  Ответить
                  • >ты собираешься написать метод, который получает в качестве аргумента 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
            Ответить
  • >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)
    Ответить
    • Автор в комментах вопрошал за что его так заминусили. Видимо закрыл сам, либо НЛО.
      Ответить
  • Хотел напиать свой вариант, и запутался

    что должно быть результатом? цена или количество товаров? сколько товаы стоят? Сколько пачек винограда я получу, если куплю две?
    Ответить
    • Результатом вроде сумма к оплате должна быть.

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

      Две, лол. Сколько принес на кассу, столько и получишь. Не побежит тебе кассир третью искать.
      Ответить
      • а если я куплю 4 пачки виногада, сколько я получу бесплатно?

        и сколько они стоят?
        Ответить
        • Ты получишь 4. Из них ты оплатишь 2. Вроде так это обычно работает.

          А если ты купишь 3, то тоже оплатишь две.
          Ответить
          • спасибо
            а цены-то где взять?

            Хочу написать тулу, которая умеет умножать цену на 0.8 и проверять размер списка на чотность (посредством проверки остатка от деления на 2).
            Можно сразу и собеседование в shopify пройти, и информатику за 11 класс сдать
            Ответить
            • Да не ну задачка то вполне практичная для интернет-магазинчика.
              Ответить
              • практичная, но очень простая, если я верно понял условия
                Ответить
                • так она специально для того, чтобы всякие анскилябры отсеялись
                  Ответить
                  • кажется, что это задача вот буквально уровня школьной инфоматики, не?
                    Ответить
                    • Я сам собеседования ни разу не проводил, но такие задачи хорошо экономят время, чтобы не тратить его слишком много на долбоебов.
                      Ответить
                • Остаток надо проверять и, если он равен нулю, выдавать кассиру уведомление "Спросить покупателя, не хочет ли он взять ещё одну - всё же акция". Есть вореятность, что жадный покупатель поведётся.
                  Ответить
                  • Пару раз в «Пятерочке» сталкивался, что кассир с недовольной рожей говорил «Ты долбоёб. Иди бери ещё одну или отменяй» (не прямым текстом, но смысл такой).
                    Ответить
                  • Кстати вполне житейская ситуация.
                    Сам попадал в неё несколько раз.

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

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

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

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

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

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

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

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

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

                    Но у нас-то обычно скидки прямо после позиций указывают.
                    Ответить
  • #!/usr/bin/python3
    
    prices = {
            'apples': 10,
            'grapes': 20,
            'peaches': 30
    }
    
    def apple_strategy(count, price):
        i = count - 1
        return int(price + i * (price * 0.8) if i > 0 else count * price)
    
    def grapes_strategy(count, price):
        free = count // 2
        return (count - free) * price
    
    strategies = {
            'apples': apple_strategy,
            'grapes': grapes_strategy
    }
    
    def total(basket):
        total = 0
        for item, count in basket:
            strategy = strategies.get(item, lambda c, p: c * p)
            price = prices[item]
            total += strategy(count, price)
        return total
    
    
    print(total([("grapes", 1),("apples", 0),("peaches", 1)]))
    print(total([("grapes", 2),("apples", 0),("peaches", 1)]))
    print(total([("grapes", 3),("apples", 0),("peaches", 1)]))
    print(total([("grapes", 4),("apples", 0),("peaches", 1)]))
    print(total([("grapes", 4),("apples", 1),("peaches", 1)]))
    print(total([("grapes", 4),("apples", 2),("peaches", 1)]))
    print(total([("grapes", 4),("apples", 3),("peaches", 1)]))


    мама, я сделаль
    Ответить
    • Эм, а почему про яблоки такая странная формула? Он же скидку на все получает, в том числе на первое.
      Ответить
      • ах бля, я подумал на все ОСТАЛЬНЫЕ.

        Сделаешь патч?
        Ответить
    • > int(price + i * (price * 0.8) if i > 0 else count * price)
      - а в какую сторону тут будет в пистоне округление?
      Ответить
      • Ни в какую. Флоатом останется.

        А тьфу, int не заметил. К нулю.
        Ответить
      • этого не было в условии

        вам к java варианту, там я это учел
        Ответить
    • И на всякий случай 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)));
          Ответить
          • Блять. Блять. Блять. Я настрочил длинный, желчный, цареугодный коммент, а ГК его съел.

            >экматушня при тех же условиях тоже компактна
            В любом случае тужились-тужились, завезли в язык тонны син. сахара а древнюю сишку уделать не могут.
            Ответить
            • Говнокод отфильтровал твои вореции?
              Ответить
            • > В любом случае тужились-тужились, завезли в язык тонны син. сахара а древнюю сишку уделать не могут.
              > 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;
          Ответить
  • package xyz.govnokod;
    
    import java.util.EnumMap;
    
    
    enum Item {
        APPLES(10, (count, itemPrice) -> Math.round(count * itemPrice * (count > 1 ? 0.8 : 1.0))),
        PEACHES(20, (count, itemPrice) -> count * itemPrice),
        GRAPES(30, (count, itemPrice) -> (count - Math.floorDiv(count, 2)) * itemPrice);
        private final PriceStrategy myPriceStrategy;
        private final int myItemPrice;
    
        Item(int itemPrice, PriceStrategy priceStrategy) {
            myPriceStrategy = priceStrategy;
            myItemPrice = itemPrice;
        }
    
        long getPrice(int count) {
            return myPriceStrategy.getPriceFor(count, myItemPrice);
        }
    
        @FunctionalInterface
        private interface PriceStrategy  {
            long getPriceFor(int count, int itemPrice);
        }
    }
    
    final class Basket {
        private final EnumMap<Item, Integer> myItems = new EnumMap<>(Item.class);
    
        void add(Item item, int count) {
            int current = myItems.getOrDefault(item, 0);
            myItems.put(item, current + count);
        }
        void add (Item item) {
            add(item, 1);
        }
    
        long getPrice() {
            return myItems.entrySet().stream()
                    .map(record -> record.getKey().getPrice(record.getValue()))
                    .reduce(Long::sum)
                    .orElse(0L);
        }
    }
    
    
    public class Shop {
        public static void main(String[] args) {
            Basket basket = new Basket();
            basket.add(Item.APPLES);
            basket.add(Item.GRAPES);
            basket.add(Item.PEACHES);
            System.out.println(basket.getPrice());
            basket.add(Item.APPLES);
            System.out.println(basket.getPrice());
            basket.add(Item.GRAPES);
            System.out.println(basket.getPrice());
            basket.add(Item.GRAPES);
            System.out.println(basket.getPrice());
        }
    }


    Вот вам супер-пупе объектно ориентированная джава.
    Ответить
    • Я не обязан понимать этот Ынтырпрайз. Переведи на «PHP».
      Ответить
      • <?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;
        Ответить
        • Блядь, как всё сложно. Именно поэтому «Конардо» против «ООП».
          Ответить
          • Мне не нравится (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;
            Ответить
          • тогда переведи питонячий вариант
            он проще намного
            Ответить
    • >Вот вам супер-пупе объектно ориентированная джава.
      Я плюсанул за енумы. Но это есть нюанс, который сильно раздражает.
      В енумах можно писать маловербозно и без функцианальной питушни:
      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;
          }
       
      }
      Ответить
      • я опять писал как на 8-й джаве, небось с девятки можно без функцпитушни
        Ответить
          • ебать
            век живи -- век учись
            спасибо

            впрочем, в коко я бы взял sealed classes, а на чистой джаве я уже почти не пишу, кроме старого кода
            Ответить
  • не стесняемcя, переписываем детскую задачку на Свой Любимый Язык
    Ответить
  • Как-то так:
    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
    Ответить
  • Блядь, и куда хотел пойти работипизированные в лист? числовия так захотельно не пришлости, у тут будет по не из приняты называется и на два.

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

      >хлопециально
      Высокосинтаксически.
      Проверил. Все словосочетанусы взязты из треда.
      Ответить
    • Только что об этом думал. Действительно, это важный аспект, который мало кто учитывает. Как оказывается, это на практике критично.
      Ответить
      • Есть реальный пример статистики, какие аспекты респонденты учитывают чаще всего?
        Ответить
    • Блядь
      Ты Велимир Хлебников что-ли?
      Ответить
  • Сколько можно мусолить это говно? Давайте что-то нормальное обсуждать.
    Ответить
    • Давайте. Например, будем строить нормальные плоскости к первым попавшимся прямым.
      Ответить
  • #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-датасаентист.
    Ответить
    • >Варианты когда покупатель просто не взял бесплатный виноград — не рассматриваются
      Жри виноград сука
      Ответить
    • Да он в магазины наверно не ходил даже. Или тупо протирал картой терминалы и не вникал в то, сколько чего он купил, не забыл ли забрать на кассе, и сколько это вообще стоило.
      Ответить
      • Не, ну я тоже особо не вникаю в детали ценника. А на вопрос "а это у вас по акции?" отвечаю "да хрен знает, считайте как посчитается"...

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

Добавить комментарий для guest Отменить ответ

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8