Veja como retroceder e digitar novamente de uma sequência para outra:
- Comece da primeira string.
- Remova os caracteres no final até o resultado ser um prefixo da segunda sequência. (Isso pode levar 0 etapas.)
- Adicione caracteres no final até que o resultado seja igual à segunda string. (Isso também pode levar 0 etapas.)
Por exemplo, o caminho de fooabc
para se fooxyz
parece com:
fooabc
fooab
fooa
foo
foox
fooxy
fooxyz
Tarefa
Dada uma lista de palavras, escreva um programa que retroceda e retorne seu caminho da sequência vazia, para todas as palavras da lista em sucessão, de volta para a sequência vazia. Saída todas as seqüências intermediárias.
Por exemplo, dada a lista de entrada ["abc", "abd", "aefg", "h"]
, a saída deve ser:
a
ab
abc
ab
abd
ab
a
ae
aef
aefg
aef
ae
a
h
Regras
Você pode retornar ou imprimir uma lista de cadeias ou uma única cadeia com algum delimitador de sua escolha. Opcionalmente, você pode incluir as cadeias vazias inicial e final. É garantido que a entrada contenha pelo menos uma palavra e cada palavra contenha apenas letras ASCII em minúsculas ( a
- z
). Editar: seqüências consecutivas na entrada são garantidas para não serem iguais.
Isso é código-golfe ; o menor código em bytes vence.
Uma implementação de referência no Python 3: Experimente online!
["abc","abc"]
?a,abc,abcde,abc,a,abc,abcde
Respostas:
Pitão,
2523 bytesExperimente online.
fonte
Perl, 43 bytes
42 bytes de código +
-n
sinalizadores.Para executá-lo:
fonte
abc
fazer com que fosse impresso 3 vezes (mas, na verdade, a primeira e a terceira vez foi sem espaço). Eu removi isso.Java 8, 144 bytes
Este é semelhante à implementação de referência, mas combina os dois
while
loops. É uma expressão lambda que aceita umString[]
parâmetro.Ungolfed
Agradecimentos
fonte
class B
vez deinterface B
? Você pode executar a partir de uma classe privada de pacote. Além disso, considere usar um lambda como você já especificou o Java8.interface B{static void main
é menor queclass B{public static void main
.a->{/*your code*/}
, o qual será atribuído a uma variável do tipojava.util.function.Consumer<String[]>
. Não posso testar no momento, no entanto.Mathematica, 149 bytes
fonte
Retina , 39 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Entrada e saída são listas separadas por avanço de linha. A saída inclui a sequência vazia inicial e final.
fonte
Geléia ,
312926 bytesExperimente online!
Como funciona
fonte
Haskell ,
102 93 9190 bytesA última linha é uma função anônima, que pega e retorna uma lista de strings. Experimente online!
Explicação
Minha solução é recursiva. Primeiro,
?
é uma função auxiliar de infixo:a?b
fornece os primeiroslength a
caracteres deb
, ou o conjunto deb
sea
é maior. Em seguida, defino uma função infix!
. A idéia é quea!x
, ondea
há uma string ex
uma lista de strings, produza o caminho daa
primeira stringx
e volte ao final dex
. Na linha final, defino uma função anônima que acrescenta a string vazia e depois se aplica!
à string vazia e à entrada.Explicação de
!
:fonte
Python 2,
118107103979392 bytesA entrada é fornecida como
['abc', 'abcdef', 'abcfed']
, ou como ["abc", "abcdef", "abcfed"]
.Revisão 1: -11 bytes. O crédito vai para @xnor por seu post sobre dicas de golfe em Python, e para @Lynn por encontrar a dica para mim e por ser inteligente. Duas alterações foram feitas: em vez de
not s.startswith(i)
, eu useis.find(i)
e em vez dei!=s
eu useii>s
.Revisão 2: -4 bytes. O crédito me ocorre ao perceber que cometi um erro muito estúpido. Em vez de usar o recuo de tabulação única e de tabulação dupla, usei o recuo de espaço único e de tabulação única.
Revisão 3: -6 bytes. O crédito vai para @ mbomb007 por sugerir colocar os whiles em uma única linha. Também corrigi um erro mudando
s.find(i)
parai.find(s)
.Revisão 4: -4 bytes. O crédito vai para @xnor por perceber que eu não precisava armazenar a entrada em uma variável.
Revisão 5: -1 byte. O crédito é para mim por perceber que
['']
é a mesma coisa que[s]
ao adicioná-lo à entrada.fonte
while
s em uma única linha. Além disso, você pode usar em<1
vez denot
.startswith
.while
s em uma única linha. Você quer dizer comowhile s.find(i):s=s[:-1];print s
? Além disso, obrigado pela sugestão<1
, mas mudei para algo ainda mais curto, graças a uma das dicas do xnor no segmento de dicas do Python.GNU M4, 228 ou 232 bytes¹
(¹ dependendo de terminar
dnl\n
ou não o arquivo - ainda sou novo no golfe e no M4)Além disso, 3 bytes podem ser salvos substituindo o segundo argumento de
substr
from0
para a string vazia, mas isso produziria muitos avisos no stderr.Ungolfed:
Uso:
fonte
PHP,
11611110183 bytesNota: usa a codificação Windows-1252.
Execute assim:
Explicação
Tweaks
trim($c^$w,"\0")
para verificar a correspondência de substring em vez de$c&&strpos($w,$c)!==0
.~ÿ
para gerar uma sequência com um byte NUL em vez de"\0"
$c=$c.ÿ&$w
sufixo$c
no próximo caractere de$w
fonte
Lote,
296291 bytesComputar o prefixo comum era complicado.
fonte
PHP, 153 bytes
muito longo :(
Corra com
php -nr '<ode>' <text1> <text2> ...
.fonte
JavaScript (ES6), 135 bytes
Desafio interessante! Uso:
g(["abc", "abd", "aefg", "h"])
. Não consegui salvar nenhum bytes escrevendo isso como uma função, então são dois. Novas linhas não incluídas na contagem de bytes.Tenho certeza que isso pode ser reduzido muito mais. Adicionará a versão não destruída mais tarde.
fonte
Javascript, 98 bytes
Resposta Java do Porto de Jakob
fonte