Tách nó đi. Nhưng không phải tất cả!


11

Lấy cảm hứng từ câu hỏi StackOverflow này .

Đầu vào:

Chúng tôi sẽ có ba đầu vào:

  • Một ký tự phân cách Dđể phân chia
  • Một nhân vật Igiữa hai trong số chúng ta bỏ qua nhân vật phân cách (tôi biết, điều đó nghe có vẻ mơ hồ, nhưng tôi sẽ giải thích nó bên dưới)
  • Một chuỗi S

Đầu ra:

Một danh sách / mảng chứa các chuỗi con sau khi tách.

Thí dụ:

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

Tại sao? Tách trên dấu phẩy sẽ thường cũng chia 98,00, 12,000,000,-,trong hai / ba mảnh. Nhưng vì chúng nằm trong Iký tự đầu vào, chúng tôi bỏ qua việc bỏ qua phần tách ở đây.

Quy tắc thử thách:

  • Bạn có thể giả sử sẽ luôn có một lượng Iký tự chẵn trong chuỗi đầu vào.
  • Bạn có thể giả sử nhân vật Isẽ luôn có một ký tự Dbên cạnh (trừ khi đó là ký tự đầu tiên hoặc cuối cùng của đầu vào) vẫn có thể được phân chia chính xác. Vì vậy, bạn sẽ không có cái gì đó như thế D = ','; I = '"'; S = 'a,b"c,d"e,f', cũng không có gì như thế này D=','; I='"'; S='a",b,"c'.
  • Chuỗi đầu vào Scó thể không chứa một trong hai Dhoặc I. Nếu nó không chứa D, chúng tôi xuất ra một danh sách với toàn bộ chuỗi đầu vào dưới dạng chỉ mục.
  • Danh sách đầu ra sẽ không chứa ký tự Inữa, ngay cả khi nó không chứa D(như bạn có thể thấy khi "Abc "trở thành 'Abc 'trong ví dụ trên).
  • Có thể là chuỗi con bên trong Ichỉ chứa D. Ví dụ: D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'sẽ dẫn đến ['a', ',', 'b', 'c', 'd,e,,', 'f'].
  • Bạn có thể cho rằng Dsẽ không bao giờ bắt đầu hoặc kết thúc S, vì vậy bạn sẽ không phải đối phó với các mục trống / dẫn đầu.
  • Khi một đầu vào có hai liền kề D, chúng ta sẽ có một mục trống. Tức là D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'sẽ có kết quả ['a', 'b,c', 'd', '', 'e', '', 'f'].
  • Bạn có thể giả sử đầu vào và đầu ra sẽ chỉ chứa ASCII có thể in trong phạm vi [32, 126](vì vậy không bao gồm các tab và dòng mới).
  • Bạn cũng được phép xuất tất cả các mục được phân tách bằng dòng mới thay vì trả về / xuất ra một danh sách / mảng (đặc biệt đối với các ngôn ngữ không có danh sách / mảng; ví dụ như Retina).
  • Bạn được phép xuất danh sách theo thứ tự đảo ngược nếu nó lưu byte. Mặc dù vậy, bạn không được phép xuất nó theo thứ tự được sắp xếp hoặc 'xáo trộn'. Vì vậy, D = ','; I = 'n'; S = 'a,2,b,3,c'có thể là đầu ra như [a,2,b,3,c]hoặc [c,3,b,2,a], nhưng không phải là [2,3,a,b,c,]hoặc [a,3,b,c,2]ví dụ.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

Các trường hợp thử nghiệm:

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

Hầu hết (hoặc tất cả?) Trong số các câu trả lời hiện tại không có mục trống ở đầu và cuối của trường hợp kiểm tra 6. Đây có phải là trường hợp đặc biệt hoặc lỗi trong các thử nghiệm không? ( "", "'ll remove all ", "")
TFeld

@TFeld Đó là một trường hợp đặc biệt. Hầu như tất cả các câu trả lời cũng thất bại cho D = ','; I = '"'; S = ',"a,b",c,,d,""'tôi chỉ cần chú ý. Tôi sẽ sửa đổi thử thách một chút để các mục trống sẽ không thể thực hiện được khi bắt đầu hoặc kết thúc. Dựa trên kinh nghiệm trong cả Java và 05AB1E trong quá khứ, tôi biết các mục trống sau khi chia tách có thể khắc phục thủ công như thế nào khi ngôn ngữ không làm đúng theo mặc định. Một trường hợp thử nghiệm như thế này vẫn nên được hỗ trợ: D = ','; I = '"'; S = 'a,"b,c",d,,e['a', 'b,c', 'd', '', 'e']với một mục trống ở giữa.
Kevin Cruijssen

