Existe a codificação e decodificação clássica do comprimento da execução.
input output
a3b2c5 aaabbccccc
E isso é bastante direto e feito antes.
O desafio é também responsável por um comportamento não-padrão quando vários caracteres preceder a extensão da execução (um único dígito 0-9). Cada caractere antes do dígito do comprimento da execução (o último dígito antes de um não dígito ou final da sequência) tem esse valor aplicado individualmente e impresso em ordem.
Algumas entradas e saídas de teste, incluindo alguns casos extremos:
input output
ab3c5 aaabbbccccc
a0b3 bbb
13b1 111b
a13b1 aaa111b
a123b1 aaa111222b
aa2a1b1 aaaaab
- Uma sequência de caracteres (
[a-zA-Z0-9]+
) deve ser seguida pelo comprimento da execução ([0-9]
) - Somente entradas válidas precisam ser consideradas (
([a-zA-Z0-9]+[0-9])*
)- sim, uma string vazia é uma entrada válida.
- Entrada é via entrada padrão, saída via saída padrão
Este é o código golf, o número de bytes determina o vencedor.
Respostas:
Pip, 22 + 1 = 23 bytes
Usa
-r
sinalizador. Observe que isso exige que você 1) insira um EOF após a entrada (Ctrl-D no Linux, Ctrl-Z no Windows) ou 2) canalize a entrada de outro lugar.Explicação:
O resultado da operação do mapa é na verdade uma lista de listas, mas por padrão as listas são simplesmente concatenadas quando impressas, portanto, nenhuma conversão manual em string é necessária.
Exemplo, com entrada
a13b1
:Pip tem suporte básico a regex a partir de ... 2 dias atrás . Ótimo momento!
fonte
-r
bandeira. (A questão especifica que a entrada tem de vir do STDIN.)q
vez dea
sem sinalizadores extras, mas parece haver um bug e está solicitando a entrada duas vezes.Perl / Bash
5440 + 1 = 41 bytesÉ basicamente uma regex dentro de uma regex. E um pouco de mágica.
Explicação
A regex externa
/(\D*\d*)(\d)/g
extrai cada grupo codificado em toda a execução. Capturamos o material para repetir$1
e o número de repetições$2
. Agora, substituímos cada um desses grupos pela expansão desse grupo. Para isso, avaliamos o código"\$1=~s/./\$&x$2/egr"
duas vezes (como pela/ee
bandeira na substituição externa).A primeira avaliação interpola apenas o número de repetições na string - as outras variáveis são protegidas por uma barra invertida. Então, assumindo a entrada
a14
, agora teríamos o código$1=~s/./$&x4/egr
, que será avaliado novamente.Isso aplicará a substituição ao conteúdo de
$1
(o material a repetira1
). A substituição corresponde a cada caractere.
. A$&
variável mantém toda a correspondência, que repetimosx4
vezes. Fazemos isso/g
globalmente para cada correspondência e/r
retornamos a string substituída em vez de modificar a$1
variável (que é somente leitura). Portanto, o resultado da substituição interna éaaaa1111
.A
-p
bandeira aplica a substituição a cada linha de entrada e imprime o resultado.fonte
-p
modificador. Eu conto 45 bytes. Além disso, você deve poder usar em\D
vez de[a-z]
, o que também eliminou a necessidadei
.CJam,
33 3127 bytesUghh, a falta de expressões regulares torna isso muito longo ...
Como funciona
Percorremos todos os caracteres da sequência de entrada e, em cada iteração, controlamos o último caractere encontrado (começando com um caractere vazio pela primeira vez). Em seguida, verificamos se o caractere atual não é numérico e o último caractere é numérico. Nesse caso, repetimos cada caractere anterior (que ainda não foi repetido), o número de vezes.
(Uma expansão de código um pouco desatualizada)
Experimente online aqui
fonte
rs ,
4371 caracteresBem, isso virou muito rapidamente. Números estúpidos ...
Experimente aqui!
Versão original (não funcionou com entradas como
123
):Explicação
A primeira linha coloca espaços entre as execuções que contêm números, por exemplo, se transformando
a313
ema3 13
.A segunda linha expande continuamente as codificações compactadas como
aa5
aa5a5
.A terceira linha converte todas as instâncias
a5
emaaaaa
usando o operador de repetição .A última linha remove os espaços.
fonte
a123b1
?Javascript ( ES6 ),
8683 bytesComentado:
fonte
alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(c+1).join(b)))
fará o mesmo? Tem apenas 71 bytes de comprimento.Array(6).join('12')
e ele retornará'1212121212'
.alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(-~c).join(b)))
(mesmos 71 bytes de comprimento, testado em es6fiddle.net/ia7gocwg )CJam,
2725 bytesExperimente on-line no intérprete CJam .
Como funciona
fonte
Pitão,
333228 bytesExperimente on-line: demonstração ou equipamento de teste
Explicação
Vou explicar o código usando a entrada de exemplo
aa1a23b2
. Espero que isso seja um pouco mais fácil de seguir do que sem.fonte
Ruby 73
Testes: http://ideone.com/L1fssb
fonte
JavaScript 112
fonte
Python 2.7, 98 bytes
Isso apenas faz uma pesquisa simples em regex por dígitos que não são seguidos por um dígito e, em seguida, faz a aritmética da string em cada grupo e junta todos eles novamente.
fonte
raw_input
torna-seinput
masprint
precisa de parênteses.Julia,
105999587 bytesIsso cria uma função sem nome que recebe uma string como entrada a retorna uma string. Para chamá-lo, dê um nome, por exemplo
f=s->...
.Aqui são usadas duas compreensões de matriz, uma aninhada na outra. A compreensão externa atua em cada correspondência da sequência de entrada contra a expressão regular
\D*\d*\d
. A compreensão interna repete cada caractere da correspondência de acordo com o dígito à direita. Os elementos da matriz interna são unidos em uma string, portanto a matriz externa é uma matriz de strings. Estes são unidos e retornados.Em Julia, cadeias de caracteres podem ser tratadas como matrizes de caracteres. No entanto, observe que os tipos
Char
eString
em Julia não têm os mesmos métodos definidos; em particular, não existe método para repetição usando^
para caracteres. Isso usa uma solução alternativa complicada:chop()
.string()
.int('4')
não retorna 4. Em vez disso, ele retorna o ponto de código, que neste caso é 52. Assim, podemos subtrair 48 para recuperar o número inteiro real.string(b)
acordo comint(p[end]) - 48
.Exemplos:
fonte
Python 3,
148144136135 BytesObrigado a Pietu1998 e mbomb007 pelas sugestões.
Python 2,
161151147139138 BytesTalvez hoje tenha sido apenas um longo dia de trabalho, mas não consigo descobrir como jogar isso ..
fonte
raw_
fora, parênteses paraprint
).len(d)>0
pode ser substituído pord
uma lista vazia ser falsa e uma lista não vazia ser verdadeira.list(...)
pode ir direto para ofor
. Os colchetesw([...])
são desnecessários, pois esse é o único argumento. Você pode remover o espaço) for
. Essas são todas as pequenas coisas que inventei até agora.list()
pois as strings são iteráveis. Você pode usarw=r=''
. Se você estiver disposto a mudar muito, consulte minha solução. :)if c.isdigit()
pode se tornarif'/'<c<':'
, se não me engano.Java 7, 175 bytes
O desafio é mais difícil do que parece, imo ..
Ungolfed & código de teste:
Experimente aqui.
Resultado:
fonte