Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.01.2018, 16:13
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Тестовое задание Yandex
Собственно, на задание отведено 15 минут и запрещено запускать консоль. Можно писать код в блокноте и объяснять ход мыслей.

Задача: Есть строка вида "AAAADEEESSQQQQQQ";
Нужно сделать простейший архиватор и выдать что-то вроде: "A4DE3S2Q6".

Поскольку собеседование я засрал, но интерес остался - вот потуги моей деятельности за 3 часа мозго-секса.


var originalString = 'HRRAAAABBZGGU';

		function archiver(data) {

			var elements = data.split("");
			var compressedData = "";
			var compressRate = 1;

			var repeats = [];

			var rate = '';

			for( var i in elements ) {

				if( elements[i++] === elements[i] ) {

					var currentRate = compressRate++;

					repeats.push(currentRate);
					rate += currentRate - "";
				
				} 
				else {

					compressRate = 1;
					repeats = [];
					rate = '';

				}

				i--;

				compressedData += ( repeats.length > 0 ) ? elements[i] + (Math.max.apply(null, rate.split('')) + 1 ) : ( typeof elements[i] !== 'undefined' ) ? elements[i] + '1' : '';
				
			}


			var compressedResult = compressedData.split('');
			var testLetter = '';

			for( var x in compressedResult) {

				if( compressedResult[x++] !== compressedResult[x] ) {
					x--;
					testLetter += ( typeof compressedResult[x] !== 'undefined' ) ? compressedResult[x] : ''; 
				}

			}


			function pairs(testLetter) {
				var pairs = [];

				for( var i = 0; i < testLetter.length / 2; i++ ) {
					pairs.push( testLetter.slice( 2 * i, 2 * i + 2 ) );
				}
				return pairs;
			}


			var compressedDataString = '';


			for( var n in pairs(testLetter) ) {

				if( n == 0 && pairs(testLetter)[n].split('')[1] === '1') {
					compressedDataString += pairs(testLetter)[n].split('')[0];
				}

				var first = pairs(testLetter)[n];
				var second = ( typeof pairs(testLetter)[(n - 0)+1] !== 'undefined' ) ? pairs(testLetter)[(n - 0)+1] : '';

				if( (n - 0) > 0) {

					if( first.split('')[0] == second.split('')[0] ) {

						compressedDataString += first.split('')[0] + first.split('')[1];
					} 
					else {
						//n++
					}
				}

			}

			console.log( compressedDataString );


			return compressedData;

		}

		archiver(originalString);


Она выдает: HR2A2A3A4B2G2

Собсно, я знаю что это говнокод и знаю что неприкольно не доводить до конца, но пока я решал задачу дома - пришло письмо с отказом(мол не тот уровень). Кодить я бросил и предлагаю рушить задачу либо дописав мой говнокод, либо написав с нуля. Просто интересно во сколько по времени вы оцените решение данной постановы.

Я лично припарился Не знаю что там насчет 15 минут - слишком много подводных камней бьют по мизинцам.
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2018, 16:28
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сделал "на коленке" минут за 5 (не засекал):

<input type="text" id="input" />
<div id="display"></div>
<script>
    document.getElementById('input').addEventListener('input', function() {
        document.getElementById('display').innerHTML = pack(this.value);
    });

    function pack(str) {
        var last_char,
            counter = 1,
            res = [];

        (str + '.').split('').forEach(function(char, i, list) {
            if (last_char == char)
                counter++;
            else {
                res.push(last_char);
                if (counter > 1)
                    res.push(counter);

                last_char = char;
                counter = 1;
            };
        });

        return res.join('');
    };
</script>

Последний раз редактировалось Nexus, 30.01.2018 в 16:31.
Ответить с цитированием
  #3 (permalink)  
Старый 30.01.2018, 16:39
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Не поверил конечно, но ладно. Спасибо за вариант.

p.s.: пошел убивать прослушку. видимо у меня совсем мозг не работает.
Ответить с цитированием
  #4 (permalink)  
Старый 30.01.2018, 16:49
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Сообщение от xShift
Не поверил конечно
Во время реализации?
Ответить с цитированием
  #5 (permalink)  
Старый 30.01.2018, 16:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Предложу такой вариант...

var str="AAAADEEESSQQQQQQ";
alert(arh(str));
function arh(Str){
	var cnt=0;
	var old=Str.slice(0,1);
	var arh=old;
	for (var i=1; i<Str.length; i++){
		var val=Str.slice(i,i+1);
		if (val==old) {
			++cnt;
		} else {
			arh=arh+((cnt==0)? '': ++cnt)+val;
			old=val;
			cnt=0;
		};
	};
	if (cnt>0) {
		arh=arh+(++cnt);
	};
	return arh;
};
Ответить с цитированием
  #6 (permalink)  
