🪿 IT Птица · подготовка к собесу

Яндекс — 1-й этап: реальные задачи

Условия задач и код — как их реально давали на собесах. Решения ищи сам.

Формат: лайвкодингЗП: 250–300К33 собесов
💡 Иди сверху вниз (свежие первые). Каждая карточка — отдельный собес с его задачами. Повторяющиеся задачи (groupBy, sleep, MaxStack, spy…) — самые важные, их прорешай в первую очередь.
#1Яндекс ТЕХ 1 этап2026-02-20

20.02 Яндекс ТЕХ 1 этап.
Сразу перешли к задачам:
1) Что выведется в консоль? Почему?

Promise.resolve(1)
  .then(x => x + 1)
  .then(x => { throw x })
  .then(x => console.log(x)) // не выполнится
  .catch(err => console.log(err)) // 2
  .then(x => Promise.resolve(x))
  .catch(err => console.log(err)) // не выполнится
  .then(x => console.log(x)) // undefined

2) Написать функцию, которая вернет объект с группами (пример не сохранился):

Array.prototype.groupBy = function(fn) {
  return this.reduce((acc, item) => {
    const key = fn(item);      // вычисляем ключ для текущего элемента
    if (!acc[key]) acc[key] = []; // если ещё нет массива под этим ключом, создаём
    acc[key].push(item);  // добавляем элемент
    return acc;
  }, {});
};

3) Обернуть функцию Auth() в промис.

function auth() {
  return new Promise((resolve, reject) => {
    asyncAuth((error, data) => {
      if (error) {
        reject(error);
      } else {
        resolve(data);
      }
    });
  });
}

4) Написать функцию, которая делает N запросов и если все запросы вернули ошибку, то вернуть последнюю ошибку.

async function tryAuth(n) {
  let lastError;

  for (let i = 0; i <= n; i++) {
    try {
      return await auth();
    } catch (err) {
      lastError = err;
    }
  }

  throw lastError;
}

5) Написать функцию, которая будет превращать строку из CamelCase в snake_case

function camelToSnake(text) {
  const parts = [];
  let current = "";

  const isUpper = (c) => c >= "A" && c <= "Z";

  for (let i = 0; i < text.length; i++) {
    const ch = text[i];

    if (isUpper(ch)) {
      if (current.length > 0) {
        parts.push(current);
      }
      current = ch.toLowerCase();
    } else {
      current += ch;
    }
  }

  if (current) parts.push(current);

  return parts.join("_");
}

6) Оценить алгоритмическую сложность написанной функции выше (O(n)). Какая будет сложность если пережать 1млн строк? Как можно улучшить сложность при работе с 1 млн строк? (через .join)

#2Яндекс 1 этап2026-02-03

03.02 Яндекс 1 этап

1.Необходимо написать функцию STJOIN которая склеивает строки через разделитель

function strJoinES6(separator, ...args) {
  return args.join(separator);
}

2.

//Необходимо написать результат выполнения каждого console.log.
var n = 1;
function f(n) {
  n = 3;
}
f(n);

console.log(n); // ??

var obj = { a: 1 };
function f1(o) {
  o.a = 5;
}
f1(obj);

console.log(obj); // ??

var obj = { a: 1 };
function f2(o) {
  o = { hello: 1 };
}
f2(obj);

console.log(obj); // ??

3.

// Необходимо реализовать метод groupBy, расширяющий стандартные методы массивов.
// Метод должен возвращать сгруппированную версию массива — объект,
// в котором каждый ключ является результатом выполнения переданной функции fn(arri),
// а каждое значение — массивом, содержащим все элементы исходного массива с этим ключом.

Array.prototype.groupBy = function(fn) {
  return this.reduce((acc, item) => {
    const key = fn(item);      // вычисляем ключ для текущего элемента
    if (!acc[key]) acc[key] = []; // если ещё нет массива под этим ключом, создаём
    acc[key].push(item);  // добавляем элемент
    return acc;
  }, {});
};

4.Написать функцию get, чтобы запрос делался 5 попыток, а потом выбрасывало ошибку

function get(url, retries = 5) {
  return fetch(url)
    .then(response => {
      if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
      return response.json(); // возвращаем JSON
    })
    .catch(err => {
      if (retries > 0) {
        return get(url, retries - 1); // повторяем запрос
      } else {
        return Promise.reject("Заданный URL недоступен"); // ошибка после всех попыток
      }
    });
}

5.Проверить на pangram.
const LETTERS = "ABCDEFGHJ";

function isPangram(text) {
  text = new Set(text.toLowerCase());

  return [...LETTERS].every((letter) => text.has(letter.toLowerCase()));
}
#3Яндекс 1й этап2025-12-03

Яндекс 1й этап:
Задача 1:

//Необходимо написать результат выполнения каждого console.log.
var n = 1;
function f(n) {
  n = 3;
}
f(n);

console.log(n); // ??

var obj = { a: 1 };
function f1(o) {
  o.a = 5;
}
f1(obj);

console.log(obj); // ??

var obj = { a: 1 };
function f2(o) {
  o = { hello: 1 };
}
f2(obj);

console.log(obj); // ??

Задача 2:

//Реализовать функцию sumPromises, которая принимает
//в качестве аргументов промисы и возвращает сумму
//результатов их выполнения.
//Функция может принимать любое количество аргументов.
//Можно использовать любые API промисов.

function sumPromises(...promises) {
    return Promise.all(promises)
        .then(results => 
            results.reduce((sum, num) => sum + num, 0)
        );
}

Задача 3:

// Необходимо реализовать метод groupBy, расширяющий стандартные методы массивов.
// Метод должен возвращать сгруппированную версию массива — объект,
// в котором каждый ключ является результатом выполнения переданной функции fn(arri),
// а каждое значение — массивом, содержащим все элементы исходного массива с этим ключом.

Array.prototype.groupBy = function(fn) {
  return this.reduce((acc, item) => {
    const key = fn(item);      // вычисляем ключ для текущего элемента
    if (!acc[key]) acc[key] = []; // если ещё нет массива под этим ключом, создаём
    acc[key].push(item);  // добавляем элемент
    return acc;
  }, {});
};

Задача 4:

// Напишите функцию tryAuth(n), которая выполняет попытку асинхронной авторизации с помощью функции asyncAuth

import asyncAuth from '.';
function auth() {
    return new Promise((resolve, reject) => {
        asyncAuth((error, data) => {
            if (error) {
                reject(error);
            } else {
                resolve(data); 
            }
        });
    });
}

function tryAuth(n) {
    return auth().catch(error => {
        if (n <= 0) throw error;
        return tryAuth(n - 1);
    });
}

Задача 5:

/**
 * Реализовать функцию isMonotonic, которая принимает
 * массив чисел и определяет, является ли он
 * монотонным (не возрастающим или не убывающим).
 *
 * @param {Array<number>} numbers – массив чисел
 * @return {boolean} – true, если массив монотонный, иначе false
 */
 
function isMonotonic(numbers) {
  if (numbers.length <= 1) return true;

  let nonDecreasing = true;
  let nonIncreasing = true;

  for (let i = 1; i < numbers.length; i++) {
    if (numbers[i] > numbers[i - 1]) nonIncreasing = false;
    if (numbers[i] < numbers[i - 1]) nonDecreasing = false;
  }

  return nonDecreasing || nonIncreasing;
}

console.clear();
console.log(isMonotonic([1, 2, 3, 6])); // true
console.log(isMonotonic([6, 3, 2, 1])); // true
console.log(isMonotonic([5, 5])); // true
console.log(isMonotonic([1, 2, 5, 5, 5, 8, 9])); // true
console.log(isMonotonic([1, 2, 5, 5, 5, 2, 1])); // false
console.log(isMonotonic([1, 10, 6])); // false
console.log(isMonotonic([])); // true (пустой массив)
console.log(isMonotonic([3])); // true (один элемент)
#4Яндекс 1 этап2025-11-03

Яндекс 1 этап

задача 1 написать функцию runOnce

function runOnce(fn) {
  let called = false;
  let result;

  return function(...args) {
    if (called) return undefined;
    called = true;
    result = fn.apply(this, args);
    return result;
  };
}

задача 2 написать функцию sleep

function sleep(duration) {
  return new Promise(resolve => setTimeout(resolve, duration));
}

задача 3 расширить прототип массива

// Расширяем прототип массива
Array.prototype.groupBy = function(fn) {
  return this.reduce((acc, item) => {
    const key = fn(item);      // вычисляем ключ для текущего элемента
    if (!acc[key]) acc[key] = []; // если ещё нет массива под этим ключом, создаём
    acc[key].push(item);       // добавляем элемент
    return acc;
  }, {});
};

задача 4 написать функцию get чтобы запрос делался 5 попыток а потом выбрасывал ошибку

function get(url, retries = 5) {
  return fetch(url)
    .then(response => {
      if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
      return response.json(); // возвращаем JSON
    })
    .catch(err => {
      if (retries > 0) {
        return get(url, retries - 1); // повторяем запрос
      } else {
        return Promise.reject("Заданный URL недоступен"); // ошибка после всех попыток
      }
    });
}
#5Яндекс 1 этап Платформа2025-10-01

Яндекс — 1 этап Платформа

// Что выведется в консоли и почему?
var a = 2
function fn(a) {
   a = 3
}
fn(a)
console.log(a) // 2

var obj = {a: 1}
function fn(obj) {
   obj.a = 2
}
fn(obj)
console.log(obj) // { a: 2 }

var obj = {a: 1}
function fn(o) {
  o = {a: 2}
}
fn(obj)
console.log(obj) // { a: 1 }
// Написать ассинхронную функцию, которая будет спать заданное количество миллисекунд, а потом успешно завершаться
async function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}
// Написать метод groupBy
Object.defineProperty(Array.prototype, "groupBy", {
  value: function (fn) {
    return this.reduce((acc, item) => {
      const key = fn(item); // вычисляем ключ
      if (!acc[key]) {
        acc[key] = [];
      }
      acc[key].push(item);
      return acc;
    }, {});
  },
  enumerable: false // чтобы метод не светился в for...in
});
// Напишите функцию tryAuth(n), которая выполняет попытку асинхронной авторизации с помощью функции asyncAuth

