...

Задача

Написать программу, которая читала бы псевдографическое дерево каталогов и писала бы список путей ко всем каталогам.

Примеры данных

Маленький пример

На входе:

/etc/NetworkManager
|-- conf.d
|-- dispatcher.d
|   |-- no-wait.d
|   |-- pre-down.d
|   `-- pre-up.d
|-- dnsmasq.d
|-- dnsmasq-shared.d
`-- system-connections

Ожидаемый результат:

/etc/NetworkManager
/etc/NetworkManager/conf.d
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/no-wait.d
/etc/NetworkManager/dispatcher.d/pre-down.d
/etc/NetworkManager/dispatcher.d/pre-up.d
/etc/NetworkManager/dnsmasq.d
/etc/NetworkManager/dnsmasq-shared.d
/etc/NetworkManager/system-connections

Просто для информации, эти списки получились в результате выполнения таких команд:

$ tree -d --charset ASCII --noreport /etc/NetworkManager 
$ find /etc/NetworkManager -name '.*' -prune -o -type d -print |sort 

Большой пример

На входе: файл

Ожидаемый результат: файл

Просто для информации: это каталоги в репозитории с исходным кодом Firefox. Списки получились в результате выполнения таких команд:

$ hg clone https://hg.mozilla.org/mozilla-central/
$ tree -d mozilla-central --charset ASCII --noreport >dirs_firefox_repo_tree.txt
$ find mozilla-central -name '.*' -prune -o -type d -print |sort >dirs_firefox_repo_paths.txt

Как выглядит успешное решение (проверь себя)

dirs_tree – файл с деревом каталогов
dirs_paths – файл со списком путей
my_program – программа для конвертации

Запускаем программу и сравниваем результат с эталоном:

$ cat dirs_tree |my_program > dirs_paths_converted
$ diff -u dirs_paths dirs_paths_converted |wc -l
0

Успех – 0 в последнем diff (=результат совпадает с эталоном).

Погнали?

  • Сколько строчек кода будет в твоем решении?
  • Сколько времени займет написание программы?

Почему мне нравится эта задача

  • Задача небольшая
  • сложных теоретических знаний не требуется
  • но все-таки надо аккуратно применить одну классическую структуру данных (не буду подсказывать какую)
  • что-нибудь подобное вполне может встретиться в реальной жизни; причем скорее даже не в разработке сервисов, а при решении эксплуатационных задач
  • и это обработка текста, а такое мне всегда нравится