Podziel To. Ale nie wszystko!

11

Inspirowane tym pytaniem StackOverflow .

Wejście:

Weźmiemy trzy dane wejściowe:

  • Znak separatora Ddo podziału
  • Znak Imiędzy dwoma, z których ignorujemy znak ogranicznika (wiem, to brzmi niejasno, ale wyjaśnię to poniżej)
  • Sznurek S

Wynik:

Lista / tablica zawierająca podciągi po podziale.

Przykład:

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', ',-,']

Czemu? Dzielenie na przecinkiem normalnie również podzielone 98,00, 12,000,000a ,-,na dwa / trzy kawałki. Ponieważ jednak mieszczą się one w Iznaku wejściowym, ignorujemy tutaj podział.

Zasady konkursu:

  • Możesz założyć, że Iw ciągu wejściowym zawsze będzie parzysta liczba znaków.
  • Możesz założyć, że znak Izawsze będzie miał Dobok niego (z wyjątkiem, gdy jest to pierwszy lub ostatni znak wejścia), który nadal można poprawnie podzielić. Więc nie będziesz mieć czegoś takiego D = ','; I = '"'; S = 'a,b"c,d"e,f'ani niczego takiego D=','; I='"'; S='a",b,"c'.
  • Wejście string Smoże zawierać żadnego z albo Dalbo I. Jeśli nie zawiera D, wyprowadzamy listę z całym ciągiem wejściowym jako jedyny element.
  • Lista wyjście nie będzie zawierała znaku Iwięcej, nawet gdy nie zawierał D(jak widać u "Abc "staje 'Abc 'w powyższym przykładzie).
  • Możliwe, że podciąg Izawiera tylko D. Na przykład: D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'spowodowałoby ['a', ',', 'b', 'c', 'd,e,,', 'f'].
  • Możesz założyć, że Dnigdy nie będzie na początku ani na końcu S, więc nie będziesz musiał radzić sobie z ciągnięciem / prowadzeniem pustych przedmiotów.
  • Kiedy wejście ma dwa sąsiadujące ze sobą D, będziemy mieli pusty element. Tj D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'skutkowałoby ['a', 'b,c', 'd', '', 'e', '', 'f'].
  • Możesz założyć, że dane wejściowe i wyjściowe będą zawierały tylko ASCII do wydruku w zakresie [32, 126](więc z wyłączeniem tabulatorów i znaków nowej linii).
  • Możesz również wypisywać wszystkie elementy rozdzielane znakami nowej linii zamiast zwracać / wypisywać listę / tablicę (szczególnie w tych językach, które nie mają list / tablic; np. Retina).
  • Możesz zapisać listę w odwrotnej kolejności, jeśli zapisuje ona bajty. Nie możesz jednak wyprowadzać go w kolejności posortowanej lub „przetasowanej”. Więc D = ','; I = 'n'; S = 'a,2,b,3,c'może być wyprowadzany jako [a,2,b,3,c]lub [c,3,b,2,a], ale nie jako [2,3,a,b,c,]lub [a,3,b,c,2]na przykład.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i zwracanymi typami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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']
Kevin Cruijssen
źródło
Większość (lub wszystkie?) Obecnych odpowiedzi nie ma pustych pozycji na początku i na końcu przypadku testowego 6. Czy to przypadek specjalny, czy błąd w przypadkach testowych? ( "", "'ll remove all ", "")
TFeld,
@TFeld To wyjątkowy przypadek. Prawie wszystkie odpowiedzi również zawodzą, ponieważ D = ','; I = '"'; S = ',"a,b",c,,d,""'właśnie zauważyłem. Zmodyfikuję nieco wyzwanie, aby puste przedmioty nie były możliwe na początku ani na końcu. Opierając się na doświadczeniach zarówno w Javie, jak i 05AB1E w przeszłości, wiem, jak frustrujące mogą być puste elementy po podziale, aby naprawić ręcznie, gdy język domyślnie nie robi tego poprawnie. Takie przypadki testowe powinny być nadal obsługiwane: D = ','; I = '"'; S = 'a,"b,c",d,,e['a', 'b,c', 'd', '', 'e']z pustym elementem pomiędzy.
Kevin Cruijssen
Czy wymagane jest, aby końcowe wyjście utrzymywało kolejność danych wejściowych? np.'1,"2,3"' -> ['2,3','1']
Kamil Drakari
1
@KamilDrakari Hmm, dodam regułę, która pozwoli zarówno na przewijanie do przodu, jak i do tyłu, ale nie jest tasowana. Więc [a,b,c]i [c,b,a]mogą wyjść, ale [a,c,b]czy [b,a,c]nie na przykład.
Kevin Cruijssen
Co powinno być wynikiem, D=','; I='"'; S='a",b,"c'czy może nawet prawidłowym wkładem?
Zgarb

