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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Задачка на сортировку файла
« : Декабрь 02, 2012, 03:18:53 pm »
Дан текстовый файл (UTF-8 with BOM)
Содержит дерево строковых элементов. Подчиненность обозначена табами.
например:
Цитировать
Элемент1ПервогоУровня
    Элемент1ВторогоУровня
    Элемент2ВторогоУровня
        Элемент1ТретьегоУровня
Элемент2ПервогоУровня
    Элемент1ВторогоУровня
и т.д.
Нужно получить копию исходного файла, но с отсортированными в пределах подчинения строками.

Исходный и отсортированный файлы прилагаются.
И мое решение на Lua под паролем  :)

ps Кодировка не важна. Можно конвертировать в подходящую.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #1 : Декабрь 02, 2012, 03:52:32 pm »
А что должно быть в результате обработки такого:
    z
    x
a
    y
    f
b
    a
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #2 : Декабрь 02, 2012, 03:58:01 pm »
В этом случае нужно ошибку выдать. Ибо это неправильный файл.

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #3 : Декабрь 02, 2012, 04:01:43 pm »
В этом случае нужно ошибку выдать. Ибо это неправильный файл.

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

А вот такое - тоже ошибка?
a
        b
    c
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #4 : Декабрь 02, 2012, 04:08:09 pm »
В этом случае можно либо ошибку выдать, либо считать что отступ b только на 1 больше отступа a (я делал так)
т.е. будто файл такой:
Цитировать
a
    b
    c


ps Блин, у себя уже ошибку нашел  :)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #5 : Декабрь 02, 2012, 04:11:20 pm »
В этом случае можно либо ошибку выдать, либо считать что отступ b только на 1 больше отступа a (я делал так)
т.е. будто файл такой:
Цитировать
a
    b
    c


ps Блин, у себя уже ошибку нашел  :)
Ну, вообще можно и виртуальный безымянный (анонимный) узел же создавать.
a
        z
        x
        y
    d
    c
    b
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #6 : Декабрь 02, 2012, 04:15:31 pm »
Можно и так.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #7 : Декабрь 02, 2012, 06:12:49 pm »
Ну, как-то так:
#include <iostream>
#include <map>
#include <vector>
#include <memory>

using namespace std;

struct node { multimap<string, shared_ptr<node>> childs; };

void print(const shared_ptr<node>& c, const size_t n)
{
    for (auto p : c->childs) {
        for (size_t i=0; i<n; i++) cout << '\t';
        cout << p.first << "\n";
        print(p.second, n+1);
    }
}

int main()
{
    vector<shared_ptr<node>> lasts;
    lasts.push_back(make_shared<node>());
    auto add = [&](string name) {
        auto n = make_shared<node>();
        lasts.back()->childs.insert({name, n});
        lasts.push_back(n);
    };
    string line;
    while (getline(cin, line)) {
        auto first = line.find_first_not_of('\t');
        while (lasts.size()>first+1) lasts.pop_back();
        while (lasts.size()<first+1) add("");
        add(string(line, first));
    }
    print(lasts.front(),0);
    return 0;
}
Работает на однобайтовых кодировках.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #8 : Декабрь 02, 2012, 06:36:45 pm »
Пипец я ничего не понял  ;D

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #9 : Декабрь 02, 2012, 06:39:23 pm »
Пипец я ничего не понял  ;D
Скорее ты не смог сделать над собой дОлжное усилие чтобы начать разбираться :-)
Примерно также я смотрю на код 1С и на всякое написанное кириллицей.
Y = λf.(λx.f (x x)) (λx.f (x x))

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #10 : Декабрь 02, 2012, 06:43:29 pm »
STD + новый стандарт делают код менее привычным. Особенно синтаксис анонимной функции.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка на сортировку файла
« Ответ #11 : Декабрь 02, 2012, 06:46:11 pm »
STD + новый стандарт делают код менее привычным. Особенно синтаксис анонимной функции.
Ну, что я могу сказать? Пора привыкать к хорошему :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #12 : Декабрь 02, 2012, 06:47:44 pm »
Я не понял даже где там сортировка. Коллекция это сама автоматом делает?

valexey_u

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Задачка на сортировку файла
« Ответ #14 : Декабрь 02, 2012, 06:52:23 pm »
Особенно синтаксис анонимной функции.
Это которая add?
Это функция?  :o  ;D ;D ;D
Нда тяжеловат для восприятия cpp с наскоку...  :D