Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   регулярки: замена ссылки на ютуб (https://javascript.ru/forum/misc/30183-regulyarki-zamena-ssylki-na-yutub.html)

oneguy 31.07.2012 01:18

Цитата:

Сообщение от Hekumok
oneguy, мне вот это убрать?

Да, пожалуйста.
Цитата:

Сообщение от Hekumok
oneguy, Решение не показывайте пока - я завтра еще подумаю, да и melky хотел...

Хорошо.

melky 31.07.2012 12:50

oneguy, что-то получилось.

кто не хочет - пусть не смотрит.
// это такой хайд :)
var reg = eval(Array.prototype.map.call("2+1.,+B@_4-/_4.',2", function (a) { return String.fromCharCode(a.charCodeAt() - 3); }).join(''));

// рега без флагов !
alert( false === reg.global === reg.ignoreCase === reg.multiline );

function gcd(m, n) {
  return (Array(m+1).join("*")+","+Array(n+1).join("*")).match(reg)[0].length;
}

alert( gcd(3, 4) ); // 1  - :) 
alert( gcd(3, 6) ); // 3
alert( gcd(15, 25) ); // 5
alert( gcd(35, 42) ); // 7
alert( gcd(42, 35) ); // 7 (!) - порядок чисел неважен.

oneguy 31.07.2012 15:16

Цитата:

Сообщение от melky
oneguy, что-то получилось.

Вы неправильно поняли условие задачи, нужно вставить именно литерал регулярного выражения, а не идентификатор, то есть регулярка должна быть постоянной.

Hekumok 31.07.2012 15:23

Не, не знаю как решить

melky 31.07.2012 16:09

Цитата:

Сообщение от oneguy (Сообщение 193255)
Вы неправильно поняли условие задачи, нужно вставить именно литерал регулярного выражения, а не идентификатор, то есть регулярка должна быть постоянной.

..... какая разница, там eval'ится литерал в "хайде". всё равно он постоянный - хоть в переменной, хоть и не в переменной.
function gcd(m, n) {
  return (Array(m+1).join("*")+","+Array(n+1).join("*")).match(/(.+)(?=\1*,\1+$)/)[0].length;
}

alert( gcd(3, 4) ); // 1  - :) 
alert( gcd(3, 6) ); // 3
alert( gcd(15, 25) ); // 5
alert( gcd(35, 42) ); // 7
alert( gcd(42, 35) ); // 7 (!) - порядок чисел неважен.

... либо я туплю, не понимаю, о чём Вы, и прошу пояснить.

oneguy 31.07.2012 17:19

melky,
Да, извините, я не сразу понял, что там регулярка просто закодирована и не зависит ни от каких данных.
Засчитал. Решили с моей подсказкой или без?
Жаль, не могу поставить плюсик, что-то глючит сайт Уже поставил.

Hekumok 31.07.2012 17:29

По ходу я конкретный тормоз >.< Еси до этого не додумался

melky 31.07.2012 17:45

Цитата:

Сообщение от oneguy (Сообщение 193296)
Решили с моей подсказкой или без?

честно? я перед тем как спать лечь, прокрутил три варианта :
Код:

1. gcd(2, 4) - простое и составное
2. gcd(3, 7) - два простых
3. gcd(4, 8) - два составных

запомнил выдачу, и лёг спать. в процессе размышляя, что там за алгоритм.
было 3 варианта, два - неверные.

после того, как зашел на форум, увидел подсказку, и понял, что я на верном пути.

дальше я всё время добивал регулярку :)

Dim@ 31.07.2012 20:45

melky,
oneguy,
раз уж я не понимаю регулярку melky - можете мне её пожалуста объяснить, вот как я её вижу
/
  (.+) // просто получаем все содержимое
  (?=\1* // опять получаем все содержимое
  ,\1+$) // <<<<----WTH?
/

Dim@ 31.07.2012 21:40

oneguy,
melky,
в общем я то думал что хорошо знаю реги (они мне в отличии от других людей быстро и понятно давались, но в 4-ом Флэнагане(как же писать его имя не жирным шрифтом ;) )(и по которому я учился) не было того что написал melky), а в результате я их не очень хорошо знаю

Hekumok 31.07.2012 22:10

/(.+)(?=\1*,\1+$)/

это значит - получаем символы (кроме пробела), за которыми следует такое же количество символов нуль или более раз, затем идет запятая, затем следует опять то количество символов один или несколько раз, которые находятся в конце входных данных))) Я понятно обьяснил?

Dim@ 31.07.2012 22:13

Hekumok,
неа,
Цитата:

это значит - получаем символы (кроме пробела), за которыми следует такое же количество символов нуль или более раз, затем идет запятая,
это я понял это и есть (.+)(\1*,) а конец как то ты странно объяснил ;)

oneguy 31.07.2012 22:16