Odpowiedzi:

3

Japt , 16 bajtów

qV mÏu ?X:XrWRÃq

Spróbuj!

Zasadniczo ta sama strategia, co nowsza odpowiedź Pip DLosc, odkłada na bok sekcje „cytowane”, a następnie zastępuje separator nową linią w pozostałej części łańcucha, co daje wynik rozdzielany znakiem nowej linii

Pełne wyjaśnienie:

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

Zauważ, że nawet jeśli pierwszy element jest cytowany, nadal będzie miał indeks 1, a nie 0. Jeśli qznajdzie separator jako pierwszy znak, pierwszy element w podziale (indeks 0) będzie pusty ciąg, więc zawartość cytat poprawnie staje się drugim przedmiotem (indeks 1). Oto demonstracja prawidłowego postępowania z wiodącym cytatem.

Kamil Drakari
źródło
Właśnie zapisałem niektóre bajty, zastępując D znakiem nowej linii poza cudzysłowami i dzieląc na nową linię, eliminując w ten sposób potrzebę zamiany nowej linii na D na końcu. Czy to też może skrócić Twój kod?
DLosc
@DLosc Rzeczywiście, dzięki za sugestię!
Wdrażanie
8

R , 34 bajty

Regularne niemodyfikowana scanz odpowiednich argumentów text, sepa quotepowinien to zrobić.

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

Wypróbuj online!

J.Doe
źródło
2
Jak zwykle R przoduje w wyzwaniach związanych z dzieleniem strun.
ngm
2
Porozmawiaj o właściwym języku do pracy. :) Zweryfikowano kilka przypadków testowych i wszystkie wydają się działać dobrze, więc daj +1 ode mnie. PS: Pobieranie danych wejściowych poprzez przechowywanie ich w zmiennej nie jest dozwolone zgodnie z meta.
Kevin Cruijssen
1
@KevinCruijssen Czy mogę przesłać scan4 bajty, a następnie wywołać go z argumentami w odpowiednich miejscach?
J.Doe
1
@ J.Doe Umm .. Nie wiem. Niezbyt dobrze zna możliwe dopuszczalne formaty wejściowe dla R tbh. O ile wiem, używanie pełnego programu z argumentami programu lub STDIN, a także funkcja (lambda) z odpowiednimi parametrami lub również używanie STDIN są domyślnie akceptowane. W meta post, który wcześniej podłączyłem, wymieniono wszystkie prawidłowe formaty wejściowe (z wynikiem dodatnim). Jak to działa dla R. Nie wiem.
Kevin Cruijssen
@ J.Oddaj swój wniosek jest teraz pełnym programem i obecnie nie pobiera danych wejściowych ze standardowego wejścia. Najkrótszym rozwiązaniem byłoby zawinięcie go w funkcję.
Giuseppe
7

C (gcc) , 64 bajty

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

Wypróbuj online!

JavaScript (Node.js) , 57 bajtów

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

Wypróbuj online!

l4m2
źródło
1
Twoja odpowiedź C działa świetnie, ale wydaje się, że odpowiedź JS nadal dzieli się Dwewnątrz Ii zawiera Iw danych wyjściowych, co można również zobaczyć w pierwszych przypadkach testowych w łączu TIO. (PS: Lepiej byłoby też opublikować je jako osobne odpowiedzi, z linkiem stwierdzającym, że jest to port twojej odpowiedzi w języku C.)
Kevin Cruijssen
1
@KevinCruijssen Naprawiono. Zazwyczaj publikuję podobne odpowiedzi razem i mówię tylko, że jest to port, jeśli pochodzi z pracy innych osób
l4m2
4

Python 2, 67 bajtów

import csv
lambda D,I,S:next(csv.reader(S,delimiter=D,quotechar=I))

Wypróbuj online!

Python 2, 71 bajtów

D,I,S=input()
k=1
for p in S.split(I):print p.replace(D*k,'\n'*k),;k^=1

Wypróbuj online!

Lynn
źródło
4

Pip , 18 bajtów

FxcxQb?!:oOo?xRanx

Pobiera dane wejściowe jako argumenty wiersza polecenia. Wypróbuj online!

