Dada uma sequência de letras e um conjunto de palavras, produza uma ordem das palavras para que elas possam ser encontradas na sequência, descartando letras desnecessárias. As palavras podem ocorrer mais de uma vez no conjunto de palavras. A sequência de entrada e todas as palavras consistirão em 1 a 1000 letras minúsculas cada. As letras a serem descartadas podem ocorrer dentro das palavras ou entre as palavras.
Seu programa ou função pode aceitar a sequência de letras e as palavras como listas, uma sequência de caracteres ou de STDIN e deve gerar todas as palavras na ordem correta como saída de uma lista ou sequência de caracteres. Se houver mais de uma solução correta, envie apenas uma delas. Se não houver uma solução correta, produza uma lista vazia ou uma sequência vazia.
Exemplos:
dogcatfrog cat frog dog
-> dog cat frog
xxcatfixsxhingonxgrapexxxfishingcxat cat grape catfish fishing
-> catfish grape fishing cat
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
-> da ab ba ba ba cc bb aa ac dc db dd
flea antelope
->
(no solution)
Isso é código de golfe. O menor número de bytes vence.
Editar: explicou que caracteres extras podem estar dentro das palavras.
cc
antes,bb
mas as substringsbb
ecc
aparecem apenas uma vez e abb
substring aparece primeiro.ccbcb
parte da string que produzimos acc
saídabb
depois de largar o meioc
.Respostas:
Pitão,
2024 bytesMinha primeira tentativa em Pyth :)
Como funciona:
Notas: leva muito tempo no terceiro exemplo (
dababbabadbaccbcbaaacdacdbdd aa bb cc dd ba ba ba ab ac da db dc
).fonte
Pitão, 10 bytes
Demonstração
Este programa é muito força bruta. Primeiro, ele constrói todos os subconjuntos da entrada, depois todas as partições dos subconjuntos, depois verifica o primeiro, que é uma reordenação da lista de palavras. Nenhuma possibilidade é tratada através de erros, sem saída para stdout, o que é permitido por meta consenso. O erro pode ser removido por 2 bytes extras.
Observe que, para muitos dos casos de teste fornecidos, o programa não será concluído dentro de um período de tempo razoável.
fonte
JavaScript (ES6), 119 bytes
Aceita uma sequência de caracteres e uma matriz de palavras e retorna uma matriz de palavras ou
undefined
com falha. Adicione 2 bytes se precisar retornar a sequência vazia em caso de falha (?q:``
); nesse caso, essa versão alternativa terá apenas 120 bytes e retornará a sequência vazia em caso de falha e poderá salvar 2 bytes se for permitido retornar 0 em caso de falha:(Depois de escrever isso, notei que o algoritmo é basicamente o mesmo que a resposta Pyth de @ KennyLau.)
Edição editada: atualizada após o esclarecimento da pergunta, mas agora é muito lenta no terceiro caso de teste; Comecei na noite anterior e nesta manhã acabei de perceber que ele realmente encontrou a solução, algo entre 30 e 40 horas depois. Eu fui realmente malvado e dei a solução para ele (funciona melhor com a solução invertida, que será verificada instantaneamente).
fonte
Java 7, 256 bytes
Definitivamente, deveria ser possível jogar mais isso usando uma abordagem diferente, mas isso funcionará por enquanto.
Ungolfed & código de teste:
Experimente aqui.
Resultado:
fonte
Groovy (44 bytes)
Não acredito que mais ninguém usou expressões regulares para isso ...
Explicação
/${b.join('|')}/
- Crie uma regex para encontrar qualquer uma das palavras em uma sequência..findAll(...)
- Encontre e colete todas as ocorrências na string em uma matriz..join(" ")
- Una a matriz com espaços.Basicamente, se não houver ocorrências, a matriz estará vazia e retornará uma sequência vazia implicitamente. Se encontrar ocorrências, ele retornará um objeto de matriz com as ocorrências e o achatará em uma sequência.
fonte