Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8

Реализация нативного .split() без любых нативных методов

16.10.2023, 10:13. Показов 2348. Ответов 24

Студворк — интернет-сервис помощи студентам
Приветствую всех!

Задача следующая: необходимо реализовать нативный строковый метод .split() с использованием ТОЛЬКО ОДНОГО цикла for и (по необходимости) методы .charCodeAt() и .fromCharCode(). Любые другие нативные методы запрещены!

Хотелось бы увидеть максимально грамотную, лаконичную и понятную реализацию.

Для примера прикрепляю свой вариант, мне он не нравится, его тяжело читать и обслуживать, однако он работает:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
function split(text, divider = null) {
  if (divider === null) {
    return [text];
  }
 
  const result = [];
 
  let stringAccum = "";
 
  let dividerIndex = 0;
  let currDivider = "";
  let repeat = true;
 
  for (let i = 0; i < text.length; i++) {
    if (divider === "") {
      result[result.length] = text[i];
      continue;
    }
 
    const check = divider[dividerIndex] ?? null;
 
    // console.log(
    //   `text: ${text[i]}`,
    //   `check: ${check}`,
    //   `currDivider: ${currDivider}`
    // );
 
    if (check) {
      if (check === text[i]) {
        dividerIndex++;
        if (currDivider === divider) currDivider = "";
        if (stringAccum) {
          if (i === text.length - 1 && currDivider !== divider) {
            currDivider += text[i];
            if (currDivider !== divider) {
              result[result.length] = stringAccum + currDivider;
            } else if (currDivider === divider) {
              result[result.length] = stringAccum;
              result[result.length] = "";
            }
            // result[result.length] = stringAccum + currDivider;
            break;
          }
 
          if (divider.length === 1) {
            result[result.length] = stringAccum + currDivider;
            stringAccum = "";
          }
        }
        currDivider += text[i];
        if (i === text.length - 1 && currDivider !== divider) {
          result[result.length] = currDivider;
        } else if (i === text.length - 1 && currDivider === divider) {
          result[result.length] = "";
        }
      } else if (check !== text[i]) {
        repeat = false;
        dividerIndex = 0;
        if (currDivider === divider) currDivider = "";
        stringAccum += currDivider;
        currDivider = "";
        stringAccum += text[i];
        if (i === text.length - 1) {
          result[result.length] = stringAccum;
        }
      }
    } else if (!check) {
      dividerIndex = 0;
      const check = divider[dividerIndex] ?? null;
 
      if (repeat) result[result.length] = "";
 
      if (check === text[i]) {
        repeat = true;
        dividerIndex++;
        if (currDivider === divider) currDivider = "";
        if (stringAccum) result[result.length] = stringAccum + currDivider;
        currDivider += text[i];
        stringAccum = "";
        if (i === text.length - 1 && currDivider !== divider) {
          result[result.length] = currDivider;
        } else if (i === text.length - 1 && currDivider === divider) {
          result[result.length] = "";
        }
      } else if (check !== text[i]) {
        dividerIndex = 0;
        repeat = false;
        if (currDivider === divider) currDivider = "";
        stringAccum += currDivider;
        stringAccum += text[i];
        if (i === text.length - 1) {
          result[result.length] = stringAccum;
        }
      }
    }
  }
 
  return result;
}
Добавлено через 17 минут
Нужно в точности повторить поведение нативного .split(). Темы, которые Вы кидаете лишь коссвенно касаются моего вопроса, а не отвечают на него
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.10.2023, 10:13
Ответы с готовыми решениями:

