O desafio
Dadas duas cadeias / uma matriz de cadeias, produza a primeira cadeia diminuindo lentamente e expandindo de volta para a segunda cadeia.
Você pode assumir que as strings sempre começarão com o mesmo caractere.
Exemplo
Input:
"Test", "Testing"
Output:
Test
Tes
Te
T
Te
Tes
Test
Testi
Testin
Testing
Primeiro você produz a primeira palavra:
Test
Então você continua removendo uma letra até que a cadeia tenha um caractere:
Tes
Te
T
Continue adicionando uma letra da segunda palavra até terminar:
Te
Tes
Test
Testi
Testin
Testing
(se as duas strings tiverem um caractere, basta imprimir uma delas uma vez.)
Casos de teste
"Hello!", "Hi."
Hello!
Hello
Hell
Hel
He
H
Hi
Hi.
"O", "O"
O
"z", "zz"
z
zz
".vimrc", ".minecraft"
.vimrc
.vimr
.vim
.vi
.v
.
.m
.mi
.min
.mine
.minec
.minecr
.minecra
.minecraf
.minecraft
" ", " "
SSSSS
SSSS
SSS
SS
S
SS
SSS
"0123456789", "02468"
0123456789
012345678
01234567
0123456
012345
01234
0123
012
01
0
02
024
0246
02468
(nota: no espaço / quarto caso de teste, substitua S por espaços)
Regras
Isso é código-golfe , então a resposta mais curta em bytes vence! O desempate é o post mais votado. O vencedor será escolhido em 10/09/2016.
As brechas padrão são proibidas.
Respostas:
Pitão, 9 bytes
Um programa que pega a segunda cadeia e, em seguida, a primeira, como cadeias citadas em STDIN e imprime o resultado.
Experimente online
Como funciona
fonte
V , 14 bytes
Experimente online!
Explicação:
Agora, o buffer fica assim:
Só precisamos fazer a mesma coisa ao contrário para a próxima linha:
Solução alternativa mais interessante :
fonte
Python, 93 bytes
Começa com a sequência vazia
r
, adicionaa
e uma nova linha e remove o último caractere dea
até quea
esteja vazio, em seguida, adiciona as partes necessáriasb
e uma nova linha mantendo um contadori
, que começa em2
até que o comprimentob
seja excedido e retornar
. Tem uma nova linha à direita.Todos os testes são em ideone
fonte
r=""
. Simplesr
ainda funcionaria.f=
. 2. Sem or=''
presentef('test','testing')
não funcionaria; simf('test','testing','')
, mas devemos seguir as especificações.05AB1E , 9 bytes
Explicação
Experimente online!
fonte
Retina,
504126 bytesAgradecemos a Martin Ender por salvar 15 (!) Bytes.
Recebe entrada com as duas cadeias separadas por uma nova linha:
Experimente online!
Explicação
A primeira linha gera os "passos" de ambas as palavras:
M
é para o modo de correspondência,&
considera correspondências sobrepostas e!
imprime as correspondências em vez do número delas. A razão pela qual é revertida é ar
opção da direita para a esquerda: o mecanismo começa a procurar correspondências no final da sequência e continua em direção ao início.Isso coloca tudo na ordem certa: ele
O
reproduz todas as correspondências da regex subseqüente: um caractere em sua própria linha e cada caractere (incluindo novas linhas) depois dele, que corresponde a toda a segunda metade como um pedaço ou uma linha de caracteres , que corresponde a cada linha individual. Essas correspondências são classificadas por ponto de código, para que o T seguido pela nova linha vá primeiro, seguido pelas linhas, ascendendo pelo comprimento.Agora, temos apenas a primeira linha de caracteres no topo, portanto, usamos o
A
modo ntigrep para descartar a primeira correspondência da regex padrão.+
.Versão antiga
Experimente esta versão online!
Explicação
A primeira linha é a mesma, então veja a explicação para isso acima.
Isso inverte as linhas da primeira metade (segunda palavra de entrada). Na verdade, ele
O
define as linhas e a expressão regular limita as correspondências: deve ser uma linha de dois ou mais caracteres (..+
) seguida por uma nova linha (¶
) que começa onde o último parou (\G
). No exemplo acima, o singleT
no meio não corresponde, então nada depois pode.Agora, temos os dois componentes certos, mas na ordem errada.
¶.¶
corresponde ao T solitário no meio, do qual não precisamos, mas separa as duas partes. Os dois(.*)
capturam tudo antes e depois, incluindo novas linhas graças ao modos
ingle-line. As duas capturas são substituídas na ordem correta por uma nova linha no meio.Agora terminamos, a menos que as seqüências de entrada tenham um caractere, nesse caso, a entrada não mudou. Para se livrar da duplicata, substituímos
¶.$
(quando a última linha da string um único caractere) por nada.fonte
Python 2,
8882 bytesToma duas entradas, cada uma entre aspas.
Obrigado @ JonathanAllan por salvar alguns bytes e apontar um erro.
fonte
len(x)
,x=x[:len(x)-1]
já que a fatia de deslocamento negativo funciona - basta escreverx=x[:-1]
. O único problema é que seu código não processará" ", " "
muito bem o caso de teste.input()
e usar um formato de entrada como"<str1>", "<str2>"
for i in range(x):print x[-i:]
e a quarta linha parafor i in range(1,y):print y[:-i]
. Não tenho certeza se funcionaria.Perl,
3428 bytesInclui
+2
para-0n
Execute com as strings em linhas separadas no STDIN:
slow.pl
:Deixe o regex voltar ao trabalho ...
fonte
Queijo Cheddar , 76 bytes
Um pouco mais do que eu gostaria. Vou adicionar uma explicação em breve
Experimente online!
fonte
|>
faz?Braquilog , 32 bytes
Experimente online!
Explicação
O Brachylog não possui prefixo embutido, portanto, obteremos os prefixos usando
concatenate
(Veja o predicado 2): um prefixo deS
éP
seP
concatenado paraQ
(o que quer que seja) resultarS
.Predicado principal:
Predicado 1:
Predicado 2:
fonte
Javascript,
10381 bytesExemplo:
f("Test", "Testing")
Saída:
Resposta original
fonte
Java,
188179 bytesAtualizar
Ungolfed :
Uso :
fonte
Haskell,
545347 bytesExemplo de uso:
((.reverse.t).(++).init.t) "Hello" "Hi!"
->["Hello","Hell","Hel","He","H","Hi","Hi!"]
.Um pouco de mágica sem sentido. É o mesmo que
f x y = (init(t x))++reverse (t y)
wheret
faz uma lista de todas as substrings iniciais, por exemplot "HI!"
- ->["H","HI","HI!"]
.fonte
t=reverse.tail.inits
?inits
precisaimport Data.List
.Pyke, 14 bytes
Experimente aqui!
E 17 bytes apenas porque é uma solução incrível:
Experimente aqui!
fonte
GNU sed,
5745 + 2 (sinalizadores de rn) = 47 bytesCorre:
A entrada deve ser as duas cadeias separadas por uma nova linha. O código é executado pelo sed para cada linha.
O loop
:
exclui um caractere do final da string de forma iterativa. A saída relacionada com a primeira corda é impresso diretamente, exceto o primeiro caractere:1{/../p}
. A saída da segunda sequência é armazenada no espaço de espera na ordem inversa (2G;2h
) durante a exclusão e impressa no final.fonte
C (gcc) ,
102979593 bytesExperimente online!
O primeiro loop sobrescreve a string com 0 bytes a partir do final e usa
puts()
para imprimir a sequência. O segundo loop não pode simplesmente sobrescrever desde o início, ele precisa armazenar o valor antigo para poder recuperá-lo; o byte 0 está apenas caminhando para o final.Obrigado a @homersimpson e @ceilingcat por cada remoção de 2 bytes!
fonte
n
como um int global como:n;f(char*a,char*b){n=strlen(a)...
. E você provavelmente pode fazern=*a=0
como uma tarefa encadeada no corpo do seu loop for.Python 3, 104 bytes
Meh.
Graças a @DJMcMayhem por jogar 21 bytes de desconto.
Ideone it!
fonte
n='\n'
usar 5 bytes se fizer isso e usar n em vez de'\n'
. Você poderia ter um outro 8 off se você usou um lambda em vez de imprimir:n='\n';lambda x,y:n.join(x+n+n.join(x[:-i]for i in range(1,len(x)-1))+n+n.join(y[:i]for i in range(1,len(y)+1)))
REPL / Javascript, 109 bytes
Usa string falsa para diminuir a string original
Abusa de substring com números maiores para aumentar o segundo, para quando está prestes a imprimir a mesma palavra da última vez.
Demo:
fonte
a=>b=>...
e chamar a função de (a), (b)Brainfuck,
3855 bytesEditar: novas linhas incluídas na saída
fonte
Dyalog APL ,
2013 bytes↑
matrificar(⌽,\⍞)
⌽
concatenação cumulativa reversa ( ) (,\
) da entrada de caracteres (⍞
),
anexado a1↓
um elemento caiu de,\⍞
concatenação cumulativa da entrada de caracteresTryAPL online!
fonte
Raquete 193 bytes
Teste:
fonte
Floróide , 69 bytes
É um começo. Toma a entrada de STDIN.
Casos de teste
fonte
JavaScript (ES6), 92 bytes
o
replace
instruções constroem um triângulo de strings, exatamente o que é necessário para a segunda metade da saída, no entanto, a primeira metade precisa ser revertida e a linha de um único caractere duplicada removida. Nota: gera uma nova linha inicial se a primeira sequência for um único caractere. Se isso for indesejável, para um byte extra, esta versão sempre gera uma nova linha à direita:fonte
C, 142 bytes
Forneça
f(char* str1, char* str2)
.fonte
TI-Basic, 56 bytes
Exemplo de uso
fonte
Java,
168136 bytesPrograma de teste ungolfed
fonte
(Lambdabot) Haskell - 41 bytes
Mais legível, mas com mais dois bytes:
Saída:
fonte
J, 18 bytes
Ungolfed:
Este é um trem de 7:
O trem mais interno
[: |. ]\@[
consiste em um limite[:
à esquerda, então aplicamos|.
(reverso) ao resultado de]\@[
, que é]\
(prefixos) sobre[
(argumento à esquerda).Aqui está o que parece na
testing, test
entrada:Isso nos dá a primeira parte, quase. O trem 5 fora disso é
([: }: ([: |. ]\@[))
, que se aplica}:
(betail, remove last element) à expressão acima:(Isso ocorre porque não podemos ter um ponto médio duplicado.)
A parte externa é finalmente:
Isso é composto por
]\@]
(prefixos de argumento à esquerda) e,~
(acrescenta o que está à esquerda com o que está à direita), deixando-nos com o resultado desejado:Casos de teste
fonte
(,~}:@|.)&(]\)
PHP,
117109 bytesPHP, 107 bytes (não funciona com cadeias de caracteres
0
)fonte
C, 111 bytes
Teste ungolfed
fonte
brainfuck, 162 bytes
Experimente aqui
A entrada pega as duas cadeias separadas por um avanço de linha.
Primeiro programa com brianfuck e primeiro código de golfe, então tenho certeza de que há muita otimização a ser feita. Diverti-me fazendo isso.
Ungolfed
fonte