Раздели это. Но не все!

11

Вдохновлен этим вопросом 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']
Кевин Круйссен
источник
Большинство (или все?) Текущих ответов не содержат пустых элементов в начале и в конце тестового примера 6. Это особый случай или ошибка в тестовых случаях? ( "", "'ll remove all ", "")
TFeld
@TFeld Это особый случай. Почти все ответы тоже не срабатывают, потому что 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']
Камил Дракари
1
@KamilDrakari Хмм, я добавлю правило, чтобы оно было как вперед, так и назад, но не перемешивалось. Так [a,b,c]и [c,b,a]допустимы выходы, но [a,c,b]или [b,a,c]нет например.
Кевин Круйссен
Каким должен быть результат D=','; I='"'; S='a",b,"c'или это даже допустимый вклад?
Згарб

Ответы:

3

Japt , 16 байт

qV mÏu ?X:XrWRÃq

Попробуй!

По сути, та же стратегия, что и в более новом ответе Пипса в DLosc, откладывает разделы «кавычки», а затем заменяет разделитель новой строкой в ​​остальной части строки, что приводит к выводу с разделителями новой строки.

Полное объяснение:

qV                  Split on I
   m          Ã     For each segment:
    Ïu ?              If the segment has an odd index (quoted)...
        X             Keep it as-is
         :          Otherwise:
          XrWR        Replace each D in the segment with a newline
               q    Join it all to a single string

Обратите внимание, что даже если первый элемент указан в кавычках, он все равно будет иметь индекс 1, а не индекс 0. Если qв качестве первого символа будет найден разделитель, первый элемент в разбиении (индекс 0) станет пустой строкой, поэтому содержимое котировки правильно становятся вторым пунктом (индекс 1). Вот демонстрация правильного обращения с лидирующей цитатой.

Камил Дракари
источник
Я просто сохранил несколько байтов, заменив D новой строкой вне кавычек и разделив ее на новую строку, тем самым устраняя необходимость замены новой строки на D в конце. Может ли это сократить ваш код тоже?
DLosc
@DLosc Действительно, спасибо за предложение!
Выкладываю
8

R , 34 байта

Обычные не модифицированы scanс соответствующими аргументами text, sepи quoteдолжны это делать.

function(D,I,S)scan(,t=S,"",,,D,I)

Попробуйте онлайн!

j.doe
источник
2
Как обычно, R лидирует на соревнованиях по расщеплению строк.
НГМ
2
Разговор о правильном языке для работы. :) Проверено несколько тестовых случаев, и все они, кажется, работают нормально, так что +1 от меня. PS: в соответствии с мета-метом ввод данных путем сохранения их в переменной запрещен.
Кевин Круйссен
1
@KevinCruijssen Могу ли я передать scan4 байта, а затем вызвать их с аргументами в соответствующих местах?
J.Doe
1
@ Дж. Доу ... Я не знаю. Не слишком знаком с возможными приемлемыми форматами ввода для R tbh. Насколько я знаю, использование полной программы с программными аргументами или STDIN, а также (лямбда) -функция с соответствующими параметрами или также использование STDIN допустимы по умолчанию. В мета-посте, на который я ссылался ранее , упоминаются все допустимые форматы ввода (с положительным счетом). Как это работает для R, я не знаю.
Кевин Круйссен
@ J. Ваша заявка сейчас представляет собой полную программу, и в настоящее время она не требует ввода от stdin. Самое короткое решение было бы заключить его в функцию.
Джузеппе
7

C (gcc) , 64 байта

c;f(d,i,s)char*s;{for(;*s;s++)*s==i?c=!c:putchar(d-*s|c?*s:10);}

Попробуйте онлайн!

JavaScript (Node.js) , 57 байт

(d,i,s)=>s.replace(c=/./g,e=>i==e?(c^=1,''):d!=e|c?e:`
`)

Попробуйте онлайн!

l4m2
источник
1
Ваш ответ на C хорошо работает, но ваш ответ на JS, похоже, все еще разделен Dвнутри, Iа также содержится Iв выходных данных, что также можно увидеть в первых тестовых примерах в вашей ссылке TIO. (PS: также может быть лучше опубликовать их как отдельные ответы со ссылкой, указывающей, что это порт вашего C-ответа.)
Кевин Круйссен,
1
@KevinCruijssen Исправлено. Обычно я выкладываю похожие ответы вместе и только говорю, что это порт, если он от чужой работы
l4m2
4