Найти в строке самое длинное слово без split, для типа string, не используя методов класса
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication28 { ...

JNI. Проблема с вызовом нативных методов
Привет всем! Братцы, кто работал с нативными методами?! Моя программа должна работать с устройством, висящим на LPT-порте. Для этого...

Реализация двоичного дерева без использования готовых методов
Есть ли примеры кода, как реализовать двоичное дерево без использования готовых методов.

24
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
16.10.2023, 12:14
Чет много кода. По идее перебираешь символы, сохраяя их в буффер. Как только наткнула на разделитель, буфер скидываем в финальный результат, буфер очищаем

Добавлено через 6 минут
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function split(text, divider = null) {
    const buffer = [];
    const result = [];
    let currentChar = null;
    for (let i = 0; i < text.length; i++) {
        currentChar = text[i];
        if (currentChar === divider) {
            if (buffer.length > 0) {
                result.push(buffer.join(''));
                buffer.length = 0;
            }
        } else {
            buffer.push(currentChar);
        }
    }
    //end of string
    if (buffer.length > 0) {
        result.push(buffer.join(''));
    }
    return result;
}
 
console.log(split('testtesttest', null));
console.log(split('testtesttest', ''));
console.log(split('testtesttest', 't'));
console.log(split('testtesttest', 'e'));
[ 'testtesttest' ]
[ 'testtesttest' ]
[ 'es', 'es', 'es' ]
[ 't', 'stt', 'stt', 'st' ]
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
16.10.2023, 12:22
Блин, кто придумывает такие дурацкие задачки? С одним циклом for... офигеть.

Да, вот такую строчку еще не забудьте распарсить:

JavaScript
1
let str = `Привет, \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`;
0
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8
16.10.2023, 12:51  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
Чет много кода. По идее перебираешь символы, сохраяя их в буффер. Как только наткнула на разделитель, буфер скидываем в финальный результат, буфер очищаем
Твой код не хендлить некоторые кейсы, который хендлит нативный .split() (к примеру .split('')), но это не проблема, в целом.

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

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

Может еще есть варианты ?

Добавлено через 2 минуты
Цитата Сообщение от KingdaKa Посмотреть сообщение
Блин, кто придумывает такие дурацкие задачки? С одним циклом for... офигеть.

Да, вот такую строчку еще не забудьте распарсить:

JavaScript
1
let str = `Привет, \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`;
Круто понимать, как работают нативные методы под капотом. Часто это лучше, с точки зрения перфоманса. И, обычно, ничего сложного в самостоятельной реализации нет, но вот .split() меня подплавил
0
16.10.2023, 13:24

Не по теме:

Ща придет Драмм и всех выалгоритмизирует :D

0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
16.10.2023, 13:48

Не по теме:

Цитата Сообщение от dull- Посмотреть сообщение
Главная сложность в этой таске возникает тогда, когда разделителем выступает не один символ, а строка
Ах вот оно че %-)



Добавлено через 8 минут
Тогда про поддержку RegExp не забудьте, а то split ее поддерживает

Добавлено через 12 минут
Chat gpt solution без поддержки regex, но в целом хендлит кейс с разделителем > 1 символа
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
function split(text, divider = null) {
    if (divider === null) {
        // If divider is not provided, return an array with the entire string as the only element.
        return [text];
    }
 
    const result = [];
    const dividerLength = divider.length;
    let currentIndex = 0;
 
    while (currentIndex < text.length) {
        let match = true;
 
        for (let i = 0; i < dividerLength; i++) {
            if (text.charCodeAt(currentIndex + i) !== divider.charCodeAt(i)) {
                match = false;
                break;
            }
        }
 
        if (match) {
            result.push(text.slice(0, currentIndex));
            text = text.slice(currentIndex + dividerLength);
            currentIndex = 0;
        } else {
            currentIndex++;
        }
    }
 
    result.push(text);
    return result;
}
 
// Example usage:
const text = 'testtesttest';
const divider = 'te';
 
const customSplitResult = split(text, divider);
const nativeSplitResult = text.split(divider);
 
console.log(customSplitResult); // Output: [ '', 'st', 'st', 'st' ]
console.log(nativeSplitResult); // Output: [ '', 'st', 'st', 'st' ]
 
// Check if the two arrays are equal
const arraysEqual = (arr1, arr2) => {
    if (arr1.length !== arr2.length) return false;
    for (let i = 0; i < arr1.length; i++) {
        if (arr1[i] !== arr2[i]) return false;
    }
    return true;
};
 
