Логотип YeaHub

Мемоизация с объектами и массивами в аргументах (Memoize with Object Arguments)

3

JavaScriptPython

Кэширование

Т-Банк

Условие: Реализуйте функцию memoize(fn), которая возвращает мемоизированную версию fn. Аргументы могут быть примитивами, массивами и объектами (в Python dict и list), в том числе вложенными. Два вызова считаются одинаковыми, если их аргументы равны по структуре, а не по ссылке. При повторном вызове с равными аргументами результат берётся из кэша и fn не вызывается.

Правила сравнения:

  • порядок ключей в объекте не важен: {a: 1, b: 2} и {b: 2, a: 1} считаются одним и тем же аргументом;

  • порядок элементов в массиве важен: [1, 2] и [2, 1] разные аргументы;

  • типы различаются: 1 и "1" разные аргументы;

  • порядок аргументов важен: fn(a, b) и fn(b, a) кэшируются отдельно.

Входные данные: Функция fn и последовательность вызовов мемоизированной версии с аргументами.

Выходные данные: Мемоизированная функция. Тесты проверяют возвращаемые значения и количество реальных вызовов fn.

Ограничения:

  • 0 <= число аргументов <= 5

  • глубина вложенности не более 5

  • значения: числа, строки, булевы, null, массивы, объекты

  • нет циклических ссылок, функций и undefined

Пример:

Вход: fn = (obj, arr) => obj.a + arr.length

  • memoized({a: 1, b: 2}, [1, 2]) → 3 (вычисляется, fn вызвана 1 раз)

  • memoized({b: 2, a: 1}, [1, 2]) → 3 (из кэша, fn вызвана 1 раз)

  • memoized({a: 1, b: 2}, [2, 1]) → 3 (вычисляется, fn вызвана 2 раза)

Loading...