Motivação : Às vezes, você precisa saber onde está uma string. Você deseja poder olhar para qualquer parte de uma string e saber exatamente onde você está, na medida do possível.
Desafio : escreva um programa para produzir uma sequência de fita métrica de um determinado comprimento. Uma corda de fita métrica própria descreve seu comprimento o mais longe possível, ao longo de seu próprio comprimento.
Regras :
- Seu programa deve ter um parâmetro inteiro positivo, para o comprimento total da cadeia de fita métrica
- Para cada seqüência de dígitos contígua na saída, esses dígitos devem informar com precisão o comprimento da saída até agora - inclusive !
- Os comprimentos são medidos desde o início da string até o final de cada número
- O maior número possível de comprimento deve ser incluído na string
- Evite ambiguidade. Separadores / delimitadores podem ser usados para evitar a justaposição de números, ou seja,
12
diz doze, não um, dois. - A cadeia deve sempre relatar com precisão seu comprimento total no final, sem separadores à direita
- Você pode precisar de vários separadores para manter os comprimentos precisos, por exemplo, aqui está um exemplo de uma fita métrica de comprimento 4:
1--4
Exemplos não prescritivos / exaustivos:
- fita métrica de comprimento 1:
1
- fita métrica de comprimento 2:
-2
- fita métrica de comprimento 3:
1-3
- fita métrica de comprimento 4:
1--4
ou-2-4
(ambos os comprimentos de relatório o mais rápido possível, ou seja, duas vezes e terminam com o comprimento total correto) - fita métrica de comprimento 10:
1-3-5-7-10
- fita métrica de comprimento 11:
1-3-5-7--11
ou ou1-3-5--8-11
ou1-3--6-8-11
ou1--4-6-8-11
ou-2-4-6-8-11
(todos têm o maior número possível de comprimentos e terminam com o comprimento total do fio)
-
e você precisa ter o máximo de marcas de comprimento possível na sequência?0
.Respostas:
Python,
50484746 bytesExplicação
Solução lambda recursiva bastante simples
Nossos casos base são 1 e 0, os quais são cobertos por
"1"*x
outra forma, obtemos a sequência de-x
with`-x`
e acrescentamos o resultado de chamar a função emlen(`-x`)
menos.fonte
-x
?Mathematica,
6757 bytesAgradecimentos a Martin Ender por descartar 10 bytes!
Função sem nome, usando um argumento inteiro não negativo e retornando uma string. Praticamente o algoritmo recursivo óbvio: verifique se a string termina com o número de entrada precedido por um
"-"
e, em seguida, chame a função novamente usando#0
.Mas há muita diversão na implementação do algoritmo.
""["1"][[#]]
denota o#
th argumento da expressão""["1"]
: o 0th argumento é a cabeça""
e o 1º argumento é visivelmente"1"
, o que fornece os casos básicos da recursão. Se#
exceder 1, então""["1"][[#]]
lança uma mensagem de erro e permanece como uma função não avaliada. Mas então/._@__:>
é uma regra que pega qualquer função não avaliada e a transforma na expressão que vem a seguir, que é a chamada recursiva para a função original.Submissão original:
fonte
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&
salva um byte, evitando oIf
e um monte de bytes, evitandoIntegerString
e"-"<>
._@__
é mágica do malJavaScript (ES6), 49 bytes
fonte
f
Pitão, 23 bytes
Roubou descaradamente a solução recursiva do assistente de trigo resposta . Além disso, acredito que isso não é jogado corretamente.
Experimente aqui!
fonte
Perl 6 , 43 bytes
Explicação:
Por exemplo, para a entrada 10, ela gera a sequência
(-10, -7, -5, -3, -1)
e, a partir disso, a sequência-1-3-5-7-10
e, a partir disso, a sequência final1-3-5-7-10
.Experimente online .
fonte