- 1
- 2
- 3
- 4
- 5
https://habrahabr.ru/post/276673/
Какой-то пыхапист плачет что не может в элементарные алгоритмы. А весь хабр его утешает.
Ко-ко-ко! Зачем мне дерево в жизни обходить! Мне это не понадобится!
Куд-кудах! Я фронтэндщик и никогда даже массивы не сортировал. Ку-ка-реку!
есть разрабы которые умеют проблемы решать. есть разрабы которые из говна конфетки умеют делать. разрабы всякие нужны, разрабы всякие важны. садишь их вместе - и будет тебе щасце.
все относительно.
> не жалуется на хуевый оклад.
оклад должен зависеть от способности решать реальные проблемы, а не от результатов собеседования.
или начальство не должно жаловатся что народ разбегается через пару лет.
Не давно столкнулся с таким, продукт продается премии, повышенные оклады менеджерам это же они продают. Продажи софта падают давайте снизим ЗП программистам они делают хуевый продукт его не кто не хочет покупать.
Вот, что сказать таким людям?
Если он не будет уметь складывать 2+2 ты тоже скажешь что всё относительно?
как правило за первый год работы становится ясно что за человек. это конечно если ты пытаешься присматриваться, и так же соответственно даёшь разные типы работ что бы можно было увидеть сильные/слабые стороны нового сотрудника.
а так типично на новичков сваливают дерьмовую работу которую сениоры сами не хотят делать. как нанимают - хотят гениев. но даже если нашли гения - все равно какой тупой байдой мозги атрофируют, а потом жалуются что блин почему то гений какой захерелый.
И вообще гений отличается от обычного человека тем, что обычный человек довольствуется каким то одним уровнем, а гений идет вверх вечно
google://ректор+мгу+проценты
Aaaaaaa
Я не знаю подходящего алгоритма обхода дерева для решения, покажите. Пока что вижу единственный способ:
1) инициализируем массив нод корневым элементом
2) соединяем ноды
3) заполняем новый массив нод детишками старого
4) новый массив нод пустой? выход
5) свапаем старый массив с новым
6) гоуту(2)
2) соединяем за O(n) по скорости ноды
3) заполняем новый массив нод детишками старого, расходуя O(1) по памяти
4) новый массив нод пустой? асимптотически отптимально выходим жрать элитный доширак, ибо работа явно наша
5) свапаем старый массив с новым за O(1) по скорости (быстрее ограничения задания!)
6) гоуту(2)
...
>6) гоуту(2)
Количество итераций зависит от N.
Отптимально выходите с собеседования на улицу.
Такое ведь только для "дерева-в-массиве"?
Это, как минимум, уже другой случай (как "массив" и "отсортированный массив").
Хотя ифов тут и так выше крыши
при вызове тоже нужно ref писать
Что бы программист всегда был предупрежден && вооружен
И это хорошо.
P.S. Не заманивай меня на этот ваш c#
Да я скорее для себя решить пытаюсь, нужны мне плюсы или шарпа достаточно
Почему питоныч из скриптовых, а не экма например?
Потому что с экмой тебя затянет в веб. А ты же этого не хочешь?
> по любому там будут плюсы
Не факт. Но часто - да, странный кентавр под названием C/C++, которым так любят хвастаться в резюме...
C++/CLI от майкрософта. Мечты сбываются.
Кмк, тут и без функций прекрасно можно обойтись. Мой вариант:
Специально сходил проверил - его уже в комментах написали. На самом деле это классическая задачка для унылых индусособесов, таких на geeksforgeeks.com полно.
вроде, мысль понятна - использовать созданный список слоя сверху для продвижения по слою снизу, если я правильно понял идею алгоритма
Устранить конкурентов, выложив такой вот код
Код на сишке/плюсах там лучше вообще не смотреть. Зато можно почерпнуть интересные идеи для решения задач на собесах. Всегда лучше писать код самому. В целях подготовки к собесам - на бумажке.
P.S. Я тут года два назад читал API Design for C++, ужаснулся, как книжку с таким кодом вообще в печать выпустили. Дословно не помню, было что-то вроде
Книгу писал джавист?
Хотя... судя по if (stack) и delete stack - походу сишник, который даже не знал, что new не вернётся при недостатке памяти...
Однажды на собеседовании меня спосили, какие паттерны я знаю. Я сказал, что надо ПИСАТЬ КОД БЛЕАТЬ, а не забивать голову паттернами. Собеседование продлилось минут 10 от силы. Меня не взяли.
Думаю, ТС с хабра знает много паттернов и прочих красивых слов.
так сейчас универы таких и готовят. Много умных слов, всяких терминов, особого видения проблемы. А обычный алгоритм закодить - ну не царское это дело.
помню однокурсник в универе на полном серьезе спорил со мной на тему - "нахуя писать все эти сортировки, рандомизаторы и длинную арифметику если они уже давно в стандартных либах есть?"
А источник кривых пакетов найти весьма сложно (сетевухи вполне спокойно отправляют любой треш, не обязательно со своим MAC'ом). Приходится порты по одному отключать, а если коммутатор дешёвый - так вообще бегать и дёргать кабели...
Это, конечно, не ответ на вопрос "а почему вы взяли хуйню вместо структуры данных". Видимо, когда это все разрабатывалось, вопрос it безопасности мало кого ебал.
Кстати, а когда ms уже похоронит (NT)LM?
Емнип, только включать DHCP и покупать коммутатор подороже, с соотв. защитой. На самих компах не лечится. Со статическими айпишками тоже не лечится.
> не ответ на вопрос "а почему вы взяли хуйню вместо структуры данных"
Ну работало же, если целенаправленной атаки нету ;)
2. Видимо, когда это разрабатывалось, структуры себе писал каждый сам.
Надо конкретные железки смотреть, если ты про свою сеть. Ну и не пускать туда кого попало.
Ну а паблик вайфай в кафешках и прочих местах лучше по-дефолту считать скомпрометированным...
Там еще аутентификация challenge-response, ловишь - и сразу можно брутать. В крайнем случае митмом.
У ноды с val = 1 некорректно линк проставил. Перепиливай :)
left = left->right ? left->right : left->left;
Короче из рабочих вариантов, походу, остаётся только поиск в ширину, который выше написан.
P.S. А не, тож не вариант, нам же все уровни надо пролинковать, а не только верхний.
мне было очень лень жать ctrl+space в своей теплой и ламповой VS
Когда уже урлы запилят?!
P.S. "ну тогда пусть этот разраб, который не может решить примитивнейшую задачу, не жалуется на хуевый оклад"
А главное не нужную, для пыхаря - уж точно, задачу
И да, под стрессом вполне можно начать городить какую-то хуйню.
Нахуя - это уже другой вопрос. Меня бы и твоё решение за O(N) по памяти и асимптотическое O(N) по времени устроило. По крайней мере, его написать и проверить легко.
Один я разучился читать что-то сложнее форича?
Имхо достаточно убедиться что у человека есть мозг и он работает. По идее хватило бы и словесного описания работы алгоритма
nodes[level] - вот это растягиваться будет, т.к. ты не знаешь сколько у тебя уровней
.append(node) - и вот это тоже будет растягиваться. Или там связные списки?
Поэтому по времени выйдет асимптотическое O(количество узлов).
P.S. Или я гоню про асимптотику...
P.P.S. Амортизированное, слова спутал.
Ну он тоже изредка реаллокаться будет, т.к. длина изначально неизвестна. Или там не один сплошной блок, а список из страничек, как в крестоблядском std::deque?
Ну у меня там ещё рекурсия выкинута (код бежит по уже построенному слою когда строит следующий).
Вообще мне код показался годным. Для шарпа. С точки зрения плюсов оценить не могу
Креститься надо.
>Креститься надо.
>В крестах он не годный?
Или я чего-то не понял?
Перескажи своими словами пост.
Скорее бинарное дерево
hextree - ведьмодерево
Хотел сначала написать «бінарне дерево», потом решил применить славянский термин.
> Перескажи своими словами пост.
Статья со звёздочкой в помощь:
https://de.wikipedia.org/wiki/Prolog_(Programmiersprache)
А теперь своими словами.
Программа описывает четыре факта.
Факт №1:
Условие bintree с парой аргументов [Left, Val, Right] и bt(Left1, Val, Right1)) выполняется, если выполняется условие bintree с парой аргументов Left и Left1 и при этом выполняется условие bintree с парой аргументов Right и Right1.
Факт №2:
Условие bintree с парой аргументов Val и bt(Val) истинно.
Факт №3:
Условие nodes выполняется, когда его аргумент равен [[[8, 4, 9], 2, 5], 1, [6, 3, [10, 7, 11]]].
Факт №4:
Условие build_tree с аргументом Tree выполняется, если выполнено условие nodes с аргументом Nodes и выполнено условие bintree с парой аргументов Nodes и Tree.
Требуется: найти аргумент, удовлетворяющий build_tree.
*****
Разбор задачи.
Последние два факта можно сократить до одного:
Что такое bt, я не знаю.
>потом решил применить славянский термин.
И по-украински эот будет двiйкове?
https://goo.gl/tmZdqR
> И нахуй мне этот пролог в 16м году?
Я вообще не умею писать на декларативных ЯП. Но это же не означает, что декларативные ЯП не нужны?
> И по-украински эот будет двiйкове?
https://uk.wikipedia.org/wiki/Двійкова_система_числення
https://uk.wikipedia.org/wiki/Двійкове_дерево
True. Прежде, чем писать код, обычно нужно как следует разобраться в задаче.
Я же заводил тред про ращкаобразование, что ж ты тогда молчал. И нах он нужен? Или пережиток СССР?
- Петрович, что за дела? Зачем нам эти новые кривые стамески? - спросит он у начальника цеха после очередной утренней пятиминутки
- Семен, сколько можно! Новые станки тебе ненравятся, заготовки из красного дерева тебе ненравятся, техника безопасности тебе ненравится! Тебе хоть что нибудь нравится?
Семен поступил взгляд. Он чувствовал себя смущенным и виноватым, но ничего не мог с собой поделать.
- вот чем они лучше обычных плоских? Я всегда только плоскую...
- тьфу ты ну ты! - воскликнул в сердцах Петрович и зашагал прочь
Если на пальцах - пролог это что-то типа базы данных, в которой ты записываешь факты и правила, по которым из них можно вывести новые. А потом можешь задавать ему вопрос, а он пытается построить ответ на основе тех самых фактов.
Какую это пользу принесет конкретно тебе - думай сам. Скорее всего никакую, т.к. реляционок хватит.
При императивном подходе ты указываешь компьютеру точный порядок действий (с точностью до ветвлений), когда и что сделать. Применяется, когда заранее известен алгоритм решения задачи.
При декларативном подходе ты не раскрываешь, что и каким образом делать, а лишь описываешь взаимосвязи между данными, а поиск алгоритма решения доверяешь интерпретатору. Такой подход применяется, когда алгоритм решения неизвестен или труден.
Теоретически ты можешь перевести программу с декларативного ЯП (типа Пролога) на императивный (типа Си), но для этого понадобятся услуги математика. Приходится выбирать, ебаться самому с математическими выводами (чтобы получить программу на императивном языке) или доверить их машине (тупо вбив условия исходной задачи на декларативном языке).
- Пролог описывает логические формулы, и хорошо подходит для описания отношений и ограничений. Например, на нем можно легко выразить задачи из психотестов типа "У Васи есть питбуль, Сема живет в желтом доме, Петя живет справа от Васи, а у Петиной бабушки на окнах занавески" и т.д.
- Пролог не только лучше это может выразить чем, например, Питон, но в нем еще есть и инструменты для решения таких задач.
> Чем Пролог лучше Питона
- У Пролога более гибкий синтаксис (программист может вводить новые синтаксические конструкции).
- В Прологе меньше встроенных сущностей (т.е. язык сам по-себе меньше).
- В Прологе проще семантика (за очень редким исключением, программы не используют изменяемое состояние).
- Практически все реализации Пролога компилируются либо в натив, либо в оптимизированый байткод.
> Чем Пролог хуже Питона
- Нету стандартной хеш-таблицы и массива.
- Мало библиотек и мало пользователей.
> Чем Пролог хуже других
- Инструменты разработки не на высоте.
- Пролог не очень подходит для описания многопоточности / многозадачности.
В общем, забавный язычок для написания брутфорсов.
Интересно, у меня одного бомбит от того, что в SWI-шелле можно только вопросы задавать, факты добавлять нельзя?
Это все могут.
Делал как то обход файлов на пхп в одном из каталогов наткнулся на линк на каталог выше уровнем.
Программа не корректная, раз не проверяет такие вещи.
SWI как бы хорошая реализация с одной стороны (вотличие от ГНУ Пролог), но чем-то же коммерческие реализации должны быть лучше, если они существуют. Сикстус может быть не зависает, там где не нужно?
В SWI можно добавлять факты в шелле, эту возможность у пролога отобрать нельзя (ну, по крайней мере у стандарнтых реализаций). Просто нужно не сам-по себе факт писать а asssert(Term).
Угу. А какие-нибудь оптимизации и индексы в современные прологи завезли? Или всё тот же тупой поиск в глубину, как в старом добром турбо прологе?
>- Мало библиотек и мало пользователей.
Подумаешь, недостатки.
В ПХП например, нет массивов. В ж.скрипте - тоже нет, в Луа - тоже, но это не особенно им мешает. В Сишке нет хеш-таблиц, и опять же.
В Питоне есть массивы, но никто ими не пользуется.
У тебя нету ни массивов ни хешмепов. В луа и рнр одно заменяет другое.
> В Сишке нет хеш-таблиц, и опять же.
А сишку кроме как для системного программирования мало кто юзает.
>В Питоне есть массивы, но никто ими не пользуется.
Есть списки и кортежи, они заменяют массивы, ими очень часто пользуются.
А почему ты решил, что хеш-таблицы не нужны в системном программировании? Очень даже нужны, и поэтму в Си есть 100500 самодельных реализаций хеш-таблиц: http://stackoverflow.com/questions/1138742.
Ну, как бы да в Питоне массивами редко пользуются, о чем же и речь.
Про Луа и ПХП я не понял, расшифруй, чего у меня нету?
Я вот чего не могу понять: в питредах принято сигнались в condvar после того, как отпустил мутекс, и в целом понятно, почему.
А вот почему в жабе надо обжект.нотифаить с зохваченным монитором?
Да поди очередь ожидающих тредов защищена только самим монитором.
Если бы они так нужны - в нормальном языке были бы стандартные. Но си древний как гавно мамонта и юзается в основном для системного программирования, ему можно простить (а треды - околосистемная вещь), а пролог вроде ЯВУ же?
В луа и пхп есть гибрид списка и хешмепа, ты не в курсе был?
В сишке нет языкового механизма для объявления параметризованных типов контейнеров, потому и универсальных хэш-таблиц вы там не найдёте.
У разных сишкопроектов совершенно разные требования к производительности, разные стратегии выделения памяти, и куча других нюансов.
"Стандартная" сишная хэш-таблица, которая бы устроила почти всех, просто не может существовать.
В C++ такое вполне возможно благодаря шаблонам.
#include <unordered_map>
>"Стандартная" сишная хэш-таблица, которая бы устроила почти всех, просто не может существовать.
>В C++ такое вполне возможно благодаря шаблонам.
Нет, невозможно. http://stolyarov.info/guestbook#comment-606
Структуры данных не бывают универсальными, за исключением самых простых (массивов и списков), но использование контейнеров для массивов и списков заведомо бессмысленно — за более чем сомнительный выигрыш во времени кодирования мы при этом вынуждены расплачиваться феерическими приключениями во время отладки и сопровождения, причём ставки там приблизительно неделя (проигрыша) за пять минут (экономии); ну а более сложные структуры данных должны, естественно, проектироваться под каждую конкретную задачу (не под проект, а именно под каждую возникающую задачу), и generic они быть не могут — как следствие, ни о каком применении шаблонов при построении сложных (проблемно-ориентированных) структур данных не может быть никакой речи.
Плюсы - говно!
Ты, наверное, не знаешь немецкий или поленился прочитать статью. Пролог изобретён французом.
фикс
Какая разница? С теми примерами ты также не сталкивался.
ахахаха
Так вот почему сайт изредка ложится. Кто-то ддосит.