Suponha que usemos as regras a seguir para extrair uma única string de outra, uma contendo apenas caracteres imprimíveis ASCII e chamada de *
-string. Se a sequência acabar antes que o processo pare, isso é um erro e o resultado do processo é indefinido nesse caso:
- Começar com
d=1, s=""
- Sempre que encontrar um
*
, multipliqued
por 2. Sempre que encontrar outro personagem, concatene-o até o finals
e subtraia 1 ded
. Se agorad=0
, pare e retornes
Exemplos definidos :
d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh
Exemplos indefinidos : (observe que a string vazia também seria uma dessas)
*7
**769
*7*
*a*b
*
Seu trabalho é pegar uma sequência e retornar a *
sequência mais curta que produz essa sequência.
Exemplos de programas :
7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69
Seu programa deve manipular qualquer sequência que contenha pelo menos um caractere e apenas *
caracteres imprimíveis não ASCII. Você nunca pode retornar strings para as quais o processo é indefinido, pois, por definição, eles não podem produzir QUALQUER strings.
Aplicam-se brechas padrão e regras de E / S.
*
?Respostas:
Pitão (
3627 bytes)Obrigado a Jakube por uma melhoria de 9 bytes! Atualmente não é tão bom quanto a resposta de muddyfish , mas seja qual for
Suíte de teste
Tradução para python:
fonte
JavaScript (ES6), 61 bytes
Função recursiva que faz o seguinte:
Se
d
for menor ou igual ao comprimento restante da string dividido por 2:Acrescente
*
à saída e multipliqued
por 2Outro:
Mude a string e acrescente à saída, subtraia 1 de
d
.Veja em ação:
fonte
f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
Pyth,
2927( Percebido )272625 bytesExplicação para vir.
Suíte de teste
fonte
C, 125 bytes
Isso tira proveito do padrão muito regular de posições em estrela para gerar a codificação correta. Inicialmente, tentei uma solução recursiva de força bruta, mas, em retrospecto, deveria ter sido óbvio que havia uma solução matemática mais simples.
Essencialmente, você sempre terá
2^floor(log_2(length))
estrelas no início de sua produção e uma estrela final após os2^ceil(log_2(length)) - length
caracteres (se isso der pelo menos 1 caractere).A versão (ligeiramente) não destruída é a seguinte
fonte
JavaScript (ES6),
8877 bytesNo começo eu pensei que
abcde
tinha que ser,*a**bcde
mas acontece que**abc*de
funciona tão bem. Isso significa que a saída é prontamente construída usando estrelas principais de piso (log₂ (s.length)), além de uma estrela adicional para seqüências de caracteres cujo comprimento não é uma potência de duas.Editar: salvou 8 bytes calculando o número de estrelas principais recursivamente. Salvei mais 3 bytes com cadeias de caracteres especiais de comprimento 1, para que eu possa tratar as cordas cujo comprimento é uma potência de 2 como tendo uma estrela principal extra.
fonte
Haskell, 68 bytes
O mesmo que as outras respostas, na verdade. Se EOF, produza uma sequência vazia. Se o comprimento restante for mais do que duas vezes
d
, produza uma estrela e duas vezesd
. Caso contrário, imprima o próximo caractere e subtraia umd
.Ungolfed:
fonte