拆分它。但不是所有的!


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,0012,000,000,-,在二/三段。但是由于它们在I输入字符中,因此我们忽略此处的拆分。

挑战规则:

  • 您可以假设I输入字符串中总是有偶数个字符。
  • 您可以假定该字符I将始终有一个D下一个字符(除非它是输入的第一个或最后一个字符),但仍然可以正确分割。所以你不会有类似之类的D = ','; I = '"'; S = 'a,b"c,d"e,f'东西D=','; I='"'; S='a",b,"c'
  • 输入字符串S可以不包含DI。如果它不包含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 ", ""
TF

@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']
卡米尔(Kamil Drakari)

1
@KamilDrakari嗯,我要添加一条规则,以允许它向前和向后移动,但不能拖曳。所以,[a,b,c][c,b,a]被允许输出,但[a,c,b]还是[b,a,c]不适合的例子。
凯文·克鲁伊森

D=','; I='"'; S='a",b,"c'或什至是有效输入的结果应该是什么?
Zgarb

Answers:


3

Japt,16字节

qV mÏu ?X:XrWRÃq

尝试一下!

基本上与DLosc的较新Pip回答相同的策略,将“带引号”的部分放在一边,然后在字符串的其余部分中用换行符替换定界符,从而得到以换行符分隔的输出

完整说明:

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的确,感谢您的建议!现在放一个新版本
Kamil Drakari '18

8

R,34个字节

定期未修改scan与适当的参数textsep而且quote应该这样做。

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

在线尝试!


2
像往常一样,R引领了字符串拆分挑战。
ngm

2
谈论适合工作的语言。:)验证了一些测试用例,它们似乎都可以正常工作,所以我+1。PS:根据元数据,不允许通过将输入存储在变量中来获取输入。
凯文·克鲁伊森

1
@KevinCruijssen我可以提交scan4个字节,然后在适当的位置使用参数调用它吗?
J.Doe '18 -10-29

1
@ J.Doe Umm ..我不知道。对R tbh 可能接受的输入格式不太熟悉。据我所知,默认情况下可以使用带有程序参数或STDIN的完整程序,以及带有适当参数的(lambda)函数,也可以使用STDIN。在我之前链接的meta文章中,提到了所有有效的输入格式(得分为正)。我不知道这对R如何起作用。
凯文·克鲁伊森

@ J.Doe现在提交的内容是完整的程序,当前不接受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答案似乎仍然各执DI以及包含I在输出中,这也可以在第一测试案例中的TIO链接看到。(PS:将它们作为单独的答案发布也可能会更好,并带有链接说明它是您C答案的端口。)
Kevin Cruijssen

1
@KevinCruijssen固定。通常我会一起发布类似的答案,并且只说它是别人提供的端口
l4m2 18-10-29

4

Python 2,67个字节

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

在线尝试!

Python 2,71个字节

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

在线尝试!


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

输入是SID

在线尝试!验证所有测试用例

这个怎么运作

考虑输入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在以下两行。然后,如果找到an,I则将其吃掉,并将字符与下一个ID匹配,否则将字符与行的下一个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设置为,SS在不为空的情况下进行迭代。


2

-n29 24字节

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

将输入作为命令行参数。在线尝试!

策略:外部I对,D用换行符替换(因为我们保证换行符不会出现在字符串中)。然后在换行符上分割并剥离I


2

果冻 20  18 字节

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

一个完整的程序取三个参数DIS它打印一行的每个项目。

在线尝试!(脚加入换行符)

怎么样?

D在每边加上一个额外的包围符,在Is处拆分,在s处拆分奇数索引的项,D然后删除它们的首尾,并用换行符将其合并,最后将结果与换行符合并。


1
我认为列表输出(而不是返回列表)需要以某种方式定界,因此您可以告诉1)这根本是一个列表,以及2)其中一项结束而另一项开始的地方。(我没有专门的元文章来支持这一点,但是与非可观察到的行为的讨论有一定的关联性。现在,您的程序输出的是列表而不是字符串,这是不可观察的。 )
DLosc

因此,我想我可以用换行替换联接来代替拧紧(它将返回混合了字符的字符列表,但完整的程序将在新行上打印项目)。
乔纳森·艾伦


@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
我相信只要您指定顺序,就可以重新排列输入。为了更清楚一点,对于此50字节长的版本,可以使用变量$S$D并且$I使用0字节的开销。
伊斯梅尔·米格尔

此外,50个字节的版本,用$S$D$I变量可以作为的参数的顺序指导。
伊斯梅尔·米格尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.