Sunday 27 October 2013

Вопросы на собеседовании #4

Собеседование производилось на позицию Python разработчика, было очень весело и классно.

Вопрос взят с тестовых заданий Yandex.

Задача:
В системе авторизации есть ограничение — логин должен начинаться с латинской буквы, он может состоять из латинских букв, цифр, точки и минуса, но заканчиваться только латинской буквой или цифрой; минимальная длина логина составляет 1 символ, максимальная — 20 символов. Пожалуйста, напишите код, проверяющий соответствие входной строки этому правилу. Придумайте несколько способов решения задачи и сравните их.
Решение:
Я придумал только два способа, проверка условий if-ами и обычное регулярное выражение, аля
^(\w[\w\d\.-]{0,18}[\w\d]|\w)$

Больше в голову ничего не лезло. Попросили придумать вторую регулярку....ничего не придумал, но на идею меня потом натолкнули. Она чертовски классная!

Основана она на Законах Де Моргана  и по идее выполняется более быстро. Встречайте:


^(?![^a-zA-Z].*$|.*[^a-zA-Z\d]$|.{21,}$)(?=[a-zA-Z\d\.\-]*$)


Для поста я ее писал очень долго, не получалось внести последнее условие под "знак НЕ", в итоге так и не получилось и я бросил это занятие. Может быть даже и накосячил в этой.

В связи с моей недоработкой предлагаю вам внести крайнее условие под "знак НЕ" и предложить еще способы решения этой задачи. Пишите в комменты!

Другие части цикла: #1 #2 #3 #5

2 comments:

  1. ^(\w[\w\d\.-]{0,18}[\w\d]|\w)$ - не верное выражение хотя бы потому что \w содержит и цифры тоже
    второе чуть-чуть не верно :
    ^(?![^a-zA-Z].*$|.*[^a-zA-Z\d]$|.{21,}$)(?=[a-zA-Z\d\.\-]*$) - не сработает если логин равен ""
    ^(?![^a-zA-Z].*$|.*[^a-zA-Z\d]$|.{21,}$)(?=[a-zA-Z\d\.\-]+$) - сработает для всех условий :))

    А почему это должно быстрее работать?

    ReplyDelete
    Replies
    1. Уфф, ну вот и косяки полезли =) может как нить и поправлю =)

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

      Delete