Sep 18

Мдя, решений моей задачки вообще нет. Неинтересно так. :(

Мое решение:

$filename = "test.txt";

class Tree {
    var $children = array();
    var $level;
    var $name;
}

function display($tree) {
    // кто знает, как вывести n строк подряд - подскажите
    for($i = 0; $i < $tree->level; $i++) echo "\\t";
    echo $tree->name . "n";
    foreach($tree->children as &$child)
        display($child);
}

$root = new Tree();
$root->level = -1;
$nodes = array($root);

foreach(file($filename) as $record)
{
    $record = preg_replace('/\\n|\\r\\n/', '', $record);
    list($id, $parent_id, $name) = explode('|', $record);

    $parent = $nodes[$parent_id];
    $node = new Tree();
    $node->level = $parent->level + 1;
    $node->name = $name;
    $parent->children[] = $node;
    $nodes[$id] = $node;
}

foreach($root->children as $child)
    display($child);

written by fxposter


4 Responses to “Задача №1: решение”

  1. 1. troorl Says:

    Вот моё решение на Python. Делал только что в полпятого утра, так что уж извините за корявость :)

    class node_data:
           def __init__(self, id, par, name):
                   self.id = id
                   self.par = par
                   self.name = name
    
           id = int()
           par = int()
           name = str()
    
    in_f = open('data.txt','r+')
    in_arr = in_f.readlines()
    node_list = list()
    
    for i in in_arr:
           (id, par, name) = i.split("|")
           node_list.append(node_data(int(id), int(par), name.split("\\n")[0]))
    
    def nodes_print(cur_nod, n_l, indent, rep_list):
           for i in n_l:
    
                   if(cur_nod.id not in rep_list):
                           rep_list.append(cur_nod.id)
                           print indent + cur_nod.name
                   if i.par == cur_nod.id:
                           indent += "\\t"
                           nodes_print(i, n_l, indent, rep_list)
    
    for i in node_list:
           if(i.par == 0):
                   nodes_print(i, node_list, "\\t", list())
  2. 2. FX Poster Says:

    Решение не катит:
    1. На один отступ больше. Ну это еще ладно. :)
    2. Посмотри на свою выдачу и сравни с моей. Особенно обрати внимание на Nikon и Canon ;) Да и TV не там, где нужно.

  3. 3. Graber Says:

    может уже не актуально, но все таки

    // кто знает, как вывести n строк подряд – подскажите
    print str_repeat(“\t”, $tree->level);

    И еще вопрос: зачем использовать класс? Я сам всеми руками и ногами за, но для этой тривиальной задачи мне кажется можно было обойтись и массивом array(‘name’, ‘children’, ‘level’);

  4. 4. FX Poster Says:

    Ага, благодарю.
    А я не знаю, как можно не юзая Древовидную структуру решить задачу за линейное время.

Leave a Reply