import asyncAuth from '.';

function auth() {
    return new Promise((resolve, reject) => {
        asyncAuth((error, data) => {
            if (error) {
                reject(error);
            } else {
                resolve(data);
            }
        });
    });
}

function tryAuth(n) {
    return auth().catch(error => {
        if (n <= 0) throw error;
        
        return tryAuth(n - 1);
    });
}
// написать функцию filterOdds, где нечётные числа массива сортируются по возрастанию, а чётные остаются на своих местах
function filterOdds(arr) {
  const odds = arr.filter(n => n % 2 !== 0);

  odds.sort((a, b) => a - b);

  return arr.map(n => {

    if (n % 2 === 0) return n;

    return odds.shift();
  });
}
#6Яндекс 1 этап2025-09-23

Яндекс 1 этап

Задачи:
1. Сказать что будет в консоли:

var a = 2
function fn(a) {
   a = 3
}
fn(a)
console.log(a) // 2

var obj = {a: 1}
function fn(obj) {
   obj.a = 2
}
fn(obj)
console.log(obj) // {a: 2}

var obj = {a: 1}
function fn(o) {
  o = {a: 2}
}
fn(obj)
console.log(obj) // {a: 1}

2.

/**
 * Реализовать метод times для числового объекта.
 * Функция должна принимать callback и вызывать его
 * заданное количество раз с индексом текущей итерации.
 */

// Code here
Number.prototype.times = function(callback) {
    for (let i = 0; i < this; i++) {
        callback(i);
    }
};

// Примеры
console.clear();
(3).times(console.log);
// 0
// 1
// 2

3. Реализовать функцию compose:

const square = (x) => x * x
const mult2 = (x) => x * 2
const sum = (a,b) => a + b

function compose(...funcs) {
  return function (...args) {
    return funcs.reduceRight((acc, cur) => {
      return [cur(...acc)]
    }, args)[0]
  }
}

compose(square, mult2)(2) // 16
compose(square, mult2, sum)(3,2) // 100

4. Напишите функцию tryAuth(n), которая выполняет попытку асинхронной авторизации с помощью функции asyncAuth:

import asyncAuth from '.';

function auth() {
    return new Promise((resolve, reject) => {
        asyncAuth((error, data) => {
            if (error) {
                reject(error);
            } else {
                resolve(data);
            }
        });
    });
}



function tryAuth(n) {
    return auth().catch(error => {
        if (n <= 0) {
            throw error;
        }
        return tryAuth(n - 1);
    });
}

5. Написать функцию, которая убирает все falsy значения:

/**
 * Необходимо написать функцию, которая на вход принимает объект
 * и убирает из него все falsy значения
 * falsy значение - это такое значение value, для которого Boolean(value) === false
 * считаем, что obj - результат выполнения JSON.parse, то есть plain object
 */
function filterFalsy(obj) {
    if (typeof obj === "null") return null;
    if (Array.isArray(obj)) {
        return obj.filter((item) => Boolean(item)).map((item) => filterFalsy(item));
    } else if (typeof obj === "object" && typeof obj !== "null") {
        const filterObj = {};
        for (let key in obj) {
            filterObj[key] = filterFalsy(obj[key]);
        }
        return filterObj;
    }
    return obj;
}

console.log(filterFalsy([null, 0, false, 1])); // => [1]
console.log(filterFalsy({ a: null, b: [false, 1] })); // => { 'b': [1] }
console.log(filterFalsy([null, 0, 5, [0], [false, 16]])); // => [5, [], [16]]
#7Яндекс 1 этап2025-09-20

Яндекс 1 этап

1 задача

/**
 * Реализовать метод times для числового объекта.
 * Функция должна принимать callback и вызывать его
 * заданное количество раз с индексом текущей итерации.
 */

// Code here


// Примеры
console.clear();
(3).times(console.log)
// 0
// 1
// 2

ответ

/**
 * Реализовать метод times для числового объекта.
 * Функция должна принимать callback и вызывать его
 * заданное количество раз с индексом текущей итерации.
 */

// Code here
Number.prototype.times = function(callback) {
    for (let i = 0; i < this; i++) {
        callback(i);
    }
};

// Примеры
console.clear();
(3).times(console.log);
// 0
// 1
// 2

2 задача

// написать ассинхронную функцию, которая будет спать заданное количество миллисекунд, а потом успешно завершаться

function sleep(duration) {
  return new Promise(resolve => setTimeout(resolve, duration))
}

3 задача

/**
 * Написать декоратор для функции, который ограничивает число вызовов.
 *
 * calllimit(fn, limit, callback), принимает следующие аргументы:
 * fn - функция, которую декорируем;
 * limit - максимальное число вызовов;
 * callback - вызывается, когда совершен последний вызов. Опционально.
 * У вызываемой функции должен быть метод для перезагрузки счётчика в начальное положение.
 */

function calllimit(fn, limit, callback) {
   // Тут что-то написать
}

function log(title, message) {
   console.log(title + ': ' + message);
}

ответ:

/**
 * Написать декоратор для функции, который ограничивает число вызовов.
 *
 * calllimit(fn, limit, callback), принимает следующие аргументы:
 * fn - функция, которую декорируем;
 * limit - максимальное число вызовов;
 * callback - вызывается, когда совершен последний вызов. Опционально.
 * У вызываемой функции должен быть метод для перезагрузки счётчика в начальное положение.
 */

function calllimit(fn, limit, callback) {
    let count = 0;
    let limitedFn = function(...args) {
        if (count < limit) {
            count++;
            const result = fn.apply(this, args);
            
            if (count === limit && callback) {
                callback();
            }
            
            return result;
        }
    };
    
    limitedFn.reset = function() {
        count = 0;
    };
    
    return limitedFn;
}

function log(title, message) {
    console.log(title + ': ' + message);
}

4 задача

//Необходимо реализовать функцию timeLimited, которая принимает асинхронную функцию и временной лимит в миллисекундах. 
//Функция timeLimited должна возвращать новую асинхронную функцию, которая выполняет переданную функцию, 
// но отклоняется с ошибкой, если выполнение занимает больше заданного времени.

const timeLimited = function(fn, t) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      const fPromise = fn(...args).then(resolve).catch(reject);

      const timer = setTimeout(() => {
        reject("Time limit exceeded");
      }, t);

      fPromise.finally(() => clearTimeout(timer));
    });
  }
};

5 задача

// Написать декоратор для функции, который ограничивает число вызовов.
//
// callLimit(fn, limit, callback), принимает следующие аргументы:
// fn - функция, которую декодируем;
// limit - маскимальное число вызовов
// callback - вызывается, когда совершен последний вызов. Опционально.
// У вызываемой функции должен быть метод для перезагрузки счетчика в начале

function callLimit(fn, limit, callback) {
  let count = 0;

  function wrapper(...args) {
    if (count < limit) {
      count++;
      const result = fn.apply(this, args);
      if (count === limit && typeof callback === "function") {
        callback();
      }
      return result;
    }
    // лимит превышен — ничего не делаем
    return undefined;
  }

  // метод для сброса счётчика
  wrapper.reset = function () {
    count = 0;
  };

  return wrapper;
}

6 задача

/**
 * Необходимо написать функцию, которая на вход принимает объект
 * и убирает из него все falsy значения
 * falsy значение - это такое значение value, для которого Boolean(value) === false
 * считаем, что obj - результат выполнения JSON.parse, то есть plain object
 */
function filterFalsy(obj) {
    if (typeof obj === "null") return null;
    if (Array.isArray(obj)) {
        return obj.filter((item) => Boolean(item)).map((item) => filterFalsy(item));
    } else if (typeof obj === "object" && typeof obj !== "null") {
        const filterObj = {};
        for (let key in obj) {
            filterObj[key] = filterFalsy(obj[key]);
        }
        return filterObj;
    }
    return obj;
}

console.log(filterFalsy([null, 0, false, 1])); // => [1]
console.log(filterFalsy({ a: null, b: [false, 1] })); // => { 'b': [1] }
console.log(filterFalsy([null, 0, 5, [0], [false, 16]])); // => [5, [], [16]]
#8Яндекс 1 этап2025-08-28

Яндекс 1 этап.

Задача №1

/**
 * Реализовать метод times для числового объекта.
 * Функция должна принимать callback и вызывать его
 * заданное количество раз с индексом текущей итерации.
 */

// Code here


// Примеры
console.clear();
(3).times(console.log)
// 0
// 1
// 2

Ответ к задаче №1

/**
 * Реализовать метод times для числового объекта.
 * Функция должна принимать callback и вызывать его
 * заданное количество раз с индексом текущей итерации.
 */

// Code here
Number.prototype.times = function(callback) {
    for (let i = 0; i < this; i++) {
        callback(i);
    }
};

// Примеры
console.clear();
(3).times(console.log);
// 0
// 1
// 2


Задача №2

/**
 * Реализовать функцию sumPromises, которая принимает  
 * в качестве аргументов промисы и возвращает сумму  
 * результатов их выполнения.  
 * 
 * Функция может принимать любое количество аргументов.  
 * Можно использовать любые API промисов.  
 */

// Code here


// Пример использования
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);

sumPromises(promise1, promise2).then(console.log); // 3

Ответ к задаче № 2

/**
 * Реализовать функцию sumPromises, которая принимает  
 * в качестве аргументов промисы и возвращает сумму  
 * результатов их выполнения.  
 * 
 * Функция может принимать любое количество аргументов.  
 * Можно использовать любые API промисов.  
 */

// Code here
function sumPromises(...promises) {
    return Promise.all(promises)
        .then(results => results.reduce((sum, num) => sum + num, 0));
}

// Пример использования
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);

sumPromises(promise1, promise2).then(console.log); // 3

Задача №3

/**
 * Написать декоратор для функции, который ограничивает число вызовов.
 *
 * calllimit(fn, limit, callback), принимает следующие аргументы:
 * fn - функция, которую декорируем;
 * limit - максимальное число вызовов;
 * callback - вызывается, когда совершен последний вызов. Опционально.
 * У вызываемой функции должен быть метод для перезагрузки счётчика в начальное положение.
 */

function calllimit(fn, limit, callback) {
   // Тут что-то написать
}

