Terinspirasi oleh pertanyaan StackOverflow ini .
Memasukkan:
Kami akan mengambil tiga input:
- Karakter pembatas
D
untuk dibagi - Karakter di
I
antara 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,000
dan ,-,
dalam dua / tiga bagian. Tetapi karena mereka berada dalam I
karakter input, kami abaikan mengabaikan pemisahan di sini.
Aturan tantangan:
- Anda dapat mengasumsikan akan selalu ada jumlah genap
I
dalam string-input. - Anda dapat mengasumsikan bahwa karakter
I
akan selalu memiliki karakter diD
sebelahnya (kecuali ketika karakter input pertama atau terakhir) yang masih dapat dipisah dengan benar. Jadi Anda tidak akan memiliki sesuatu seperti iniD = ','; I = '"'; S = 'a,b"c,d"e,f'
, atau sesuatu seperti iniD=','; I='"'; S='a",b,"c'
. - Input-string tidak
S
boleh mengandung salah satuD
atauI
. Jika tidak mengandungD
, kami mengeluarkan daftar dengan seluruh string-input sebagai satu-satunya item. - Daftar keluaran tidak akan berisi karakter
I
lagi, bahkan ketika itu tidak berisiD
(seperti yang Anda lihat di"Abc "
menjadi'Abc '
dalam contoh di atas). - Mungkin saja substring di
I
dalamnya hanya berisiD
. Misalnya:D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'
akan menghasilkan['a', ',', 'b', 'c', 'd,e,,', 'f']
. - Anda dapat mengasumsikan bahwa
D
tidak akan pernah ada di awal atau akhirS
, sehingga Anda tidak harus berurusan dengan tertinggal / memimpin item kosong. - Ketika input memiliki dua yang berdekatan
D
, kami akan memiliki item kosong. YaituD = ','; 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 kode-golf , 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']
"", "'ll remove all ", ""
)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.'1,"2,3"' -> ['2,3','1']
[a,b,c]
dan[c,b,a]
diizinkan output, tetapi[a,c,b]
atau[b,a,c]
tidak misalnya.D=','; I='"'; S='a",b,"c'
atau bahkan masukan yang valid?Jawaban:
Japt , 16 byte
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:
Perhatikan bahwa bahkan jika item pertama dikutip, itu masih akan berakhir pada indeks 1 bukan indeks 0. Jika
q
menemukan 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.sumber
R , 34 byte
Reguler tidak dimodifikasi
scan
dengan argumen yang sesuai untuktext
,sep
danquote
harus melakukannya.Cobalah online!
sumber
scan
4 byte dan kemudian menyebutnya dengan argumen di tempat yang sesuai?C (gcc) , 64 byte
Cobalah online!
JavaScript (Node.js) , 57 byte
Cobalah online!
sumber
D
dalamI
dan juga berisiI
dalam 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.)Python 2, 67 byte
Cobalah online!
Python 2, 71 byte
Cobalah online!
sumber
Pip , 18 byte
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?
sumber
MATL , 24 byte
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'
.sumber
Retina , 45 byte
Cobalah online! Penjelasan:
Lihatlah ke depan untuk menemukan nilai-nilai
D
danI
pada dua baris berikut. Kemudian, jika kita menemukan danI
memakannya dan mencocokkan karakter dengan yang berikutnyaI
danD
, jika tidak, hanya mencocokkan karakter dengan yang berikutnyaD
atau akhir baris.Daftar menangkap 4 dan 5 dari setiap pertandingan; 4 adalah tangkapan antara dua
I
s sedangkan 5 adalah tangkapan antara duaD
s.sumber
Powershell, 71 byte
Skrip uji yang kurang golf:
Keluaran:
Penjelasan:
-split{...}
menentukan aturan untuk menerapkan pembatas. Lihat about_split .$script:a=...
set variabela
dalam lingkup luar .-ceq
berarti persamaan case-sensitive .|% trim $i
memanggil metodetrim
dengan argumen$i
.sumber
SNOBOL4 (CSNOBOL4) , 109 byte
Cobalah online!
Misalkan itu
D =','
danI ='"'
. 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 untukS
dan mengulangi selamaS
tidak kosong.sumber
Pip
-n
,2924 byteMengambil input sebagai argumen baris perintah. Cobalah online!
Strategi:
I
pasangan luar , gantiD
dengan baris baru (karena kami dijamin baris baru tidak akan muncul di string). Kemudian bagi baris dan strip baruI
.sumber
Jelly ,
2018 byteSebuah program penuh mengambil tiga argumen
D
,I
,S
yang mencetak setiap item pada baris.Cobalah online! (Footer bergabung dengan baris baru)
Bagaimana?
Kelilingi dengan tambahan
D
di setiap sisi, pisahkan padaI
s, pisahkan item yang diindeks ganjil padaD
s kemudian lepaskan kepala dan ekor mereka dan gabungkan dengan baris baru, akhirnya gabungkan hasilnya dengan baris baru.sumber
;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
PHP , 50 byte
Cobalah online! Menggunakan fungsi bawaan .
Jika mengatur ulang input diperbolehkan (
(S,D,I)
sehingga cocok denganstr_getcsv
tanda tangan), saya memiliki versi 44 byte .sumber
$S
,$D
dan$I
dengan biaya 0 byte, untuk versi panjang 50 byte ini.$S
,$D
,$I
variabel bisa berfungsi sebagai panduan untuk urutan argumen.