repairCase('Hello World', 'hell'); // 'Hell'
repairCase('Алан Тьюринг', 'а'); // 'а'
repairCase('Дональд Кнут', 'Н'); // 'н'
repairCase('Линус Торвальдс', 'ндc'); // ''function repairCase(str, substr) {
	if (!substr) return ''; //Empty string
	//let arr = []; //Найденные результаты. Для наглядного дебага
	let str_upper = str.toUpperCase();
	let sub_upper = substr.toUpperCase();
	let len = sub_upper.length;
	let index = 0; //Стартовая позиция
	let max_score = -1; //Максимальная оценка на совпадение по регистру.
	let answer = ''; //То, что вернёт функция.
	while (true) {
		let result = str_upper.indexOf(sub_upper, index); //Ищем позицию очередного куска
		if (result == -1) break;
		let found = str.substr(result, len); //Найденный кусок
		let score = 0; //Оценка совпадения
		for(let i=0;i<substr.length;i++) { //Простой алгоритм:: чем больше совпадений, тем лучше.
			if (substr[i] == found[i]) score++; //Увеличиваем оценку за каждое совпадение по символу.
		}
		if (score > max_score) { //Нашли более подходящий результат
			max_score = score;
			answer = found;
		}
		//arr.push({ pos: result, found: found, score: score });
		index = result + 1;
	}
	//console.log(arr); //Смотрим, что под капотом
	return answer;
}repairCase('Hello World', 'hell'); // 'Hell'
repairCase('Алан Тьюринг', 'а'); // 'а'
repairCase('Дональд Кнут', 'Н'); // 'н'
repairCase('Линус Торвальдс', 'ндc'); // ''// но тесты проходит
  function repairCase(src, input) {
    const len = input.length;
    if (len === 0) return '';
    
    const _src = src.toLowerCase();
    const _input = input.toLowerCase();
    let i, from = 0, maxWeight = -1, maxIndex = -1;
    while (i = _src.indexOf(_input, from), -1 !== i) {
      from = i + 1; 
      const match = src.substr(i, len);
      let weight = 0;
      for (let k = 0; k < len; k++) if (match[k] === input[k]) weight++;
      if (maxWeight < weight) {
        maxWeight = weight;
        maxIndex = i;
      }
    }
    
    if (-1 === maxIndex) return '';
    
    return src.substr(maxIndex, len);
  }