Tendo passado algum tempo neste site, passei a gostar de coisas o mais curtas possível. Essa pode ser a razão pela qual recentemente me ofendi com seqüências contendo os mesmos caracteres mais de uma vez. Seu trabalho é escrever uma função ou programa que condense uma determinada sequência de acordo com as seguintes regras:
Comece com uma condensação 0 , ou seja, procure o primeiro par (mais à esquerda) dos mesmos caracteres com 0 outros caracteres entre eles. Se esse par for encontrado, remova um dos dois caracteres e reinicie o algoritmo executando outra condensação 0 . Se nenhum par for encontrado, continue com a próxima etapa. Exemplos:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
Em seguida, execute uma condensação 1 , ou seja, procure o primeiro par de caracteres iguais com 1 outro caractere entre eles. Se esse par for encontrado, remova um deles e todos os caracteres entre eles e reinicie com uma condensação 0 . Se nenhum par for encontrado, continue com a próxima etapa. Exemplos:
abacac
-C1->acac
java
-C1->ja
Continue com uma condensação 2 e assim por diante até uma condensação n, com n sendo o comprimento da corda original, reiniciando cada vez que uma condensação remove algumas letras. Exemplos:
programing
-C2-> -C3-praming
abcdafg
>afg
A sequência resultante é chamada condensada e contém cada caractere no máximo uma vez.
Entrada:
Uma sequência minúscula de caracteres ascii imprimíveis.
Saída:
o corda condensada de acordo com as regras acima.
Exemplos:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
Exemplos detalhados para esclarecer como o algoritmo funciona:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
Sua abordagem não precisa implementar o algoritmo de cima, desde que sua solução e o algoritmo retornem a mesma saída para todas as entradas permitidas. Este é um desafio do código-golfe .
Obrigado a @Linus pelos comentários úteis sobre o sandbox!
Respostas:
JavaScript (ES6), 74 bytes
fonte
Perl,
38313029 bytesIsso deve deixar para trás os idiomas não relacionados ao golfe ...
-1 por
$-[0]
agradecimentos a Riley-1 por
@{-}
agradecimentos a DadaInclui +1 para
-p
Dê entrada no STDIN
condense.pl
:Esta versão de 27 bytes deve funcionar, mas não porque o perl não interpola
@-
em uma regex (consulte /programming/39521060/why-are-etc-not-interpolated-in-strings )fonte
@{\@-}
peça funciona? Eu pensei que@-
mantinha os índices de cada partida, então como "conta" em todas as iterações. Além disso, se você imprimir@{\@-}
antes e após cada substituição só vez imprime 1 ou 2././g
progresso progride em 1 na cadeia de caracteres a cada vez, exceto quando a cadeia é alterada, e é redefinida para 0. Se você imprimir@-
após o/./g
anterior, mas antes des///
ver a subida (use um teste em que o restante da cadeia seja grande o suficiente)$-[0]
fornece os números que eu esperaria. Funciona@{\@-}
como$-[0]
por causa do contexto regex, mas não ao imprimir por algum motivo?$-[0]
é um byte mais curto do que@{\@-}
se for o mesmo."@{\@-}"
não é o mesmo que@{\@-}
(sem"
)."@{\@-}"
é o mesmo que"@-"
. E isso também deve ser verdade para uma substituição de regex, mas não é. Simularmente$-[0]
deve funcionar, mas não funciona. PS: contexto escalar Você provavelmente de alguma forma tinha aplicado para@-
quando você fez a sua impressão, assim você sempre tem 1 ou 2CJam , 35 bytes
Experimente online!
Você pode ver as condensações individuais inserindo
ed
fonte
Python 2,
117104101 bytesRecursivamente, faça as substituições necessárias. Eu construo o regex dinamicamente.
Experimente online
fonte
return i>len(t) and t or s!=t and f(t) or f(t,i+1)
um líquido de bytes -4return t if i>len(t)else s!=t and f(t)or f(t,i+1))
e=s==t;return i>len(t)and t or f(t,i*e+e)
depois, você pode remover oi=0
na definição de função, mas precisará chamar com 0 start.Perl
5352Inclui +1 para -p
Experimente em ideone .
fonte
Mathematica, 101 bytes
Deve haver uma maneira de tornar isso mais curto ...
fonte
PHP, 90 bytes
ou 92 bytes
fonte
+$i
vez de$i+=0
(-2). 2)for
loop em vez dewhile
pode salvar dois bytes e permitir remover curvas (-4). 3) em$i=++$i*!$c
vez de$i=$c?0:$i+1
(-1). 4)\\2
não é necessário, remova os parênteses (-2). 5) Você pode permitir limite em9
vez de1
velocidade (+0)+$i
não funciona em todos os casos. Tentehammer
. O PHP não reclama das chaves vazias no regex; mas não corresponde ao desejado. A propósito: conto 91, não 90. Mas tente o novo 1)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
$i+=0
e tentarei sua proposta mais tarde. O que significa com martelo?puzzle
ou algo assim,(.)//1
mas está tudo bem com a sua proposta ou com o$i´=0
Ruby,
756457 bytes(56 bytes de código +
p
opção de linha de comando.)Usando a interpolação de cadeia de caracteres dentro de uma regex para controlar o comprimento das correspondências que são substituídas.
Teste:
fonte
Haskell ,
9788 bytesExperimente online!
Bersão antiga de 97 bytes:
Experimente em ideone .
Explicação:
A
(!)
função executa uma n-condensação quando uma string é dada uma vez inteira e uma vez com os primeiros n caracteres removidos, por exemplo,abcdbe
ecdbe
para uma 2-condensação, comparando recursivamente os dois caracteres iniciais.fonte