Böl onu. Fakat hepsi değil!


11

Bu StackOverflow sorusundan ilham alındı .

Giriş:

Üç girdi alacağız:

  • DBölünecek sınırlayıcı karakter
  • Bir karakter Iikisi arasında hangi biz (yani sesler belirsiz, biliyorum, ama ben aşağıda açıklayacağım) sınırlayıcı karakteri göz ardı
  • Dizi S

Çıktı:

Bölme işleminden sonra alt dizeleri içeren bir liste / dizi.

Misal:

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

Neden? Virgül üzerinde Bölme normalde de bölmek 98,00, 12,000,000ve ,-,iki / üç parça halinde. Ancak Igiriş karakterleri içinde oldukları için buradaki bölünmeyi yok sayıyoruz.

Zorluk kuralları:

  • IGiriş dizesinde her zaman eşit miktarda karakter olacağını varsayabilirsiniz .
  • Karakterin Iher zaman Dyanında (girişin ilk veya son karakteri hariç), yine de düzgün bir şekilde bölünebileceğini varsayabilirsiniz . Böylece gibi bir şey olmaz D = ','; I = '"'; S = 'a,b"c,d"e,f'böyle, ne de bir şey D=','; I='"'; S='a",b,"c'.
  • Girdi-string Sya hiçbiri içerebilir Dveya I. Hayır içeriyorsa D, girdi dizesinin tamamını yalnızca öğe olarak içeren bir liste çıkarırız.
  • Çıktı liste karakteri içermez Ihiçbir içerdiği bile artık D(en görebileceğiniz gibi "Abc "olma 'Abc 'Örneğin yukarıda).
  • İçindeki alt dizenin Iyalnızca içerdiği mümkündür D. Örneğin: ile D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'sonuçlanır ['a', ',', 'b', 'c', 'd,e,,', 'f'].
  • Bunun Dhiçbir zaman başlangıcında veya sonunda olmayacağını varsayabilirsiniz S, böylece boş / sondaki boş öğelerle uğraşmak zorunda kalmazsınız.
  • Bir girişin bitişik iki yanı olduğunda D, boş bir öğemiz olur. Yani D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'sonuçlanır ['a', 'b,c', 'd', '', 'e', '', 'f'].
  • Girişlerin ve çıkışların aralıkta yalnızca yazdırılabilir ASCII içereceğini varsayabilirsiniz [32, 126](sekmeler ve yeni satırlar hariç).
  • Ayrıca, bir liste / dizi döndürmek / çıkarmak yerine tüm satırları yeni satırla ayrılmış şekilde yayınlamanıza izin verilir (özellikle liste / dizileri olmayan diller için; örneğin Retina).
  • Bayt kaydederse listeyi ters sırayla çıkarmanıza izin verilir. Bununla birlikte, sıralı veya 'karıştırılmış' sırayla çıkmanıza izin verilmez. Yani D = ','; I = 'n'; S = 'a,2,b,3,c'olarak çıktı olabilir [a,2,b,3,c]veya [c,3,b,2,a]değil olarak [2,3,a,b,c,]veya [a,3,b,c,2]örneğin.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için bir test içeren bir bağlantı ekleyin (örn. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Test senaryoları:

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

Mevcut cevapların çoğunun (veya hepsinin?) Test senaryosu 6'nın başında ve sonunda boş öğeleri yok. Bu özel bir vaka mı, yoksa test senaryolarında bir hata mı? ( "", "'ll remove all ", "")
TFeld

@TFeld Özel bir durum. Hemen hemen tüm cevaplar da başarısız oldu D = ','; I = '"'; S = ',"a,b",c,,d,""'çünkü fark ettim. Başlangıçta veya sonunda boş öğeler mümkün olmayacak şekilde meydan okumayı biraz değiştireceğim. Geçmişte hem Java hem de 05AB1E'deki deneyime dayanarak, bölme işleminden sonra boş öğelerin dil varsayılan olarak doğru yapmadığı zaman manuel olarak düzeltmek için ne kadar sinir bozucu olabileceğini biliyorum. Bunun gibi bir test durumu hala desteklenmelidir: D = ','; I = '"'; S = 'a,"b,c",d,,e→ arada ['a', 'b,c', 'd', '', 'e']boş bir öğe var.
Kevin Cruijssen

Son çıktının girdinin sırasını koruması gerekli midir? ör.'1,"2,3"' -> ['2,3','1']
Kamil Drakari

1
@KamilDrakari Hmm, hem ileri hem de geri izin vermek için bir kural ekleyeceğim, ancak karıştırılmadı. Yani [a,b,c]ve [c,b,a]çıkışları izin verilir, ancak [a,c,b]ya [b,a,c]değil örneğin.
Kevin Cruijssen

Sonuç ne olmalı D=','; I='"'; S='a",b,"c'ya da geçerli bir girdi mi?
Zgarb

Yanıtlar:


3

Japt , 16 bayt

qV mÏu ?X:XrWRÃq

Dene!

Temel olarak DLosc'un daha yeni Pip cevabı ile aynı strateji, "alıntılanan" bölümleri bir kenara bırakır ve daha sonra sınırlayıcıyı dizenin geri kalanında bir satırsonu yerine yeni satırla sınırlandırılmış çıktıyla değiştirir

Tam açıklama:

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

İlk öğe alıntılanmış olsa bile, yine de dizin 0 değil, dizin 1 ile sonuçlanacaktır. qİlk karakter olarak bir sınırlayıcı bulursa, bölünmedeki (dizin 0) ilk öğeyi boş bir dize yapar, böylece içerik alıntı doğru bir şekilde ikinci madde (indeks 1) haline gelir. İşte önde gelen bir teklifle doğru bir şekilde başa çıkmanın bir demosu.


Sadece D'yi tırnak işaretleri dışındaki satırsonu ile değiştirerek satırsonu olarak bölerek bazı baytları kurtardım , böylece satırsonu yerine satır satırını D ile değiştirme ihtiyacını ortadan kaldırdım. Bu da kodunuzu kısaltabilir mi?
DLosc

@DLosc Gerçekten, öneri için teşekkürler! Şimdi yeni bir sürüm koymak
Kamil Drakari

8

R , 34 bayt

Değiştirilmemiş Düzenli scaniçin uygun argümanlarla text, sepve quotebunu yapmalıdır.

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

Çevrimiçi deneyin!


2
Her zamanki gibi, R string bölme zorluklarına öncülük ediyor.
ngm

2
İş için doğru dil hakkında konuşun. :) Birkaç test vakası doğrulandı ve hepsi iyi çalışıyor gibi görünüyor, bu yüzden benden +1. Not: Metaya göre girdiyi bir değişkende saklayarak almaya izin verilmiyor.
Kevin Cruijssen