function log(title, message) {
   console.log(title + ': ' + message);
}

Ответ к задаче №3

/**
 * Написать декоратор для функции, который ограничивает число вызовов.
 *
 * calllimit(fn, limit, callback), принимает следующие аргументы:
 * fn - функция, которую декорируем;
 * limit - максимальное число вызовов;
 * callback - вызывается, когда совершен последний вызов. Опционально.
 * У вызываемой функции должен быть метод для перезагрузки счётчика в начальное положение.
 */

function calllimit(fn, limit, callback) {
    let count = 0;
    let limitedFn = function(...args) {
        if (count < limit) {
            count++;
            const result = fn.apply(this, args);
            
            if (count === limit && callback) {
                callback();
            }
            
            return result;
        }
    };
    
    limitedFn.reset = function() {
        count = 0;
    };
    
    return limitedFn;
}

function log(title, message) {
    console.log(title + ': ' + message);
}

Задача №4

import asyncAuth from '.';
/**
  * Функция `asyncAuth(callback)` принимает callback, в который может быть передана ошибка (первым аргументом) и данные
  * с бэкенда (вторым аргументом).
  * asyncAuth((error, data) => {});
  *
  * Вам нужно реализовать функцию `auth()',
  * которая вызывает `asyncAuth()`, но возвращает Promise.
  *
  * @returns {Promise}
  */
function auth() {
    // asyncAuth((error, data) => {}
};
}

/**
  * Функция `tryAuth()` использует `auth()` и, в случае ошибки,
  * совершает N дополнительных попыток.
  * в случае, если все попытки провалились - вернуть последнюю ошибку
  *
  * @returns {Promise}
  */
function tryAuth(n) {
}

Ответ к задаче №4

import asyncAuth from '.';
/**
  * Функция `asyncAuth(callback)` принимает callback, в который может быть передана ошибка (первым аргументом) и данные
  * с бэкенда (вторым аргументом).
  * asyncAuth((error, data) => {});
  *
  * Вам нужно реализовать функцию `auth()',
  * которая вызывает `asyncAuth()`, но возвращает Promise.
  *
  * @returns {Promise}
  */
function auth() {
    return new Promise((resolve, reject) => {
        asyncAuth((error, data) => {
            if (error) {
                reject(error);
            } else {
                resolve(data);
            }
        });
    });
}

/**
  * Функция `tryAuth()` использует `auth()` и, в случае ошибки,
  * совершает N дополнительных попыток.
  * в случае, если все попытки провалились - вернуть последнюю ошибку
  *
  * @returns {Promise}
  */
function tryAuth(n) {
    return auth().catch(error => {
        if (n <= 0) {
            throw error;
        }
        return tryAuth(n - 1);
    });
}

Задача №5

/**  
 * Ecть дерево, на котором сидят белки (squirrels) и вороны (ravens). Необходимо написать функцию,   
 * которая находит всех белок на дереве и возвращает их имена  
 */  

function squirrelScanner(tree) {  
// your code here  
}  

/*  
 * Type Tree = {  
 * nest: Squirrel | Raven;  
 * branches?: Tree[];  
 * }  
 * Type Squirrel = {  
 * name: string;  
 * type: 'squirrel';  
 * }  
 * Type Raven = {  
 * name: string;  
 * type: 'raven';  
 * }  
 */

Ответ к задаче №5

/**  
 * Ecть дерево, на котором сидят белки (squirrels) и вороны (ravens). Необходимо написать функцию,   
 * которая находит всех белок на дереве и возвращает их имена  
 */  

function squirrelScanner(tree) {  
    const result = [];
    
    function traverse(node) {
        // Проверяем текущее гнездо
        if (node.nest.type === 'squirrel') {
            result.push(node.nest.name);
        }
        
        // Рекурсивно обходим все ветки
        if (node.branches) {
            for (const branch of node.branches) {
                traverse(branch);
            }
        }
    }
    
    traverse(tree);
    return result;
}  

/*  
 * Type Tree = {  
 * nest: Squirrel | Raven;  
 * branches?: Tree[];  
 * }  
 * Type Squirrel = {  
 * name: string;  
 * type: 'squirrel';  
 * }  
 * Type Raven = {  
 * name: string;  
 * type: 'raven';  
 * }  
 */
#9Яндекс 1 этап2025-08-08

Яндекс 1 этап
Те же задачи https://t.me/c/2071074234/489/183394

#10Яндекс Финтех 1 этап2025-08-06

Компания: Яндекс Финтех 1 этап

Яндекс Финтех 1 этап (задачи)

1. Что будет выведено, обосновать

Что будет в консоли ?
var n = 1;
function f(n) {
  n = 3;
}
f(n);
console.log(n); // ?? 1


var obj = { a: 1 };
function f1(o) {
  o.a = 5;
}
f1(obj);
console.log(obj); // ?? { a: 5 };


var obj = { a: 1 };
function f2(o) {
  o = { hello: 1 };
}
f2(obj);
console.log(obj); // ??{ a: 1 };

2. Функция, которая принимает сепаратор и массив (склеить айтемы массива в строку через сеператор)

 
function strjoin(char, ...str) {
    return str.join(char);
}

И как бы выглядела функция для старых стандартов до es6 (через цикл)

3. Написать groupBy для прототипа массива

// Добавляем метод groupBy к прототипу массива
Array.prototype.groupBy = function(fn) {
  // Используем reduce для прохода по всем элементам массива
  return this.reduce(function(acc, item) {
    
    // Применяем функцию fn к элементу, чтобы получить ключ
    const key = fn(item);
    
    // Если для этого ключа ещё нет массива в объекте, создаём его
    if (!acc[key]) acc[key] = [];
    
    // Добавляем текущий элемент в массив по соответствующему ключу
    acc[key].push(item);
    
    // Возвращаем аккумулятор (объект), который будет использоваться в следующем шаге
    return acc;
  }, {});  // Инициализируем аккумулятор как пустой объект
};

4. Написать Promise.any (подумать о корнер кейсах)

function any(promises) {
  // Если массив пустой — сразу кидаем кастомную ошибку
  if (promises.length === 0) {
    throw new Error('any() received an empty array of promises');
  }

  return new Promise((resolve, reject) => {
    let errors = [];          // Сюда буду собирать ошибки по индексам, чтобы сохранить порядок
    let rejectedCount = 0;    // Счётчик отказов, чтобы понять, когда все промисы сдохли

    // Перебираю каждый промис
    promises.forEach((p, index) => {
      // Оборачиваю в Promise.resolve на случай, если кто-то передал не настоящий промис
      Promise.resolve(p)
        .then(resolve)  // Как только хоть один зарезолвится — всё, победа, резолвим итоговый промис
        .catch(err => {
          errors[index] = err;     // Сохраняю ошибку под тем же индексом
          rejectedCount++;         // Ещё один отказник

          // Если все отказались — значит надо фейлить основной промис
          if (rejectedCount === promises.length) {
            reject(new AggregateError(errors, 'No Promise in any was resolved'));
          }
        });
    });
  });
}

5. Написать функцию для поиска совпадающих временных отрезков у двух массивов (подумать о корнер кейсах)

function intersection(user1, user2) {
  const result = [];

  let i = 0; // буду идти по первому списку
  let j = 0; // и по второму тоже

  // Пока оба списка не закончились
  while (i < user1.length && j < user2.length) {
    const [start1, end1] = user1[i]; // беру текущий интервал первого юзера
    const [start2, end2] = user2[j]; // и второго

    // Думаю: где у них начинается общая часть? Это максимум стартов
    const start = Math.max(start1, start2);

    // А конец общей части — минимум из двух концов
    const end = Math.min(end1, end2);

    // Если вдруг пересекаются — норм, добавляю в результат
    if (start < end) {
      result.push([start, end]);
    }

    // Теперь думаю: какой интервал двинуть дальше?
    // Двигаю тот, кто раньше закончился, чтобы не пропустить следующую возможную точку пересечения
    if (end1 < end2) {
      i++; // первый закончился раньше
    } else {
      j++; // второй закончился раньше или одновременно
    }
  }

  // Возвращаю все отрезки, где они были оба онлайн
  return result;
}
#11Яндекс 1 этап2025-08-05

Яндекс 1 этап

Задача 1:

Что будет в консоли ?
var n = 1;
function f(n) {
  n = 3;
}
f(n);
console.log(n); // ?? 1


var obj = { a: 1 };
function f1(o) {
  o.a = 5;
}
f1(obj);
console.log(obj); // ?? { a: 5 };


var obj = { a: 1 };
function f2(o) {
  o = { hello: 1 };
}
f2(obj);
console.log(obj); // ??{ a: 1 };

Задача 2:

/**
 * Необходимо написать функцию strjoin,
 * которая склеивает строки через разделитель.
 */
function strjoin(char, str) {
    return str.join(char)
}

console.log(strjoin('.', 'a', 'b', 'c')) // 'a.b.c'
console.log(strjoin('-', 'a', 'b', 'c', 'd', 'e', 'f')) // 'a-b-c-d-e-f'

Попросил на словах рассказать о реализации через псевдо массив arguments

Задача 3:

// Необходимо реализовать метод groupBy, расширяющий стандартные методы массивов.
// Метод должен возвращать сгруппированную версию массива - объект,
// в котором каждый ключ является результатом выполнения переданной функции fn(arr[i]),
// а каждое значение - массивом, содержащим все элементы исходного массива с этим ключом.

// Пример 1
const array1 = [{ id: 1 }, { id: 1 }, { id: 2 }];

const fn = (item) => item.id;

array1.groupBy(fn);
// {
//   1: [{ id: 1 }, { id: 1 }],
//   2: [{ id: 2 }]
// }

// Пример 2
const array2 = [1, 2, 3];
array2.groupBy(String); // { "1": [1], "2": [2], "3": [3] }

// Пример 3
const array3 = [3.3, 0.5, 1.4];
array3.groupBy(Math.round); // { "3": [3.3], "1": [0.5, 1.4] }

Задача 4:

/*
Даны два отсортированных списка с интервалами присутствия
пользователей в онлайне в течение дня. Начало интервала строго меньше конца.
Нужно вычислить интервалы, когда оба пользователя были в онлайне.
Интервалы указаны в часах, считаем что могут быть часы от 0 до 24.
*/

