Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Определить минимальное количество символов,по которым можно разлечить слова. (https://javascript.ru/forum/misc/78798-opredelit-minimalnoe-kolichestvo-simvolov-po-kotorym-mozhno-razlechit-slova.html)

Hokage777 06.11.2019 16:58

Определить минимальное количество символов,по которым можно разлечить слова.
 
Строка состоит из нескольких слов, разделенных пробелом. Определить минимальное количество первых символов слов, по которым можно различить слова в строке.
Входные данные:
abc5 abc0 abcde abcfg
Выходные данные:
4

Вот наработки:
let words = [];
let res = [];
let i;
let counter = 0;
let matrix = [];

    let val1 = "abc5 abc0 abcde abcfg";
    if ($('#val1').val() == '') alert('Введите данные')
    else {
        words = val1.split(' ');
        for (let i = 0; i < words.length; i++) {
            for (let j = 0; j < words[i].length; j++) {
                matrix[i] = words[i].split('');
            }
        }
        let matrxLength = matrix.length;
        for (let word = 0; word <=matrxLength+1; word++) {
            for (let sym = 0; sym < matrix[word].length; sym++) {
                console.log(matrix[word][sym]);
                if (matrix[word][sym] == matrix[word+1][sym]) {
                    if (res.includes(matrix[word][sym]) != true) {
                       console.log(res);
                        res.push(matrix[word][sym])
                    }

                }
            }
        }
      //  console.log(matrix);
      //  console.log(res);
    }
});

и еще один вариант:
for (let i = 0; i < words.length; i++) {
            for (let j = 0; j < words[i].length; j++) {
                matrix[i] = words[i].split('');
            }
      }
      console.log(matrix[0][0]);
      for (let word in matrix) {
          for (let symbol in matrix[word]) {
              if (matrix[word][symbol]==matrix[++word][symbol]){
                  if (res.includes(matrix[word][symbol])!=true){
                      console.log(res);
                      res.push(matrix[word][symbol])
                  }

          }


      }
    }
};
console.table(matrix);
console.log(res);
});

рони 06.11.2019 17:24

Hokage777,
вариант ...
let val1 = "abc5 abc0 abcde abcfg";
const fn = str => {
    let words = str.split(/\s+/).sort((a,b)=> a.length - b.length);
    let word = words[0];
    for(let a of words){
        a = [...a];
        let temp = "";
      for(b of word){
        if(b == a.shift()) temp += b;
        else break;
      }
       if(temp) word = temp;
       else return 0
    }
    return word.length + 1
}
console.log(fn(val1))

Alexandroppolus 06.11.2019 21:40

Цитата:

Сообщение от Hokage777
Определить минимальное количество первых символов слов, по которым можно различить слова в строке.

различить хотя бы одну пару слов, или различить любую пару слов?
вариант рони соответствует первому условию, т.е. для строки 'a5 abc0 abcde abcfg' он вернет 2, чего достаточно, чтобы различить первое и второе слово, но не хватит при сравнении 2 и 3 слов

рони 06.11.2019 22:54

Цитата:

Сообщение от Alexandroppolus
различить любую пару слов

let val1 = "abc5 abc0 abcde abcfg";
let val2 = "a5 abc0 abcde abcfg";
const fn = str => {
    let words = str.split(/\s+/);
    let length = Math.max(...words.map(_=>_.length)), i = 0;
    k: for (; i < length; i++) {
        let temp = "";
    for(let a of words){
       if (a[i] !== void 0){
       if(temp.includes(a[i]))  continue k;
       temp += a[i];
       }

       }
       return ++i
    }
    return i
}
console.log(fn(val1))
console.log(fn(val2))

laimas 06.11.2019 23:49

var s = ' abcde abc5 abc0 abcfg'.trim(), 
    w = s.split(/\s+/); 

for(var i=1; i < w[0].length; ++i) if(s.match(new RegExp('\\b'+w[0].substr(0, i), 'g')).length < w.length) break;

console.log(i)

Malleys 07.11.2019 01:01

И ещё один вариант:
var str = " abc5 abc0 abcde abcfg";
var match = str.match(/^\s*(\S*)\S*(?:\s+\1\S*)*\s*$/);
var length = match ? match[1].length + 1 : 0;
console.log(length);

рони 07.11.2019 01:40

Malleys,
var str = " abc5 abc0 abcde abcdg";
var match = str.match(/^\s*(\S*)\S*(?:\s+\1\S*)*\s*$/);
var length = match ? match[1].length + 1 : 0;
console.log(length); //4 а нужно 5

Malleys 07.11.2019 03:36

Цитата:

Сообщение от рони
//4 а нужно 5

А почему тогда, если у laimas получается 4, то он молодец? (Сообщение №5) Или у тебя? (Сообщение №2)

Получается нужно найти длину не наименьшей части подстроки, которая встречается в каждом слове, а такую длину L подстроки, которая однозначно определяла бы любое слово, в случае, если взять в нём не менее L символов.

Если пример от laimas запустить с s = ' w abcde abc5 abc0 abcfg', то он тоже показывает удивительнейшие вещи! Например, то, что человек, пропагандирующий уникальные идентификаторы, может продвигать решение, где они как раз-таки и не уникальные! (Нужно ведь идентифицировать слово)

Если поглядеть в пример от рони то совершенно не понятно, почему там получается 4, когда рони упорно провозглашает, что
Цитата:

Сообщение от рони
//4 а нужно 5

Видимо проповедники не всегда живут как учат!

Цитата:

Сообщение от рони
//4 а нужно 5

