それを分割します。すべてではありません!


11

このStackOverflowの質問に触発されました。

入力:

3つの入力を使用します。

  • 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,-,2/3枚インチ しかし、それらはI入力文字内にあるため、ここでの分割は無視します。

チャレンジルール:

  • Iinput-string には常に偶数の文字があると想定できます。
  • 文字Iは常にD適切に分割できる(入力の最初または最後の文字である場合を除き)常に隣にあると想定できます。ですから、あなたはD = ','; I = '"'; S = 'a,b"c,d"e,f'このようなものもこのようなものも持っていませんD=','; I='"'; S='a",b,"c'
  • input-stringにSは、Dまたはのいずれも含めることはできませんI。noが含まれている場合D、入力文字列全体を唯一の項目として含むリストを出力します。
  • 出力リストには、文字が含まれていなくても、文字は含まIれませんD(上記の例のように"Abc "なり'Abc 'ます)。
  • 内の部分文字列Iがのみを含む可能性がありますD。たとえば、次のD = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'ようになり['a', ',', 'b', 'c', 'd,e,,', 'f']ます。
  • Dの開始または終了にならないことを前提とすることができSます。そのため、末尾の空の項目を処理する必要はありません。
  • 入力に2つの隣接する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 ", ""
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

それを試してみてください!

基本的に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

最初のアイテムが引用されていても、インデックス0ではなくインデックス1 qになります。最初の文字として区切り文字が見つかった場合、スプリットの最初のアイテム(インデックス0)が空の文字列になるため、コンテンツ見積もりの​​2番目の項目(インデックス1)に正しくなります。主要な引用を正しく処理するデモを次に示します。


引用符の外で Dを改行置き換え、改行分割することでバイトを節約しました。これにより、最後に改行をDで置き換える必要がなくなりました。それはあなたのコードも短縮できますか?
DLosc

@DLosc確かに、提案をありがとう!今すぐ新しいバージョンを
入れる

8

R、34バイト

scanの適切な引数で変更されていない通常のtextsepそれquoteを行う必要があります。

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

オンラインでお試しください!


2
いつものように、Rは文字列分割の課題を先導しています。
ngm

2
仕事に適した言語について話してください。:)いくつかのテストケースを検証しましたが、すべて正常に動作しているようです。PS:入力を変数に格納することは、メタに従って許可されていません。
ケビンクルーイッセン

1
@KevinCruijssen scan4バイト送信して、適切な場所に引数を付けて呼び出すことはできますか?
J.Doe

1
@ J.Doe Umm ..私は知らない。R tbhの許容される入力形式について詳しくない。私が知る限り、プログラム引数またはSTDINを使用した完全なプログラムの使用、および適切なパラメーターを使用した(ラムダ)関数の使用、またはSTDINの使用はデフォルトで許容されます。以前にリンクしたメタ投稿では、すべての有効な入力形式(正のスコア)が記載されています。これが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の回答は、出力D内にI含まIれているだけでなく、内部でも分割されているようです。これは、TIOリンクの最初のテストケースでも確認できます。(追記:また、C回答の移植版であるというリンクを付けて、個別の回答として投稿する方が良いかもしれません。)
ケビンクルーイッセン

1
@KevinCruijssen修正済み。通常、私は同様の回答を一緒に投稿し、それが他の人の作品からのものである場合にのみポートであると言う
-l4m2


4

ピップ、18バイト

FxcxQb?!:oOo?xRanx

入力をコマンドライン引数として受け取ります。オンラインでお試しください!

完全に異なるアプローチ:文字列を一度に1文字ずつ処理し、改行区切りで目的の結果を出力します。

どうやって?

                    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|¶)

次の2行のDとの値を見つけてくださいI。私たちが発見した場合次に、Iそれを食べて、次に文字を一致させるID、そうでない場合はすぐ隣に文字を一致させるDか、行の終わり。

L$`
$4$5

リストは、各マッチから4と5をキャプチャします。4は2 I秒間のキャプチャで、5は2 D秒間のキャプチャです。


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))マッチのように見えるという文字列".*"かが.*どちらかによって、その後,の文字列の末尾かによって、および出力任意の(.*)文字に比類のない残りを設定Sしている限り、反復S空ではありません。


2

ピップ -n29 24バイト

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

入力をコマンドライン引数として受け取ります。オンラインでお試しください!

戦略:Iペアの外側で、D改行に置き換えます(文字列に改行が表示されないことが保証されているため)。次に、改行で分割してストリップしますI


2

ゼリー 20  18 バイト

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

3つの引数、を受け取る完全なプログラムDIS各項目を1行に出力します。

オンラインでお試しください!(フッターは改行で結合します)

どうやって?

D各辺を余分に囲み、Isで分割し、sで奇数インデックスのアイテムを分割し、D頭と尾を削除して改行で結合し、最終的に結果を改行で結合します。


1
リストの出力(リストを返すのではなく)を何らかの方法で区切る必要があると思うので、1)リストであると、2)あるアイテムが終了し、別のアイテムが始まる場所を伝えることができます。(それをバックアップする特定のメタ投稿はありませんが、観察不可能な動作に関する議論には一定の関連性があります。現在、プログラムが文字列ではなくリストを出力することは観察できません。 )
DLosc

したがって、タイトラインを改行による結合に置き換えることができると思います(完全なプログラムが新しい行にアイテムを印刷するので、文字が混合された文字のリストを返します)。
ジョナサンアラン


@JonathanAllan 20バイトのソリューションは意図したとおりに機能しますが、コメント内の17バイトは間違った結果をもたらすようです。
ケビン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この50バイト長のバージョンを0バイトのコスト、と。
イスマエルミゲル

また、バージョンバイト50は、と$S$D$I変数が引数の順序のためのガイドとして役立つことができます。
イスマエルミゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.