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


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