Почему тогда в начале темы пишут, что «Входные данные: abc5 abc0 abcde abcfg Выходные данные: 4»?
И laimas опубликовал решение раньше, а вы превзошли в правдивости всех!

рони, так значит в сообщениях №2, 5 и 6 находят длину наименьшей части подстроки, которая встречается в каждом слове?

рони, а вы потрясающе деструктурируете!
Вот вычисление такой длины L подстроки, которая однозначно определяла бы любое слово, в случае, если взять в нём не менее L символов... (без деструктуризации!)

function fn(str) {
	var length = 0;
	str.trim().split(/\s+/).sort(function(as, bs) {
		var i = Array.prototype.findIndex.call(as, (a,i) => bs[i] !== a)
		length = Math.max(length, 1 + i)
		return as > bs ? 1 : -1
	})
	return length
}

console.log(
	fn("abc5 abc0 abcde abcfg"),
	fn("a5 abc0 abcde abcfg"), 
	fn(" abcde abc5 abc0 abcfg")
) // включает все строки, упоминавшиеся в теме

Удивительно, упорно получается 4.

laimas 07.11.2019 04:18

Цитата:

Сообщение от Malleys
человек, пропагандирующий уникальные идентификаторы

Это в мой адрес? Вы ошиблись, я атеист. ;)

рони 07.11.2019 07:39

Цитата:

Сообщение от Malleys
А почему тогда, если у laimas получается 4, то он молодец? (Сообщение №5) Или у тебя? (Сообщение №2)

потому что неверно понял условие задачи первоначально.
Цитата:

Сообщение от Malleys
Если поглядеть в пример от рони то совершенно не понятно, почему там получается 4, когда рони упорно провозглашает, что
Сообщение от рони
//4 а нужно 5
Видимо проповедники не всегда живут как учат!

Сообщение от рони
//4 а нужно 5
Почему тогда в начале темы пишут, что «Входные данные: abc5 abc0 abcde abcfg Выходные данные: 4»?

бред какой-то.
что не так с результатом 5!!!
если ваш новый код даёт тоже 5!!!
function fn(str) {
	var length = 0;
	str.trim().split(/\s+/).sort(function(as, bs) {
		var i = Array.prototype.findIndex.call(as, (a,i) => bs[i] !== a)
		length = Math.max(length, 1 + i)
		return as > bs ? 1 : -1
	})
	return length
}

console.log(
	fn(" abc5 abc0 abcde abcdg")
) // 5

P.S.
Malleys,
вероятно вы не заметили разницу в строке пост #7 и пост #6

Malleys 07.11.2019 07:56

Цитата:

Сообщение от laimas
Вы ошиблись, я атеист.

И какое это имеет отношение к поиску длины?

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

Вот некоторые сокровища (они достойны быть цитируемыми!) из них...

... и ещё сотни высококачественных сочинении на тему уникальности идентификаторов!

Сама суть пропаганды...
Цитата:

Сообщение от laimas (Сообщение 514510)
уникальный идентификатор. Понимаете, уникальный!

Я думаю, что будь ваши ответы в виде видео, то они производили бы на людей неизгладимое впечатление! А пропаганда означает распространение любых идей, взглядов, фактов, не обязательно о том, что вы можете «доказать» «несуществование» чего-то, находящегося за пределами, доступными исследованию!

laimas 07.11.2019 08:01

Цитата:

Сообщение от Malleys
и ещё сотни высококачественных сочинении
Сама суть пропаганды...
Я думаю, что будь ваши ответы в виде видео, то они производили бы на людей неизгладимое впечатление!

Охренеть. Да и куда мне до Станиславского.

Malleys 07.11.2019 08:07

Цитата:

Сообщение от рони
вероятно вы не заметили разницу в строке пост #7 и пост #6

Да, нужно было как-то указать! А то понимаете, я же не предполагал, что вы будете менять буковки в таких местах, а то я смотрел на исправленное рег. выражение... Учту и такое!

Цитата:

Сообщение от рони
что не так с результатом 5!!!
если ваш новый код даёт тоже 5!!!

Последний вариант правильно вычисляет или нет?

Цитата:

Сообщение от рони
что не так с результатом 5!!!
если ваш новый код даёт тоже 5!!!

Т. е. теперь надо, чтобы было 4?

рони 07.11.2019 08:17

Цитата:

Сообщение от Malleys
Т. е. теперь надо, чтобы было 4?

не дури :) всё нормально у тебя с новым кодом.
Цитата:

Сообщение от Malleys
Последний вариант правильно вычисляет или нет?

да правильно, насколько я смог проверить.

Vlasenko Fedor 07.11.2019 13:56

let str = 'kabc5 sabc0 abjcde abcfg fgabcfg2 safds abc'
let arr = str.split(/\s+/)
let res = 1
const find = arr => {
  let temp = {}
  arr.forEach(v => {
    let key = v.substr(0, res)
    temp[key] = (temp[key] >>> 0) + 1
  })
  arr = arr.filter(v => temp[v.substr(0, res)] > 1)
  if (arr.length) {
    res += 1
    find(arr)
  }
}

find(arr)
console.log(res)

мой вариант решения :dance:

Hokage777 07.11.2019 14:12

Всем спасибо за ответ. Первоначальное решение Рони оказалось верным:)

Vlasenko Fedor 07.11.2019 14:18

Цитата:

Сообщение от Hokage777 (Сообщение 515059)
Всем спасибо за ответ. Первоначальное решение Рони оказалось верным:)

Стало интересно каким образом оно верно при скажем такой строке
"kabc5 sabc0 abjcde abcfg fgabcfg2 safds abc"
я поначалу так-же регулярками думал решить, но позже бросил эту идею:haha:


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