Автор Тема: Задачка на сортировку файла  (Прочитано 21119 раз)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #15 : Декабрь 02, 2012, 06:54:37 pm »
Я не понял даже где там сортировка. Коллекция это сама автоматом делает?
Да. Контейнер std::multimap сортирует по ключам. Красно-черное дерево (одна из возможных реализаций).
Вот оно че! Теперь начинаю врубаться  :)

Мне свой говнокод показывать или подождать?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #16 : Декабрь 02, 2012, 06:54:51 pm »
Особенно синтаксис анонимной функции.
Это которая add?
Это функция?  :o  ;D ;D ;D
Нда тяжеловат для восприятия cpp с наскоку...  :D
Это лямбда-функций а не функция :-)
Вообще, функциональность как бэ ощущается в использовании:
add(string(line, first));Я бы даже сказал что это лямбда-процедура :-D

Как будто во всяких Lua не то же самое с лямбдами.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #17 : Декабрь 02, 2012, 06:56:49 pm »
Я не понял даже где там сортировка. Коллекция это сама автоматом делает?
Да. Контейнер std::multimap сортирует по ключам. Красно-черное дерево (одна из возможных реализаций).
Вот оно че! Теперь начинаю врубаться  :)

Мне свой говнокод показывать или подождать?
Ну, я готов посмотреть. Но если есть желающие еще накодить, возможно стоит подождать. (С++ тут не слишком популярен, так что думаю что придумать свой алгоритм/реализацию народу не сложнее чем разобраться в моем коде :-) (особенно психологически) )
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #18 : Декабрь 02, 2012, 06:59:15 pm »
...думаю что придумать свой алгоритм/реализацию народу не сложнее чем разобраться в моем коде :-) (особенно психологически) )
;D
Удобно однако. И обфускатор не нужон  ;D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #19 : Декабрь 02, 2012, 07:02:36 pm »
...думаю что придумать свой алгоритм/реализацию народу не сложнее чем разобраться в моем коде :-) (особенно психологически) )
;D
Удобно однако. И обфускатор не нужон  ;D
Нужен, если вокруг плюсовики :-)

Это как моя бабушка рассказывала, что когда её родители не хотели чтобы она понимала о чем они говорят, они беседовали на немецком.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #20 : Декабрь 02, 2012, 07:08:39 pm »
Ладно вот моя обезьянка. Собсна скрывать нечего. Типичный говнокод  :D
function print_tree(tree, indent)
    indent = indent or 1
    for _, branch in ipairs(tree.children) do
        print(string.rep('    ', indent) .. branch.value)
        if branch.children then
            print_tree(branch, indent + 1)
        end
    end
end

function comp(a, b)
    return a.value < b.value
end

function read(file)
    local line = file:read()
    if not line then
        return nil
    end
    local _, indent = line:find('%s+')
    local last = indent
    local first = indent
    local tree = {children = {}}
    local branch
    while line do
        _, indent = line:find('%s+')
        if indent < first then
            print('error 001')
            return nil
        end
        if indent > last then
            tree = branch
            tree.children = {}
            last = last + 1
        else
            while indent < last do
                table.sort(tree.children, comp)
                tree = tree.parent
                last = last - 1
            end
        end
        branch = {parent = tree, value = line:sub(indent + 1)}
        table.insert(tree.children, branch)
        line = file:read()
    end
    while tree.parent do
        table.sort(tree.children, comp)
        tree = tree.parent
    end
    return tree
end

if arg[1] then
    local file = io.open(arg[1])
    if file and file:seek('set', 3) then
        local tree = read(file)
        if tree then
            print_tree(tree)
        else
            print('epic fail...')
        end
    end
end

И даже ошибка есть (и даже наверно не одна), но мою конкретную задачу хорошо решает на тех файлах, что я прикладывал.

Работает из командной строки. Принимает один аргумент (путь к исходному файлу)
Вываливает в консоль результат. Вывод конечно можно в файл перенаправить.

ps пароль: oberspace

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #21 : Декабрь 02, 2012, 07:17:28 pm »
Да, моя программа все читает из stdin и выводит на stdout. Смысла в файлах не нашел :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #22 : Декабрь 02, 2012, 07:26:25 pm »
valexey_u, а у тебя результат такой же как у меня?
Можешь выложить? Любопытно дифом пройтись  :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #23 : Декабрь 02, 2012, 07:36:16 pm »
valexey_u, а у тебя результат такой же как у меня?
Можешь выложить? Любопытно дифом пройтись  :)
Дифом не ходил, но на первый взгляд похоже.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #24 : Декабрь 02, 2012, 07:43:33 pm »
Да, и вот скажи, зачем мне Lua, если на плюсах типичную "скриптовую" задачку получается написать быстрее, надежней, компактней и на более высоком уровне? ;-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #25 : Декабрь 02, 2012, 07:48:45 pm »
Диф показывает небольшие отличия. Но это потому что мы по разному решили обозначенные тобой выше проблемы.
А в общем одинаково.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #26 : Декабрь 02, 2012, 07:50:48 pm »
Диф показывает небольшие отличия. Но это потому что мы по разному решили обозначенные тобой выше проблемы.
А в общем одинаково.

Кстати, твоя программа у меня падает на таком:
a
b
c
z
y
x

Ругается так:
lua.EXE: main.lua:27: attempt to compare nil with number
stack traceback:
        main.lua:27: in function 'read'
        main.lua:56: in main chunk
        [C]: ?
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #27 : Декабрь 02, 2012, 07:54:33 pm »
Да да. Это та ошибка которую я нашел. На моих файлах просто всегда есть отступ хотя бы в 1 таб. И я на это не обратил внимания.

Если отступ нулевой то строчка:
local _, indent = line:find('%s+')
в indent помещает nil. А я это не обрабатываю.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #28 : Декабрь 02, 2012, 08:02:10 pm »
И еще одна особенность моего алгоритма:
Я не сортирую первый уровень. Ибо не надо. На тех файлах всегда 1 корневой элемент.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #29 : Декабрь 02, 2012, 08:16:23 pm »
Да, и вот скажи, зачем мне Lua, если на плюсах типичную "скриптовую" задачку получается написать быстрее, надежней, компактней и на более высоком уровне? ;-)
Ну тебе знающему cpp конеш  ;)
А у меня выбора нет  :P