Привет, чертяки!
Мы возобновили практику домашних заданий. Как и раньше, к следующей встрече будет предложена простенькая задачка, победитель будет объявлен на встрече 26 января.
Задача: в дереве ревизий CVS надо найти последнюю ревизию в данной ветке. 
Например, на рисунке справа есть две ветки: “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. Если вы не хотите, чтобы ваше решение показывали кому-либо, укажите это в письме.
Удачи!
Python: http://pastebin.com/f5c4cf62d
Python (ФП, без переменных): http://pastebin.com/f5dffba97
JavaScript: http://pastebin.com/f4e77bf7a
“в дереве ревизий CVS надо найти последнюю ревизию в данной ветке…”
видимо не в данной ветке, а среди experiment1 и experiment2
Нет, нужно именно в данной ветку.
То есть если на входе дано “experiment1″, то надо вернуть 1.3.2.4, а если “experiment2, то 1.3.4.1
Надеюсь, я правильно понял задание, т.е. используется система версий описанная в документации 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″
А вообще клёва, да =))
С#
http://pastebin.com/m2d90b33a
а Руби вариант да, жжот.
вариант с С# тоже довольно неплох
http://gist.github.com/280098
как то наивно императивно
где твой вариант? ))
а я всё никак Brainf*ck не осилю
как осилишь, берись за Whitespace
жизни не хватит
Домашние задание состоит в том, чтобы написать корректно и лаконично.
согласен. просто после руби не смотрится
Вот мой C#
http://pastebin.com/m4739bd84
Почти тоже самое что у Казначея только с регулярным
Непонятно, откуда может взяться ноль т.к. судя по документации “CVS creates a branch number it picks the first unused even integer, starting with 2.”, так что я последую за Димой и проигнорирую его
Мое решение на Haskell без регэкспов т.к. лень было подключать библиотеки
http://pastebin.com/f168344c4
апдейт http://pastebin.com/f41489c1f
хаскель рулит однозначно!
Очень интересно. Надо будет углубиться в хаскель.
Паша, а это решение работает для всех случаев входных параметров или только для одноразрядных номеров версий?
если я правильно понял вопрос, то ответ – для всех. Т.е. при списке ревизий ["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