Старый 30.01.2018, 17:09
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Я начал делать, а потом подумал: что если среди символов цифры?.. Что если символов больше 256 подряд?.. Нужны какие-то разделители?.. Тащем понял, что тупо конечно можно сделать действительно за 5 минут, но если нужна работающая реализация для любых строк, с нормальным кпд, которую потом ещё и разархивировать можно, то это уже надо отдельно думать.)
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 30.01.2018, 17:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109


было задание массив соединение диапазонов
решено так:
<script>
function fn(f) {
  var c = void 0;
  return f.reduce(function(e, d, a, b) {
    a = d + 1 == b[++a];
    b = void 0 === c;
    a && b ? c = d : a || b ? !a && b && e.push(d) : (e.push(c + "-" + d), c = void 0);
    return e;
  }, []);
};
var data = [35, 3, 6, 9, 11, 12, 13, 14, 15, 39, 9, 21, 25, 26, 27];
document.write(JSON.stringify(data) + '<br>' + JSON.stringify(fn(data)))
</script>

...лёгким росчерком переделано в архиватор
<script>
function fn(f) {
  var c = void 0;
  return f.split('').reduce(function(e, d, a, b) {
    a = d == b[++a];
    b = void 0 === c;
    a && b ?(c = 2) : a && c++ || b ? !a && b && e.push(d) : (e.push(d + c), c = void 0);
    return e;
  }, []).join('');
};
var data = 'AAAADEEESSQQQQQQ';
document.write(JSON.stringify(data) + '<br>' + JSON.stringify(fn(data)))
  </script>


...продолжение
<script>
function fn(f) {
  var c = 0;
  return f.split("").reduce(function(e, d, a, b) {
    (a = d == b[++a]) && !c ? c = 2 : a && c++ || !c ? !a && !c && (e += d) : (e += d + c, c = 0);
    return e;
  }, "");
};
var data = 'AAAADEEESSQQQQQQ';
document.write(JSON.stringify(data) + '<br>' + JSON.stringify(fn(data)))
  </script>

ещё чуть-чуть
<script>
function fn(f) {
  var c = 0;
  return f.split("").reduce(function(e, d, a, b) {
     (a = d == b[++a]) && !c && (c = 1);
      a ? c++ : (e += d, c && (e += c, c = 0))
     return e;
  }, "");
};
var data = 'AAAADEEESSQQQQQQ';
document.write(JSON.stringify(data) + '<br>' + JSON.stringify(fn(data)))
  </script>

Последний раз редактировалось рони, 30.01.2018 в 18:43.
Ответить с цитированием
  #8 (permalink)  
Старый 30.01.2018, 18:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

alert('AAAADEEESSQQQQQQ'.split('').reduce(function(m, c, i, a) {
    if(c == a[i+1]) m[m.length-1]++; 
    else {
        m[m.length-1] = c+m[m.length-1];  
        if(a[i+1]) m.push(1);
    }
    return m
}, [1]).join(''));

Последний раз редактировалось laimas, 30.01.2018 в 18:09.
Ответить с цитированием
  #9 (permalink)  
Старый 30.01.2018, 18:17
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Завтра Яшка всем тут отказы напишет.
Ответить с цитированием
  #10 (permalink)  
Старый 30.01.2018, 18:19
Аватар для xShift
Профессор
Отправить личное сообщение для xShift Посмотреть профиль Найти все сообщения от xShift
 
Регистрация: 22.11.2016
Сообщений: 212

Вариант рони понравился ибо украсть этот код не получится. Такая последовательность никогда не просплойтиться и идею не возможно будет утащить тупо прослушкой.

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

6 лет с депутатами, беретами и киношниками и еще всех не упомнить уже сделали мой мозг не восприимчивым к таким формам мышления. Как застрял в 2011 - так там и торчу в области программирования. С версткой еще как-то мозг развивается немного.

Все не плохо. Если не могу работать сам - значит за меня будут работать другие, а я получать за то, чтобы им работать не мешали.

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Yandex map api или Yandex static arahmanov Элементы интерфейса 5 04.02.2016 11:34
Тестовое задания Front-end разработчику Имя Работа 19 08.12.2011 12:31
Тестовое задание Yandex mycoding Оффтопик 71 06.07.2011 15:46
Тестовое задание. Дайте идею. FINoM Оффтопик 14 28.03.2011 10:09
Помогите сделать тестовое задание начального уровня по js makregistr Работа 1 16.12.2010 14:26