Membaginya. Tapi tidak semua!

11

Terinspirasi oleh pertanyaan StackOverflow ini .

Memasukkan:

Kami akan mengambil tiga input:

  • Karakter pembatas Duntuk dibagi
  • Karakter di Iantara dua di antaranya kita abaikan karakter pembatas (saya tahu, itu terdengar kabur, tapi saya akan jelaskan di bawah)
  • Sebuah benang S

Keluaran:

Daftar / array yang berisi substring setelah split.

Contoh:

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

Mengapa? Memisahkan pada koma biasanya juga akan terpecah 98,00, 12,000,000dan ,-,dalam dua / tiga bagian. Tetapi karena mereka berada dalam Ikarakter input, kami abaikan mengabaikan pemisahan di sini.

Aturan tantangan:

  • Anda dapat mengasumsikan akan selalu ada jumlah genap Idalam string-input.
  • Anda dapat mengasumsikan bahwa karakter Iakan selalu memiliki karakter di Dsebelahnya (kecuali ketika karakter input pertama atau terakhir) yang masih dapat dipisah dengan benar. Jadi Anda tidak akan memiliki sesuatu seperti ini D = ','; I = '"'; S = 'a,b"c,d"e,f', atau sesuatu seperti ini D=','; I='"'; S='a",b,"c'.
  • Input-string tidak Sboleh mengandung salah satu Datau I. Jika tidak mengandung D, kami mengeluarkan daftar dengan seluruh string-input sebagai satu-satunya item.
  • Daftar keluaran tidak akan berisi karakter Ilagi, bahkan ketika itu tidak berisi D(seperti yang Anda lihat di "Abc "menjadi 'Abc 'dalam contoh di atas).
  • Mungkin saja substring di Idalamnya hanya berisi D. Misalnya: D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'akan menghasilkan ['a', ',', 'b', 'c', 'd,e,,', 'f'].
  • Anda dapat mengasumsikan bahwa Dtidak akan pernah ada di awal atau akhir S, sehingga Anda tidak harus berurusan dengan tertinggal / memimpin item kosong.
  • Ketika input memiliki dua yang berdekatan D, kami akan memiliki item kosong. Yaitu D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'akan menghasilkan ['a', 'b,c', 'd', '', 'e', '', 'f'].
  • Anda dapat mengasumsikan input dan output hanya akan berisi ASCII yang dapat dicetak dalam kisaran [32, 126](jadi tidak termasuk tab dan baris baru).
  • Anda juga diperbolehkan untuk mengeluarkan semua item yang dibatasi oleh baris baru alih-alih mengembalikan / mengeluarkan daftar / larik (terutama untuk bahasa-bahasa yang tidak memiliki daftar / larik; yaitu Retina).
  • Anda diizinkan untuk mengeluarkan daftar dalam urutan terbalik jika menyimpan byte. Anda tidak diizinkan untuk output dalam urutan diurutkan atau 'diacak'. Jadi D = ','; I = 'n'; S = 'a,2,b,3,c'bisa berupa output sebagai [a,2,b,3,c]atau [c,3,b,2,a], tetapi tidak sebagai [2,3,a,b,c,]atau [a,3,b,c,2]misalnya.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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
sumber
Sebagian besar (atau semua?) Jawaban saat ini tidak memiliki item kosong di awal dan akhir uji kasus 6. Apakah ini kasus khusus, atau kesalahan dalam testcases? ( "", "'ll remove all ", "")
TFeld
@TFeld Ini kasus khusus. Hampir semua jawaban juga gagal karena D = ','; I = '"'; S = ',"a,b",c,,d,""'saya perhatikan. Saya akan sedikit memodifikasi tantangan sehingga item kosong tidak akan mungkin pada awal atau akhir. Berdasarkan pengalaman di Jawa dan 05AB1E di masa lalu, saya tahu betapa frustasi item kosong setelah split dapat diperbaiki secara manual ketika bahasa tidak melakukannya dengan benar secara default. Kasus uji seperti ini harus tetap didukung: D = ','; I = '"'; S = 'a,"b,c",d,,e['a', 'b,c', 'd', '', 'e']dengan item kosong di antaranya.
Kevin Cruijssen
Apakah diperlukan agar hasil akhir mempertahankan urutan input? mis.'1,"2,3"' -> ['2,3','1']
Kamil Drakari
1
@ KamilDrakari Hmm, saya akan menambahkan aturan untuk memungkinkannya maju dan mundur, tetapi tidak diacak. Jadi [a,b,c]dan [c,b,a]diizinkan output, tetapi [a,c,b]atau [b,a,c]tidak misalnya.
Kevin Cruijssen
Apa yang harus menjadi hasil D=','; I='"'; S='a",b,"c'atau bahkan masukan yang valid?
Zgarb

