15.10.2009

Домашка №1

По примеру Сергея тоже хочу загрузить вас домашкой :) Не пугайтесь, задания не сложные (пока). Итак, сегодня две задачки по яваскрипту.

Задача 1

Написать метод, который принимает два массива в качестве параметров и возвращает позицию, начиная с которой второй параметр входит как подмассив в первый параметр.

Пример. Первый массив: [4, 8, 15, 16, 23, 42], второй массив: [15, 16], результат: 2

Задача 2

Есть массив с числами. Нужно написать метод, который трансформирует исходный массив в массив функций, которые возвращают исходные числа.

Пример. На входе: [4, 8, 15], на выходе: [function() {return 4;}, function() {return 8;}, function() {return 15;}]

22 комментария:

Chikey комментирует...

1 Пардона ми, я наизусть функции жс не помню, хотя когда то знал наизусть =) в целом думаю поймешь)

trr=function(ar1,ar2){
string1=join(ar1,'|||');
string2=join(ar2,'|||');
#explod string1 with using string2..and then explode result with using '|||' and return count of it..
}

2.
делать смысла нулл, ибо в жс все из объект, а значит, что 5, что return 5 - одно и тоже. Хотя, разумеется, 5() не пашет.

null комментирует...

Мой вариант

Степан Резников комментирует...

@Chikey: Для первой задачи хорошая идея и на практике вполне применимая, хотя строго говоря есть допущение, что в исходных массивах нет элементов содержащих "|||".

Степан Резников комментирует...

@null:
arrayFind([4, 8, 15, 16, 23, 42], [4, 8, 15, 16]) возвращает false, а должен 0.

И еще, странно, что вы используете конструкцию for (k in nidle) для перебора элементов массива. Обычно для этого используют for (var i = 0; i < nidle.length; i++). Конструкция for (k in nidle) не гарантирует порядок перебора ключей, а порядок важен для массивов. Эта конструкция уместна для обхода ключей объектов, потому что length у объектов отсутствует и порядок не важен.

Vii комментирует...

Для (1) ничего гениальнее чем вариант от Chikey сходу не придумал.

Для (2) получился вот такой монстрик (выложить некуда, извиняюсь):

var ArrayToFoo = (function() {
function _f(i) {
return function() {
return i;
}
}


function _a() {
var l = arguments.length,
aR = [];

for( var i = 0; i < l; i++ ) {
aR[i] = _f( arguments[i] );
}

return aR;
}

return function( aParam ) {
return _a.apply( this, aParam );
}
})();

var a = ArrayToFoo( [5,18,25] );

Дима комментирует...

@Степан, forin — это привычка с foreach в php :)

И с поиском поправил. Не тот массив листал для проверки, да и условие if (0) там обрубало дальнейшую проверку.

Исправленный вариант.

Степан Резников комментирует...

@Дима:
arrayFind([4, 8, 15, 15, 16, 23, 42], [15, 16]) возвращает false, а должен 3.

besisland комментирует...

function mietod1(array1, array2) {
if ((array1 instanceof Array) && (array2 instanceof Array)) {
var matches = 0;
for (var i = 0; i < array1.length; i++) {
if (array1[i] == array2[matches]) {
if (++matches == array2.length) {
return i - matches + 1;
}
} else {
matches = 0;
}
}
}
}

function mietod2(array) {
if (array instanceof Array) {
var result = new Array();
for (var i = 0; i < array.length; i++) {
result.push((function() {
var number = array[i];
return function() {
return number;
}
})());
}
return result;
}
}

Дима комментирует...

@Степан, да, надо было подумать над задачей, прежде чем делать реализацию :)

Сделал вариант, из текущего, и более оптимальный.

Степан Резников комментирует...

@besisland:
mietod1([4, 8, 15, 15, 16, 23, 42], [15, 16]) возвращает undefined, а должен 3.

besisland комментирует...

