Inspirado en esta pregunta de StackOverflow .
Entrada:
Tomaremos tres entradas:
- Un carácter delimitador
D
para dividir - Un personaje
I
entre dos de los cuales ignoramos el carácter delimitador (lo sé, eso suena vago, pero lo explicaré a continuación) - Una cuerda
S
Salida:
Una lista / matriz que contiene las subcadenas después de la división.
Ejemplo:
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', ',-,']
¿Por qué? Dividir en coma normalmente también se dividiría 98,00
, 12,000,000
y ,-,
en dos / tres piezas. Pero debido a que están dentro del I
carácter de entrada, ignoramos ignoramos la división aquí.
Reglas de desafío:
- Puede suponer que siempre habrá una cantidad par de
I
caracteres en la cadena de entrada. - Puede suponer que el carácter
I
siempre tendrá unD
lado (excepto cuando es el primer o el último carácter de la entrada) que aún se puede dividir correctamente. Entonces no tendrás algo como estoD = ','; I = '"'; S = 'a,b"c,d"e,f'
, ni nada como estoD=','; I='"'; S='a",b,"c'
. - La entrada de la cadena
S
podría contener ninguno de cualquieraD
oI
. Si no contieneD
, mostramos una lista con toda la cadena de entrada como único elemento. - La lista de salida ya no contendrá el carácter
I
, incluso cuando no contenía ningúnD
(como se puede ver en el"Abc "
futuro'Abc '
en el ejemplo anterior). - Es posible que la subcadena
I
contenga soloD
. Por ejemplo:D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'
resultaría en['a', ',', 'b', 'c', 'd,e,,', 'f']
. - Puede suponer que
D
nunca estará al principio o al finalS
, por lo que no tendrá que lidiar con los elementos vacíos finales / iniciales . - Cuando una entrada tiene dos adyacentes
D
, tendremos un elemento vacío. Es decirD = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'
, resultaría en['a', 'b,c', 'd', '', 'e', '', 'f']
. - Puede suponer que las entradas y salidas solo contendrán ASCII imprimibles en el rango
[32, 126]
(excluyendo pestañas y nuevas líneas). - También se le permite generar todos los elementos delimitados por una nueva línea en lugar de devolver / generar una lista / matriz (especialmente para aquellos idiomas que no tienen listas / matrices; es decir, Retina).
- Se le permite generar la lista en orden inverso si guarda bytes. Sin embargo, no está permitido enviarlo en orden ordenado o 'barajado'. Por
D = ','; I = 'n'; S = 'a,2,b,3,c'
lo tanto, se puede generar como[a,2,b,3,c]
o[c,3,b,2,a]
, pero no como[2,3,a,b,c,]
o[a,3,b,c,2]
por ejemplo.
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolf. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Se aplican reglas estándar para su respuesta, por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Las lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Además, se recomienda agregar una explicación para su respuesta.
Casos de prueba:
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,""'
me acabo de dar cuenta. Modificaré el desafío un poco para que los elementos vacíos no sean posibles al principio o al final. Basado en la experiencia en Java y 05AB1E en el pasado, sé lo frustrante que puede ser arreglar los elementos vacíos después de dividirlos manualmente cuando el idioma no lo hace correctamente de manera predeterminada. Aún se deben admitir casos de prueba como este:D = ','; I = '"'; S = 'a,"b,c",d,,e
→['a', 'b,c', 'd', '', 'e']
con un elemento vacío en el medio.'1,"2,3"' -> ['2,3','1']
[a,b,c]
y[c,b,a]
son salidas permitidas, pero[a,c,b]
o[b,a,c]
no, por ejemplo.D=','; I='"'; S='a",b,"c'
o es una entrada válida?Respuestas:
Japt , 16 bytes
¡Intentalo!
Básicamente, la misma estrategia que la nueva respuesta Pip de DLosc, deja de lado las secciones "citadas" y luego reemplaza el delimitador con una nueva línea en el resto de la cadena, lo que resulta en una salida delimitada por nueva línea
Explicación completa:
Tenga en cuenta que incluso si se cita el primer elemento, seguirá terminando en el índice 1, no en el índice 0. Si
q
encuentra un delimitador como primer carácter, convierte el primer elemento en la división (índice 0) en una cadena vacía, por lo que el contenido de la cotización se convierte correctamente en el segundo elemento (índice 1). Aquí hay una demostración de cómo tratar correctamente una cita destacada.fuente
R , 34 bytes
Regular sin modificaciones
scan
con los argumentos apropiados paratext
,sep
yquote
debería hacerlo.Pruébalo en línea!
fuente
scan
4 bytes y luego llamarlo con los argumentos en los lugares apropiados?C (gcc) , 64 bytes
Pruébalo en línea!
JavaScript (Node.js) , 57 bytes
Pruébalo en línea!
fuente
D
dentroI
y también contieneI
en la salida, que también se puede ver en los primeros casos de prueba en su enlace TIO. (PD: También podría ser mejor publicarlas como respuestas separadas, con un enlace que indique que es un puerto de su respuesta C).Python 2, 67 bytes
Pruébalo en línea!
Python 2, 71 bytes
Pruébalo en línea!
fuente
Pip , 18 bytes
Toma entradas como argumentos de línea de comandos. Pruébalo en línea!
Enfoque completamente diferente: procese la cadena un carácter a la vez y genere los resultados deseados delimitados por nueva línea.
¿Cómo?
fuente
MATL , 24 bytes
Las entradas son
S
,I
,D
.Pruébalo en línea! O verificar todos los casos de prueba .
Cómo funciona
Considerar entradas
D = ','
;I = '"'
;S = 'a,"b,c",d,,e,"",f'
.fuente
Retina , 45 bytes
Pruébalo en línea! Explicación:
Mire hacia adelante para encontrar los valores de
D
yI
en las siguientes dos líneas. Luego, si encontramos un yI
luego lo comemos y hacemos coincidir los caracteres con el siguienteI
yD
, de lo contrario, solo hacemos coincidir los caracteres con el siguienteD
o el final de la línea.Lista de capturas 4 y 5 de cada partido; 4 es la captura entre dos
I
s, mientras que 5 es la captura entre dosD
s.fuente
Powershell, 71 bytes
Menos guión de prueba de golf:
Salida:
Explicación:
-split{...}
especifica reglas para aplicar el delimitador. Ver about_split .$script:a=...
establece la variablea
en el alcance externo .-ceq
significa ecuación entre mayúsculas y minúsculas .|% trim $i
llama a un métodotrim
con argumento$i
.fuente
SNOBOL4 (CSNOBOL4) , 109 bytes
Pruébalo en línea!
Supongamos que
D =','
yI ='"'
. Luego, el patrón(I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))
coincide con las cadenas que se parecen".*"
o.*
siguen,
al final de la cadena o al final de la misma, y SALE los caracteres arbitrarios (.*
), configurando el REMAinder no coincidenteS
e iterando siempre queS
no esté vacío.fuente
Pip
-n
,2924 bytesToma entradas como argumentos de línea de comandos. Pruébalo en línea!
Estrategia:
I
pares externos , reemplaceD
con nueva línea (ya que tenemos la garantía de que las nuevas líneas no aparecerán en la cadena). Luego se divide en nueva línea y tiraI
.fuente
Jalea ,
2018 bytesUn programa completo de tomar los tres argumentos
D
,I
,S
que imprime cada elemento en una línea.Pruébalo en línea! (El pie de página se une con las nuevas líneas)
¿Cómo?
Rodee con un extra
D
en cada lado, divida enI
s, divida los elementos indexados impares enD
s, luego retire sus cabezas y colas y únalas con líneas nuevas, finalmente unan el resultado con líneas nuevas.fuente
;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
PHP , 50 bytes
Pruébalo en línea! Utiliza una función incorporada .
Si se permite reorganizar las entradas (
(S,D,I)
para que coincida con lastr_getcsv
firma), tengo una versión de 44 bytes .fuente
$S
,$D
y$I
con un costo de 0 bytes, para esta versión larga de 50 bytes.$S
,$D
,$I
variables podrían servir como una guía para el orden de los argumentos.