1
@KevinCruijssen scan4 bayt gönderebilir ve daha sonra uygun yerlerde argümanlarla çağırabilir miyim ?
J.Doe

1
@ J.Doe Umm .. Bilmiyorum. R tbh için olası kabul edilebilir giriş biçimlerine aşina değil . Bildiğim kadarıyla program argümanları veya STDIN ile tam bir programın yanı sıra uygun parametrelerle (lambda) işlevi veya STDIN kullanma varsayılan olarak kabul edilebilir. Daha önce bağladığım meta yazıda tüm geçerli girdi biçimlerinden (pozitif puanla) bahsedilir. Bunun R için nasıl çalıştığını bilmiyorum.
Kevin Cruijssen

@ J.Doe şu anda tam bir programdır ve şu anda stdin'den girdi almamaktadır. En kısa çözüm onu ​​bir fonksiyona sarmak olacaktır.
Giuseppe

7

C (gcc) , 64 bayt

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

Çevrimiçi deneyin!

JavaScript (Node.js) , 57 bayt

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

Çevrimiçi deneyin!


1
C yanıtınız harika çalışıyor, ancak JS yanıtınız hala TIO bağlantınızdaki ilk test örneklerinde de görülebilen çıktı Diçinde Iolduğu gibi içeride de bölünmüş gibi görünüyor I. (PS: Bunları ayrı cevaplar olarak göndermek daha iyi olabilir, bunun C cevabınızın bir limanı olduğunu belirten bir bağlantı.)
Kevin Cruijssen

1
@KevinCruijssen Düzeltildi. Genellikle benzer cevapları birlikte gönderirim ve sadece başkalarının işinden
geliyorsa


4

Pip , 18 bayt

FxcxQb?!:oOo?xRanx