console.log(arraysEqual(customSplitResult, nativeSplitResult)); // Output: true
1
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8
16.10.2023, 14:12  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение

Не по теме:


Ах вот оно че %-)



Добавлено через 8 минут
Тогда про поддержку RegExp не забудьте, а то split ее поддерживает

Добавлено через 12 минут
Chat gpt solution без поддержки regex, но в целом хендлит кейс с разделителем > 1 символа
Получилось решить:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function split(text, divider = null) {
  let result = [];
  let strAccum = "";
  let divAccum = "";
  let index = 0;
 
  if (divider === null) {
    return [text];
  }
 
  for (let i = 0; i < text.length; i++) {
    const char = text[i];
 
    if (divider === "") {
      result[result.length] = text[i];
      continue;
    }
 
    if (char === divider[index]) {
      divAccum += char;
 
      if (!divider[index + 1]) {
        index = 0;
      } else {
        index++;
      }
 
      if (divAccum === divider) {
        divAccum = "";
        result[result.length] = strAccum;
        strAccum = "";
      }
 
      if (i === text.length - 1) {
        divAccum ? (strAccum += divAccum) : null;
        result[result.length] = strAccum;
      }
    } else if (char !== divider[index]) {
      index = 0;
      if (divAccum) {
        strAccum += divAccum;
        divAccum = "";
      }
 
      strAccum += char;
 
      if (i === text.length - 1) {
        divAccum ? (strAccum += divAccum) : null;
        result[result.length] = strAccum;
      }
    }
  }
 
  return result;
}

Это решение легче читать, чем мой прошлый вариант, соблюдены все условия и поведение в точности копирует поведение нативного .split(). За исключением regexp'ов в аргументах, этого в задании не было

Ваше решение пока не изучал, но вижу, что там два цикла, нужен один.
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
16.10.2023, 14:18
Цитата Сообщение от dull- Посмотреть сообщение
в точности копирует поведение нативного .split().
Nope (
JavaScript
1
2
3
4
console.log(
  split('testtest', 'te'), 
  'testtest'.split('te')
);
[ '', 'sttest' ] [ '', 'st', 'st' ]
1
16.10.2023, 14:20
 Комментарий модератора 
crautcher, напоминаю, что размещение решений из ChatGPT запрещено.
0
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8
16.10.2023, 14:21  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
Nope (
JavaScript
1
2
3
4
console.log(
  split('testtest', 'te'), 
  'testtest'.split('te')
);
Ага, сейчас чекну
0
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
16.10.2023, 15:29
Цитата Сообщение от KingdaKa Посмотреть сообщение
Ща придет Драмм и всех выалгоритмизирует
специально приглашенный гость =)

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

Оценка по времени в худшем случае O(2*n)=>O(n) по памяти O(n)
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
const f = (s, d) => {
  const ans = [];
 
  // c - размер совпавших символов в делителе
  let c = 0;
  for (let i = 0, j = 0; i < s.length; i++) {
    if (!ans[j]) ans[j] = [];
 
    if (d[c] == s[i]) {
      c++;
    } else {
      if (c == d.length && ans[j].length) {
        // если нашелся полный делитель
        ans[j] = ans[j].join("");
        j++;
        if (d.length == 0) {
          ans[j] = [s[i]];
          continue;
        }
        c = 0;
        // чтобы еще раз обработать текущий символ
        i--;
      } else if (c) {
        // если нашлась часть делителя
        for (let k = 0; k < c; k++) ans[j].push(d[k]);
 
        c = 0;
        if (s[i] != d[0]) {
          ans[j].push(s[i]);
        } else {
          i--;
          continue;
        }
      } else {
        // если делитель не нашелся даже частично
        ans[j].push(s[i]);
      }
    }
  }
  if (Array.isArray(ans[ans.length - 1]) && (ans[ans.length - 1].length || c)) {
    for (let i = 0; i < c; i++) ans[ans.length - 1].push(d[i]);
    if (ans[ans.length - 1].length)
      ans[ans.length - 1] = ans[ans.length - 1].join("");
  }
  return ans;
};
 
{
  console.log(f(`Привет, \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`, ""));
  /*
  [
  'П',      'р',      'и',
  'в',      'е',      'т',
  ',',      ' ',      '\ud83d',
  '\ude06', '\ud83c', '\udf7a',
  '\ud83e', '\udd2a', ' ',
  'ф',      'о',      'р',
  'у',      'м',      '!'
]
  */
}
 
{
  console.log(f(`Привет, \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`, " "));
  /*
        [ 'Привет,', '������������������', 'форум!' ]
    */
}
{
  console.log(f(`Привет,  \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`, "  "));
  /*
        [ 'Привет,', '������������������ форум!' ]
    */
}
{
  console.log(f("testtest", "te"));
  /*
          [ 'test', 'st' ]
      */
}
2
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8
16.10.2023, 15:57  [ТС]
Цитата Сообщение от mr_dramm Посмотреть сообщение
специально приглашенный гость =)

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

