Teile es auf. Aber nicht alles!

11

Inspiriert von dieser StackOverflow-Frage .

Eingang:

Wir nehmen drei Eingaben:

  • Ein Trennzeichen Dzum Teilen
  • Ein Zeichen Izwischen zwei, von denen wir das Trennzeichen ignorieren (ich weiß, das klingt vage, aber ich werde es unten erklären)
  • Ein Faden S

Ausgabe:

Eine Liste / ein Array mit den Teilzeichenfolgen nach dem Teilen.

Beispiel:

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

Warum? Splitting auf Komma normalerweise auch gespalten 98,00, 12,000,000und ,-,in zwei / drei Stücken. Da sie sich jedoch innerhalb des IEingabezeichens befinden, ignorieren wir die Aufteilung hier und ignorieren sie.

Herausforderungsregeln:

  • Sie können davon ausgehen, dass Idie Eingabezeichenfolge immer eine gerade Anzahl von Zeichen enthält.
  • Sie können davon ausgehen, dass neben dem Zeichen Iimmer ein Zeichen steht D(außer wenn es das erste oder letzte Zeichen der Eingabe ist), das noch ordnungsgemäß aufgeteilt werden kann. Sie werden also weder so etwas D = ','; I = '"'; S = 'a,b"c,d"e,f'noch so etwas haben D=','; I='"'; S='a",b,"c'.
  • Die Eingabezeichenfolge kann Sweder eines noch Doder enthalten I. Wenn es no enthält D, geben wir eine Liste mit der gesamten Eingabezeichenfolge als einzigem Element aus.
  • Die Ausgabeliste wird nicht das Zeichen Imehr, auch wenn sie nicht enthalten ist D(wie man an dem sieht "Abc "immer 'Abc 'im Beispiel oben).
  • Es ist möglich, dass der Teilstring nur Ienthält D. Zum Beispiel: D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'würde ergeben ['a', ',', 'b', 'c', 'd,e,,', 'f'].
  • Sie können davon ausgehen, dass dies Dniemals am Anfang oder Ende von sein wird S, sodass Sie sich nicht mit nachfolgenden / führenden leeren Elementen befassen müssen.
  • Wenn eine Eingabe zwei nebeneinander hat D, haben wir ein leeres Element. Dh D = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'würde ergeben ['a', 'b,c', 'd', '', 'e', '', 'f'].
  • Sie können davon ausgehen, dass die Ein- und Ausgänge nur druckbares ASCII im Bereich enthalten [32, 126](also ohne Tabulatoren und Zeilenumbrüche).
  • Sie können auch alle durch neue Zeilen getrennten Elemente ausgeben, anstatt eine Liste / ein Array zurückzugeben / auszugeben (insbesondere für Sprachen ohne Listen / Arrays, z. B. Retina).
  • Sie können die Liste in umgekehrter Reihenfolge ausgeben, wenn Bytes gespeichert werden. Sie dürfen es jedoch nicht in sortierter oder gemischter Reihenfolge ausgeben. So D = ','; I = 'n'; S = 'a,2,b,3,c'lassen sich als sein [a,2,b,3,c]oder [c,3,b,2,a], aber nicht wie [2,3,a,b,c,]oder [a,3,b,c,2]zum Beispiel.

Allgemeine Regeln:

  • Dies ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich nicht von Code-Golf-Sprachen davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, eine möglichst kurze Antwort für "jede" Programmiersprache zu finden.
  • Für Ihre Antwort gelten Standardregeln , sodass Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden dürfen. Ihr Anruf.
  • Standardschlupflöcher sind verboten.
  • Wenn möglich, fügen Sie bitte einen Link mit einem Test für Ihren Code (dh TIO ) hinzu.
  • Es wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle:

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
quelle
Die meisten (oder alle?) Der aktuellen Antworten enthalten zu Beginn und am Ende von Testfall 6 keine leeren Elemente. Ist dies ein Sonderfall oder ein Fehler in den Testfällen? ( "", "'ll remove all ", "")
TFeld
@TFeld Es ist ein Sonderfall. Fast alle Antworten scheitern auch, weil D = ','; I = '"'; S = ',"a,b",c,,d,""'ich es gerade bemerkt habe. Ich werde die Herausforderung ein wenig ändern, damit leere Elemente am Anfang oder Ende nicht möglich sind. Aufgrund der Erfahrungen in Java und 05AB1E in der Vergangenheit weiß ich, wie frustrierend es sein kann, leere Elemente nach dem Teilen manuell zu beheben, wenn die Sprache dies standardmäßig nicht richtig macht. Ein solcher Testfall sollte weiterhin unterstützt werden: D = ','; I = '"'; S = 'a,"b,c",d,,e['a', 'b,c', 'd', '', 'e']mit einem leeren Element dazwischen.
Kevin Cruijssen
Ist es erforderlich, dass die endgültige Ausgabe die Reihenfolge der Eingabe beibehält? zB'1,"2,3"' -> ['2,3','1']
Kamil Drakari
1
@KamilDrakari Hmm, ich werde eine Regel hinzufügen, die es sowohl vorwärts als auch rückwärts erlaubt, aber nicht gemischt. Also [a,b,c]und [c,b,a]sind Ausgaben erlaubt, aber [a,c,b]oder [b,a,c]nicht zum Beispiel.
Kevin Cruijssen
Was sollte das Ergebnis sein D=','; I='"'; S='a",b,"c'oder ist es überhaupt eine gültige Eingabe?
Zgarb

