Inspiré par cette question StackOverflow .
Contribution:
Nous prendrons trois entrées:
- Un délimiteur
D
sur lequel se diviser - Un caractère
I
entre deux dont nous ignorons le caractère délimiteur (je sais, cela semble vague, mais je vais l'expliquer ci-dessous) - Un string
S
Production:
Une liste / tableau contenant les sous-chaînes après la scission.
Exemple:
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', ',-,']
Pourquoi? Le fractionnement sur une virgule se diviserait normalement également 98,00
, 12,000,000
et ,-,
en deux / trois morceaux. Mais parce qu'ils sont dans le I
caractère d'entrée, nous ignorons ignorer la division ici.
Règles du défi:
- Vous pouvez supposer qu'il y aura toujours un nombre pair de
I
caractères dans la chaîne d'entrée. - Vous pouvez supposer que le personnage
I
aura toujours unD
côté (sauf s'il s'agit du premier ou du dernier caractère de l'entrée) qui peut toujours être correctement divisé. Vous n'aurez donc rien de semblableD = ','; I = '"'; S = 'a,b"c,d"e,f'
, ni rien de semblableD=','; I='"'; S='a",b,"c'
. - La chaîne d'entrée
S
ne peut contenir ni l'unD
ni l' autreI
. S'il ne contient pasD
, nous éditons une liste avec la chaîne d'entrée entière comme seul élément. - La liste de sortie ne contiendra plus le caractère
I
, même s'il n'en contenait pasD
(comme vous pouvez le voir au"Abc "
devenir'Abc '
dans l'exemple ci-dessus). - Il est possible que la sous-chaîne
I
contienne uniquementD
. Par exemple:D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'
entraînerait['a', ',', 'b', 'c', 'd,e,,', 'f']
. - Vous pouvez supposer que
D
cela ne se fera jamais au début ou à la finS
, vous n'aurez donc pas à gérer les éléments vides de fin / de début . - Lorsqu'une entrée en a deux adjacentes
D
, nous aurons un élément vide. C'est-à-direD = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'
qu'il en résulterait['a', 'b,c', 'd', '', 'e', '', 'f']
. - Vous pouvez supposer que les entrées et sorties ne contiendront que de l'ASCII imprimable dans la plage
[32, 126]
(donc à l'exclusion des tabulations et des sauts de ligne). - Vous êtes également autorisé à sortir tous les éléments délimités par une nouvelle ligne au lieu de renvoyer / sortir une liste / tableau (en particulier pour les langages qui n'ont pas de listes / tableaux; c'est-à-dire Retina).
- Vous êtes autorisé à afficher la liste dans l'ordre inverse si elle enregistre des octets. Cependant, vous n'êtes pas autorisé à le sortir dans l'ordre trié ou «mélangé». Il
D = ','; I = 'n'; S = 'a,2,b,3,c'
peut donc être sorti en tant que[a,2,b,3,c]
ou[c,3,b,2,a]
, mais pas en tant que[2,3,a,b,c,]
ou[a,3,b,c,2]
par exemple.
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse, vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
- De plus, l'ajout d'une explication à votre réponse est fortement recommandé.
Cas de test:
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,""'
je viens de le remarquer. Je modifierai un peu le défi afin que les éléments vides ne soient pas possibles au début ou à la fin. Sur la base de mon expérience dans Java et 05AB1E dans le passé, je sais à quel point les éléments vides frustrants peuvent être réparés manuellement lorsque le langage ne le fait pas correctement par défaut. Un cas de test comme celui-ci doit toujours être pris en charge:D = ','; I = '"'; S = 'a,"b,c",d,,e
→['a', 'b,c', 'd', '', 'e']
avec un élément vide entre les deux.'1,"2,3"' -> ['2,3','1']
[a,b,c]
et[c,b,a]
sont autorisés les sorties, mais pas[a,c,b]
ou[b,a,c]
non par exemple.D=','; I='"'; S='a",b,"c'
ou est-ce même une entrée valide?Réponses:
Japt , 16 octets
Essayez!
Fondamentalement, la même stratégie que la nouvelle réponse Pip de DLosc, met de côté les sections "entre guillemets" puis remplace le délimiteur par une nouvelle ligne dans le reste de la chaîne, ce qui entraîne une sortie délimitée par une nouvelle ligne
Explication complète:
Notez que même si le premier élément est cité, il finira toujours à l'index 1 et non à l'index 0. Si
q
trouve un délimiteur comme premier caractère, il fait du premier élément de la division (index 0) une chaîne vide, donc le contenu du devis devient correctement le deuxième élément (index 1). Voici une démo de traiter correctement une citation de premier plan.la source
R , 34 octets
Régulier non modifié
scan
avec les arguments appropriés pourtext
,sep
etquote
devrait le faire.Essayez-le en ligne!
la source
scan
pour 4 octets puis l'appeler avec les arguments aux endroits appropriés?C (gcc) , 64 octets
Essayez-le en ligne!
JavaScript (Node.js) , 57 octets
Essayez-le en ligne!
la source
D
intérieurI
ainsi que contenueI
dans la sortie, ce qui peut également être vu dans les premiers cas de test de votre lien TIO. (PS: Il pourrait également être préférable de les publier en tant que réponses séparées, avec un lien indiquant qu'il s'agit d'un portage de votre réponse C.)Python 2, 67 octets
Essayez-le en ligne!
Python 2, 71 octets
Essayez-le en ligne!
la source
Pip , 18 octets
Prend les entrées comme arguments de ligne de commande. Essayez-le en ligne!
Approche complètement différente: traitez la chaîne un caractère à la fois et sortez les résultats souhaités délimités par la nouvelle ligne.
Comment?
la source
MATL , 24 octets
Les entrées sont
S
,I
,D
.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Comment ça fonctionne
Considérez les entrées
D = ','
;I = '"'
;S = 'a,"b,c",d,,e,"",f'
.la source
Rétine , 45 octets
Essayez-le en ligne! Explication:
Regardez en avant pour trouver les valeurs de
D
etI
sur les deux lignes suivantes. Ensuite, si nous trouvons un,I
mangez-le et faites correspondre les caractères au suivantI
etD
, sinon, faites simplement correspondre les caractères au suivantD
ou à la fin de la ligne.La liste capture 4 et 5 de chaque match; 4 est la capture entre deux
I
s tandis que 5 est la capture entre deuxD
s.la source
Powershell, 71 octets
Script de test moins golfé:
Production:
Explication:
-split{...}
spécifie les règles d'application du délimiteur. Voir about_split .$script:a=...
définit la variablea
dans la portée externe .-ceq
signifie une équation sensible à la casse .|% trim $i
appelle une méthodetrim
avec argument$i
.la source
SNOBOL4 (CSNOBOL4) , 109 octets
Essayez-le en ligne!
Supposons que
D =','
etI ='"'
. Ensuite, le modèle(I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))
correspond aux chaînes qui ressemblent".*"
ou sont.*
suivies par,
ou à la fin de la chaîne, et SORTE les caractères arbitraires (.*
), définissant le REMainder sans correspondance surS
et itérant tant qu'ilS
n'est pas vide.la source
Pip
-n
,2924 octetsPrend les entrées comme arguments de ligne de commande. Essayez-le en ligne!
Stratégie: en dehors des
I
paires, remplacezD
par une nouvelle ligne (car nous sommes garantis que les nouvelles lignes n'apparaîtront pas dans la chaîne). Ensuite, divisez sur la nouvelle ligne et supprimezI
.la source
Gelée ,
2018 octetsUn programme complet prenant les trois arguments
D
,I
,S
qui imprime chaque élément sur une ligne.Essayez-le en ligne! (Le pied de page rejoint les nouvelles lignes)
Comment?
Entourez avec un supplément
D
de chaque côté, divisez enI
s, divisez les éléments indexés enD
s puis retirez leurs têtes et queues et joignez-les avec des nouvelles lignes, enfin joignez le résultat avec des nouvelles lignes.la source
;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
PHP , 50 octets
Essayez-le en ligne! Utilise une fonction intégrée .
Si le réarrangement des entrées est autorisé (
(S,D,I)
il correspond donc austr_getcsv
signature), j'ai une version de 44 octets .la source
$S
,$D
et$I
avec un coût de 0 octet, pour cette version longue de 50 octets.$S
,$D
,$I
variables pourraient servir de guide pour l'ordre des arguments.