Вдохновлен этим вопросом StackOverflow .
Входные данные:
Мы возьмем три входа:
- Символ-
D
разделитель, на который можно разделить - Символ
I
между двумя из которых мы игнорируем символ разделителя (я знаю, это звучит расплывчато, но я объясню это ниже) - Строка
S
Выход:
Список / массив, содержащий подстроки после разбиения.
Пример:
Input:
D = ','
I = '"'
S = '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"'
Output:
['11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,']
Зачем? Расщепление на запятой , как правило , также разделены 98,00
, 12,000,000
и ,-,
в двух / трех частей. Но поскольку они находятся внутри I
входного символа, мы игнорируем игнорирование разделения здесь.
Правила вызова:
- Вы можете предположить, что
I
во входной строке всегда будет четное количество символов. - Вы можете предположить, что символ
I
всегда будетD
рядом с ним (кроме случаев, когда это первый или последний символ ввода), который все еще может быть правильно разделен. Таким образом, у вас не будет ничего подобногоD = ','; I = '"'; S = 'a,b"c,d"e,f'
и ничего подобногоD=','; I='"'; S='a",b,"c'
. - Ввод-строка
S
не может содержать ни одного либоD
илиI
. Если в нем нетD
, мы выводим список со всей входной строкой как единственным элементом. - Выходной список не будет содержать символ
I
больше, даже если она не содержалаD
(как вы можете видеть на"Abc "
становление'Abc '
в примере выше). - Возможно, что подстрока внутри
I
содержит толькоD
. Например:D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'
приведет к['a', ',', 'b', 'c', 'd,e,,', 'f']
. - Вы можете предположить, что
D
этого никогда не будет в начале или в концеS
, поэтому вам не придется иметь дело с конечными / ведущими пустыми элементами. - Когда вход имеет два смежных
D
, у нас будет пустой элемент. Т.е.D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'
приведет к['a', 'b,c', 'd', '', 'e', '', 'f']
. - Можно предположить, что входы и выходы будут содержать только печатный ASCII в диапазоне
[32, 126]
(исключая вкладки и переводы строк). - Вам также разрешено выводить все элементы с разделителями новой строки вместо возврата / вывода списка / массива (особенно для тех языков, которые не имеют списков / массивов; т.е. Retina).
- Вам разрешено выводить список в обратном порядке, если он сохраняет байты. Вам не разрешено выводить его в отсортированном или «перемешанном» порядке. Так что
D = ','; I = 'n'; S = 'a,2,b,3,c'
можно выводить как[a,2,b,3,c]
или[c,3,b,2,a]
, но не как[2,3,a,b,c,]
или,[a,3,b,c,2]
например.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте найти как можно более короткий ответ для «любого» языка программирования. - К вашему ответу применяются стандартные правила , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
Тестовые случаи:
Input:
D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'
Output:
['a', 'b,c', 'd', '', 'e', '', 'f']
Input:
D = ','; I = '"'; S = '11020199,"Abc ",aduz,,444,bieb,dc,2 ,2222.00,whatever 5dc,222.22,22.00,"98,00","12,000,000",21-09-2018, 06:00,",-,"'
Output:
['11020199', 'Abc ', 'aduz', '', '444', 'bieb', 'dc', '2 ', '2222.00', 'whatever 5dc', '222.22', '22.00', '98,00', '12,000,000', '21-09-2018', ' 06:00', ',-,']
Input:
D = ' '; I = ','; S = 'this is a test , to see if you understand it, or not , hmmm, I think I have too many commas , or not , perhaps..'
Output:
['this', 'is', 'a', 'test', ' to see if you understand it', 'or', 'not', ' hmmm', 'I', 'think', 'I', 'have', 'too', 'many', 'commas', ' or not ', 'perhaps..']
Input:
D = 'x'; I = 'y'; S = 'contains no lowercase X nor Y'
Output:
['contains no lowercase X nor Y']
Input:
D = '1'; I = '3'; S = '3589841973169139975105820974944592078316406286208948254211370679314'
Output: ['58984197', '69', '9975105820974944592078', '64062862089482542', '', '70679', '4']
Input:
D = ' '; I = 'S'; S = 'regular split on spaces'
Output:
['regular', 'split', 'on', 'spaces']
"", "'ll remove all ", ""
)D = ','; I = '"'; S = ',"a,b",c,,d,""'
я только что заметил. Я немного изменю задачу, чтобы пустые элементы были невозможны в начале или в конце. Основываясь на опыте работы с Java и 05AB1E в прошлом, я знаю, как можно расстроить пустые элементы после разделения, если язык по умолчанию не делает это правильно. Подобные тестовые примеры все еще должны поддерживаться:D = ','; I = '"'; S = 'a,"b,c",d,,e
→['a', 'b,c', 'd', '', 'e']
с пустым элементом между ними.'1,"2,3"' -> ['2,3','1']
[a,b,c]
и[c,b,a]
допустимы выходы, но[a,c,b]
или[b,a,c]
нет например.D=','; I='"'; S='a",b,"c'
или это даже допустимый вклад?Ответы:
Japt , 16 байт
Попробуй!
По сути, та же стратегия, что и в более новом ответе Пипса в DLosc, откладывает разделы «кавычки», а затем заменяет разделитель новой строкой в остальной части строки, что приводит к выводу с разделителями новой строки.
Полное объяснение:
Обратите внимание, что даже если первый элемент указан в кавычках, он все равно будет иметь индекс 1, а не индекс 0. Если
q
в качестве первого символа будет найден разделитель, первый элемент в разбиении (индекс 0) станет пустой строкой, поэтому содержимое котировки правильно становятся вторым пунктом (индекс 1). Вот демонстрация правильного обращения с лидирующей цитатой.источник
R , 34 байта
Обычные не модифицированы
scan
с соответствующими аргументамиtext
,sep
иquote
должны это делать.Попробуйте онлайн!
источник
scan
4 байта, а затем вызвать их с аргументами в соответствующих местах?C (gcc) , 64 байта
Попробуйте онлайн!
JavaScript (Node.js) , 57 байт
Попробуйте онлайн!
источник
D
внутри,I
а также содержитсяI
в выходных данных, что также можно увидеть в первых тестовых примерах в вашей ссылке TIO. (PS: также может быть лучше опубликовать их как отдельные ответы со ссылкой, указывающей, что это порт вашего C-ответа.)Python 2, 67 байт
Попробуйте онлайн!
Python 2, 71 байт
Попробуйте онлайн!
источник
Пип , 18 байт
Принимает входные данные в качестве аргументов командной строки. Попробуйте онлайн!
Совершенно другой подход: обрабатывать строку по одному символу за раз и выводить желаемые результаты с разделителями строк.
Как?
источник
MATL , 24 байта
Входы
S
,I
,D
.Попробуйте онлайн! Или проверьте все тестовые случаи .
Как это работает
Рассмотреть входные данные
D = ','
;I = '"'
;S = 'a,"b,c",d,,e,"",f'
,источник
Сетчатка , 45 байт
Попробуйте онлайн! Объяснение:
Посмотрите вперед, чтобы найти значения
D
иI
в следующих двух строках. Затем, если мы найдем,I
то сожмем это и сопоставим символы со следующим,I
а вD
противном случае просто сопоставим символы со следующимD
или концом строки.Список захватывает 4 и 5 из каждого матча; 4 - захват между двумя
I
s, а 5 - захват между двумяD
s.источник
Powershell, 71 байт
Менее гольф тестовый скрипт:
Выход:
Объяснение:
-split{...}
указываются правила применения разделителя. Смотрите about_split .$script:a=...
устанавливает переменнуюa
во внешней области видимости .-ceq
означает чувствительное к регистру уравнение .|% trim $i
вызывает методtrim
с аргументом$i
.источник
СНОБОЛ4 (CSNOBOL4) , 109 байт
Попробуйте онлайн!
Предположим, что
D =','
иI ='"'
. Затем шаблон(I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))
сопоставляет строки, которые выглядят".*"
или.*
следуют либо,
за концом строки, либо за ней, и OUTPUT устанавливает произвольные.*
символы ( ), устанавливая непревзойденный REMainderS
и повторяя его, покаS
он не пуст.источник
Пип
-n
,2924 байтаПринимает входные данные в качестве аргументов командной строки. Попробуйте онлайн!
Стратегия: за пределами
I
пар заменитеD
символом новой строки (поскольку мы гарантируем, что символы новой строки не появятся в строке). Затем разделить на новую строку и раздетьсяI
.источник
Желе ,
20-18 байтПолная программа принимает три аргумента
D
,I
,S
который печатает каждый элемент в строке.Попробуйте онлайн! (Нижний колонтитул соединяется с новыми строками)
Как?
Окружите лишним
D
с каждой стороны, разделите вI
s, разделите нечетно-индексированные элементы вD
s, затем удалите их головы и хвосты и соедините их с новыми строками, наконец объедините результат с новыми строками.источник
;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
PHP , 50 байт
Попробуйте онлайн! Использует встроенную функцию .
Если перестановка входов разрешена (
(S,D,I)
так что она совпадает сstr_getcsv
подписью), у меня есть 44-байтовая версия .источник
$S
,$D
и$I
со стоимостью 0 байт, для этого 50 байт длинной версии.$S
,$D
,$I
переменные могут служить в качестве руководства для порядка аргументов.