Inspirado por esta pergunta StackOverflow .
Entrada:
Tomaremos três entradas:
- Um caractere delimitador
D
no qual dividir - Um caractere
I
entre dois dos quais ignoramos o caractere delimitador (eu sei, isso parece vago, mas explicarei abaixo) - Uma linha
S
Resultado:
Uma lista / matriz que contém as substrings após a divisão.
Exemplo:
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ê? Dividindo em vírgula normalmente também dividir 98,00
, 12,000,000
e ,-,
em dois / três peças. Mas como eles estão dentro do I
caractere de entrada, ignoramos a divisão aqui.
Regras do desafio:
- Você pode assumir que sempre haverá uma quantidade uniforme de
I
caracteres na string de entrada. - Você pode assumir que o caractere
I
sempre terá umD
próximo a ele (exceto quando for o primeiro ou o último caractere da entrada) que ainda pode ser dividido corretamente. Então você não terá algo parecidoD = ','; I = '"'; S = 'a,b"c,d"e,f'
, nem nada dissoD=','; I='"'; S='a",b,"c'
. - A entrada de cordas
S
pode conter nenhum dos sejaD
ouI
. Se não contiverD
, produzimos uma lista com toda a string de entrada como único item. - A lista de saída não conterá mais o caractere
I
, mesmo quando não continhaD
(como você pode ver no"Abc "
devir'Abc '
no exemplo acima). - É possível que a subcadeia
I
contenha apenasD
. Por exemplo:D = ','; I = '"'; S = 'a,",",b,"c","d,e,,",f'
resultaria em['a', ',', 'b', 'c', 'd,e,,', 'f']
. - Você pode assumir que
D
nunca estará no início ou no final deS
, portanto não precisará lidar com itens vazios à direita / à direita. - Quando uma entrada tem duas adjacentes
D
, teremos um item vazio. Ou sejaD = ','; I = '"'; S = 'a,"b,c",d,,e,"",f'
, resultaria em['a', 'b,c', 'd', '', 'e', '', 'f']
. - Você pode assumir que as entradas e saídas conterão apenas ASCII imprimível no intervalo
[32, 126]
(excluindo guias e novas linhas). - Você também pode gerar todos os itens delimitados por nova linha em vez de retornar / produzir uma lista / matriz (especialmente para os idiomas que não possuem listas / matrizes; por exemplo, Retina).
- Você tem permissão para gerar a lista na ordem inversa, se ela salvar bytes. Você não tem permissão para produzi-lo na ordem classificada ou 'aleatória'. Portanto,
D = ','; I = 'n'; S = 'a,2,b,3,c'
pode ser produzido como[a,2,b,3,c]
ou[c,3,b,2,a]
, mas não como[2,3,a,b,c,]
ou[a,3,b,c,2]
por exemplo.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
- Além disso, é altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste:
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,""'
acabei de perceber. Modificarei um pouco o desafio para que itens vazios não sejam possíveis no início ou no final. Com base na experiência em Java e 05AB1E no passado, sei como os itens vazios frustrantes após a divisão podem ser corrigidos manualmente quando o idioma não o faz corretamente por padrão. Um caso de teste como esse ainda deve ser suportado:D = ','; I = '"'; S = 'a,"b,c",d,,e
→['a', 'b,c', 'd', '', 'e']
com um item vazio no meio.'1,"2,3"' -> ['2,3','1']
[a,b,c]
e[c,b,a]
são permitidas saídas, mas[a,c,b]
ou[b,a,c]
não, por exemplo.D=','; I='"'; S='a",b,"c'
ou é mesmo uma entrada válida?Respostas:
Japonês , 16 bytes
Tente!
Basicamente, a mesma estratégia da resposta Pip mais recente do DLosc, separa as seções "citadas" e substitui o delimitador por uma nova linha no restante da string, resultando em uma saída delimitada por nova linha
Explicação completa:
Observe que, mesmo que o primeiro item seja citado, ele ainda terminará no índice 1, e não no índice 0. Se
q
encontrar um delimitador como o primeiro caractere, ele tornará o primeiro item da divisão (índice 0) uma sequência vazia, de modo que o conteúdo da cotação se tornar corretamente o segundo item (índice 1). Aqui está uma demonstração de como lidar corretamente com uma cotação principal.fonte
R , 34 bytes
Regular não modificado
scan
com os argumentos apropriados paratext
,sep
equote
deve fazê-lo.Experimente online!
fonte
scan
por 4 bytes e depois chamá-lo com os argumentos nos locais apropriados?C (gcc) , 64 bytes
Experimente online!
JavaScript (Node.js) , 57 bytes
Experimente online!
fonte
D
dentroI
e conterI
na saída, o que também pode ser visto nos primeiros casos de teste no seu link TIO. (PS: Também pode ser melhor para publicá-las como respostas separadas, com uma ligação informando que é uma porta de sua resposta C.)Python 2, 67 bytes
Experimente online!
Python 2, 71 bytes
Experimente online!
fonte
Pip , 18 bytes
Recebe entradas como argumentos da linha de comando. Experimente online!
Abordagem completamente diferente: processe a string um caractere de cada vez e produza os resultados desejados, delimitados por nova linha.
Quão?
fonte
MATL , 24 bytes
As entradas são
S
,I
,D
.Experimente online! Ou verifique todos os casos de teste .
Como funciona
Considere entradas
D = ','
;I = '"'
;S = 'a,"b,c",d,,e,"",f'
.fonte
Retina , 45 bytes
Experimente online! Explicação:
Olhe para a frente para encontrar os valores de
D
eI
nas duas linhas a seguir. Então, se encontrarmos umI
, coma-o e combine os caracteres para o próximoI
eD
, caso contrário, apenas combine os caracteres para o próximoD
ou o final da linha.A lista captura 4 e 5 de cada partida; 4 é a captura entre dois
I
s enquanto 5 é a captura entre doisD
s.fonte
Powershell, 71 bytes
Script de teste com menos golfe:
Resultado:
Explicação:
-split{...}
especifica regras para aplicar o delimitador. Veja about_split .$script:a=...
define a variávela
no escopo externo .-ceq
significa equação que diferencia maiúsculas de minúsculas .|% trim $i
chama um métodotrim
com o argumento$i
.fonte
SNOBOL4 (CSNOBOL4) , 109 bytes
Experimente online!
Suponha que
D =','
eI ='"'
. Em seguida, o padrão(I ARB . OUTPUT I | ARB . OUTPUT) (D | RPOS(0))
corresponde a seqüências que parecem".*"
ou são.*
seguidas por,
ou no final da sequência e OUTPUTs os.*
caracteres arbitrários ( ), configurando o REMainder incomparável paraS
e iterando, desde queS
não esteja vazio.fonte
Pip
-n
,2924 bytesRecebe entradas como argumentos da linha de comando. Experimente online!
Estratégia:
I
pares externos , substituaD
por nova linha (já que temos a garantia de que as novas linhas não aparecerão na string). Em seguida, divida na nova linha e tiraI
.fonte
Geléia ,
2018 bytesUm programa completo de tomar os três argumentos
D
,I
,S
que imprime cada item em uma linha.Experimente online! (Rodapé se junta a novas linhas)
Quão?
Coloque um acréscimo
D
de cada lado, divida emI
s, divida os itensD
com índices ímpares em s, remova a cabeça e o rabo e junte-os a novas linhas, finalmente junte o resultado com novas linhas.fonte
;`j⁵œṣ⁴œṣḊṖɗ€Ðo³Y
PHP , 50 bytes
Experimente online! Usa uma função interna .
Se a reorganização das entradas for permitida (
(S,D,I)
para que corresponda àstr_getcsv
assinatura), eu tenho uma versão de 44 bytes .fonte
$S
,$D
e$I
com um custo de 0 bytes, para esta versão de 50 bytes.$S
,$D
,$I
variáveis poderia servir como um guia para a ordem dos argumentos.