Оценка по времени в худшем случае O(2*n)=>O(n) по памяти O(n)
Да, выглядит тяжеловато. + не все случаи хендлит:

JavaScript
1
2
3
4
5
6
7
const exmpl10 = "22222222332322333";
const a = "3112313212312123";
 
console.log(split(exmpl10, "22"));
console.log(exmpl10.split("22"));
console.log(a.split("12"));
console.log(split(a, "12"));
Output:
Code
1
2
3
4
[ '22', '22', '3323', '333' ]
[ '', '', '', '', '3323', '333' ]
[ '31', '3132', '3', '', '3' ]   
[ '31', '3132', '3', '123' ]

Я пришел к вот такому решению, которое, пока что, хендлит все мои тесты:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
function split(text, divider = null) {
  let result = [];
  let strAccum = "";
  let divAccum = "";
  let index = 0;
  let counter = 1;
 
  if (divider === null) {
    return [text];
  }
 
  for (let i = 0; i < text.length; i++) {
    const char = text[i];
 
    if (divider === "") {
      result[result.length] = text[i];
      continue;
    }
 
    // console.log(
    //   `char: ${char};`,
    //   `divider[index]: ${divider[index]};`,
    //   `divAccum: ${divAccum};`,
    //   `strAccum: ${strAccum};`
    // );
 
    if (char === divider[index]) {
      divAccum += char;
 
      if (!divider[index + 1]) {
        index = 0;
      } else {
        index++;
      }
 
      if (divAccum === divider) {
        divAccum = "";
        counter++;
        if (counter > 1) {
          result[result.length] = "";
        } else if (strAccum) {
          result[result.length] = strAccum;
        }
        strAccum = "";
      }
 
      if (i === text.length - 1) {
        divAccum ? (strAccum += divAccum) : null;
        result[result.length] = strAccum;
      }
    } else if (char !== divider[index]) {
      index = 0;
      counter = 0;
      if (divAccum) {
        strAccum += divAccum;
        divAccum = "";
      }
 
      if (char !== divider[index]) {
        strAccum += char;
      } else {
        result[result.length] = strAccum;
        strAccum = "";
        divAccum += char;
        index++;
      }
 
      if (i === text.length - 1) {
        divAccum ? (strAccum += divAccum) : null;
        result[result.length] = strAccum;
      }
    }
  }
 
  return result;
}
Попробуйте, может кто-то сломает
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
16.10.2023, 18:18
Цитата Сообщение от dull- Посмотреть сообщение
Круто понимать, как работают нативные методы под капотом.
А при чем тут условие "только один for"? В реализации там должно быть минимум два цикла для оптимизации производительности.
0
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8
16.10.2023, 20:00  [ТС]
Если в одном цикле лаконично и ясно помещается вся задача, зачем делать их несколько ?

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