Antworten:

3

Japt , 16 Bytes

qV mÏu ?X:XrWRÃq

Versuch es!

Grundsätzlich die gleiche Strategie wie bei der neueren Pip-Antwort von DLosc, wobei die "zitierten" Abschnitte beiseite gelegt werden und dann das Trennzeichen durch eine neue Zeile im Rest der Zeichenfolge ersetzt wird, was zu einer durch neue Zeilen getrennten Ausgabe führt

Vollständige Erklärung:

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

Beachten Sie, dass das erste Element, selbst wenn es in Anführungszeichen gesetzt wird, immer noch bei Index 1 und nicht bei Index 0 endet. Wenn qein Trennzeichen als erstes Zeichen gefunden wird, wird das erste Element im Split (Index 0) zu einer leeren Zeichenfolge, also zum Inhalt des Zitats wird korrekt zum zweiten Punkt (Index 1). Hier ist eine Demo zum korrekten Umgang mit einem führenden Zitat.

Kamil Drakari
quelle
Ich habe nur einige Bytes gespeichert, indem ich D durch eine neue Zeile außerhalb der Anführungszeichen ersetzt und in eine neue Zeile aufgeteilt habe, wodurch die Notwendigkeit beseitigt wurde, die neue Zeile am Ende durch D zu ersetzen. Könnte das auch Ihren Code verkürzen?
DLosc
@ DLosc In der Tat, danke für den Vorschlag! Jetzt eine neue Version
einfügen
8

R , 34 Bytes

Regelmäßige unmodifizierten scanmit den entsprechenden Argumenten für text, sepund quotesollte es tun.

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

Probieren Sie es online aus!

J.Doe
quelle
2
Wie üblich ist R führend bei Herausforderungen beim Teilen von Saiten.
Ngm
2
Sprechen Sie über die richtige Sprache für den Job. :) Verifizierte ein paar Testfälle, und sie scheinen alle gut zu funktionieren, also +1 von mir. PS: Eingaben durch Speichern in einer Variablen sind laut Meta nicht zulässig.
Kevin Cruijssen
1
@ KevinCruijssen Kann ich scan4 Bytes einreichen und es dann mit den Argumenten an den entsprechenden Stellen aufrufen?
J. Do
1
@ J.Doe Umm .. Ich weiß nicht. Nicht allzu vertraut mit den möglichen akzeptablen Eingabeformaten für R tbh. Soweit ich weiß, ist die Verwendung eines vollständigen Programms mit Programmargumenten oder STDIN sowie einer (Lambda) -Funktion mit den entsprechenden Parametern oder auch die Verwendung von STDIN standardmäßig zulässig. In dem zuvor verlinkten Meta-Post werden alle gültigen Eingabeformate (mit einer positiven Bewertung) erwähnt. Wie das bei R funktioniert, weiß ich nicht.
Kevin Cruijssen
@ J.Doe Ihre Einreichung im Moment ist ein vollständiges Programm, und es nimmt derzeit keine Eingabe von stdin. Die kürzeste Lösung wäre, es in eine Funktion zu verpacken.
Giuseppe
7

C (gcc) , 64 Bytes

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

Probieren Sie es online aus!

JavaScript (Node.js) , 57 Byte

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

Probieren Sie es online aus!

14 m2
quelle
1
Ihre C-Antwort funktioniert hervorragend, aber Ihre JS-Antwort scheint sich immer noch Dinnerhalb der Ausgabe aufzuteilen Iund enthält diese I, was auch in den ersten Testfällen in Ihrem TIO-Link zu sehen ist. (PS: Es könnte auch besser sein, sie als getrennte Antworten zu veröffentlichen, mit einem Link, der angibt, dass es sich um einen Port Ihrer C-Antwort handelt.)
Kevin Cruijssen
1
@ KevinCruijssen behoben. Normalerweise
poste
4

Pip , 18 Bytes

FxcxQb?!:oOo?xRanx

Übernimmt Eingaben als Befehlszeilenargumente. Probieren Sie es online aus!

Völlig anderer Ansatz: Verarbeiten Sie die Zeichenfolge zeichenweise und geben Sie die gewünschten Ergebnisse in Zeilenbegrenzung aus.