function mietod1(array1, array2) {
if ((array1 instanceof Array) && (array2 instanceof Array)) {
var matches = 0;
for (var i = 0; i < array1.length; i++) {
if (array1[i] == array2[matches]) {
if (++matches == array2.length) {
return i - matches + 1;
}
} else if (matches > 0) {
matches = (array1[i] == array2[0]) ? 1 : 0;
}
}
}
}

nop комментирует...

1. Щитаю, что это тест на велосипедизм и знание стандартных алгоритмов (по крайней мере знание о их существовании). Это задача про поиск подстроки в строке, так что правильный ответ это гугление по соответствующему запросу.
Например, http://ru.wikipedia.org/wiki/Поиск_подстроки -- там и пример псевдокода есть для тривиального алгоритма, а так же ссылки на бесчисленное множество оптимизированных.

2. Тут у тебя нестыковка в формулировке. Функция, возвращающая 4, и функция function() { return 4; } это не совсем одно и то же. Первых функций можно придумать сколько угодно, а вторая только одна.
Ну предположим, что вот так:
jQuery.map([1, 3, 5], function(n) {
return new Function("return " + n);
});

besisland комментирует...

@nop: Ну да, классические задачи, понятно же.

Утверждать (в контексте «Джаваскрипта»), что вторая функция — только одна, нельзя.

var A = function() { return 4; }
var B = function() { return 4; }
alert(A === B); // false

@Степан Резников: Что-то здесь OpenID совсем плохо работает.

Юра комментирует...

Боже ж мой боже... Здесь есть древовидные комменты??? Требую!

berkel комментирует...

Задача №1

function (a1, a2)
{
var a = a1 + '',
b = a2 + '',
c = a.substr(0, a.indexOf(b));
return c.split(',').length - 1;
};

besisland комментирует...

@berkel:

Array.prototype.toString = function() {
var str = "[";
for (var i = 0; i < this.length; i++) {
str += this[i].toString();
}
str += "]";
return str;
}

alert(berkelfunc([4, 8, 15, 16, 23, 42], [15, 16]));

Возвращает ноль (sic).

berkel комментирует...

@besisland:

Задача №1 v.2

function (a1, a2)
{
if (a1.length && a2.length)
{
top: for (var n, q, i = 0, l = a1.length; i < l; i++)
{
if (a1[i] == a2[0])
{
for (n = 1, q = a2.length; n < q; n++)
{
if (a1[i + n] != a2[n]) continue top;
}
return i;
}
}
}
return -1;
};

ikokostya комментирует...
Этот комментарий был удален автором.
Aishek комментирует...

1)
function createString(array)
{
var result = '';
for(var currentIndex = 0, length = array.length; currentIndex < length; currentIndex++)
{
result += String.fromCharCode(array[currentIndex]);
}
return result;
}

function arrayIndex(array1, array2)
{
var string1 = createString(array1);
var string2 = createString(array2);

return string1.indexOf(string2);
}

var a = [4, 8, 15, 16, 23, 42];
var b = [15, 16]

alert(arrayIndex(a, b));

2)

function functionNumbers(array)
{
for(var currentIndex = 0, length = array.length; currentIndex < length; currentIndex++)
{
array[currentIndex] = new Function('return ' + array[currentIndex] + ';');
}

return array;
}

Степан Резников комментирует...

@ikokostya:
Стоит только элементу массива содержать запятую и ваш метод foo уже работает неверно.
foo(['ca,ts', 'dogs', 'rats', 'sharks', 'birds'], ['rats', 'sharks'])

@Aishek:
Ваш метод arrayIndex совсем не готов работать со строками.
arrayIndex(['cats', 'dogs', 'rats', 'sharks', 'birds'], ['rats', 'sharks']) возвращает 0.

ikokostya комментирует...
Этот комментарий был удален автором.
:) комментирует...

разнообразим вторую задачу :)

function nToF (a) {
var r = [];
a.join().replace(/([^,]+)/g, function (s) {
r.push(function () {return Number(s)})
});
return r;
}