497. Антивирус

Не решаласьСредняя

Вы работаете в компании «Кибериум», которая создаёт решения для информационной безопасности. Вместе с коллегами вы пишете инновационный антивирус, обеспечивающий непревзойдённую защиту и скорость реагирования на угрозы из сети. В основе антивируса лежит интеллектуальный анализатор фрагментов вредоносного кода, способный в режиме реального времени определять тип вируса по его фрагменту и применять к заражённой программе патч для её лечения. У вас есть большая база вредоносного кода, на которой вы хотите обучить анализатор.

Ваша задача

Фрагменты вредоносного кода закодированы в виде объектов и значений JavaScript. Нужно написать программу, определяющую общий тип данных для всех значений, содержащихся во входном массиве.

Формат ввода

У вас есть массив значений, среди которых могут быть как объекты, так и значения простых типов. Необходимо вывести тип TypeScript, которому будут удовлетворять все значения из массива.

Примечание

  • Гарантируется, что значениями примитивных типов могут быть только строки, числа, boolean, null и undefined.
  • У объектов значения полей могут быть только значениями примитивных типов, перечисленных выше.
  • Будет проверяться, что ваше решение выводит наиболее узкий тип (например, any или unknown не пройдут тесты).
  • Объекты логически группируются таким образом, что ключи объектов разных групп не пересекаются. При этом результирующий тип должен быть представлен как объединение типов, соответствующих каждой из групп.

Например, входной массив выглядит так:

[{type: ’spyware’, severity: ’medium’}, {severity: ’high’, target: ’winlogon.exe’}, {zippedSize: 12000, realSize: 56600}, {zippedSize: 105000, vector: ’usb_drive’}]

В этом случае первые два объекта выделяются в одну группу (так как имеют общий ключ severity), а оставшиеся два объекта — во вторую группу (так как имеют общий ключ zippedSize).

Вы должны вывести тип T1, которому соответствуют объекты первой группы, и тип T2, которому соответствуют объекты второй группы. Результирующий тип должен быть представлен как T1 | T2. При этом должно быть учтено, что значения, содержащие ключи из разных групп объектов, не должны удовлетворять результирующему типу.

Для примера выше это означает, что объект {type: ’spyware’, severity: ’medium’, target: ’winlogon.exe’} должен удовлетворять результирующему типу, а объект {type: ’spyware’, severity: ’medium’, realSize: 56600} не должен, поскольку содержит ключи из разных групп.

Необходимо учитывать количество различных значений примитивных типов string и number, которые являются элементами входного массива или значениями, соответствующими конкретному ключу объектов. Если различных значений больше пяти, то им должен непосредственно соответствовать тип string или number, иначе сопоставленный тип должен быть литеральным и представляться как объединение различных значений.

Например, входному массиву [1, 2, 3, 4, 5, 6] соответствует тип number, но входному массиву [1, 2, 3, 4, 5] соответствует тип 1|2|3|4|5.

Аналогично: входному массиву [{type: ’ransomware’, corruptUserData: true}, {type: ’adware’}] соответствует тип {type: ’ransomware’ | ’adware’, corruptUserData?: boolean}.

Ваше решение должно быть оформлено в виде функции, которая принимает единственный аргумент — массив значений. Функция должна возвращать результирующий тип в виде строки. Строка не должна предваряться ключевыми словами type, interface и именем типа. Другими словами, если результирующий тип — это type Result = {type: string, size: number}, вы должны вернуть только {type: string, size: number}.

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

function solution(values) {  
    // ваше решение
}

module.exports = solution;

Код пишется на языке JavaScript.

Ограничения

Ограничение времени

60 с

Ограничение памяти

1 000 МБ

Теги

JavaScript Node.js 20.14 + Chrome 125
Нужно войти, чтобы отправить решение.Войти