Jawaban:

3

Japt , 16 byte

qV mÏu ?X:XrWRÃq

Cobalah!

Pada dasarnya strategi yang sama dengan jawaban Pip yang lebih baru dari DLosc, mengesampingkan bagian "yang dikutip" kemudian menggantikan pembatas dengan baris baru di seluruh string, menghasilkan output dibatasi baris baru

Penjelasan lengkap:

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

Perhatikan bahwa bahkan jika item pertama dikutip, itu masih akan berakhir pada indeks 1 bukan indeks 0. Jika qmenemukan pembatas sebagai karakter pertama, itu membuat item pertama di split (indeks 0) menjadi string kosong, jadi isinya kutipan dengan benar menjadi item kedua (indeks 1). Ini adalah demo menangani dengan benar penawaran terkemuka.

Kamil Drakari
sumber
Saya baru saja menyimpan beberapa byte dengan mengganti D dengan baris baru di luar tanda kutip dan membelah baris baru, sehingga menghilangkan kebutuhan untuk mengganti baris baru dengan D di akhir. Bisakah itu mempersingkat kode Anda juga?
DLosc
@DLosc Memang, terima kasih atas sarannya! Menempatkan versi baru sekarang
Kamil Drakari
8

R , 34 byte

Reguler tidak dimodifikasi scandengan argumen yang sesuai untuk text, sepdan quoteharus melakukannya.

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

Cobalah online!

J.Apakah
sumber
2
Seperti biasa, R memimpin jalan pada tantangan pemisahan tali.
ngm
2
Bicara tentang bahasa yang tepat untuk pekerjaan itu. :) Mengverifikasi beberapa kasus uji, dan semuanya tampaknya berfungsi dengan baik, jadi +1 dari saya. PS: Mengambil input dengan menyimpannya dalam variabel tidak diizinkan sesuai dengan meta.
Kevin Cruijssen
1
@KevinCruijssen Dapatkah saya mengirimkan scan4 byte dan kemudian menyebutnya dengan argumen di tempat yang sesuai?
J.Doe
1
@ J.Apakah Umm .. Saya tidak tahu. Tidak terlalu terbiasa dengan kemungkinan format input yang dapat diterima untuk R tbh. Sejauh yang saya tahu menggunakan program lengkap dengan argumen program atau STDIN, serta fungsi (lambda) dengan parameter yang sesuai atau juga menggunakan STDIN dapat diterima secara default. Dalam posting meta saya ditautkan sebelumnya semua format input yang valid (dengan skor positif) disebutkan. Bagaimana ini bekerja untuk R saya tidak tahu.
Kevin Cruijssen
@ J.Apakah kiriman Anda sekarang adalah program lengkap, dan saat ini tidak menerima input dari stdin. Solusi terpendek adalah membungkusnya menjadi suatu fungsi.
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);}

Cobalah online!

JavaScript (Node.js) , 57 byte

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

Cobalah online!

l4m2
sumber
1
Jawaban C Anda berfungsi dengan baik, tetapi jawaban JS Anda tampaknya masih terbelah di Ddalam Idan juga berisi Idalam output, yang juga dapat dilihat pada kasus uji pertama di tautan TIO Anda. (PS: Mungkin lebih baik untuk mempostingnya sebagai jawaban yang terpisah, dengan tautan yang menyatakan itu adalah port jawaban C.)
Kevin Cruijssen
1
@KevinCruijssen Diperbaiki. Biasanya saya memposting jawaban yang sama bersama-sama, dan hanya mengatakan itu adalah port jika itu dari karya orang lain
l4m2
4

Python 2, 67 byte

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

Cobalah online!

Python 2, 71 byte

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

Cobalah online!

Lynn
sumber
4

Pip , 18 byte

FxcxQb?!:oOo?xRanx

Mengambil input sebagai argumen baris perintah. Cobalah online!

