codility

Тестировался сегодня на codility.com, сделал два задания, с третьим чтото не срослось. Задание скопировать не додумался поэтому импровизирую:

Есть двоичное представление некого числа, например 1000100001, в нем есть две группы нулей запертых между единицами. В числе 1000 нету запертых нулей. Надо написать функцию которая вернет количество нулей в самой длинной запертой последовательности, 101-1, 10010001-3, 10100-1

Первый вариант решения, с реализацией алгоритма который считает все за O (O это не 0), этот вариант был отправлен на проверку


(function binary_gap( N ) {
	var binary = N.toString(2),
		j = binary.length,
		started = false,
		counter = 0,
		longest = 0;
	while (j--) {
		if (binary[j] === "1") {
			if (started === false) {
				started = true;
			} else if (counter > 0) {
				started = false;
				longest = counter > longest ? counter : longest;
			}
			counter = 0;
		} else {
			if (started === true) {
				counter++;
			}
		}
	}
	return longest;
})(483); // 3

Второй вариант решения, с регулярками и в-одну-стоку, был придуман пока писалась заметка


(function binary_gap( N ) {
	return N
		.toString(2) // приводим в двоичный вид
		.replace(/0+$/g, "") // тримем нули только в конце так как в начале их никогда нет
		.match(/0+/g) // еще раз применяем страшную регулярку
		.sort() // сортируем квиксортом (об алгоритмах сортировки в браузере была отдельная статья)
		.pop() // берем последний
		.length; // получаем длину
})(483);

Вторая задача: есть A < B, K где A,B,K натуральные. Надо в промежутке от A до B найти все числа, которые нацело делятся на K (тоесть mod) и посчитать их количество. решение опять же считает все за O, тоесть в один проход по массиву


(function count_div ( A,B,K ) {
	for (var counter = 0; A < B; A++) {
		if ( A % K === 0) {
			counter++;
		}
	}
	return counter;
})(6,11,2); // 3

После написание этого кода мне сказали что: Your codility score is not high. Предлагаю вам "сделать" Старика написав более кодистый код :)

4 Комментарии “codility

  1. решил задачку с кольцами и дисками, правда сайт заглючил и не выдал мне ответ

    
    function falling_disks ( A,B ) {
        for (var i = A.length-1, j = 0; i >= 0 ; i--) {
            if (A[i] >= B[j] && Math.min.apply( null, A ) >= B[j]) { 
            	j++;
            }
            if (B[j] === undefined) break;
            A.splice(i, 1);
        }
        return j;
    }
    
  2. 67/100 кхм
    не скалабельно, нужно было юзать другую функцию для поиска минимального диска

  3. а как ты вторую задачу получил, я как не пытался, мне одна и та же задача

Комментарии закрыты