intersection(
  [
    [8, 12],
    [17, 22],
  ],
  [
    [5, 11],
    [14, 18],
    [20, 23],
  ]
); // [[8, 11], [17, 18], [20, 22]]

intersection(
  [
    [9, 15],
    [18, 21],
  ],
  [
    [10, 14],
    [21, 22],
  ]
); // [[10, 14]]

function intersection(user1, user2) {}
#12Яндекс (1 этап)2025-07-30

Компания: Яндекс (1 этап)
Задачи:
1. Функция runOnce(fn) предназначена для того,
чтобы обернуть любую другую функцию так, чтобы она могла быть вызвана только один раз.

function runOnce(fn) {
    let called = false
    return function() {
        if (called) return undefined
        called = true
        return fn()
    }
}

2.Функция реализует «задержку» (аналог sleep)

function sleep(duration) {
    return new Promise(resolve => setTimeout(resolve, duration));
}

3.Написать функцию callLimit.

function callLimit(fn, limit, callback) {
    let count = 0;

    function inner(...args) {
        if (count < limit) {
            const result = fn.apply(this, args);
            count++;
            if (count === limit) callback();
            return result;
        }
        return undefined;
    }

    inner.reset = () => count = 0;
    return inner;
}

4:

/**
 * Функция `asyncAuth(callback)` принимает callback, в который может
 * быть передана ошибка (первым аргументом) и данные
 * с бэкенда (вторым аргументом).
 *
 * asyncAuth((error, data) => {});
 *
 * Вам нужно реализовать функцию `auth()`,
 * которая вызывает `asyncAuth()`, но возвращает Promise.
 *
 * @returns {Promise}
 */
function auth() {
    return new Promise((resolve, reject) => {
        asyncAuth((error, data) => {
            if (error) reject(error);
            resolve(data);
        });
    });
}
/**
 * Функция `tryAuth()` использует `auth()` и, в случае ошибки,
 * совершает N дополнительных попыток.
 *
 * В случае, если все попытки провалились - вернуть последнюю ошибку
 *
 * @returns {Promise}
 */
async function tryAuth(n = 0) {
    try {
        const response = await auth();
        return response;
    } catch (error) {
        n -= 1;
        if (n === -1) {
            throw error;
        }
        return tryAuth(n);
    }
}

5:Необходимо написать функцию, которая на вход принимает объект
и убирает из него все falsy значения
falsy значение - это такое значение value, для которого Boolean(value) === false
считаем, что obj - результат выполнения JSON.parse, то есть plain object

function filterFalsy(obj) {
  if (Array.isArray(obj)) {
    return obj
      .map(filterFalsy)
      .filter(Boolean);
  }
  if (obj !== null && typeof obj === 'object') {
    const result = {};
    for (const key in obj) {
      const value = filterFalsy(obj[key]);
      if (Boolean(value)) {
        result[key] = value; // исправлено здесь
      }
    }
    return result;
  }
  return obj;
}
#13Яндекс 1 этап2025-07-22

Компания: Яндекс 1 этап

Только лайвкодинг
Задача 1:

/**
 * Необходимо написать функцию strjoin,
 * которая склеивает строки через разделитель.
 */
function strjoin(char, str) {
    return str.join(char)
}

console.log(strjoin('.', 'a', 'b', 'c')) // 'a.b.c'
console.log(strjoin('-', 'a', 'b', 'c', 'd', 'e', 'f')) // 'a-b-c-d-e-f'

Задача 2:

/**
 * Необходимо написать асинхронную функцию,
 * которая будет "спать" заданное количество миллисекунд,
 * а потом успешно завершаться
 */
function sleep(duration) {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve(), duration)
    })
}

// Пример
const startTime = Date.now();
console.log("Start sleeping...");

sleep(2000).then(() => {
    console.log("Woke up after 2 seconds!");
    console.log("Time passed: ", Date.now() - startTime);
});

sleep(1000).then(() => {
    console.log("Woke up after 1 seconds!");
    console.log("Time passed: ", Date.now() - startTime);
});

Задача 3

/**
 * Реализовать функцию compose, которая принимает
 * переменное количество функций и возвращает новую функцию.
 * Результат работы каждой функции передается в следующую.
 */
function compose(...fn) {
    return function (...args) {
        let result;
        for (let i = fn.length - 1; i >= 0; i--) {
            if (result) {
                result = fn[i](result);
            } else {
                result = fn[i](...args);
            }
        }
        return result;
    };
}

const square = (x) => x * x;
const times2 = (x) => x * 2;
const sum = (a, b) => a + b;

console.clear();
console.log(compose(square, times2)(2) === square(times2(2)));
console.log(compose(square, times2, sum)(3, 4) === square(times2(sum(3, 4))));

Задача 4:

/**
 * Функция `asyncAuth(callback)` принимает callback, в который может
 * быть передана ошибка (первым аргументом) и данные
 * с бэкенда (вторым аргументом).
 *
 * asyncAuth((error, data) => {});
 *
 * Вам нужно реализовать функцию `auth()`,
 * которая вызывает `asyncAuth()`, но возвращает Promise.
 *
 * @returns {Promise}
 */
function auth() {
    return new Promise((resolve, reject) => {
        asyncAuth((error, data) => {
            if (error) reject(error);
            resolve(data);
        });
    });
}
/**
 * Функция `tryAuth()` использует `auth()` и, в случае ошибки,
 * совершает N дополнительных попыток.
 *
 * В случае, если все попытки провалились - вернуть последнюю ошибку
 *
 * @returns {Promise}
 */
async function tryAuth(n = 0) {
    try {
        const response = await auth();
        return response;
    } catch (error) {
        n -= 1;
        if (n === -1) {
            throw error;
        }
        return tryAuth(n);
    }
}

Задача 5: не лучшее решение, посмотрите через ИИ как сделать лучше

/**
 * Необходимо написать функцию, которая на вход принимает объект
 * и убирает из него все falsy значения
 * falsy значение - это такое значение value, для которого Boolean(value) === false
 * считаем, что obj - результат выполнения JSON.parse, то есть plain object
 */
function filterFalsy(obj) {
    if (typeof obj === "null") return null;
    if (Array.isArray(obj)) {
        return obj.filter((item) => Boolean(item)).map((item) => filterFalsy(item));
    } else if (typeof obj === "object" && typeof obj !== "null") {
        const filterObj = {};
        for (let key in obj) {
            filterObj[key] = filterFalsy(obj[key]);
        }
        return filterObj;
    }
    return obj;
}

console.log(filterFalsy([null, 0, false, 1])); // => [1]
console.log(filterFalsy({ a: null, b: [false, 1] })); // => { 'b': [1] }
console.log(filterFalsy([null, 0, 5, [0], [false, 16]])); // => [5, [], [16]]
#14Яндекс 1 Этап2025-07-01

Яндекс 1 Этап

1 задача
Вопросы:
Спросил за rest оператор, и что если будем делать если у нас ES5.
Что такое arguments
Что такое псевдомассив

function strjoin(separator, ...arr) {
  console.log(arguments)
  return arr.join(separator);
}

2 задача

Вопросы:
Что такое промисы?

Promise.resolve(1)
  .then(x => x + 1) // 2
  .then(x => { throw x }) // выбрасывает 2
  .then(x => console.log(x)) // пропускается из-за ошибки
  .catch(err => console.log(err)) // 2
  .then(x => Promise.resolve(x)) // undefined (catch ничего не возвращает)
  .catch(err => console.log(err)) // не сработает
  .then(x => console.log(x)) // undefined

3 задача

// Написать декоратор для функции, который ограничивает число вызовов.
//
// callLimit(fn, limit, callback), принимает следующие аргументы:
// fn - функция, которую декодируем;
// limit - маскимальное число вызовов
// callback - вызывается, когда совершен последний вызов. Опционально.
// У вызываемой функции должен быть метод для перезагрузки счетчика в начале

function callLimit(fn, limit, callback) {
  let count = 0 // Счётчик вызовов

  // Обёртка над исходной функцией
  function wrapper(...args) {
    if (count >= limit) return // Прекратить выполнение, если лимит превышен

    count++ // Увеличить счётчик

    // Если вызов достиг лимита — вызвать callback (если он передан)
    if (count === limit && typeof callback === 'function') {
      callback()
    }

    // Вызов оригинальной функции с переданными аргументами
    return fn.apply(this, args)
  }

  // Метод для ручного сброса счётчика вызовов
  wrapper.reset = function () {
    count = 0
  }

  return wrapper // Вернуть обёрнутую функцию
}

4 Задача

/**
 * @param {Function} fn - Асинхронная функция
 * @param {number} t - Время ограничения в миллисекундах
**/
const timelimited = function (fn, t) {
  return function (...args) {
    return new Promise((resolve, reject) => {
      // Запускаем асинхронную функцию
      const fnPromise = fn(...args).then(resolve).catch(reject);

      // Устанавливаем таймер на t миллисекунд
      const timer = setTimeout(() => {
        reject("Time limit exceeded"); // Реджектим, если время истекло
      }, t);

      // Если функция успевает выполниться, очищаем таймер
      fnPromise.finally(() => clearTimeout(timer));
    });
  };
};

5 задача

Вопросы:
Какие сложности алгоритмов бывают.
Описать и рассказать в чем разница

class MaxStack {
    constructor() {
        this.stack = []; // Основной стек
        this.maxStack = []; // Вспомогательный стек для хранения максимумов
    }

    // Добавление элемента в стек
    push(x) {
        this.stack.push(x);
        // Если maxStack пуст или x >= текущего максимума, добавляем x в maxStack
        if (this.maxStack.length === 0 || x >= this.maxStack[this.maxStack.length - 1]) {
            this.maxStack.push(x);
        }
    }

    // Удаление и возврат верхнего элемента
    pop() {
        if (this.stack.length === 0) {
            throw new Error("Stack is empty");
        }
        const popped = this.stack.pop();
        // Если удалённый элемент равен текущему максимуму, удаляем его из maxStack
        if (popped === this.maxStack[this.maxStack.length - 1]) {
            this.maxStack.pop();
        }
        return popped;
    }


