Тестовое задание 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 Собсно, я знаю что это говнокод и знаю что неприкольно не доводить до конца, но пока я решал задачу дома - пришло письмо с отказом(мол не тот уровень). Кодить я бросил и предлагаю рушить задачу либо дописав мой говнокод, либо написав с нуля. Просто интересно во сколько по времени вы оцените решение данной постановы. Я лично припарился :D Не знаю что там насчет 15 минут - слишком много подводных камней бьют по мизинцам. |
Сделал "на коленке" минут за 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>
|
Не поверил конечно, но ладно. Спасибо за вариант.
p.s.: пошел убивать прослушку. видимо у меня совсем мозг не работает. |
Цитата:
|
Предложу такой вариант...
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;
};
|
Я начал делать, а потом подумал: что если среди символов цифры?.. Что если символов больше 256 подряд?.. Нужны какие-то разделители?.. Тащем понял, что тупо конечно можно сделать действительно за 5 минут, но если нужна работающая реализация для любых строк, с нормальным кпд, которую потом ещё и разархивировать можно, то это уже надо отдельно думать.)
|
:write:
было задание массив соединение диапазонов решено так:
<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>
ещё чуть-чуть :write:
<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>
|
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(''));
|
Завтра Яшка всем тут отказы напишет. :D
|
Вариант рони понравился ибо украсть этот код не получится. Такая последовательность никогда не просплойтиться и идею не возможно будет утащить тупо прослушкой.
А я, увы, похоже больше не смогу развиваться в этом ключе. :cray: 6 лет с депутатами, беретами и киношниками и еще всех не упомнить уже сделали мой мозг не восприимчивым к таким формам мышления. Как застрял в 2011 - так там и торчу в области программирования. С версткой еще как-то мозг развивается немного. ;) Все не плохо. Если не могу работать сам - значит за меня будут работать другие, а я получать за то, чтобы им работать не мешали. :victory: Пошел накачаю какого нибудь сутулого беднягу красноглазика, который круглосуточно пишет код и не подозревает о том что кто-то его бережно разрабатывает ;) |
| Часовой пояс GMT +3, время: 05:13. |