Dim@, я постараюсь объяснить. Вы понимаете как работают обратные ссылки? Они ловят ту же подстроку, которая была поймана в захватывающие скобки с указанным порядковым номером.
/
  (.+) // ловит несколько звёдочек (допустим, n)
  (?=\1* // количество звёздочек, кратное n, \1 ловит ту же подстроку, которая была захвачена в (.+)
  , //символ запятая
  \1+ //количество звёздочек, кратное n
  $ //конец входящей строки
/

Следовательно, поиск удаётся только когда n является общим делителем количества звёздочек слева и справа от запятой. Поскольку использовался жадный квантификатор, то интерпретатор остановился на наибольшем общем делителе указанных чисел.
(.+) действительно вначале проверяет всю входящую строку, но дальше поиск не удаётся, поэтому постепенно сокращает количество в квантификаторе.

Hekumok 31.07.2012 22:19

Цитата:

Сообщение от Dim@ (Сообщение 193359)
в общем я то думал что хорошо знаю реги (они мне в отличии от других людей быстро и понятно давались

Как по мне, то ничего сложного в регах нет...прочитал про нихэту и эту статью - ничего сложного не увидел...вот хотел потренироваться на них...

Deff 31.07.2012 22:22

oneguy,
Хотя с точки зрения скоростной оптимальности- это лишь кубик рубик интелекта
при больших числах наверняка - ток массивы и циклы ?

Dim@ 31.07.2012 22:24

oneguy,
Цитата:

Вы понимаете как работают обратные ссылки?
Да и часто ими пользовался в регах
oneguy,
спасибо :dance:

oneguy 31.07.2012 22:26

Цитата:

Сообщение от Deff
oneguy,
Хотя с точки зрения скоростной оптимальности- это лишь кубик рубик интелекта
при больших числах наверняка - ток массивы и циклы ?

Ну разумеется, данный алгоритм не следует применять в реальных задачах. Наибольший общий делитель нужно считать алгоритмом Евклида.

Deff 31.07.2012 22:27

Цитата:

Сообщение от oneguy
Наибольший общий делитель нужно считать алгоритмом Евклида.

Спс

Hekumok 31.07.2012 22:34

Цитата:

Сообщение от oneguy (Сообщение 193378)
Dim@, я постараюсь объяснить. Вы понимаете как работают обратные ссылки? Они ловят ту же подстроку, которая была поймана в захватывающие скобки с указанным порядковым номером.
/
  (.+) // ловит несколько звёдочек (допустим, n)
  (?=\1* // количество звёздочек, кратное n, \1 ловит ту же подстроку, которая была захвачена в (.+)
  , //символ запятая
  \1+ //количество звёздочек, кратное n
  $ //конец входящей строки
/

Следовательно, поиск удаётся только когда n является общим делителем количества звёздочек слева и справа от запятой. Поскольку использовался жадный квантификатор, то интерпретатор остановился на наибольшем общем делителе указанных чисел.
(.+) действительно вначале проверяет всю входящую строку, но дальше поиск не удаётся, поэтому постепенно сокращает количество в квантификаторе.

Во, oneguy вабще отлично объяснил)))

Dim@ 31.07.2012 22:40

oneguy,
интересно мне почему он ищет кратное n, а не общее наибольшое n?:blink:

oneguy 31.07.2012 22:53

Цитата:

Сообщение от Dim@ (Сообщение 193390)
oneguy,
интересно мне почему он ищет кратное n, а не общее наибольшое n?:blink:

Извините, не совсем понял что такое общее наибольшое n.

nerv_ 31.07.2012 23:08

Цитата:

Сообщение от oneguy
(.+) // ловит несколько звёдочек (допустим, n)

ничего подобного. Жрет всю строку

/
  (.+)  // пытается сожрать всю строку, но
  (?=\1* // опережающая проверка отменяет совпадение, если условие, следующее далее не является истинным. С того же места, где была захвачена подстрока (.+) начинается первая проверка обратной ссылки - 0 или более символов,
  , // далее обязательная запятая и
  \1+ // вторая проверка обратной ссылки - 1 или более символов
  $ //конец входящей строки
/


Цитата:

Сообщение от Hekumok
это значит - получаем символы (кроме пробела)

включая пробел

Hekumok 31.07.2012 23:14

Цитата:

Сообщение от nerv_ (Сообщение 193414)
ничего подобного. Жрет всю строку

Нет, именно пытается это сделать, как вы написали ниже

melky 31.07.2012 23:44

Цитата:

Сообщение от nerv_
начинается первая проверка обратной ссылки - 0 или более символов,

количество повторений строки от нуля, включая.

Цитата:

Сообщение от nerv_
вторая проверка обратной ссылки - 1 или более символов

опять таки, 1 и более повторений захваченной строки.

вообще, я этой реги сам боюсь)

вот её обьяснение, от создателя :


/
  (.+)  // хавает какую-то строку.
  (?=\1* // далее она повторяется несколько раз, или не повторяется вообще.
  ,
  \1+ // <----- тут эта схаванная строка повторяется хотя бы один (!) раз, самое главное - без остатка (конец строки)
  $ //   <-----|
/

oneguy 01.08.2012 02:36

Кстати, если это интересно, идею для этой задачи я увидел в спецификации: http://es5.javascript.ru/x15.10.html#x15.10.2.5, см. ПРИМЕЧАНИЕ 2, конец.

Hekumok 01.08.2012 10:48

Цитата:

Сообщение от nerv_ (Сообщение 193414)
включая пробел

Ой, да, пардон, перепутал - переносы строк


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