    // Возврат максимального элемента
    max() {
        if (this.maxStack.length === 0) {
            throw new Error("Stack is empty");
        }
        return this.maxStack[this.maxStack.length - 1];
    }
}
#15Яндекс 1 этап2025-06-26

Яндекс 1 этап

1 задача

function any(promises) {
  return new Promise((resolve, reject) => {
    const errors = [];
    let rejCount = 0;
    
    promises.forEach((p, i) => {
      Promise.resolve(p)
        .then(resolve)
        .catch((err) => {
          errors[i] = err;
          rejCount++;
          
          if (rejCount === promises.length) {
            reject(new AggregateError(errors, 'No Promise in any was resolved'));
          }
        });
    });
  });
}

2.

function runOnce(fn) {
  let isCalled = false;
  
  return function (...args) {
    if (isCalled) {
      return undefined;
    }
    isCalled = true;
    return fn(...args);
  }
}

3.

function compose(...funcs) {
  return function (...args) {
    return funcs.reduceRight((acc, fn) => {
      return [fn(...acc)];
    }, args)[0];
  };
}

4.Реализовать MaxStack с методами pop push и max

class MaxStack {
constructor() {
this.stack = [];
this.maxStack = [];
}

push(value) {
this.stack.push(value);

const currentMax = this.maxStack.length === 0 ? value : Math.max(value, this.maxStack[this.maxStack.length - 1]);
this.maxStack.push(currentMax);
}

pop() {
if (this.stack.length === 0) return null;
this.maxStack.pop();
return this.stack.pop();
}

max() {
if (this.maxStack.length === 0) return null;
return this.maxStack[this.maxStack.length - 1]
}
}

#16Яндекс Фантех 1 этап лайвкодинг2025-06-24

Яндекс Фантех 1 этап лайвкодинг
hr сам написал

1. Сделай такую обёртку над функцией, чтобы она вызывалась только один раз - при первом вызове. Все последующие вызовы ничего не делают.

Решение:

function runOnce(fn) {
    let called = false;

    return function (...args) {
        if (called) {
            return undefined;
            called = true;
            return fn(...args);
        }
    }
}

2.Написать функцию sleep которая через переданное время резолвится

Решение:

function sleep(time) {
    return new Promise((resolve) => 
    setTimeout(() => resolve(), time))
}

3. Реализовать функцию groupBy, которая группирует элементы массива по ключу, полученному из коллбэка сb.

Решение:

Array.prototype.groupByV2 = function (fn) {
    const res = {}
    const arr = this;
    for (let i = 0; i < arr.length; i++) {
        const key = fn(arr[i]);
        if (res[key]) {
            res[key] = [];
        }
        res[key].push(arr[i]);
    }
    return res
}

4.Напиши обёртку над асинхронной функцией `fn`, которая вызывает её, но **прерывает выполнение**, если она **не успевает завершиться за **`t`** миллисекунд**.
В этом случае Promise должен быть отклонён с сообщением `"Time limit exceeded"`.

Решение:

const timeLimited = function(fn, t) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      const fPromise = fn(...args).then(resolve).catch(reject);

      const timer = setTimeout(() => {
        reject("Time limit exceeded");
      }, t);

      fPromise.finally(() => clearTimeout(timer));
    });
  }
};

5.Реализовать класса `MaxStack`, в котором все методы `push`, `pop` и `max` работают за **O(1)**:

Решение:

class MaxStack {
  constructor() {
    this.stack = [];      
    this.maxStack = [];   
  }

  push(value) {
    this.stack.push(value);
   
    const currentMax = this.maxStack.length === 0 ? value : Math.max(value, this.maxStack[this.maxStack.length - 1]);
    this.maxStack.push(currentMax);
  }

  pop() {
    if (this.stack.length === 0) return null;
    this.maxStack.pop();   
    return this.stack.pop(); 
  }

  max() {
    if (this.maxStack.length === 0) return null;
    return this.maxStack[this.maxStack.length - 1]
  }
}
#17Яндекс Этап 12025-06-23

Яндекс
Этап 1
Задачи:
1. Сделай такую обёртку над функцией, чтобы она вызывалась только один раз — при первом вызове. Все последующие вызовы ничего не делают.

function runOnce(fn) {
  let isCalled = false;
  return (...args) => {
    if (isCalled) {
      return undefined; // уже вызывалась — ничего не делаем
    }
    isCalled = true;
    return fn(...args); // вызываем fn только один раз
  };
}

2. Напиши функцию, которая принимает несколько промисов и возвращает промис, в котором будет сумма всех результатов этих промисов

function sumFulfilledPromises(...promises) {
  return Promise.allSettled(promises)
    .then(results => {
      const successValues = results
        .filter(result => result.status === 'fulfilled')
        .map(result => result.value);

      return successValues.reduce((sum, num) => sum + num, 0);
    });
}

3. Реализовать функцию groupBy, которая группирует элементы массива по ключу, полученному из коллбэка cb.

Array.prototype.groupBy = function (cb) {
  const result = {};

  for (const item of this) {
    const key = cb(item);
    if (!result[key]) {
      result[key] = [];
    }
    result[key].push(item);
  }

  return result;
};

4. Сделать auth с повторными попытками: если промис auth() отклоняется, пробовать заново n раз. Если все попытки неудачны — выбросить ошибку.

async function tryAuth(n) {
  try {
    const response = await auth(); // вызываем auth
    return response;              // если успех — возвращаем результат
  } catch (err) {
    n -= 1;
    if (n < 0) return Promise.reject(err); // если попытки закончились — ошибка
    return tryAuth(n); // пробуем снова
  }
}

5. Пройти по дереву (объекту с ветками tree.branches) и собрать белок с каждой ветки с помощью функции squirrelScanner, возвращающей массив белок.

function scanTree(tree) {
  let squirrels = [];

  if (tree.branches) {
    tree.branches.forEach(branch => {
      squirrels.push(...squirrelScanner(branch));
    });
  }

  return squirrels;
}
#18Яндекс (1 этап)2025-06-03

Компания - Яндекс (1 этап)

ЗАДАНИЕ 1

Реализовать метод times для числового объекта.
Функция должна принимать callback и вызывать его заданное количество раз с индексом текущей итерации.

РЕШЕНИЕ

Number.prototype.times = function(callback) {
  const num = Math.floor(this);
  for (let i = 0; i < num; i++) {
    callback(i);
  }
};

ЗАДАНИЕ 1.1

Попросил дописать решение, добавив проверку на целые числа.

РЕШЕНИЕ

Number.prototype.times = function(callback) {
  if (!Number.isInteger(this)) return;
  const num = Math.floor(this);
  for (let i = 0; i < num; i++) {
    callback(i);
  }
};

ЗАДАНИЕ 2

Реализовать функцию sumPromises, которая принимает в качестве аргументов промисы и возвращает сумму результатов их выполнения.
Функция может принимать любое количество аргументов.
Можно использовать любые API промисов.

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
sumPromises(promise1, promise2).then(console.log) //3

РЕШЕНИЕ

function sumPromises(...promises) {
  return Promise.all(promises)
    .then(results => {
      return results.reduce((sum, num) => sum + num, 0);
    });
}

ЗАДАНИЕ 3

Реализовать функцию compose, которая принимает
переменное количество функций и возвращает новую функцию.

const square = (x) => x * x;
const times2 = (x) => x * 2;
const sum = (a, b) => a + b;

console.clear();
console.log(compose(square, times2)(2) === square(times2(2)));
console.log(compose(square, times2, sum)(3, 4) === square(times2(sum(3, 4))));

РЕШЕНИЕ

function compose(...funcs) {
  return function (...args) {
    return funcs.reduceRight((acc, fn) => {
      return [fn(...acc)];
    }, args)[0];
  };
}

ЗАДАНИЕ 4

Необходимо проверить решение задачи по двум сервисам,
вызвав checkResult(url1, solution), checkResult(url2, solution);
checkResult: (url: string, solution: string | number) => Promise<boolean>;
Если оба запроса вернули true - вывести success.
Если хоть один вернул false - вывести fail.
Если хоть зареджектился - вывести error.
Если хоть один отвечает дольше 1 сек - вывести timeout.

import { checkResult } from "myLib"

const solution = "Any answer"
const url1 = "yandex.ru"
const url2 = "google.com"

checkResult(url, solution);
checkResult(url, solution);

РЕШЕНИЕ

