Привет, чертяки!

Мы возобновили практику домашних заданий. Как и раньше, к следующей встрече будет предложена простенькая задачка, победитель будет объявлен на встрече 26 января.

Задача: в дереве ревизий CVS надо найти последнюю ревизию в данной ветке. cvs-tree

Например, на рисунке справа есть две ветки: “experiment1″ и “experiment2″. В ветке “experiment1″ последняя ревизия – 1.3.2.4, а в ветке “experiment2″ – 1.3.4.1

Поскольку пример из жизни, то уже есть две реализации этой задачи.

Первая реализация – короткая, но некорректная. Она не учитывает случай, когда ревизия была удалена (см. картинку).

Вторая реализация – корректная, но громоздкая.

Домашние задание состоит в том, чтобы написать корректно и лаконично. Кто как может. Кому как нравится. Можно использовать любой язык программирования. Приветствуются методы и языки, о которых шла речь на двух последних встречах (Функциональное программирование, Python, C#, Haskell, Scala, Scratch, Alice :) ).

Ответы и вопросы можно писать здесь в комментариях или по мылу andrei punkt solntsev koer gmail punkt com. Если вы не хотите, чтобы ваше решение показывали кому-либо, укажите это в письме.

Удачи!

  1. vld says:

    “в дереве ревизий CVS надо найти последнюю ревизию в данной ветке…”

    видимо не в данной ветке, а среди experiment1 и experiment2

    • Нет, нужно именно в данной ветку.
      То есть если на входе дано “experiment1″, то надо вернуть 1.3.2.4, а если “experiment2, то 1.3.4.1

  2. Дмитрий Жучков says:

    Надеюсь, я правильно понял задание, т.е. используется система версий описанная в документации http://www.cs.utah.edu/dept/old/texinfo/cvs/cvs_3.html и входным параметром подается мажорная версия бранча (например 1.3.2)

    Ruby: http://gist.github.com/278416

    • классное решение.

    • Да, задание такое.
      Решение на Руби… Хм.. пытаюсь осмыслить..

      • Дмитрий Жучков says:

        Там два действия. Первое выборка регексом набора версий из указанного бранча. Второе поиск в выборке максимальной версии по минорной ее части.

    • Дмитрий Жучков says:

      Апдейт, по понятным причинам заискейпил точки в строке бранча перед использованием в регексе. Обновленный вариант там же http://gist.github.com/278416

      • Ага, клёва.
        Только вот малопонятно =)) Ну да ладно. Мой питон тоже хаяли =))
        Я хотел только отметить, что на входе приходит немного другая вещь. В твоем случае это должно было быть:
        branch = “1.3.0.2″
        И из него уже делается “1.3.2″
        А вообще клёва, да =))

  3. kaznachei says:

    а Руби вариант да, жжот.

  4. Oleg Ky says:

    Вот мой C#
    http://pastebin.com/m4739bd84
    Почти тоже самое что у Казначея только с регулярным :)

  5. Непонятно, откуда может взяться ноль т.к. судя по документации “CVS creates a branch number it picks the first unused even integer, starting with 2.”, так что я последую за Димой и проигнорирую его :)
    Мое решение на Haskell без регэкспов т.к. лень было подключать библиотеки
    http://pastebin.com/f168344c4

      • хаскель рулит однозначно!

      • Дмитрий Жучков says:

        Очень интересно. Надо будет углубиться в хаскель.

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

        • если я правильно понял вопрос, то ответ – для всех. Т.е. при списке ревизий ["1.3.2.1", "1.3.2.4", "1.3.4.1", "1.3.2.1.2.1", "1.3.2.1.2.30"] для “1.3.2″ выдаст “1.3.2.4″, а для “1.3.2.1″ – “1.3.2.1.2.30″

          • Дмитрий Жучков says:

            А как работают типы в хаскеле? Я смотрю что у тебя набор из строковых констант. Когда вызывается функция maximum, то как она производит сравнение? Это будет строковое сравнение или числовое? Просто во многих языках, и в частности руби “11″ < "2"

            • Димыч, ты совершенно прав! Я напрочь забыл про лексикографический порядок. Строки в Хаскеле это списки Чар-ов и для них определены инстансы классов Eq и Ord. Без регэкспов пришлось извратиться, чтобы отрезать номер ревизии и перевести его в Инт, вот собсно фикс, уже не так красиво:
              http://pastebin.com/f7cc9f301

*