Здравствуйте, CodeMonkey, Вы писали:
НС>>Порвались шаблоны? Понимаю. CM>Все в пределах стандартных шаблонов — самые криворукие всегда уверены, что делают всё идеально ЭДК в действии.
Ну да, ты погряз в багфиксинге, я криворукие те, кто умеет без. Логично, чо.
Здравствуйте, CodeMonkey, Вы писали:
НС>>Заказы то у всех разные. Кому остатки на складах, а кому всякий AI и cognitive. CM>А, ну это всё объясняет. Никакое тестирование вообще не предусмотрено, да и кода — с гулькин нос.
Здравствуйте, iriska2, Вы писали:
I>Я тебя пожалуй поддержу, с одной стороны такую задачу конечно надо уметь решить, с другой стороны отсеивать человека потому что, он не решил одну задачу это МАРАЗМ.
Это смотря с какой стороны глядеть. Если со стороны собеседуемого, то конечно. А если со стороны собеседующего, когда тебе несколько десятков кандидатов надо просмотреть — не тако уж и маразм.
Здравствуйте, Somescout, Вы писали:
S>когда мне говорят LL/LR/RL/прочая хрень, для меня это просто буквы (и мне не сильно интересно лезть разбирать что это такое), но если меня попросят сделать парсер алгебраических выражений, я его сделаю
Просто факт. AI в его современном виде — это, в общем-то, шаманистика. Как оно работает, и вообще работает ли на каких-то данных, кроме тестового набора — никто толком не понимает. Получили правильный результат хотя бы в 51% случаев — протрубили победу. Не получили — надо добавлять в отвар больше говна мамонта и крови девстенниц, пока не получили хотя бы 51%.
А если потом выясняется, что, например, нейросеть распознает не объекты на фоне, а сам фон — никто не виноват. http://innovation.uci.edu/2017/08/husky-or-wolf-using-a-black-box-learning-model-to-avoid-adoption-errors/
Bleeding edge, ептыть, какие могут быть претензии
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Somescout, Вы писали:
S>>когда мне говорят LL/LR/RL/прочая хрень, для меня это просто буквы (и мне не сильно интересно лезть разбирать что это такое), но если меня попросят сделать парсер алгебраических выражений, я его сделаю
НС>Можно раскрыть как? Регексами, да?
Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.
Буду исходить из того что парсить требуется простую арифметику из чисел, операторов и скобок.
Сначала напишу токенизатор.
Парсить буду рекурсивно. Первый вызов парсера помечается как корневой.
1) Если не задан левый операнд, то берём токен с левым операндом
Если это открывающая скобка, то для получения левого операнда вызываем рекурсивно парсер.
left = parser(tokenizer, left:null, root:false)
Если это число, то оно сразу становится левым операндом
В ином случае исключение
2) Берём токен с операцией (если это не операция - исключение)
3) Берём токен с правым операндом по тем же правилам, что и левый
4) Подглядываем на следующую операцию, если приоритет её выше чем у нашей, то заменяем правый операнд результатом работы парсера с переданным ему текущим правым операндом
right = parser(tokenizer, left:right, root:false)
5) применяем операцию к операндам, помещаем результат в левый операнд, если приоритет следующей операции равен приоритету текущей или парсер корневой - переходим к 2
Если токен следующей операции это закрывающая скобка, то извлекаем токен (скобку) и возвращаем левый операнд
если нет либо если конец выражения, то возвращаем результат
Примерно так.
ЗЫ. Регэкспами, при здравом размышлении, интересный вариант — quick and dirty, но будет работать.
Здравствуйте, CodeMonkey, Вы писали:
НС>>Ну да, ты погряз в багфиксинге, я криворукие те, кто умеет без. Логично, чо. CM>Я пока не видел ни одной проги без багов.
Это больше говорит о твоем кругозоре.
CM> А это значит, что те, кто "не погряз в багфиксинге" — просто ничего не фиксят.
Не значит. Это значит что мы много сил уделяем качеству кода еще до того, как на продакшене полезут баги. Но ты явно даже не понимаешь о чем речь.
Ага, придуманный тобой. Иначе ведь можно сделать некоторое количество выводов, угрожающих твоим шаблонам и твоему восприятию себя непризнанным гением от программирования.
CM> AI в его современном виде — это, в общем-то, шаманистика. Как оно работает, и вообще работает ли на каких-то данных, кроме тестового набора — никто толком не понимает.
Если ты не понимаешь, это не означает что никто не понимает.
CM> Получили правильный результат хотя бы в 51% случаев — протрубили победу. Не получили — надо добавлять в отвар больше говна мамонта и крови девстенниц, пока не получили хотя бы 51%.
Здравствуйте, Somescout, Вы писали:
S>Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.
Да тут рядом предлагали на полном серьезе.
S>Сначала напишу токенизатор.
Как? Или про НКА-ДКА ты все таки слышал?
S>Примерно так.
Ты LL и описал. Только у LL есть определенные проблемки со сложными приоритетами.
S>ЗЫ. Регэкспами, при здравом размышлении, интересный вариант — quick and dirty, но будет работать.
Т.е. про классы грамматик ты не в курсе? Огорчу — приоритеты и скобки ты на регексах не распарсишь, это в регулярные грамматики невпихуемо, даже с фиксированным LA.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Зачем извращаться: сделать регэкспами парсер учитывающий приоритет операций наверно можно, но это уже эзотерическое программирование.
НС>Да тут рядом предлагали на полном серьезе.
Я на полном серьёзе обдумал, и думаю это возможно. Не за один проход, само собой. Но если несколько раз пройти по выражению, сначала обработав все вложенные скобки
(\([^(]+\))
Заменив их результатом парсинга операций.
Содержимое скобок парсим в два этапа:
1) ([\d*/]+) — умножение и деление, в первую очередь,
2) ([\d+\-]+) — сложение и вычитание.
На выходе получаем число
НС>Как? Или про НКА-ДКА ты все таки слышал?
Нет, я слышал про токенизатор, и думаю что класс, делящий строку на функциональные компоненты для указанного мной примера я напишу и без сакральных знаний (хотя потребуется костыль для отрицательных чисел).
НС>Ты LL и описал. Только у LL есть определенные проблемки со сложными приоритетами.
Ну я подозревал что во что-то подобное ткну пальцем.
S>>ЗЫ. Регэкспами, при здравом размышлении, интересный вариант — quick and dirty, но будет работать.
НС>Т.е. про классы грамматик ты не в курсе? Огорчу — приоритеты и скобки ты на регексах не распарсишь, это в регулярные грамматики невпихуемо, даже с фиксированным LA.
Регэкспами можно парсить сбалансированные скобки. Я даже делал это for fun — реализация dotNet Regex поддерживает balanced group matching.
Но в данном случае это не нужно, достаточно нескольких итераций упрощения выражения.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Чтобы оценить. У нас пока 16-ричной системе с детства не учат, десятичная прописана у всех глубоко в моск.
Чтобы оценить, достаточно посчитать число разрядов. Переводить ничего не надо.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Если ты не понимаешь, это не означает что никто не понимает.
Верно, но не к месту. Полагаю, про converse error ты никогда не слышал?
НС>Главное что мы получили результат, лучший в мире. И этот результат вполне устраивает наших клиентов.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Ты LL и описал. Только у LL есть определенные проблемки со сложными приоритетами.
Проблемы у него есть с левыми рекурсиями, но это решается модификацией грамматики. Что там за "сложные приоритеты" — этому, видимо, только особо избранных учат
CM>Так это и есть твои "сверхмалые и сверхэффективные алгоритмы"?
Сверхмалые и сверхэффективные алгоритмы имеет смысл применять примерно в одном случае из ста. Что конечно же не отменяет того факта, что они важны и нужны — тот самый редкий случай может поставить колом весь проект.
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>Сначала напишу токенизатор. НС>Как? Или про НКА-ДКА ты все таки слышал?
В 12-13 лет написал рекурсивный вычислитель арифметических выражений (инфиксных), с приоритетами и скобками. Времени ЕМНИП заняло час-два. На тот момент и не слышал таких понятий как токенизаторы, автоматы, грамматики, регулярные выражения, генераторы парсеров и т.п. Руководствовался исключительно интуицией и логикой.
Ни в коем случае не хочу сказать что программисту это знать не нужно, наоборот — нужно, получилось бы проще, качественнее и быстрее. Но поинт в том что задача вообще-то простая