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

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

16.10.2023, 10:13. Показов 1674. Ответов 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,843
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,843
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,843
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
1805 / 1044 / 328
Регистрация: 17.07.2021
Сообщений: 2,120
Записей в блоге: 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
1805 / 1044 / 328
Регистрация: 17.07.2021
Сообщений: 2,120
Записей в блоге: 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
1807 / 953 / 385
Регистрация: 26.11.2014
Сообщений: 1,943
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »