Dada uma sequência de 1
e 2
de qualquer comprimento, escreva algum código (não precisa mais ser uma função , tudo ficará bem) que calcula quantas etapas é necessário para encolher a sequência para uma forma final, seguindo este critério:
Se a seqüência é 112112
, isso significa que você tem que imprimir a 1, dois 1s e a 2, como este:
1112
. Quando você realizar a operação novamente, precisará imprimir 1 e 2. Você recebe 12
. Então você imprime um 2, obtendo 2
. Esta é uma forma final, pois essa sequência não será mais alterada. Seu código será exibido 3
, pois você precisou de três etapas para chegar ao formulário final.
Outras regras
Se a sequência tiver um comprimento irregular, o último número permanecerá intocado.
Toda string que não pode mais mudar (como
222222
) é considerada uma forma final.Você não pode usar nenhuma fonte externa.
Seu código deve funcionar com todas as cadeias de caracteres
1
e2
.O código mais curto vence, pois é um código de golfe.
Seu código deve imprimir todas as etapas.
Todo método de entrada ficará bem.
Exemplos
Input >> 122122122121212212
Your code has to print:
211222111111222
11222111222
122111222
2111222
111222
1222
222
Steps:7 (you can omit the "Steps")
---- ---- ---- ----
Input >> 22222221
Your code has to print:
22222211
2222221
2
---- ---- ---- ----
Input >> 2222
Your code has to print:
0
Edição: Pesadamente editado. Sinto muito por isso.
1 11 2
. A cada dois números é um par: o primeiro número do par diz quantas vezes para renderizar o segundo número no par. Qualquer dígito ímpar final sem um parceiro de par é processado como está.Respostas:
Ruby 1.9+, 73 caracteres
Eu vejo a regra no-regex como boba e arbitrária, então aqui está umasolução baseada em regexrancorosa:Execução de teste:
A última linha é o número de etapas.
Editar: a restrição Regex foi removida pela Vereos.
fonte
C -
156154Meu primeiro código de golfe aqui!
Teste:
Resultado:
fonte
GolfScript: 69 caracteres
Toda iteração do loop interno localiza os 2 primeiros números da string e os utiliza para formar um bloco do formulário
{num1 num2 '' + *}
. Quando esse bloco é avaliado, obtemos a leitura desejada desses números. Repita isso até que não haja mais caracteres. Em seguida, repita esse loop, mantendo o controle do número de iterações e impressões.Amostra:
fonte
Python - 126
Isso não imprime o valor de entrada. Se necessário, vá
print s;
para a direita antes den="";
Nota: você disse "função", então esta é uma função. Aqui está uma versão que não é uma função (127 caracteres):
(Se eu puder fazer com que o usuário cole o número em 118 (cole dados entre aspas na primeira linha)):
Exemplo de execução:
Como bônus, cada uma dessas soluções funciona para cadeias que contêm números maiores (até 9), mas algumas cadeias produzem saídas cada vez maiores (por exemplo,
99
)fonte
JavaScript, 107
(requer suporte à função de seta, por exemplo, como no Firefox)
s
é a sequência de entradaA cada rodada, usamos o regex
.?.?
para explodirs
em uma série de seqüências de caracteres de dois caracteres, depoismap
as seqüências em suas formas reduzidas e colar a matriz novamenter
armazena o resultado da rodada atual para comparação com o anteriors
k
é o contador redondoNós abusamos horrivelmente
prompt
(com alias dep
) como um mecanismo de entrada e saída, pois ele pode apresentar uma mensagem ao usuáriofonte
Perl - 50 (+2) bytes
Requer
-pl
opções de linha de comando.Uso da amostra:
fonte
PHP, 240
Exemplo: http://skyleo.de/codegolf.php?i=211222111111222
Eu sou meio ruim em codegolf ._. Talvez eu não deva usar apenas Java e PHP (e devo pensar mais complicado)
fonte
str_split
já que pode acessar caracteres individuais em uma string, assim como uma matriz no PHP.R, 158
Exemplo:
fonte
MATHEMATICA, 117
fonte
POWERSHELL, 2
Com base na resposta da Vereos "Você pode usar qualquer método de entrada que encurte seu código" à minha pergunta nos comentários do OP, o seguinte script alcança o resultado:
Exemplo de execução para "12212212212121221212":
Obviamente, essa não é uma entrada séria - seu objetivo é ilustrar meu argumento de que permitir que qualquer método de entrada possa trivializar o código real necessário para fornecer a resposta. Portanto, o método de entrada precisa ser especificado com mais rigor.
fonte
J, 41 caracteres
Como uma função (ew parens! Não muito feliz com eles):
Vista expandida Execução de amostrafonte
Perl, 107 caracteres
O outro código perl claramente supera isso, mas pelo que vale a pena, aqui está. Eu usei a opção -l ao custo de um caractere extra:
Uma versão mais legível disso:
fonte