Girdileri komut satırı bağımsız değişkenleri olarak alır. Çevrimiçi deneyin!

Tamamen farklı yaklaşım: karakter dizisini teker teker işlemek ve satırsonu ile istenen sonuçları çıktılamak.

Nasıl?

                    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 bayt

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

Girdiler vardır S, I, D.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

Girdileri düşünün 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

Retina , 45 bayt

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

Çevrimiçi deneyin! Açıklama:

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

Değerlerini bulmak için önde Bak Dve Iaşağıdaki iki hatlarında. Sonra, bir Iyemek bulursak, onu yiyip karakterleri bir sonrakine Ive Daksi takdirde karakterleri Dsatırın bir sonraki veya sonuna eşleştirirsek .

L$`
$4$5

Her maçtan 4 ve 5 numaralı maçları listeleyin; 4 iki Is arasındaki yakalama iken 5 iki Ds arasındaki yakalamadır .


3

Powershell, 71 bayt

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

Daha az golf test senaryosu:

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

Çıktı:

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

Açıklama:


2

SNOBOL4 (CSNOBOL4) , 109 bayt

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

Çevrimiçi deneyin!

Diyelim ki D =','ve I ='"'. Daha sonra desen , dizenin sonuna veya sonuna (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))benzeyen ".*"veya .*ardından görünen dizelerle eşleşir ,ve eşleşmeyen ( .*) karakterleri ÇIKARIR, eşleşmeyen REMainder öğesini boş Solarak ayarlar ve yineleyemez S.


2

Pip -n , 29 24 bayt

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

Girdileri komut satırı bağımsız değişkenleri olarak alır. Çevrimiçi deneyin!

Strateji: dış Içiftler, Dyeni satırla değiştirin (yeni satırların dizede görünmeyeceği garanti edildiğinden). Sonra newline ve strip üzerine bölün I.


2

Jöle ,  20  18 bayt

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

Üç argüman alarak tam bir program D, I, Sbir hat üzerinde her bir öğeyi yazdırılan bulunur.

Çevrimiçi deneyin! (Altbilgi yeni satırlarla birleşir)

Nasıl?

DHer tarafta bir ekstra ile çevreleyin , Is'ye bölün, tek dizinli öğeleri s'ye bölün, Dsonra başlarını ve kuyruklarını çıkarın ve yeni satırlarla birleştirin, son olarak yeni satırlarla sonuca katılın.


1
Liste çıktısının (bir listeyi döndürmenin aksine) bir şekilde sınırlandırılması gerektiğini düşünüyorum, böylece 1) bir liste olduğunu ve 2) bir öğenin bitip diğerinin başladığını söyleyebilirsiniz. (Bunu destekleyecek özel bir meta yayınım yok, ancak gözlemlenemeyen davranış tartışmasıyla ilgili belirli bir ilişki var. )
DLosc

Yani sanırım sıkılaştırmayı yeni satırlarla birleştirme ile değiştirebilirim (bu, karakterlerle karıştırılmış karakterlerin bir listesini döndürür, ancak tam bir program öğeleri yeni satırlara yazdıracaktır).
Jonathan Allan


@JonathanAllan 20 baytlık çözümünüz amaçlandığı gibi çalışır, ancak yorumdaki 17 baytınız bazı yanlış sonuçlar veriyor gibi görünüyor .
Kevin Cruijssen

1
@KevinCruijssen - evet, mobil golf iyi değil, 18 yayınlanan tek endeksli eşyalar için yeni satırlara katılmayı kaçırdım.
Jonathan Allan

2

PHP , 50 bayt

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

Çevrimiçi deneyin! Yerleşik bir işlev kullanır .

Girişlerin yeniden düzenlenmesine izin verilirse ( imzayla (S,D,I)eşleşir str_getcsv), 44 baytlık bir sürümüm var .


1
Siparişi belirttiğiniz sürece, girişin yeniden düzenlenmesine izin verildiğine inanıyorum. Daha anlaşılır, değişkenleri kullanabilirsiniz yapmak için $S, $Dve $Ibu 50 byte uzunluğunda sürümü için, 0 bayt maliyetle.
Ismael Miguel

Ayrıca, 50 ile, sürüm bayt $S, $D, $Ideğişkenler bağımsız değişkenler sipariş için bir yol gösterici olabilecek.
Ismael Miguel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.