Пип , 18 байт

FxcxQb?!:oOo?xRanx

Принимает входные данные в качестве аргументов командной строки. Попробуйте онлайн!

Совершенно другой подход: обрабатывать строку по одному символу за раз и выводить желаемые результаты с разделителями строк.

Как?

                    a,b,c are cmdline args (respectively representing D,I,S); o is 1;
                    n is newline (implicit)
                    We use o for a flag indicating whether or not to change D into newline
Fxc                 For each character x in c:
   xQb?              If x equals b (the ignore character),
       !:o            Logically negate o in-place
          O          Else, output the following (with no trailing newline):
           o?         If o is truthy,
             xRan      x, with a (the delimiter) replaced with newline
                 x    Else, x unchanged
DLosc
источник
4

MATL , 24 байта

y=Yso~yi=*~*cO10Zt2G[]Zt

Входы S, I, D.

Попробуйте онлайн! Или проверьте все тестовые случаи .

Как это работает

Рассмотреть входные данные D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f',

y     % Implicit inputs: S, I. Duplicate from below
      % STACK: 'a,"b,c",d,,e,"",f', '"', 'a,"b,c",d,,e,"",f'
=     % Is equal? Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0]
Ys    % Cumulative sum
      % STACK: 'a,"b,c",d,,e,"",f', [0 0 1 1 1 1 2 2 2 2 2 2 2 3 4 4 4]
o~    % Parity, negate
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1]
y     % Duplicate from below
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1], 'a,"b,c",d,,e,"",f'
i=    % Input: D. Is equal? Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [1 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 1], [0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0]
*~    % Multiply, negate (equivalent to NAND). Element-wise
      % STACK: 'a,"b,c",d,,e,"",f', [1 0 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1]
*     % Multiply, element-wise. Characters are converted to ASCII code
      % STACK: [97 0 34 98 44 99 34 0 100 0 0 101 0 34 34 0 102]
c     % Convert to char (character 0 is shown here as '·')
      % STACK: 'a·"b,c"·d··e·""·f'
O10   % Push 0 and then 10
      % STACK: 'a·"b,c"·d··e·""·f', 0, 10
Zt    % Replace character 0 by character 10 (newline; shown here as '¶')
      % STACK: 'a¶"b,c"¶d¶¶e¶""¶f'
2G[]  % Push second input (I) and then [] (empty array)
      % STACK: 'a¶"b,c"¶d¶¶e¶""¶f', '"', []
Zt    % Replace character given by input I by empty; that is, remove it. Implicit display
      % STACK: 'a¶b,c¶d¶¶e¶¶f'
Луис Мендо
источник
3

Сетчатка , 45 байт

L$`(?=.*¶(.)¶(.))(\2(.*?)\2|(.*?))(\1|¶)
$4$5

Попробуйте онлайн! Объяснение:

(?=.*¶(.)¶(.))(\2(.*?)\2|(.*?))(\1|¶)

Посмотрите вперед, чтобы найти значения Dи Iв следующих двух строках. Затем, если мы найдем, Iто сожмем это и сопоставим символы со следующим, Iа в Dпротивном случае просто сопоставим символы со следующим Dили концом строки.

L$`
$4$5

Список захватывает 4 и 5 из каждого матча; 4 - захват между двумя Is, а 5 - захват между двумя Ds.

Нил
источник
3

Powershell, 71 байт

param($d,$i,$s)$s-split{(1-($script:a+=$i-ceq$_)%2)*($d-ceq$_)}|% *m $i

Менее гольф тестовый скрипт:

$f = {

param($d,$i,$s)
$s-split{
    $script:a+=$i-ceq$_
    (1-$a%2)-and($d-ceq$_)
}|% Trim $i

}

