1 / 1 / 1
Регистрация: 16.10.2023
Сообщений: 8

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

16.10.2023, 10:13. Показов 2564. Ответов 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
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3964 / 2130 / 833
Регистрация: 13.03.2010
Сообщений: 7,001
18.10.2023, 12:42
Студворк — интернет-сервис помощи студентам
dull-, разрешаете функции принимать любые данные без валидации и утверждаете, что всё работает.

Умерьте свой пыл в общении, иначе придётся "быковать" в другом месте.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
18.10.2023, 12:43
Ради смеха, алгоритмом Кнута-Морриса-Пратта:

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
function buildPrefixTable(input) {
  let pos = 1, cnd = 0;
  let result = Array(input.length + 1).fill(0);
  result[0] = -1;
 
  while (pos < input.length) {
    if (input[pos] === input[cnd]) {
      result[pos] = result[cnd];
    } else {
      result[pos] = cnd;
      while (cnd >= 0 && input[pos] !== input[cnd]) {
        cnd = result[cnd];
      }
    }
    pos += 1;
    cnd += 1;
  }
 
  result[pos] = cnd;
  return result;
}
 
function kmpSearch(haystack, needle) {
  const prefixes = buildPrefixTable(needle);
  let result = [];
 
  let haystackIter = 0, needleIter = 0;
 
  while (haystackIter < haystack.length) {
    if (haystack[haystackIter] === needle[needleIter]) {
      haystackIter += 1;
      needleIter += 1;
 
      if (needleIter === needle.length) {
        result.push(haystackIter - needleIter);
        needleIter = prefixes[needleIter];
      }
    } else {
      needleIter = prefixes[needleIter];
      if (needleIter < 0) {
        haystackIter += 1;
        needleIter += 1;
      }
    }
  }
 
  return result;
}
 
function split(string, delimiter = "") {
  if (typeof string !== "string") {
    throw new TypeError(`Expected string, got ${typeof string}`);
  }
  delimiter = String(delimiter);
 
  if (delimiter.length === 0) {
    return [...string];
  }
 
  const positions = kmpSearch(string, delimiter);
  let result = [];
  let startSegmentIndex = 0;
 
  for (const position of positions) {
    if (startSegmentIndex !== position) {
      const segment = string.slice(startSegmentIndex, position);
      result.push(segment);
    }
    startSegmentIndex = position + delimiter.length;
  }
 
  if (startSegmentIndex !== string.length) {
    const lastSegment = string.slice(startSegmentIndex, string.length);
    result.push(lastSegment);
  }
 
  return result;
}
1
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
18.10.2023, 15:08
dull-, реагируй спокойнее, напиши, что просто немного срезал углы, это нормально и поблагодари за совет.
Eva Rosalene, интересное решение, я читал про этот алгоритм, но вспомнить его и воспроизвести без справочника для меня сложно, молодец что не поленилась
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
18.10.2023, 17:18

Не по теме:

Цитата Сообщение от mr_dramm Посмотреть сообщение
вспомнить его и воспроизвести без справочника для меня сложно, молодец что не поленилась
Я тоже со справочником :)



Добавлено через 5 минут
Цитата Сообщение от gogolik Посмотреть сообщение
dull-, разрешаете функции принимать любые данные без валидации и утверждаете, что всё работает.
Цитата Сообщение от KingdaKa Посмотреть сообщение
dull-, вы про валидацию входящих данных слышали вообще?
Не соглашусь, кстати. Валидировать инпуты от конечного юзера – это одно, но совсем другое – если функция сама про себя заявляет "меня можно вызывать только с такими-то и такими-то данными"; это перекладывает ответственность за валидацию на вызывающую сторону. В публичном апи разве что такое не очень комильфо делать, но бывают разные кейсы.

Добавлено через 2 минуты
А вообще, кстати, вот, можете взять и реализовать по букве:
https://262.ecma-international... type.split
Будет самый близкий к оригиналу вариант.
1
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
18.10.2023, 18:23
Цитата Сообщение от Eva Rosalene Посмотреть сообщение
функция сама про себя заявляет "меня можно вызывать только с такими-то и такими-то данными"
Функция сама ничего никому не заявляет, для этого есть ман
Нам же методы выдают ошибку, когда вместо, например, строки передаем число, ы? Фигню-то не вычисляют.
Это и есть валидация в данном случае.
Если аргументов не хватает - тоже будет ошибка, а не ерунда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2023, 18:23

Преобразовать строку в набор чисел (единичный ввод без пробелов, т.е. без 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. Не использовать сам метод или какие-либо библиотечные функции при этом. Не могу написать реализацию, не...

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


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

Новые блоги и статьи
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru