Яндекс Блиц Фронт 2: квалификация

Яндекс Блиц Фронт 2: квалификация



Расставляем по полочкам


Маша работает мерчендайзером в компании АльМека. Завтра у неё экзамен после переподготовки и она к нему готовится в последний день. В голове у Маши всё перемешалось. Помнит она то ли про товары, то ли про отзывы на товары. Нужно помочь ей расставить всё по местам и сериализовать итоговый результат в текстовый документ.

Известно, что есть 2 типа данных: good и comment.

class Good {
    name: string;
    comments: Comment[];
    related: Good[];
};

class Comment {
    text: string;
    comments: Comment[];
    parent: Good | Comment;
};

На входе: Ссылка на JS-объект На выходе: Строка в формате Markdown со всеми найденными данными

Markdown-документ должен иметь следующий формат:

## Отзывы

- %Отзыв 1% - про %Товар 1%
  - %Ответ на отзыв 1%
  - %Ответ на отзыв 2%
    - %Ответ на ответ к отзыву 1%
  - %Ответ на отзыв 3%
- %Отзыв 2% - про %Товар 2%
- %Отзыв 3% - про %Товар 3%
  - %Ответ на отзыв 4%
  - %Ответ на отзыв 5%

## Товары

- %Товар 1%
  * %Товар 2%
- %Товар 3%
  * %Товар 2%
  * %Товар 4%

Шаблон решения

Ваше решение должно содержать CommonJS-модуль, экспортирующий функцию, соответствующую следующей сигнатуре:

/**
 * @param {Good|Comment} data - ссылка на товар, отзыв или ответ на отзыв,
 * из которой нужно восстановить все возможные данные
 * @return {string}
 */
module.exports = function (data) {
    // ваш код
    return ’…’;
}

Примеры

// Товары в памяти
const Good1 = { type: ’good’, name: ’Смесь Friso Frisolaс Gold 2035’, comments: [], related: [] };
const Good2 = { type: ’good’, name: ’МакБук PRO 2035 13\’ w/ clickbar’, comments: [], related: [] };
const Good3 = { type: ’good’, name: ’Фигурка Funko POP! Vinyl: Overwatch Уинстон’, comments: [], related: [] };

// Отзывы в памяти
const Comment1 = { type: ’comment’, text: ’Классный ноутбук!’, comments: [], parent: null };
const Comment2 = { type: ’comment’, text: ’Не понравился! Кликбар не работает совсем!’, comments: [], parent: null };
const Comment3 = { type: ’comment’, text: ’Хорошая цена, у малыша не было аллергии на неё’, comments: [], parent: null };

// Похожие товары
Good3.related.push(Good1, Good2)
Good1.related.push(Good3)
Good2.related.push(Good3)

// Расставляем комментарии
Comment1.parent = Good2;
Good2.comments.push(Comment1);

Comment2.parent = Comment1;
Comment1.comments.push(Comment2);

Comment3.parent = Good1;
Good1.comments.push(Comment3);

// А ссылка осталась только на третий отзыв :-(
module.exports = Comment3;

Если вывести ссылку, получается такая структура:

{ type: ’comment’,
  text: ’Хорошая цена, у малыша не было аллергии на неё’,
  comments: [],
  parent:
   { type: ’good’,
     name: ’Смесь Friso Frisolaс Gold 2035’,
     comments: [ [Circular] ],
     related:
      [ { type: ’good’,
          name: ’Фигурка Funko POP! Vinyl: Overwatch Уинстон’,
          comments: [],
          related:
           [ [Circular],
             { type: ’good’,
               name: ’МакБук PRO 2035 13\’ w/ clickbar’,
               comments:
                [ { type: ’comment’,
                    text: ’Классный ноутбук!’,
                    comments:
                     [ { type: ’comment’,
                         text: ’Не понравился! Кликбар не работает совсем!’,
                         comments: [],
                         parent: [Circular] } ],
                    parent: [Circular] } ],
               related: [ [Circular] ] } ] } ] } }

На выходе должен получится текст в формате Markdown со всеми найденными товарами и отзывами, отсортированными в алфавитном порядке:

## Отзывы

- Классный ноутбук! - про МакБук PRO 2035 13\’ w/ clickbar
  - Не понравился! Кликбар не работает совсем!
- Хорошая цена, у малыша не было аллергии на неё - про Смесь Friso Frisolaс Gold 2035

## Товары

- МакБук PRO 2035 13’ w/ clickbar
  * Фигурка Funko POP! Vinyl: Overwatch Уинстон
- Смесь Friso Frisolaс Gold 2035
  * Фигурка Funko POP! Vinyl: Overwatch Уинстон
- Фигурка Funko POP! Vinyl: Overwatch Уинстон
  * МакБук PRO 2035 13’ w/ clickbar
  * Смесь Friso Frisolaс Gold 2035


Report Page