Có yêu cầu rằng đầu ra cuối cùng duy trì thứ tự của đầu vào? ví dụ'1,"2,3"' -> ['2,3','1']
Kamil Drakari

1
@KamilDrakari Hmm, tôi sẽ thêm một quy tắc để cho phép cả hai tiến và lùi, nhưng không bị xáo trộn. Vì vậy, [a,b,c][c,b,a]được phép đầu ra, nhưng [a,c,b]hoặc [b,a,c]không ví dụ.
Kevin Cruijssen

Điều gì sẽ là kết quả của D=','; I='"'; S='a",b,"c'hoặc thậm chí là một đầu vào hợp lệ?
Zgarb

Câu trả lời:


3

Japt , 16 byte

qV mÏu ?X:XrWRÃq

Thử nó!

Về cơ bản, chiến lược tương tự như câu trả lời Pip mới hơn của DLosc, đặt các phần "được trích dẫn" sang một bên sau đó thay thế dấu phân cách bằng một dòng mới trong phần còn lại của chuỗi, dẫn đến đầu ra được phân tách bằng dòng mới

Giải thích đầy đủ:

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

Lưu ý rằng ngay cả khi mục đầu tiên được trích dẫn, nó vẫn sẽ kết thúc ở chỉ số 1 chứ không phải chỉ mục 0. Nếu qtìm thấy một dấu phân cách làm ký tự đầu tiên, nó sẽ tạo mục đầu tiên trong phần tách (chỉ mục 0) thành một chuỗi trống, vì vậy nội dung của trích dẫn chính xác trở thành mục thứ hai (chỉ số 1). Dưới đây là một bản demo của giao dịch chính xác với một trích dẫn hàng đầu.


Tôi chỉ lưu một số byte bằng cách thay thế D bằng dòng mới bên ngoài dấu ngoặc kép và tách trên dòng mới, do đó loại bỏ sự cần thiết phải thay thế dòng mới bằng D ở cuối. Điều đó có thể rút ngắn mã của bạn quá?
DLosc

@DLosc Thật vậy, cảm ơn bạn đã gợi ý! Đưa vào một phiên bản mới ngay bây giờ
Kamil Drakari

8

R , 34 byte

Thường xuyên không sửa đổi scanvới các đối số thích hợp cho text, sepquotenên làm điều đó.

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

Hãy thử trực tuyến!


2
Như thường lệ, R dẫn đầu về các thử thách chia chuỗi.
ngm

2
Nói về ngôn ngữ phù hợp cho công việc. :) Đã xác minh một vài trường hợp thử nghiệm và tất cả chúng đều hoạt động tốt, vì vậy +1 từ tôi. PS: Lấy đầu vào bằng cách lưu trữ nó trong một biến không được phép theo meta.
Kevin Cruijssen

1
@KevinCruijssen Tôi có thể gửi scan4 byte và sau đó gọi nó với các đối số ở những nơi thích hợp không?
J.Doe

1
@ J.Doe Umm .. Tôi không biết. Không quá quen thuộc với các định dạng đầu vào có thể chấp nhận được cho R tbh. Theo như tôi biết bằng cách sử dụng một chương trình đầy đủ với các đối số chương trình hoặc STDIN, cũng như hàm (lambda) với các tham số thích hợp hoặc sử dụng STDIN theo mặc định đều được chấp nhận. Trong bài đăng meta tôi đã liên kết trước đó, tất cả các định dạng đầu vào hợp lệ (có điểm số dương) được đề cập. Làm thế nào điều này làm việc cho R tôi không biết.
Kevin Cruijssen

@ J.Doe trình của bạn ngay bây giờ là một chương trình đầy đủ và hiện tại nó không nhận đầu vào từ stdin. Giải pháp ngắn nhất sẽ là bọc nó thành một hàm.
Giuseppe

7

C (gcc) , 64 byte

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

Hãy thử trực tuyến!

JavaScript (Node.js) , 57 byte

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

Hãy thử trực tuyến!


1
Câu trả lời C của bạn hoạt động rất tốt, nhưng câu trả lời JS của bạn dường như vẫn được phân tách Dbên trong Icũng như chứa Itrong đầu ra, cũng có thể được nhìn thấy trong các trường hợp thử nghiệm đầu tiên trong liên kết TIO của bạn. (PS: Cũng có thể tốt hơn để đăng chúng dưới dạng câu trả lời riêng biệt, với một liên kết cho biết đó là một câu trả lời C của bạn.)
Kevin Cruijssen

1
@KevinCruijssen Đã sửa. Thông thường tôi đăng các câu trả lời tương tự cùng nhau và chỉ nói đó là một cổng nếu đó là từ công việc của người khác
l4m2