async function runCheck(url1, url2, solution) {
    const timeout = (ms) => new Promise((_, reject) =>
        setTimeout(() => reject(new Error("timeout")), ms);
    
    async function safeCheck(url) {
        try {
            return await Promise.race([
                checkResult(url, solution),
                timeout(3000)
            ]);
        } catch (e) {
            throw e.message === "timeout" ? "timeout" : "error";
        }
    }

    try {
        const [r1, r2] = await Promise.all([safeCheck(url1), safeCheck(url2)]);
        
        if (r1 === true && r2 === true) return "success";
        if (r1 === false || r2 === false) return "fail";
    } catch (e) {
        return e; // "timeout" или "error"
    }
}

ЗАДАНИЕ 5

Необходимо написать функцию для подсчёта суммы всех числовых значений в массиве.
Валидным числовым значением являются так же строки, которые начинаются с цифр. В этом случае в качестве числового значения нужно использовать эту начальную последовательность цифр. Массив может содержать любые типы данных, быть не плоским.

Нельзя использовать встроенные методы типа .flat, .flatMap.

function sum(arr) {
    // ...
}
console.log(sum([1, 'x', '2x', ['3', ['x2', '5']]])); //11

РЕШЕНИЕ

function sum(arr) {
    let result = 0;

    for (const item of arr) {
        if (Array.isArray(item)) {
            result += sum(item);
        } else if (typeof item === 'number') {
            result += item;
        } else if (typeof item === 'string') {
            let numStr = '';
            for (const char of item) {
                if (char >= '0' && char <= '9') {
                    numStr += char;
                } else {
                    break;
                }
            }
            if (numStr) {
                result += parseInt(numStr, 10);
            }
        }
    }
    return result;
}
#19Яндекс. Эйчартех. 1 этап2025-05-06

Яндекс. Эйчартех. 1 этап проверка знаний на js.
1. Тут все понятно, реализация своего intersection

Set.prototype.intersection = function (otherSet) {
  const result = new Set();
  const [small, large] = this.size < otherSet.size ? [this, otherSet] : [otherSet, this];

  for (const item of small) {
    if (large.has(item)) {
      result.add(item);
    }
  }

  return result;
};

2. В комментах написано что нужно сделать

/**
 * ✅ Реализовать функцию any, которая бы работала, как Promise.any().
 * ▪️ Функция принимает массив промисов (считаем, что не пустой) и возвращает промис.
 * ▪️ Если какой-то из переданных промисов резолвится (успешно выполняется), то возвращаемый промис резолвится с этим значением.
 * ▪️ Если все переданные промисы реджектятся, то возвращаемый промис реджектится с ошибкой AggregateError, в которой сгруппированы все ошибки, с учётом порядка.
 *
 * AggregateError можно создавать таким образом:
 * new AggregateError(errors, 'No Promise in any was resolved')
 */

class AggregateError extends Error {
  constructor(errors, message) {
    super(message);
    this.errors = errors;
    this.name = 'AggregateError';
  }
}

function any(promises) {
  return new Promise((resolve, reject) => {
    const errors = [];
    let rejectedCount = 0;

    promises.forEach((p, i) => {
      Promise.resolve(p)
        .then(resolve)
        .catch((err) => {
          errors[i] = err;
          rejectedCount++;
          if (rejectedCount === promises.length) {
            reject(new AggregateError(errors, 'No Promise in any was resolved'));
          }
        });
    });
  });
}

// Примеры использования
console.clear();
const p1 = Promise.reject('Error 1');
const p2 = Promise.reject('Error 2');
const p3 = Promise.resolve(3);

any([p1, p2, p3]).then(console.log); // 3

3. Что то типо реализации методов массива + вывод максимального значения

class MaxStack {
  constructor() {
    this.stack = [];
    this.maxStack = [];
  }

  push(value) {
    this.stack.push(value);
    const max = this.maxStack.length === 0
      ? value
      : Math.max(value, this.maxStack[this.maxStack.length - 1]);
    this.maxStack.push(max);
  }

  pop() {
    if (this.stack.length === 0) throw new Error('Stack is empty');
    this.maxStack.pop();
    return this.stack.pop();
  }

  max() {
    if (this.maxStack.length === 0) throw new Error('Stack is empty');
    return this.maxStack[this.maxStack.length - 1];
  }
}

const stack = new MaxStack();
stack.push(2); // max = 2, stack = [2]
stack.push(1); // max = 2, stack = [2, 1]
stack.push(3); // max = 3, stack = [2, 1, 3]
stack.push(3); // max = 3
#20Яндекс Кинопоиск Smart TV 1 этап2025-05-05

- Яндекс Кинопоиск Smart TV 1 этап.
Только софтовые вопросы.

- опыт
- какие сложные задачи я делал
- что меня мотивирует в работе
- как устроена команда, как происходит управление (scrum, kanban)
- какими своими фичами я горжусь в проекте

#21Яндекс. Скрининг2025-05-04

Яндекс. Скрининг

1) Готовы ли рассмотреть гибридный или офисный формат работы (2-3 дня в неделю в офисе)?
2) Есть ли офферы на руках? Есть ли дедлайн по принятию решения?
3) Сколько лет опыта TypeScript и React? Сколько лет опыта на NodeJS. Что именно делали?
4) Какая роль на последнем месте? Какими задачами занимаетесь?
5) Были ли тесты на проекте, если да, то какие?
6) Когда вы готовы предварительно начать процесс прохождения технических этапов?

#22Яндекс 1 этап2025-04-22

Компания: Яндекс 1 этап

Задачи:
1

// — 1 — 
console.log( typeof [] ) // ??

// — 2 — 
console.log( typeof null ) // ??

// — 3 — 
console.log( 1 + "2" ) // ??

// — 4 — 
console.log( "4" - 2 ) // ??

// — 5 — 
const first = () => console.log('Один')
const second = () => console.log('Два')
const third = () => console.log('Три')

first()
setTimeout(second, 0)
third()

// ??

// — 6 — 
var a = 2
var b = a
b++

console.log(a) // ??
console.log(b) // ??

// — 7 — 
var c = [1, 2, 3]
var d = c
d.push(4)
console.log(c) // ??
console.log(d) // ??

// — 8 — 
{
    console.log(i) // ??
    var i = 10
    console.log(i) // ??
}

2

// Необходимо реализовать метод groupBy, расширяющий стандартные методы массивов.
// Метод должен возвращать сгруппированную версию массива — объект,
// в котором каждый ключ является результатом выполнения переданной функции fn(arr[i]),
// а каждое значение — массивом, содержащим все элементы исходного массива с этим ключом.

// code here

3

/**
 * Необходимо написать функцию, которая на вход принимает url,
 * асинхронно ходит по этому урлу GET запросом и возвращает данные (json).
 * Для получения данных использовать fetch.
 * Можно использовать только Promise API
 * Если во время запроса произошла ошибка, то пробовать запросить ещё 5 раз.
 * Если в итоге информацию получить не удалось, вернуть ошибку "Заданный URL недоступен".
 */

function get(url) {
    // code here
}

get(url)
  .then(res => console.log(res))
  .catch(err => console.error(err))

4

// Вам задана строка, состоящая из латинских букв, пробелов и знаков препинания.
// Строка называется панграммой, если она содержит каждую из 26 латинских
// букв хотя бы раз. Определите, является ли строка панграммой.
// Сложность O(n)

const LETTERS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

function isPangram(text) {
    // your code here
}

5

/**
 * Написать декоратор для функции, который ограничивает число вызовов.
 *
 * callLimit(fn, limit, callback) принимает следующие аргументы:
 *  fn – функция, которую декорируем;
 *  limit – максимальное число вызовов;
 *  callback – вызывается, когда совершен последний вызов. Опционально.
 * У вызываемой функции должен быть метод для перезагрузки счетчика в начальное положение.
 */

function callLimit(fn, limit, callback) {
    // Тут что-то написать
}

function log(title, message) {
    console.log(title + ': ' + message);
}
#23Яндекс (первый этап)2025-02-26

Компания: Яндекс (первый этап)

Были только задачи, экран не шарил, немного помогали.

1. Что выведет в консоль и почему?

Первая задача

var n = 5

function fn(n) {
    n = 10
}

fn(n)
console.log(n) //???

Ответ: 5

Вторая задача

var obj = { a : 1}

function fn(obj) {
    obj = { c : 5}
}

fn(obj)
console.log(obj) //???

Ответ: { a : 1}

Третья задача

var obj = { a : 5}

function fn(obj) {
    obj.c = 10
}

fn(obj)
console.log(obj) //???

Ответ: { a : 5, c : 10 }

2. onceFn — Написать функцию которая вызывается только один раз

function onceFn(fn) {
   //Code here
}

function log(value) {
    console.log(value)
}

const onceLog = onceFn(log)

onceLog('1') // Выведет 1
onceLog('2') // Вернёт undefined
onceLog('3') // Вернёт undefined

const onceLog2 = onceFn(log)
onceLog2('4') // Выведет 4
onceLog2('5') // Вернёт undefined
onceLog2('6') // Вернёт undefined

Решение:

function onceFn(fn) {
    let isCall = false

    return (...args) => {
        if (!isCall) {
            isCall = true
            return fn(...args)
        }
    };
}

//P.S.(можно сделать с привязкой контекста):

3. Написать полифил для groupBy у массивов
Array.prototype.groupBy

Решение:

Array.prototype.groupBy = function (callback) {
    const result = {}

    for (let i = 0; i < this.length; i++) {
        const key = callback(this[i])

        if (!result[key]) result[key] = []

        result[key].push(this[i])
    }

    return result
}

const arr = [ 1, 2, 3, 4, 5 ]
const grouped = arr.groupBy((num) => num % 2 === 0 ? 'even' : 'odd')

console.log(grouped)

// P.S. Можно написать более продвинутое решение с дополнительными проверками и передачей доп. аргументов в callback

4. Функция Auth должная вернуть промис после выполнения callback в asyncAuth c error (rejected) либо data (fullfiled)

import asyncAuth from 'lib/auth'

function Auth() {
    asyncAuth((error, data) => {
        //Code here
    })
}

Решение:

function Auth() {
    return new Promise((resolve, reject) => {
        asyncAuth((error, data) => {
            if (error) {
                reject(error);
            } else {
                resolve(data);
            }
        });
    });
}

5. Задача немного связанная с предыдущей Auth.
Реализовать функцию которая будет вызывать попытки авторизации

Решение:

function auth(count = 5) {
    return new Promise(() => {
        function tryAuth(count) {
            Auth.then((value) => {
                resolve(value)
            }).catch((error) => {
                if (count === 0) {
                    reject(error)
                } else {
                    tryAuth(url, count - 1)
                }
            })
        }

        tryAuth(5)
    })
}

6. Сложить числа из массива
Дан массив [1, [2, '2x', 3], ['5', ['x7', ['6', '4']]]]
Нужно сложить все числа массива.
Если попадается число на подобии '2x' считать его как 2
Если 'x7', то игнорировать
P.S. Методы flat и flatMap нельзя использовать

Решение 1 (постое, думаю бы приняли его):

function flattenSum(arr) {
    let sum = 0

    for (let i = 0; i < arr.length; i++) {
        const el = arr[i]

        if (Array.isArray(el)) {
            sum += flattenSum(el)
        } else {
            sum += parseFloat(el) || 0
        }
    }

    return sum
}

Решение более сложное (написал его):

function helper(num) {
    return parseFloat(num) || 0
}

function flattenSum(arr) {
    const stack = [ arr ]
    let sum = 0

    while (stack.length > 0) {
        const pop = stack.pop()

        if (Array.isArray(pop)) {
            stack.push(...pop)
        } else {
            sum += helper(pop)
        }
    }

    return sum
}

console.log(flattenSum([ 1, [ 2, '2x', 3 ], [ '5', [ 'x7', [ '6', '4' ] ] ] ]))