Тему можно закрывать, всем спасибо
0
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
17.10.2023, 04:38
Лучший ответ Сообщение было отмечено mr_dramm как решение

Решение

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

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
const f = (s, d) => {
  const ans = [];
  if (d.length == 0) {
    // отдельно обрабатываем случай когда делитель ""
    for (let i = 0; i < s.length; i++) ans.push(s[i]);
    return ans;
  }
  let l = 0,
    r = 0;
  let j = 0;
  while (l < s.length) {
    if (!ans[j]) ans[j] = [];
    if (r <= s.length - 1 && d[r - l] == s[r]) {
      // нашли символ делителя
      if (r - l + 1 == d.length) {
        // делитель полностью найдем
        r++;
        // окно в 0 и переходим к след символу
        l = r;
        if (ans[j].length) {
          // если была найдена полезная предыдущая строка сохраняем
          ans[j] = ans[j].join("");
          j++;
        }
      } else {
        // делитель найден частично продолжаем искать, увеличиваем окно на 1
        r++;
      }
    } else {
      // найден символ который не соответствует последовательности делителя
      while (l <= r) {
        // если делитель состоит из нескольких символов, и окно получилось больше 1
        // будем уменьшать окно
        // все символы которые не стали делителями сохраняем в текущий массив
        ans[j].push(s[l]);
        // нужно чтобы искать именно со следующего символа
        l++;
 
        // обрабатываем нахождение начала делителя 
        // место которое можно оптимизировать, с помощью алгоритмов поиска повторяющихся подстрок в делителе
        // (я поленился делать оптимизацию ) но может быть позже
        if (d[0] == s[l]) {
          r = l - 1;
          break;
        }
      }
      // устанавливаем окно в 0 и начинаем поиск нового делителя 
      r++;
      l = r;
    }
  }
  if (Array.isArray(ans[ans.length - 1]) && ans[ans.length - 1].length) {
    // обрабатываем последнюю строку
    ans[ans.length - 1] = ans[ans.length - 1].join("");
  }
  return ans;
};
{
  console.log(f(`Привет, \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`, ""));
  /*
      [
      'П',      'р',      'и',
      'в',      'е',      'т',
      ',',      ' ',      '\ud83d',
      '\ude06', '\ud83c', '\udf7a',
      '\ud83e', '\udd2a', ' ',
      'ф',      'о',      'р',
      'у',      'м',      '!'
    ]
      */
}
{
  console.log(f(`Привет, \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`, " "));
  /*
            [ 'Привет,', '������������������', 'форум!' ]
        */
}
{
  console.log(f(`Привет,  \ud83d\ude06\ud83c\udf7a\ud83e\udd2a форум!`, "  "));
  /*
            [ 'Привет,', '������������������ форум!' ]
        */
}
{
  console.log(f("testtest", "te")); /*
              [ 'st', 'st' ]
          */
}
{
  console.log(f("bbbbd", "bbd")); /*
                ['bb' ]
            */
}
{
  console.log(f("f", "fffff")); /*
                  ['f' ]
              */
}
1
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
17.10.2023, 10:02
Цитата Сообщение от dull- Посмотреть сообщение
Если в одном цикле лаконично и ясно помещается вся задача, зачем делать их несколько ?
Вложенные циклы могут быть быстрее, чем один "лаконичный". Это вопрос оптимизации уже скорее на уровне кода.

Цитата Сообщение от dull- Посмотреть сообщение
я пришел к адекватному решению, которое удовлетворяет условие задачи.
И где оно?
0
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8
17.10.2023, 10:05  [ТС]
Лучший ответ Сообщение было отмечено mr_dramm как решение

