Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Задачка на сообразительность (https://javascript.ru/forum/offtopic/15269-zadachka-na-soobrazitelnost.html)

Matre 19.02.2011 21:17

Vulkan

Вот как, например, должна выглядеть вторая функция:

String.prototype.index = function (str) {
	var j = -1, c = false, L1 = this.length, L2 = str.length - 1;
	for (var i = 0; i < L1; i++) {
		if (str.charAt(0) === this.charAt(i))
			c = true, j = i;
		if (c && i === j + L2)
			return j;
		if (c && str.charAt(i) != this.charAt(i + j))
			c = false;
	}
	return j;
};


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

monolithed 19.02.2011 21:28

Зачем все так усложнять? ;)
String.prototype.sepa = function(str, sep) {
     return this.replace(new RegExp(str, 'g'), sep);
};

alert('1 2 3 4 5'.sepa(' ', '-'));


Цитата:

Сообщение от Matre
Вот как, например, должна выглядеть вторая функция:

String.prototype.index = function(str) {
    return [this].join().search(str);
};

alert('1 2 3 4 5'.index('4'));

B@rmaley.e><e 19.02.2011 21:33

Цитата:

Сообщение от Matre
Вот как, например, должна выглядеть вторая функция:

Это функция
Цитата:

Сообщение от Matre
разделения строки на массив по разделителю (аналог String.prototype.split)

? В то же время это ни разу не аналог String.prototype.indexOf
String.prototype.index = function (str) {
	var j = -1, c = false, L1 = this.length, L2 = str.length - 1;
	for (var i = 0; i < L1; i++) {
		if (str.charAt(0) === this.charAt(i))
			c = true, j = i;
		if (c && i === j + L2)
			return j;
		if (c && str.charAt(i) != this.charAt(i + j))
			c = false;
	}
	return j;
};

var s1 = 'aababaO_o',
     l1 = 'aba', l2 = 'abac', l3 = 'aa', l4 = 'O_o';

alert( [
 [s1.index(l1), s1.indexOf(l1)],
 [s1.index(l2), s1.indexOf(l2)],
 [s1.index(l3), s1.indexOf(l3)],
 [s1.index(l4), s1.indexOf(l4)]
].join('\n') )

Matre 20.02.2011 10:58

monolithed

Цитата:

Встроенные функции использовать запрещено
B@rmaley.e><e

Всё ведь работает.

Vulkan 20.02.2011 11:06

По поводу своих вариантов - и правда забыл что в качестве параметров могут ещё и строки из нескольких символов передаваться, как время будет исправлю.
Matre, результаты работы твоей функции отличаются от результатов работы встроенной.

B@rmaley.e><e 20.02.2011 11:31

Цитата:

Сообщение от Matre
Всё ведь работает.

Где работает? Результаты совпали только в одном случае.

Matre 20.02.2011 12:10

Цитата:

результаты работы твоей функции отличаются от результатов работы встроенной.
Цитата:

Где работает? Результаты совпали только в одном случае.
Не понял... Вы это имеете ввиду?

B@rmaley.e><e 20.02.2011 12:50

Это.

Matre 20.02.2011 13:14

Какой-то чудной у Вас браузер.

рони 20.02.2011 14:32

Вариант...
String.prototype.index = function (b) {
    for (var a = -1, d = this.length, c = 0; c < d; c++) {
        if (b.length > d) break;
        a++;
        a = b.charAt(a) === this.charAt(c) ? a : b.charAt(0) === this.charAt(c) ? 0 : -1;
        if (a == b.length - 1) return c - b.length + 1
    }
    return a
};
var s1 = 'aababaO_o',
     l1 = 'aba', l2 = 'abac', l3 = 'aa', l4 = 'O_o';
alert( [
 [s1.index(l1), s1.indexOf(l1)],
 [s1.index(l2), s1.indexOf(l2)],
 [s1.index(l3), s1.indexOf(l3)],
 [s1.index(l4), s1.indexOf(l4)]
].join('\n') )


Часовой пояс GMT +3, время: 10:45.