7. Задача MaxStack — это классическая задача, которая требует реализации структуры данных, похожей на стек, но с дополнительной функциональностью: она должна поддерживать не только стандартные операции стека (push, pop), но и операцию быстрого получения максимального элемента в стеке.
Формулировка задачи:
Реализуйте структуру данных MaxStack, которая поддерживает следующие операции:

push(x) — добавляет элемент x в стек.

pop() — удаляет и возвращает верхний элемент стека.

top() — возвращает верхний элемент стека без его удаления.

getMax() — возвращает максимальный элемент в стеке.

Все операции должны выполняться за O(1) время.

Решение которое написал не помню, но примерно такое-же:
Deepseek: vvv

class MaxStack {
    constructor() {
        this.stack = []; // Основной стек
        this.maxStack = []; // Вспомогательный стек для хранения максимумов
    }

    // Добавление элемента в стек
    push(x) {
        this.stack.push(x);
        // Если maxStack пуст или x >= текущего максимума, добавляем x в maxStack
        if (this.maxStack.length === 0 || x >= this.maxStack[this.maxStack.length - 1]) {
            this.maxStack.push(x);
        }
    }

    // Удаление и возврат верхнего элемента
    pop() {
        if (this.stack.length === 0) {
            throw new Error("Stack is empty");
        }
        const popped = this.stack.pop();
        // Если удалённый элемент равен текущему максимуму, удаляем его из maxStack
        if (popped === this.maxStack[this.maxStack.length - 1]) {
            this.maxStack.pop();
        }
        return popped;
    }

    // Возврат верхнего элемента без удаления
    top() {
        if (this.stack.length === 0) {
            throw new Error("Stack is empty");
        }
        return this.stack[this.stack.length - 1];
    }

    // Возврат максимального элемента
    getMax() {
        if (this.maxStack.length === 0) {
            throw new Error("Stack is empty");
        }
        return this.maxStack[this.maxStack.length - 1];
    }
}

// Пример использования:
const maxStack = new MaxStack();
maxStack.push(3);
maxStack.push(5);
maxStack.push(2);
console.log(maxStack.getMax()); // 5
maxStack.pop();
console.log(maxStack.top()); // 5
console.log(maxStack.getMax()); // 5
maxStack.push(6);
console.log(maxStack.getMax()); // 6
#24Яндекс (1 этап)2025-01-28

- компания: Яндекс (1 этап)

Задачи:
#Задача 1
Что выведет консоль
Как исправить

Условие:

const object = {
  value: '42',
  print() {
    function type() {
      return this.value;
    }
    
    console.log(`${this.value} is ${type()}`);
  },
};

object.print();

Решение
// Консоль выведет 42 undefined
// Чтоб исправить нужно задать контекст функции, либо сделать ее стрелочной, чтоб она брала контекст выше

const object = {
  value: '42',
  print() {
    const type = () => {
      return this.value;
    }
    
    console.log(`${this.value} is ${type()}`);
  },
};

object.print();

#Задача 2
Написать ф-цию compose

Условие:

function compose() {
  // code here
}

const square = (x) => x * x;
const times2 = (x) => x * 2;
const sum = (a, b) => a + b;

console.log(compose(square, times2)(2) === square(times2(2)));
console.log(compose(square, times2, sum)(3, 4) === square(times2(sum(3, 4))));

Решение

function compose(...funcs) {
  return function(...args) {
    return funcs.reduceRight((acc, fn) => [fn(...acc)], args)[0];
  };
}

#Задача 3
Написать функцию get, которая принимает url, делать запрос и отдает ответ. В случае ошибки делает 5 попыток

решение

function get(url, count = 5) {
  return (
    fetch(url)
    .then((res) => {
      return res.json();
    })
    .catch(() => {
      if (count > 0) {
        return get(url, count - 1)
      }

      return Promise.reject('Задача не выполнена')
    })
  )
}

get('https://api.example.com/data')
    .then(res => console.log(res))
    .catch(err => console.error(err));

#Задача 4
Есть дерево, на котором сидят белки (squirrel) и вороны(raven). Нужно написать функцию, которая проходит по дереву, собирает всех белок и выводит их имена

Условие

function squirrelScanner(tree) {
  // code here
}

// Пример дерева
const tree = {
  nest: { name: 'NEVERMORE!', type: 'raven' },
  branches: [
    {
      nest: { name: 'Acorn', type: 'squirrel' },
      branches: [
        {
          nest: { name: 'Sir Salty', type: 'squirrel' },
        },
        {
          nest: { name: 'Huginn', type: 'raven' },
          branches: [
            {},
            { nest: { name: 'Muninn', type: 'raven' } },
            { nest: { name: 'Kernel', type: 'squirrel' } },
          ],
        },
      ],
    },
  ],
};

console.log(squirrelScanner(tree)); // ['Acorn', 'Sir Salty', 'Kernel']

Решение:

function squirrelScanner(tree) {
  const squirrels = [];

  // Проверяем текущий узел дерева
  if (tree.nest.type === 'squirrel') {
    squirrels.push(tree.nest.name);
  }

  // Если есть ветви, рекурсивно ищем белок в каждой ветви
  if (tree.branches) {
    tree.branches.forEach(branch => {
      squirrels.push(...squirrelScanner(branch));  // Собираем белок из дочерних ветвей
    });
  }

  return squirrels;
}
#25Яндекс, первый этап2024-12-24

Компания: Яндекс, первый этап

// Первая секция:

var n = 1;
function f(n) {
  n = 3;
}
f(n);
console.log(n); // ?? 1


var obj = { a: 1 };
function f1(o) {
  o.a = 5;
}
f1(obj);
console.log(obj); // ?? { a: 5 };


var obj = { a: 1 };
function f2(o) {
  o = { hello: 1 };
}
f2(obj);
console.log(obj); // ??{ a: 1 };



/**
 * Необходимо написать функцию strjoin, которая склеивает строки через разделитель.
 */

function strjoin(splitter, ...strings) {
  // return strings.join(splitter);
  let result = '';
  for (let i = 0; i < strings.length; i++) {
    let current = strings[i];
    if (i === 0) result += `${current}`;
    else result += `${splitter}${current}`;
  }

  return result;
}

console.log(strjoin('.', 'a', 'b', 'c')); // 'a.b.c'
console.log(strjoin('-', 'a', 'b', 'c', 'd', 'e', 'f')); // 'a-b-c-d-e-f'


/*
 * Нужно написать функцию compose.
 * Количество входящих функций в compose и число аргументов результирующей функции не ограничены.
 */

const square = (x) => x * x;
const times2 = (x) => x * 2;
const sum = (a, b) => a + b;

console.log(compose(square, times2)(2) === square(times2(2)));
console.log(compose(square, times2, sum)(3, 4) === square(times2(sum(3, 4))));


function compose(...funcs) {
  return function (...args) {
    return funcs.reduceRight((acc, fn) => {
      return [fn(...acc)];
    }, args)[0];
  };
}


/*Задача: Реализация функции timeLimited
Описание:

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

Требования:

Функция timeLimited должна принимать два аргумента:
fn: асинхронная функция, выполнение которой нужно ограничить.
t: временной лимит в миллисекундах (число).
Функция timeLimited должна возвращать новую асинхронную функцию, которая:
Принимает произвольное количество аргументов, которые будут переданы в fn.
Использует Promise.race для одновременного выполнения двух промисов:
Первый промис — это вызов функции fn с переданными аргументами.
Второй промис — это таймер, который отклоняется через t миллисекунд с сообщением "Time limit exceeded".
Если функция fn выполняется в пределах временного лимита, результат выполнения должен быть возвращён.
Если функция fn не завершает выполнение в течение времени t, функция должна отклоняться с ошибкой "Time limit exceeded". */

const timeLimited = function (fn, t) {
  return async function (...args) {

    return Promise.race([
      fn(...args),

      new Promise((_, reject) =>
        setTimeout(
          () =>
            reject("Time limit exceeded"),
          t
        )
      ),
    ]);
  };
};


/**
 * 
 * Реализовать задачу isMonotonic, на вход приходит массив с цифрами, нужно отдать true, если айтемы в массиве идут 
 * вверх или вних, последовательно, а если нет то false 
 * 
 * [1, 2, 3, 5, 7, 8] => true
 * [6, 4, 2, 1 ] => true
 * [2, 3, 7, 4] => false
 *
 */

function isMonotonic(numbers) {
  if (numbers.length <= 1) return true;

  let isIncreasing = true;
  let isDecreasing = true;

  for (let i = 1; i < numbers.length; i++) {
      if (numbers[i] > numbers[i - 1]) {
          isDecreasing = false;
      }
      if (numbers[i] < numbers[i - 1]) {
          isIncreasing = false;
      }
  }

  return isIncreasing || isDecreasing;
}

/*
   Напишите код, который при клике на любой div
   внутри root будет выводить в консоль его id.
   Можно использовать jQuery
   */

<div id="root" style="background: red;">
  root
  <span id="id1" style="background: lightblue;">id1</span>
  <div id="id2" style="background: green;">
    id2
    <div id="id3" style="background: yellow;">id3</div>
  </div>
</div>;

const root = document.getElementById("root");
root.addEventListener("click", (event) => {
  if (event.target.tagName === "DIV") {
    console.log(event.target.id);
  }
});
#26Яндекс (1этап) (меня собесили в яндекс музыку)2024-11-14

Яндекс (1этап) (меня собесили в яндекс музыку) Вакансия:Hr сама написала Вопросы: - Расскажи про опыт - Про Promise - Про Event bubbling Задачи: - Стандартная задача какого цвета будет <div> :

Оба дива будут синими.

В CSS, когда у элемента несколько классов, приоритет имеют стили, указанные позже. Поскольку .blue определяется после .red, стили .blue будут применяться ко всем элементам, поэтому оба дива будут с синим фоном.

-

function canGetCount(n) {
    let count = 0;
    return function() {
        if (count < n) {
            count++;
            return 'yes';
        } else {
            return 'no';
        }
    };
}

-

Promise.resolve(1)
    .then(x => x + 1)                   // x = 1, возвращает 2
    .then(x => { throw x })             // выбрасывает ошибку со значением 2
    .then(x => console.log(x))          // пропускается, так как была ошибка
    .catch(err => console.log(err))     // ловит ошибку и выводит 2 в консоль
    .then(x => Promise.resolve(1))      // возвращает промис, который резолвится в 1
    .catch(err => console.log(err))     // пропускается, так как нет ошибки
    .then(x => console.log(x));         // выводит 1 в консоль

