Inspirowane tym pytaniem StackOverflow .
Wejście:
Weźmiemy trzy dane wejściowe:
- Znak separatora
D
do podziału - Znak
I
mię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,000
a ,-,
na dwa / trzy kawałki. Ponieważ jednak mieszczą się one w I
znaku wejściowym, ignorujemy tutaj podział.
Zasady konkursu:
- Możesz założyć, że
I
w ciągu wejściowym zawsze będzie parzysta liczba znaków. - Możesz założyć, że znak
I
zawsze będzie miałD
obok 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ś takiegoD = ','; I = '"'; S = 'a,b"c,d"e,f'
ani niczego takiegoD=','; I='"'; S='a",b,"c'
. - Wejście string
S
może zawierać żadnego z alboD
alboI
. Jeśli nie zawieraD
, wyprowadzamy listę z całym ciągiem wejściowym jako jedyny element. - Lista wyjście nie będzie zawierała znaku
I
więcej, nawet gdy nie zawierałD
(jak widać u"Abc "
staje'Abc '
w powyższym przykładzie). - Możliwe, że podciąg
I
zawiera tylkoD
. 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
D
nigdy nie będzie na początku ani na końcuS
, 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. TjD = ','; 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 golf golfowy , 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']
"", "'ll remove all ", ""
)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.'1,"2,3"' -> ['2,3','1']
[a,b,c]
i[c,b,a]
mogą wyjść, ale[a,c,b]
czy[b,a,c]
nie na przykład.D=','; I='"'; S='a",b,"c'
czy może nawet prawidłowym wkładem?Odpowiedzi:
Japt , 16 bajtów
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:
Zauważ, że nawet jeśli pierwszy element jest cytowany, nadal będzie miał indeks 1, a nie 0. Jeśli
q
znajdzie 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.źródło
R , 34 bajty
Regularne niemodyfikowana
scan
z odpowiednich argumentówtext
,sep
aquote
powinien to zrobić.Wypróbuj online!
źródło
scan
4 bajty, a następnie wywołać go z argumentami w odpowiednich miejscach?C (gcc) , 64 bajty
Wypróbuj online!
JavaScript (Node.js) , 57 bajtów
Wypróbuj online!
źródło
D
wewnątrzI
i zawieraI
w 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.)Python 2, 67 bajtów
Wypróbuj online!
Python 2, 71 bajtów
Wypróbuj online!
źródło
Pip , 18 bajtów
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?
źródło
MATL , 24 bajty
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'
.źródło
Siatkówka , 45 bajtów
Wypróbuj online! Wyjaśnienie:
Spójrz w przyszłość, aby znaleźć wartości
D
iI
w kolejnych dwóch wierszach. Następnie, jeśli znajdziemy, aI
następnie zjedz go i dopasuj znaki do następnego,I
aD
w przeciwnym razie po prostu dopasuj znaki do następnegoD
lub końca linii.Lista przechwytuje 4 i 5 z każdego meczu; 4 to przechwytywanie między dwoma
I
s, podczas gdy 5 to przechwytywanie między dwomaD
s.źródło
PowerShell, 71 bajtów
Skrypt testu mniej golfowego:
Wynik:
Wyjaśnienie:
-split{...}
określonych regułach stosowania ogranicznika. Zobacz about_split .$script:a=...
ustawia zmiennąa
w zakresie zewnętrznym .-ceq
oznacza równanie uwzględniające wielkość liter .|% trim $i
wywołuje metodętrim
z argumentem$i
.źródło
SNOBOL4 (CSNOBOL4) , 109 bajtów
Wypróbuj online!
Załóżmy, że
D =','
iI ='"'
. 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 naS
i iterując, dopókiS
nie jest pusty.źródło
Pip
-n
,2924 bajtówPobiera dane wejściowe jako argumenty wiersza polecenia. Wypróbuj online!
Strategia:
I
pary zewnętrzne , zamień naD
nowy wiersz (ponieważ gwarantujemy, że nowe znaki nie pojawią się w ciągu). Następnie podziel na nową linię i rozbierzI
.źródło
Galaretka ,
2018 bajtówPełen program, biorąc trzy argumenty
D
,I
,S
która drukuje każdą pozycję na linii.Wypróbuj online! (Stopka łączy się z nowymi liniami)
W jaki sposób?
Otocz dodatkowe
D
z każdej strony, podziel naI
s, podziel nieparzyste indeksy naD
s, następnie usuń ich głowy i ogony i połącz je z nowymi liniami, w końcu dołącz wynik z nowymi liniami.źródło
;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
PHP , 50 bajtów
Wypróbuj online! Używa wbudowanej funkcji .
Jeśli zmiana kolejności danych jest dozwolona (
(S,D,I)
więc pasuje dostr_getcsv
podpisu), mam wersję 44-bajtową .źródło
$S
,$D
oraz$I
z kosztem 0 bajtów, w tym 50 bajtów wersji długiej.$S
,$D
,$I
zmienne może służyć jako przewodnik dla kolejności argumentów.