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

Удачи!

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

  1. vld:

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

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

    1. Нет, нужно именно в данной ветку.
      То есть если на входе дано «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

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

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

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

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

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

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

  3. kaznachei:

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

    1. вариант с С# тоже довольно неплох

        1. а я всё никак Brainf*ck не осилю 🙂

          1. как осилишь, берись за Whitespace 🙂

      1. C#:

        Домашние задание состоит в том, чтобы написать корректно и лаконично. 😉

        1. согласен. просто после руби не смотрится 🙂

  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. хаскель рулит однозначно!

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

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

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

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

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

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

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

What do you think?

Note: Your email address will not be published

You may use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*