-

function isValid(str) {
  const stack = [];
  const brackets = {
    '(': ')',
    '{': '}',
    '[': ']'
  };

  for (let char of str) {
    if (brackets[char]) {
      // если открывающая скобка, добавляем в стек
      stack.push(char);
    } else if (Object.values(brackets).includes(char)) {
      // если закрывающая скобка, проверяем соответствие
      if (brackets[stack.pop()] !== char) {
        return false;
      }
    }
  }

  // если стек не пуст, значит есть незакрытые скобки
  return stack.length === 0;
}
#27Яндекс (Multitrack, 1 этап JS задачи)2024-10-09

— Вопросов не было
— Задачи (по всем задачам нужно рассуждать почему именно такой ответ, что ты думаешь, почему именно такое решение хочешь сделать. Обработать всевозможные ошибки, или хотябы обсудить потенциальные):

1) Надо сделать функцию get, которая принимает в себя объект и строку. И отдает найденное значение. Строкой является путь ключей через точку, по которым мы хотим дойти до значения в объекте.

const get = (obj, path) => {}

const obj = {
  a: 'f',
  b: {
    k: {
      m: '123'
    }
  },
  c: {
    d: '3'
  },
  e: ['111, '222', '333']
}

console.log(get(obj, 'a') // f
console.log(get(obj, 'b.k.m') //'123'
console.log(get(obj, 'c.d.c') // undefined
console.log(get(obj, 'e.1') // '111'

2) Что выведет, почему, и как пофиксить (чтобы -2 не выводился).

var i = 10;
var array = []

while(i--) {
  array.push(function() {
    return i + i
  })
}

console.log(array[0]()) // -2
console.log(array[1]()) // -2

3) У нас есть синхронная функция asyncAuth, которая принимает в себя колбек, и отдает ему 2 аргумента: 1 - потенциальная ошибка (если нет вернет undefined), 2 - актуальные данные, если ошибки нет.
1 Условие: напиши функцию auth, которая выполняет функцию asyncAuth, и возвращает Promise с актуальными данными или ошибкой.
2 Условие: напиши функцию tryAuth(n), которая принимает 1 аргумент, являющимся числом попыток выполнения auth функции если она вернула ошибку при первом выполнении.

function asyncAuth(callback) {...}
#28Яндекс первый этап2024-07-29

— Яндекс первый этап
— не обсуждали
— hr написал
задачи:
1. из скрина задание. изначально получаем только примитивы насколько помню
2. расширить если мы получаем на вход функцию
3. расширить если мы получем промис

#29ЯНДЕКС ГО первый тех этап2024-07-04

ЯНДЕКС ГО первый тех этап

— итог: ✅ позвали на след этап, несмотря на то что не ответил про специфичность

ВОПРОСЫ
- назови HTTP методы, для чего используются и отличия
- знакомо ли понятие идемпотентные методы
- какие методы взаимодействия сервисов ты знаешь для постоянного соединения между собой (SSE, WebSocket, Pooling) какие есть проблемы

ЗАДАЧИ
- спроектировать API, будут вытекающие вопросы: про пагинацию, про query-params, про изменение данных и про удаление

Спроектируйте API для корзины интернет магазина:
1. получение списка айтемов из корзины,
2. получение одного айтема,
3. удаление айтема из корзины,
4. обновление айтема из корзины.

Шаблон для ответа

METHOD /URL
Headers: Header1=value, Header2=value2, ...
Body: {...}
Response: {...}

Пример:

POST /path/to/src
Body: {}
Headers: A="b"
Response: {}

*/
// write here...

- задача про специфичность

<div class="box block"></div>

<style>
  .box {
    width: 100px;
    height: 100px;
  }
  
  * {
    background: black;
  }
  
  .box {
    background: yellow;
  }
  
  .box.block {
    background: green;
  }
  
  .block {
    background: red;
  }
  
  div.block {
    background: blue;
  }
</style>

- какой будет порядок выполнения

console.log('apple');

setTimeout(() => console.log('pear'), 0);

Promise.resolve('melon').then(res => console.log(res));

new Promise((resolve, reject) => {
  console.log('orange');
  resolve('pineapple');
}).then(res => console.log(res));

console.log('lime');

- решить задачу

/* Функция проверяет, является ли первая строка подпоследовательностью второй
(нечеткий поиск - fuzzysearch или approximate string matching).

Нужно реализовать функцию с использованием только одного прохода 
по символам строки, без использования регулярных выражений.
*/
Пример работы:

fuzzysearch('car', 'cartwheel')      // true
fuzzysearch('cwhl', 'cartwheel')     // true
fuzzysearch('we', 'cartwheel')       // true
fuzzysearch('cartwheel', 'cartwheel') // true
fuzzysearch('cwheeel', 'cartwheel')  // false
fuzzysearch('lw', 'cartwheel')       // false

function fuzzysearch(needle, stack) {
  // your code
}
#30Яндекс Про (1 этап)2024-06-25

- Яндекс Про(1 этап)
- Рекрутер написала
- Задачи:
1) Что выведет в консоль? Как починить?

    setTimeout(() => {
      console.log(i)
    }, 10 )
  }

2) Что выведет в консоль?

.then(x=>x+1)
.then(x=> {throw x})
.then(x=>console.log(x))
.catch(err=>console.log(err))
.then(x=>Promise.resolve(1))
.catch(err=>console.log(err))
.then(x=>console.log(x))

3) Написать свой аналог Promise.allsetled

4) Написать функцию, которая определяет, является ли переданная стоока палиндоомом
(читается слева-направо и справа-налево одинаково).
Примеры палиндромов:
- казак
- А роза упала на лапу Азора
- Do geese see God?
- Madam. I'm Adam
Ограничение по памяти О(1).

  return char.toLocaleLowerCase() !==char.toLocaleUpperCase()
}
function isEqualChars(char1, char2){
  return char1.toLowerCase() === char2.toLowerCase()
}

function isPalindrome(s){
  let start = 0,
  end = s.length - 1;
while (start < end){
let startChar = s[start],
endChar = s[end]
if (!isWord(startChar)){
start++;
continue;
  
}
if(!isWord(endChar)){
end--;
continue;
}

if (!isEqualChars(startChar, endChar)){
  return false;
}

start++;
end--;

}
return true
}
#31Яндекс Multitrack [Первый Этап]2024-05-24

— Задачи: лайвкодинг

— Задачки:

Первая задача:

function _sum(a, b) {
    return a + b;
}

function spy(f) {
    function wrapper(...args) {
        const result = f.apply(this, args);
        wrapper.data.calls++;
        wrapper.data.args.push(args);
        wrapper.data.results.push(result);
        return result;
    }

    wrapper.data = {
        calls: 0,
        args: [],
        results: []
    };

    return wrapper;
}

#################################

Вторая задача:

class EventEmitter {
  constructor() {
    this.events = {};
  }

  addEventListener(event, listener) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(listener);
    return () => {
      this.events[event] = this.events[event].filter(l => l !== listener);
    };
  }

  dispatchEvent(event, ...args) {
    if (!this.events[event]) return;
    this.events[event].forEach(listener => listener(...args));
  }
}

########################################

Третья задача:

class EventEmitter {
  constructor(queueType) {
    this.events = {};
   this.queueType = queueType;

  }

  addEventListener(event, listener) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(listener);
    return () => {
      this.events[event] = this.events[event].filter(l => l !== listener);
    };

dispatchEvent(event, payload) {
    if (!this.events[event]) {
      return;
    }
    
    const dispatchFn = () => {
      this.events[event].forEach(listener => listener(payload));
    };

    if (this.queueType === 'microTask') {
      Promise.resolve().then(() => dispatchFn(payload));
    } else if (this.queueType === 'macroTask') {
      setTimeout(() => dispatchFn(payload), 0);
    } else {
      dispatchFn(paylaod);
    }
  }
 } 


########################################

Четвертая задача:

class EventEmitter {
  constructor(queueType) {
    this.events = {};
   this.queueType = queueType;
  }

  addEventListener(event, listener) {
    if (!this.events[event]) {
      this.events[event] = [];
    }
    this.events[event].push(listener);
    return () => {
      this.events[event] = this.events[event].filter(l => l !== listener);
    };

dispatchEvent(event, payload) {
    if (!this.events[event]) {
      return;
    }
    
    const dispatchFn = () => {
      this.events[event].forEach(listener => listener(payload));
    };

    if (this.queueType === 'microTask') {
      Promise.resolve().then(() => dispatchFn(payload));
    } else if (this.queueType === 'macroTask') {
      setTimeout(() => dispatchFn(payload), 0);
    } else {
      dispatchFn(paylaod);
    }
  }
 } 

once(event, callback) => {
    const  removeEventListener =  this.addEventListener(event, (payload) => {
removeEventListener ();
callback(payload);
})
}

Даниил, привет!
Возвращаюсь с фидбеком.
По первой задаче были небольшие огрехи с контекстом вызова и стрелочной функцией, ты теоретически знал особенности работы, но в своем коде как раз не увидел проблемы, пришлось явно указать на ошибку.
В остальном задачка хорошо прошла если бы не эта ошибка, отлично было бы.

По второй задачке тоже начали отлично, но на последней доп. задаче с once методом будто уже устал и поплыл, пришлось выдавать прямо ключевые идеи и подсказывать с точностью до строки, что и как написать и где баг который был посажен в рамках этой доп. задачи.

Секция пройдена, зову на 2 этап - базовые знания программирования (алгоритмы)

#32Яндекс Финтех [Первый этап]2024-05-02

Быстро справился с задачами. Понравилось как думал и что в целом проявлял инициативу.
Теория – отлично, практика – отлично

Мы рады двигаться дальше, поэтому давай согласуем след. секцию, с алгоритмами.

#33Яндекс (первый этап)2024-04-08

Задачи:
(1) Из строки "a.b.c.d.e" сделать {a:{b:c{d:{e:{}}}}} (долго решал)
(2) Promise.race (не смог написать)