Inspiriert von dieser StackOverflow-Frage .
Eingang:
Wir nehmen drei Eingaben:
- Ein Trennzeichen
D
zum Teilen - Ein Zeichen
I
zwischen 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,000
und ,-,
in zwei / drei Stücken. Da sie sich jedoch innerhalb des I
Eingabezeichens befinden, ignorieren wir die Aufteilung hier und ignorieren sie.
Herausforderungsregeln:
- Sie können davon ausgehen, dass
I
die Eingabezeichenfolge immer eine gerade Anzahl von Zeichen enthält. - Sie können davon ausgehen, dass neben dem Zeichen
I
immer ein Zeichen stehtD
(außer wenn es das erste oder letzte Zeichen der Eingabe ist), das noch ordnungsgemäß aufgeteilt werden kann. Sie werden also weder so etwasD = ','; I = '"'; S = 'a,b"c,d"e,f'
noch so etwas habenD=','; I='"'; S='a",b,"c'
. - Die Eingabezeichenfolge kann
S
weder eines nochD
oder enthaltenI
. Wenn es no enthältD
, geben wir eine Liste mit der gesamten Eingabezeichenfolge als einzigem Element aus. - Die Ausgabeliste wird nicht das Zeichen
I
mehr, auch wenn sie nicht enthalten istD
(wie man an dem sieht"Abc "
immer'Abc '
im Beispiel oben). - Es ist möglich, dass der Teilstring nur
I
enthältD
. 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
D
niemals am Anfang oder Ende von sein wirdS
, 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. DhD = ','; 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 Code-Golf , 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']
"", "'ll remove all ", ""
)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.'1,"2,3"' -> ['2,3','1']
[a,b,c]
und[c,b,a]
sind Ausgaben erlaubt, aber[a,c,b]
oder[b,a,c]
nicht zum Beispiel.D=','; I='"'; S='a",b,"c'
oder ist es überhaupt eine gültige Eingabe?Antworten:
Japt , 16 Bytes
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:
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
q
ein 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.quelle
R , 34 Bytes
Regelmäßige unmodifizierten
scan
mit den entsprechenden Argumenten fürtext
,sep
undquote
sollte es tun.Probieren Sie es online aus!
quelle
scan
4 Bytes einreichen und es dann mit den Argumenten an den entsprechenden Stellen aufrufen?C (gcc) , 64 Bytes
Probieren Sie es online aus!
JavaScript (Node.js) , 57 Byte
Probieren Sie es online aus!
quelle
D
innerhalb der Ausgabe aufzuteilenI
und enthält dieseI
, 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.)Python 2, 67 Bytes
Probieren Sie es online aus!
Python 2, 71 Bytes
Probieren Sie es online aus!
quelle
Pip , 18 Bytes
Ü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?
quelle
MATL , 24 Bytes
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'
.quelle
Netzhaut , 45 Bytes
Probieren Sie es online aus! Erläuterung:
Schauen Sie nach vorne, um die Werte von
D
undI
in den folgenden zwei Zeilen zu finden. Wenn wir dann ein finden,I
dann essen Sie es und ordnen Sie die Zeichen dem nächsten zu,I
undD
andernfalls stimmen Sie einfach die Zeichen dem nächstenD
oder dem Ende der Zeile zu.Liste erfasst 4 und 5 von jedem Spiel; 4 ist die Erfassung zwischen zwei
I
Sekunden, während 5 die Erfassung zwischen zweiD
Sekunden ist.quelle
Powershell, 71 Bytes
Weniger Golf-Testskript:
Ausgabe:
Erläuterung:
-split{...}
gibt Regeln für die Anwendung des Trennzeichens an. Siehe about_split .$script:a=...
Legt die Variablea
im äußeren Bereich fest .-ceq
bedeutet Groß- und Kleinschreibung .|% trim $i
ruft eine Methodetrim
mit Argument auf$i
.quelle
SNOBOL4 (CSNOBOL4) , 109 Bytes
Probieren Sie es online aus!
Angenommen, das
D =','
undI ='"'
. 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 aufS
und iteriert, solange erS
nicht leer ist.quelle
Pip
-n
,2924 BytesÜbernimmt Eingaben als Befehlszeilenargumente. Probieren Sie es online aus!
Strategie: Außerhalb von
I
Paaren durchD
Zeilenumbruch ersetzen (da garantiert ist, dass Zeilenumbrüche nicht in der Zeichenfolge angezeigt werden). Dann auf Newline und Strip teilenI
.quelle
Gelee ,
2018 BytesEin volles Programm nimmt die drei Argumente
D
,I
,S
das druckt jedes Element auf einer Linie.Probieren Sie es online aus! (Fußzeile verbindet sich mit Zeilenumbrüchen)
Wie?
Umgeben Sie mit einem Extra
D
auf jeder Seite, teilen Sie beiI
s, teilen Sie die ungeradzahligen Elemente beiD
s, 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.quelle
;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
PHP , 50 Bytes
Probieren Sie es online aus! Verwendet eine integrierte Funktion .
Wenn das Neuanordnen der Eingänge zulässig ist (
(S,D,I)
damit es mit derstr_getcsv
Signatur übereinstimmt ), habe ich eine 44-Byte-Version .quelle
$S
,$D
und$I
mit Kosten von 0 Byte, für diese 50 Byte langen Version.$S
,$D
,$I
könnte Variablen als Leitfaden für die Reihenfolge der Argumente dienen.