Розділіть його. Але не всі!


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](за винятком вкладок та нових рядків).
  • Вам також дозволяється виводити всі елементи з новим рядком, а не повертати / виводити список / масив (особливо для тих мов, які не мають списків / масивів; тобто сітчатка).
  • Ви можете виводити список у зворотному порядку, якщо він зберігає байти. Ти не можеш виводити його в упорядкованому або "перетасованому" порядку. Так 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, функції / метод із відповідними параметрами та повним програмами типу return. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто 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

Спробуй це!

В основному та ж стратегія, що і в новій відповіді Pip від 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)

Спробуйте в Інтернеті!


2
Як завжди, R провідників у вирішенні проблем розщеплення струни.
ngm

2
Поговоріть про правильну мову для роботи. :) Перевірено кілька тестових випадків, і всі вони, здається, працюють нормально, тому +1 від мене. PS: Введення даних, зберігаючи її в змінній, не дозволено відповідно до мета.
Кевін Кройсейсен

1
@KevinCruijssen Чи можу я подати scan4 байти, а потім викликати його аргументами у відповідних місцях?
J.Doe

1
@ J.Doe Umm .. Я не знаю. Не надто знайомі з можливими прийнятними форматами введення для R tbh. Наскільки мені відомо, використання повної програми з програмними аргументами або STDIN, а також функцією (лямбда) з відповідними параметрами або також використанням STDIN є прийнятними за замовчуванням. У мета-публікації, яку я пов’язував раніше , згадуються всі дійсні формати введення (з позитивною оцінкою). Як це працює для R Я не знаю.
Kevin Cruijssen

@ 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:`
`)

Спробуйте в Інтернеті!


1
Ваша відповідь C чудово працює, але, схоже, ваша відповідь на JS все ще розділяється Dвсередині I, а також міститься Iу висновку, що також можна побачити в перших тестових випадках у вашому TIO-посиланні. (PS: Можливо, також буде краще опублікувати їх як окремі відповіді, посиланням на які є посилання вашої відповіді на С.)
Кевін Круїйсен

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

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

Пояснення:


2

SNOBOL4 (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))відповідає рядкам, схожим на ".*"або .*слідуючи ,або за кінцем рядка, або виводить довільні ( .*) символи, встановлюючи невідповідний REMainder на Sта повторюючи до тих пір, Sпоки не буде порожнім.


2

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

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

Приймає дані як аргументи командного рядка. Спробуйте в Інтернеті!

Стратегія: зовнішні Iпари замініть Dна новий рядок (оскільки ми гарантуємо, що нові рядки не з'являться у рядку). Потім розділіть на нову лінію та смужку I.


2

Желе ,  20  18 байт

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

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

Спробуйте в Інтернеті! (Нижній колонтитул приєднується до нових рядків)

Як?

Оточіть з додатковою Dстороною на кожній стороні, розділіть на Is, розділіть неідентифіковані елементи на Ds, потім видаліть їх голови та хвости та з'єднайте їх з новими рядками, нарешті з'єднайте результат з новими рядками.


1
Я думаю, що вихід списку (на відміну від повернення списку) потрібно якось обмежити, так що ви можете сказати 1), що це взагалі список, і 2) там, де один елемент закінчується, а інший починається. (У мене немає конкретного мета-повідомлення, який би підтверджував це, але є певна пов’язаність з дискусією про неспостережувану поведінку . Зараз зараз не помітно, що ваша програма виводить список, а не, скажімо, рядок. )
DLosc

Тож я здогадуюсь, що я можу замінити затягування на з'єднання новими рядками (це поверне список списків символів, змішаних з символами, але повна програма буде друкувати елементи в нових рядках).
Джонатан Аллан


@JonathanAllan Ваше 20-байтове рішення працює за призначенням, але ваш 17-байтний коментар, схоже, дає некоректні результати .
Kevin Cruijssen

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змінні можуть служити в якості керівництва для порядку аргументів.
Ісмаїл Мігель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.