Решение

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
function split(text, divider = null) {
  let result = [];
  let strAccum = "";
  let divAccum = "";
  let index = 0;
  let counter = 1;
 
  if (divider === null) {
    return [text];
  }
 
  for (let i = 0; i < text.length; i++) {
    const char = text[i];
 
    if (divider === "") {
      result[result.length] = text[i];
      continue;
    }
 
    // console.log(
    //   `char: ${char};`,
    //   `divider[index]: ${divider[index]};`,
    //   `divAccum: ${divAccum};`,
    //   `strAccum: ${strAccum};`
    // );
 
    if (char === divider[index]) {
      divAccum += char;
 
      if (!divider[index + 1]) {
        index = 0;
      } else {
        index++;
      }
 
      if (divAccum === divider) {
        divAccum = "";
        counter++;
        if (counter > 1) {
          result[result.length] = "";
        } else if (strAccum) {
          result[result.length] = strAccum;
        }
        strAccum = "";
      }
 
      if (i === text.length - 1) {
        divAccum ? (strAccum += divAccum) : null;
        result[result.length] = strAccum;
      }
    } else if (char !== divider[index]) {
      index = 0;
      counter = 0;
      if (divAccum) {
        strAccum += divAccum;
        divAccum = "";
      }
 
      if (char !== divider[index]) {
        strAccum += char;
      } else {
        result[result.length] = strAccum;
        strAccum = "";
        divAccum += char;
        index++;
      }
 
      if (i === text.length - 1) {
        divAccum ? (strAccum += divAccum) : null;
        result[result.length] = strAccum;
      }
    }
  }
 
  return result;
}
1
 Аватар для NTHing
1818 / 962 / 388
Регистрация: 26.11.2014
Сообщений: 1,962
Записей в блоге: 1
17.10.2023, 22:49
Цитата Сообщение от dull- Посмотреть сообщение
Любые другие нативные методы запрещены!
Полный список оных можете привести? Чтобы разночтений не было...
Цитата Сообщение от dull- Посмотреть сообщение
Нужно в точности повторить поведение нативного .split().
"В точности" без регулярок и ограничителя? Хм...
Цитата Сообщение от dull- Посмотреть сообщение
Круто понимать, как работают нативные методы под капотом.
Капот-то открывали, смотрели..?

Пара тестов для сравнения результатов кода из сообщения номер 17 и результатов нативного сплита:
JavaScript
1
2
3
4
5
6
7
8
s1 = 'Hello! 42World'
s2 = 12345 
 
log(split(s1, 2)) // Array [ "Hello! 42World" ]
log(s1.split(2)) // Array [ "Hello! 4", "World" ]
 
log(split(s2, 2)) // Array []
log(s2.split(2)) // Uncaught TypeError: s2.split is not a function
А так-то отличная тренировка!
2
1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8
18.10.2023, 09:41  [ТС]
Передаете в функцию аргументы, которые она не ожидает и говорите, что код не работает ... это достойно 'лучшего ответа' и номинации плотного душнилы. Вы, наверняка, еще посты в [del] пишите, нет ?
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
18.10.2023, 10:48
dull-, вы про валидацию входящих данных слышали вообще? И про try/catch...

И по поводу номинации... вы там как раз в топе со своим ограничением в 1 цикл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2023, 10:48
Помогаю со студенческими работами здесь

Преобразовать строку в набор чисел (единичный ввод без пробелов, т.е. без Split)
string? chislo = Console.ReadLine(); for (int i = 0; i &lt; chislo.Length; i++) { int b = Convert.ToInt32(chislo); ...

Реализация функции split
Всех приветствую. Я знаю, что этот вопрос очень часто задают программисты на lua, но тем не менее я не нашёл подходящей для меня реализации...

реализация php функции split()
Помогите реализовать функцию split(); из PHP! Кто не знает, что она делает то вот http://www.php.net/manual/ru/function.split.php Я бы и...

Своя реализация метода Split
Написать реализацию метода Split. Не использовать сам метод или какие-либо библиотечные функции при этом. Не могу написать реализацию, не...

Написать программу, сравнивающую быстродействие двух (любых) методов сортировки
Написать программу, сравнивающую быстродействие двух (любых) методов сортировки. Для определения времени выполнения алгоритма используется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru