Привет, чертяки!
Мы возобновили практику домашних заданий. Как и раньше, к следующей встрече будет предложена простенькая задачка, победитель будет объявлен на встрече 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
vld
«в дереве ревизий CVS надо найти последнюю ревизию в данной ветке…»
видимо не в данной ветке, а среди experiment1 и experiment2
Andrei Solntsev
Нет, нужно именно в данной ветку.
То есть если на входе дано «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
Антон Архипов
классное решение.
Andrei Solntsev
Да, задание такое.
Решение на Руби… Хм.. пытаюсь осмыслить..
Дмитрий Жучков
Там два действия. Первое выборка регексом набора версий из указанного бранча. Второе поиск в выборке максимальной версии по минорной ее части.
Дмитрий Жучков
Апдейт, по понятным причинам заискейпил точки в строке бранча перед использованием в регексе. Обновленный вариант там же http://gist.github.com/278416
Александр Мочёнов
Ага, клёва.
Только вот малопонятно =)) Ну да ладно. Мой питон тоже хаяли =))
Я хотел только отметить, что на входе приходит немного другая вещь. В твоем случае это должно было быть:
branch = «1.3.0.2»
И из него уже делается «1.3.2»
А вообще клёва, да =))
kaznachei
С#
http://pastebin.com/m2d90b33a
kaznachei
а Руби вариант да, жжот.
Антон Архипов
вариант с С# тоже довольно неплох
C#
http://gist.github.com/280098
Антон Архипов
как то наивно императивно 🙂
Jevgeni Holodkov
где твой вариант? ))
Антон Архипов
а я всё никак Brainf*ck не осилю 🙂
Павел Григоренко
как осилишь, берись за Whitespace 🙂
Антон Архипов
жизни не хватит
C#
Домашние задание состоит в том, чтобы написать корректно и лаконично. 😉
Антон Архипов
согласен. просто после руби не смотрится 🙂
Oleg Ky
Вот мой 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