devclub.eu

IT-встречи в Таллине (на русском)

Домашнее задание для встречи 26.01

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

Мы возобновили практику домашних заданий. Как и раньше, к следующей встрече будет предложена простенькая задачка, победитель будет объявлен на встрече 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. Если вы не хотите, чтобы ваше решение показывали кому-либо, укажите это в письме.

Удачи!

Назад

Анонс встречи 26.01.10

Далее

Agile Saturday

28 комментариев

  1. vld

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

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

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

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

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

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

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

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

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

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

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

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

  3. kaznachei

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

  4. Oleg Ky

    Вот мой 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

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

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

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

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

        • если я правильно понял вопрос, то ответ — для всех. Т.е. при списке ревизий [«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»

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

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

создано с помощью WordPress & Автор темы: Anders Norén