Pendekatan yang sama sekali berbeda: proses string satu karakter pada satu waktu dan output hasil yang diinginkan dibatasi-baris baru.

Bagaimana?

                    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
sumber
4

MATL , 24 byte

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

Input S, I, D.

Cobalah online! Atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Pertimbangkan input 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
sumber
3

Retina , 45 byte

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

Cobalah online! Penjelasan:

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

Lihatlah ke depan untuk menemukan nilai-nilai Ddan Ipada dua baris berikut. Kemudian, jika kita menemukan dan Imemakannya dan mencocokkan karakter dengan yang berikutnya Idan D, jika tidak, hanya mencocokkan karakter dengan yang berikutnya Datau akhir baris.

L$`
$4$5

Daftar menangkap 4 dan 5 dari setiap pertandingan; 4 adalah tangkapan antara dua Is sedangkan 5 adalah tangkapan antara dua Ds.

Neil
sumber
3

Powershell, 71 byte

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

Skrip uji yang kurang golf:

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

Keluaran:

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

Penjelasan:

mazzy
sumber
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

Cobalah online!

Misalkan itu D =','dan I ='"'. Kemudian pola (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))cocok dengan string yang terlihat seperti ".*"atau .*diikuti oleh ,atau pada akhir string, dan OUTPUT karakter sewenang-wenang ( .*), mengatur Pengingat yang tidak cocok untuk Sdan mengulangi selama Stidak kosong.

Giuseppe
sumber
2

Pip -n , 29 24 byte

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

Mengambil input sebagai argumen baris perintah. Cobalah online!

Strategi: Ipasangan luar , ganti Ddengan baris baru (karena kami dijamin baris baru tidak akan muncul di string). Kemudian bagi baris dan strip baru I.

DLosc
sumber
2

Jelly ,  20  18 byte

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

Sebuah program penuh mengambil tiga argumen D, I, Syang mencetak setiap item pada baris.

Cobalah online! (Footer bergabung dengan baris baru)

Bagaimana?

Kelilingi dengan tambahan Ddi setiap sisi, pisahkan pada Is, pisahkan item yang diindeks ganjil pada Ds kemudian lepaskan kepala dan ekor mereka dan gabungkan dengan baris baru, akhirnya gabungkan hasilnya dengan baris baru.

Jonathan Allan
sumber
1
Saya pikir daftar output (sebagai lawan mengembalikan daftar) perlu dibatasi entah bagaimana, sehingga Anda dapat memberitahu 1) bahwa itu daftar sama sekali, dan 2) di mana satu item berakhir dan yang lainnya dimulai. (Saya tidak memiliki meta pos khusus untuk mendukung hal itu, tetapi ada keterkaitan tertentu dengan diskusi tentang perilaku yang tidak dapat diamati . Saat ini, tidak dapat diamati bahwa program Anda menghasilkan daftar alih-alih, katakanlah, string. )
DLosc
Jadi saya kira saya dapat mengganti kencangkan dengan bergabung dengan baris baru (yang akan mengembalikan daftar daftar karakter yang dicampur dengan karakter namun sebagai program lengkap akan mencetak item pada baris baru).
Jonathan Allan
... jadi 17 dengan;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
Jonathan Allan
@JonathanAllan Solusi 20-byte Anda berfungsi sebagaimana mestinya, tetapi 17-byter Anda di komentar tampaknya memberikan beberapa hasil yang salah .
Kevin Cruijssen
1
@KevinCruijssen - ya, golf seluler tidak bagus, saya ketinggalan bergabung dengan baris baru untuk item yang diindeks aneh, 18 diposting.
Jonathan Allan
2

PHP , 50 byte

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

Cobalah online! Menggunakan fungsi bawaan .

Jika mengatur ulang input diperbolehkan ( (S,D,I)sehingga cocok dengan str_getcsvtanda tangan), saya memiliki versi 44 byte .

Jo.
sumber
1
Saya percaya bahwa mengatur ulang input diperbolehkan, selama Anda menentukan pesanan. Untuk membuatnya lebih jelas, Anda dapat menggunakan variabel $S, $Ddan $Idengan biaya 0 byte, untuk versi panjang 50 byte ini.
Ismael Miguel
Juga, 50 byte versi, dengan $S, $D, $Ivariabel bisa berfungsi sebagai panduan untuk urutan argumen.
Ismael Miguel