4

Pip , 18 byte

FxcxQb?!:oOo?xRanx

Lấy đầu vào làm đối số dòng lệnh. Hãy thử trực tuyến!

Cách tiếp cận hoàn toàn khác nhau: xử lý chuỗi một ký tự tại một thời điểm và đưa ra kết quả mong muốn được phân định bằng dòng mới.

Làm sao?

                    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 byte

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

Đầu vào là S, I, D.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

Xem xét đầu vào 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

Võng mạc , 45 byte

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

Hãy thử trực tuyến! Giải trình:

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

Nhìn về phía trước để tìm các giá trị của DItrên hai dòng sau. Sau đó, nếu chúng ta tìm thấy một Isau đó ăn nó và phù hợp với nhân vật tiếp theo ID, nếu không chỉ phù hợp với nhân vật tiếp theo Dhoặc cuối dòng.

L$`
$4$5

Danh sách chụp 4 và 5 từ mỗi trận đấu; 4 là chụp giữa hai Is trong khi 5 là chụp giữa hai Ds.


3

Powershell, 71 byte

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

Kịch bản kiểm tra ít chơi gôn hơn:

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

Đầu ra:

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

Giải trình:


2

SNOBOL4 (CSNOBOL4) , 109 byte

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

Hãy thử trực tuyến!

Giả sử rằng D =','I ='"'. Sau đó, mẫu (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))khớp với các chuỗi trông giống ".*"hoặc .*theo sau bởi ,hoặc ở cuối chuỗi và OUTPUT là các ký tự ( .*) tùy ý , đặt Remainder chưa từng có Svà lặp lại miễn Slà không trống.


2

Pip -n , 29 24 byte

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

Lấy đầu vào làm đối số dòng lệnh. Hãy thử trực tuyến!

Chiến lược: Icác cặp bên ngoài , thay thế Dbằng dòng mới (vì chúng tôi đảm bảo rằng dòng mới sẽ không xuất hiện trong chuỗi). Sau đó phân chia trên dòng mới và dải I.


2

Thạch ,  20  18 byte

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

Một chương trình đầy đủ lấy ba đối số D, I, Smà in mỗi mục trên một dòng.

Hãy thử trực tuyến! (Footer tham gia với dòng mới)

Làm sao?

Bao quanh với một phần phụ Dở mỗi bên, chia Ithành s, chia các mục được lập chỉ mục lẻ tại Ds sau đó loại bỏ đầu và đuôi của chúng và nối chúng với dòng mới, cuối cùng tham gia kết quả với dòng mới.


1
Tôi nghĩ rằng đầu ra danh sách (trái ngược với việc trả về một danh sách) cần phải được phân định bằng cách nào đó, vì vậy bạn có thể nói với 1) rằng đó là một danh sách, và 2) khi một mục kết thúc và một mục khác bắt đầu. (Tôi không có một bài đăng meta cụ thể để sao lưu, nhưng có một sự liên quan nhất định đến cuộc thảo luận về hành vi không thể quan sát được . Ngay bây giờ, không thể quan sát được rằng chương trình của bạn đưa ra một danh sách thay vì, một chuỗi. )
DLosc

Vì vậy, tôi đoán rằng tôi có thể thay thế thắt chặt bằng cách nối bằng dòng mới (sẽ trả về một danh sách các danh sách các ký tự được trộn với các ký tự vì một chương trình đầy đủ sẽ in các mục trên các dòng mới).
Jonathan Allan


@Jonathan ALLan Giải pháp 20 byte của bạn hoạt động như dự định, nhưng 17 byter trong bình luận của bạn dường như cho một số kết quả không chính xác .
Kevin Cruijssen

1
@KevinCruijssen - vâng, golf di động không tốt, tôi đã bỏ lỡ việc tham gia bởi các dòng mới cho các mục có chỉ số lẻ, 18 được đăng.
Jonathan Allan

2

PHP , 50 byte

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

Hãy thử trực tuyến! Sử dụng một chức năng tích hợp .

Nếu sắp xếp lại các đầu vào được cho phép ( (S,D,I)để phù hợp với str_getcsvchữ ký), tôi có phiên bản 44 byte .


1
Tôi tin rằng sắp xếp lại đầu vào được cho phép, miễn là bạn chỉ định thứ tự. Để làm cho nó rõ ràng hơn, bạn có thể sử dụng các biến $S, $D$Ivới một chi phí từ 0 byte, cho phiên bản dài 50 byte này.
Ismael Miguel

Ngoài ra, 50 byte phiên bản, với $S, $D, $Ibiến thể đóng vai trò như một hướng dẫn cho thứ tự của các đối số.
Ismael Miguel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.