Zupełnie inne podejście: przetwarzaj ciąg po jednym znaku na raz i wypisz pożądane wyniki rozdzielane znakiem nowej linii.

W jaki sposób?

                    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
źródło
4

MATL , 24 bajty

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

Wejścia są S, I, D.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Jak to działa

Zastanów się nad danymi wejściowymi 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'
Luis Mendo
źródło
3

Siatkówka , 45 bajtów

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

Wypróbuj online! Wyjaśnienie:

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

Spójrz w przyszłość, aby znaleźć wartości Di Iw kolejnych dwóch wierszach. Następnie, jeśli znajdziemy, a Inastępnie zjedz go i dopasuj znaki do następnego, Ia Dw przeciwnym razie po prostu dopasuj znaki do następnego Dlub końca linii.

L$`
$4$5

Lista przechwytuje 4 i 5 z każdego meczu; 4 to przechwytywanie między dwoma Is, podczas gdy 5 to przechwytywanie między dwoma Ds.

Neil
źródło
3

PowerShell, 71 bajtów

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

Skrypt testu mniej golfowego:

$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"
}

Wynik:

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

Wyjaśnienie:

mazzy
źródło
2

SNOBOL4 (CSNOBOL4) , 109 bajtów

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

Wypróbuj online!

Załóżmy, że D =','i I ='"'. Następnie wzorzec (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))dopasowuje ciągi, które wyglądają ".*"lub .*następują po nim ,lub na końcu łańcucha, i WYJŚCIE dowolnych .*znaków ( ), ustawiając niedopasowany REMainder na Si iterując, dopóki Snie jest pusty.

Giuseppe
źródło
2

Pip -n , 29 24 bajtów

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

Pobiera dane wejściowe jako argumenty wiersza polecenia. Wypróbuj online!

Strategia: Ipary zewnętrzne , zamień na Dnowy wiersz (ponieważ gwarantujemy, że nowe znaki nie pojawią się w ciągu). Następnie podziel na nową linię i rozbierz I.

DLosc
źródło
2

Galaretka ,  20  18 bajtów

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

Pełen program, biorąc trzy argumenty D, I, Sktóra drukuje każdą pozycję na linii.

Wypróbuj online! (Stopka łączy się z nowymi liniami)

W jaki sposób?

Otocz dodatkowe Dz każdej strony, podziel na Is, podziel nieparzyste indeksy na Ds, następnie usuń ich głowy i ogony i połącz je z nowymi liniami, w końcu dołącz wynik z nowymi liniami.

Jonathan Allan
źródło
1
Wydaje mi się, że dane wyjściowe listy (w przeciwieństwie do zwracania listy) muszą być w jakiś sposób rozdzielone, aby można było powiedzieć 1), że w ogóle jest to lista, i 2) gdzie kończy się jeden element, a drugi zaczyna. (Nie mam konkretnego meta postu, który mógłby to poprzeć, ale istnieje pewna zależność od dyskusji na temat nieobserwowalnego zachowania . W tej chwili nie można zaobserwować, że Twój program wyświetla listę, a nie ciąg znaków. )
DLosc
Myślę więc, że mogę zastąpić dokręcenie łączeniem znakiem nowej linii (która zwróci listę list znaków pomieszanych ze znakami, ponieważ pełny program wydrukuje elementy w nowych liniach).
Jonathan Allan
... więc 17 z;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
Jonathan Allan
@JonathanAllan Twoje 20-bajtowe rozwiązanie działa zgodnie z przeznaczeniem, ale 17-bajtowy w komentarzu wydaje się dawać nieprawidłowe wyniki .
Kevin Cruijssen
1
@KevinCruijssen - tak, mobilny golf nie jest dobry, spóźniłem się na dołączenie nowych linii do pozycji o nieparzystym indeksie, 18 opublikowanych.
Jonathan Allan
2

PHP , 50 bajtów

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

Wypróbuj online! Używa wbudowanej funkcji .

Jeśli zmiana kolejności danych jest dozwolona ( (S,D,I)więc pasuje do str_getcsvpodpisu), mam wersję 44-bajtową .

Jo.
źródło
1
Uważam, że zmiana kolejności wprowadzania jest dozwolona, ​​o ile określisz kolejność. Aby uczynić go bardziej zrozumiałym, można używać zmiennych $S, $Doraz $Iz kosztem 0 bajtów, w tym 50 bajtów wersji długiej.
Ismael Miguel
Ponadto, 50 bajty wersji, z $S, $D, $Izmienne może służyć jako przewodnik dla kolejności argumentów.
Ismael Miguel