Wie?

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

MATL , 24 Bytes

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

Die Eingänge sind S, I, D.

Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .

Wie es funktioniert

Eingaben berücksichtigen 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
quelle
3

Netzhaut , 45 Bytes

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

Probieren Sie es online aus! Erläuterung:

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

Schauen Sie nach vorne, um die Werte von Dund Iin den folgenden zwei Zeilen zu finden. Wenn wir dann ein finden, Idann essen Sie es und ordnen Sie die Zeichen dem nächsten zu, Iund Dandernfalls stimmen Sie einfach die Zeichen dem nächsten Doder dem Ende der Zeile zu.

L$`
$4$5

Liste erfasst 4 und 5 von jedem Spiel; 4 ist die Erfassung zwischen zwei ISekunden, während 5 die Erfassung zwischen zwei DSekunden ist.

Neil
quelle
3

Powershell, 71 Bytes

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

Weniger Golf-Testskript:

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

Ausgabe:

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

Erläuterung:

mazzy
quelle
2

SNOBOL4 (CSNOBOL4) , 109 Bytes

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

Probieren Sie es online aus!

Angenommen, das D =','und I ='"'. Dann (I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))stimmt das Muster mit Zeichenfolgen überein, die wie ".*"oder .*gefolgt von ,oder bis zum Ende der Zeichenfolge aussehen, und gibt die beliebigen ( .*) Zeichen aus, gibt den nicht übereinstimmenden REMainder auf Sund iteriert, solange er Snicht leer ist.

Giuseppe
quelle
2

Pip -n , 29 24 Bytes

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

Übernimmt Eingaben als Befehlszeilenargumente. Probieren Sie es online aus!

Strategie: Außerhalb von IPaaren durch DZeilenumbruch ersetzen (da garantiert ist, dass Zeilenumbrüche nicht in der Zeichenfolge angezeigt werden). Dann auf Newline und Strip teilen I.

DLosc
quelle
2

Gelee ,  20  18 Bytes

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

Ein volles Programm nimmt die drei Argumente D, I, Sdas druckt jedes Element auf einer Linie.

Probieren Sie es online aus! (Fußzeile verbindet sich mit Zeilenumbrüchen)

Wie?

Umgeben Sie mit einem Extra Dauf jeder Seite, teilen Sie bei Is, teilen Sie die ungeradzahligen Elemente bei Ds, entfernen Sie dann ihre Köpfe und Schwänze und verbinden Sie sie mit Zeilenumbrüchen. Verbinden Sie das Ergebnis schließlich mit Zeilenumbrüchen.

Jonathan Allan
quelle
1
Ich denke Liste Ausgabe (im Gegensatz zu der Rückkehr eine Liste gegen) muss irgendwie begrenzt werden, so dass man sagen kann , 1) , dass es eine Liste überhaupt, und 2) , wobei ein Punkt endet und eine neue beginnt. (Ich habe keinen bestimmten Meta-Beitrag, um dies zu belegen, aber es gibt eine gewisse Verwandtschaft mit der Diskussion über nicht beobachtbares Verhalten . Derzeit ist nicht zu beobachten, dass Ihr Programm eine Liste ausgibt, anstatt beispielsweise eine Zeichenfolge. )
DLosc
Ich denke, ich kann das Festziehen durch einen Join durch Zeilenumbrüche ersetzen (wodurch eine Liste von Listen mit Zeichen zurückgegeben wird, die mit Zeichen gemischt sind, während ein vollständiges Programm die Elemente in neuen Zeilen druckt).
Jonathan Allan
... also 17 mit;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
Jonathan Allan
@ JonathanAllan Ihre 20-Byte-Lösung funktioniert wie beabsichtigt, aber Ihre 17-Byte-Lösung im Kommentar scheint einige falsche Ergebnisse zu liefern .
Kevin Cruijssen
1
@ KevinCruijssen - yep, mobiles Golf nicht gut, ich habe den Beitritt von Zeilenumbrüchen für die ungeraden indizierten Artikel verpasst, 18 gepostet.
Jonathan Allan
2

PHP , 50 Bytes

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

Probieren Sie es online aus! Verwendet eine integrierte Funktion .

Wenn das Neuanordnen der Eingänge zulässig ist ( (S,D,I)damit es mit der str_getcsvSignatur übereinstimmt ), habe ich eine 44-Byte-Version .

Jo.
quelle
1
Ich glaube, dass das Neuanordnen von Eingaben zulässig ist, solange Sie die Reihenfolge angeben. Um es klarer, können Sie die Variablen verwenden $S, $Dund $Imit Kosten von 0 Byte, für diese 50 Byte langen Version.
Ismael Miguel
Auch die 50 - Byte - Version, mit der $S, $D, $Ikönnte Variablen als Leitfaden für die Reihenfolge der Argumente dienen.
Ismael Miguel