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

with-love-from-siberia 20.02.2011 17:38

B@rmaley.e><e,
Верно подмечено. (-:

Sweet 20.02.2011 18:06

Цитата:

Сообщение от with-love-from-siberia
Задача действительно решается в один цикл

Почему???
Это явный бред! Или может здесь кто-то панически боится циклов и микробов?
Цитата:

Сообщение от B@rmaley.e><e
Кто еще верит, что все так просто?

В моем варианте все верно, хотя он предельно прост, так что я - верю!:agree:

Vulkan 20.02.2011 18:23

Sweet, переделай в своём варианте второй цикл например под рекурсию и он будет соответствовать всем условиям =))

B@rmaley.e><e 20.02.2011 19:00

Sweet, таково условие - один цикл.
Vulkan, это все ерунда. Под одним циклом подразумевалась сложность O(n) (простой цикл по всем элементам строки). А поиск лазеек и дыр в правилах оставим юристам.

Sweet 20.02.2011 19:26

Ой, извините! Я думал про один цикл - это не изначальное условие.
Впрочем, есть не один способ перебора без цикла, например, вот (внизу). Или вот, например:
String.prototype.index = function(x){  
  var string = this, l1 = this.length, l2 = x.length;

  for(var i = 0; i < l1; i++) if(this[i] === x[0] && (function(){
    var count = 0;
  
    return (function(){
      if( count === l2 ) return true;
      if( string[i + count] === x[count++] ) return arguments.callee();
      return false;
    })();
    
  }())) return i;
  return -1;
};

Vulkan 20.02.2011 19:30

Sweet,
Цитата:

Сообщение от B@rmaley.e><e (Сообщение 93341)
Под одним циклом подразумевалась сложность O(n) (простой цикл по всем элементам строки). А поиск лазеек и дыр в правилах оставим юристам.


with-love-from-siberia 20.02.2011 21:47

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

Пусть даны СТРОКА1 и СТРОКА2. Найти позицию вхождения СТРОКА2 в СТРОКА1

Выполните цикл не более чем i < (длина СТРОКА1 - (длина СТРОКА2 / 2))
Сравнивайте начальный (0) и конечный символы (длина СТРОКА2 - 1) из СТРОКА2 с текущими позициями в СТРОКА1 (i) и (i + длина СТРОКА2 - 1), соответственно. Повторяйте сравнение.

float 20.02.2011 21:59

Т.к. теоретически точка начала совпадений мот быть в любой(каждой) позиции простым циклом нельзя(без встроенных функций[любых]).
Мой вариант:
String.prototype.at = function(str) {
	var tl = this.length, sl = str.length;
	if(tl >= sl) {
		for(var i=0, j=0; i<tl; i++) {
			if(this[i] == str[j]) {
				++j; if(sl == j) {return ++i-j;}
			}
			else{
				if(this[i] == str[0]) {j=1;}
				else {i-=j; j=0;}
			}
		}
		return -1;
	}
	else {
		return -1;
	}
}

var s1 = 'aababababaO_o', l1 = 'ababaO', l2 = 'abac', l3 = 'aa', l4 = 'O_o';

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

with-love-from-siberia 20.02.2011 22:17

Цитата:

Сообщение от float
Т.к. теоретически точка начала совпадений мот быть в любой(каждой) позиции простым циклом нельзя(без встроенных функций[любых]).

Раскройте смысл сказанного? То что Вы написали здесь противоречит Вашему же примеру.

float 20.02.2011 22:20

Цитата:

То что Вы написали здесь противоречит Вашему же примеру.
Не противоречит, т.к. в примере итераций больше чем букв в строке. Line 10


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