@(
    ,(',','"',
    '',
    '')

    ,(',','"',
    'a,"b,c",d,,e,"",f',
    'a', 'b,c', 'd', '', 'e', '', 'f')

    ,(',','"',
    '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,",-,"',
    '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', ',-,')

    ,(' ',',',
    'this is a test , to see if you understand it, or not , hmmm, I think I have too many commas , or not , perhaps..',
    'this', 'is', 'a', 'test', ' to see if you understand it', 'or', 'not', ' hmmm', 'I', 'think', 'I', 'have', 'too', 'many', 'commas', ' or not ', 'perhaps..')

    ,('x','y',
    'contains no lowercase X nor Y',
    'contains no lowercase X nor Y')

    ,('1','3',
    '3589841973169139975105820974944592078316406286208948254211370679314',
    '58984197', '69', '9975105820974944592078', '64062862089482542', '', '70679', '4')

    ,(' ','S',
    'regular split on spaces',
    'regular', 'split', 'on', 'spaces')

) | % {
    $d,$i,$s,$expected = $_
    $result = &$f $d $i $s
    "$("$result"-eq"$expected"): $result"
}

Выход:

True:
True: a b,c d  e  f
True: 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 ,-,
True: this is a test  to see if you understand it or not  hmmm I think I have too many commas  or not  perhaps..
True: contains no lowercase X nor Y
True: 58984197 69 9975105820974944592078 64062862089482542  70679 4
True: regular split on spaces

Объяснение:

Mazzy
источник
2

СНОБОЛ4 (CSNOBOL4) , 109 байт

	D =INPUT
	I =INPUT
	S =INPUT
S	S (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0)) REM . S	DIFFER(S)	:S(S)
END

Попробуйте онлайн!

Предположим, что D =','и I ='"'. Затем шаблон (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))сопоставляет строки, которые выглядят ".*"или .*следуют либо ,за концом строки, либо за ней, и OUTPUT устанавливает произвольные .*символы ( ), устанавливая непревзойденный REMainder Sи повторяя его, пока Sон не пуст.

Giuseppe
источник
2

Пип -n , 29 24 байта

cR Xa[na]@(bN{$`})^n||:b

Принимает входные данные в качестве аргументов командной строки. Попробуйте онлайн!

Стратегия: за пределами Iпар замените Dсимволом новой строки (поскольку мы гарантируем, что символы новой строки не появятся в строке). Затем разделить на новую строку и раздеться I.

DLosc
источник
2

Желе ,  20-  18 байт

;`j⁵œṣ⁴œṣḊṖYʋ€Ðo³Y

Полная программа принимает три аргумента D, I, Sкоторый печатает каждый элемент в строке.

Попробуйте онлайн! (Нижний колонтитул соединяется с новыми строками)

Как?

Окружите лишним Dс каждой стороны, разделите в Is, разделите нечетно-индексированные элементы в Ds, затем удалите их головы и хвосты и соедините их с новыми строками, наконец объедините результат с новыми строками.

Джонатан Аллан
источник
1
Я думаю, что вывод списка (в отличие от возврата списка) должен быть как-то разграничен, так что вы можете сказать 1), что это вообще список, и 2) где один элемент заканчивается, а другой начинается. (У меня нет конкретного мета-сообщения, подтверждающего это, но есть определенная связь с обсуждением ненаблюдаемого поведения . В настоящее время не наблюдается, что ваша программа выводит список, а не, скажем, строку. )
DLosc
Так что я думаю, что я могу заменить натяжение соединением с помощью новых строк (который вернет список списков символов, смешанных с символами, но полная программа будет печатать элементы на новых строках).
Джонатан Аллан
... так 17 с;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
Джонатан Аллан
@JonathanAllan Ваше 20-байтовое решение работает как задумано, но ваш 17-байтовый комментарий в комментарии, кажется, дает некоторые неверные результаты .
Кевин Круйссен
1
@KevinCruijssen - да, мобильный гольф бесполезен, я пропустил соединение по новым строкам для нечетно проиндексированных элементов, 18 опубликовано.
Джонатан Аллан
2

PHP , 50 байт

function q($D,$I,$S){return str_getcsv($S,$D,$I);}

Попробуйте онлайн! Использует встроенную функцию .

Если перестановка входов разрешена ( (S,D,I)так что она совпадает с str_getcsvподписью), у меня есть 44-байтовая версия .

Джо.
источник
1
Я считаю, что изменение порядка ввода допускается, если вы укажете порядок. Для того, чтобы сделать его более ясным, вы можете использовать переменные $S, $Dи $Iсо стоимостью 0 байт, для этого 50 байт длинной версии.
Исмаэль Мигель
Кроме того , 50 байт версии, с $S, $D, $Iпеременные могут служить в качестве руководства для порядка аргументов.
Исмаэль Мигель