Fita métrica String


15

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 :

  1. Seu programa deve ter um parâmetro inteiro positivo, para o comprimento total da cadeia de fita métrica
  2. 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 !
    1. Os comprimentos são medidos desde o início da string até o final de cada número
  3. O maior número possível de comprimento deve ser incluído na string
  4. Evite ambiguidade. Separadores / delimitadores podem ser usados ​​para evitar a justaposição de números, ou seja, 12diz doze, não um, dois.
  5. A cadeia deve sempre relatar com precisão seu comprimento total no final, sem separadores à direita
  6. 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--4ou -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--11ou ou 1-3-5--8-11ou 1-3--6-8-11ou 1--4-6-8-11ou -2-4-6-8-11(todos têm o maior número possível de comprimentos e terminam com o comprimento total do fio)

Portanto, cada dígito na sequência não é adjacente a outro dígito, a sequência é composta inteiramente por traços -e você precisa ter o máximo de marcas de comprimento possível na sequência?
Rɪᴋᴇʀ

Podemos usar a indexação baseada em 0?
Rɪᴋᴇʀ

A Regra 3 do @EasterlyIrk deve incluir o maior número possível de números na string.
Post Rock Garf Hunter


@EasterlyIrk, você não pode ter todos os traços, pois isso não atende à motivação e quebra as regras 3 e 5. Não há indexação. Apenas comprimentos. Portanto, não, uma fita métrica de comprimento um não pode ser 0.
Tom Viner

Respostas:


12

Python, 50 48 47 46 bytes

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

Explicação

Solução lambda recursiva bastante simples

Nossos casos base são 1 e 0, os quais são cobertos por "1"*xoutra forma, obtemos a sequência de -xwith `-x`e acrescentamos o resultado de chamar a função em len(`-x`)menos.


1
Você pode salvar bytes restringindo -x?
Martin Ender

@MartinEnder Ok, eu consegui trabalhar. Obrigado pela dica! Eu me sinto meio idiota por não perceber isso antes.
Post Rock Garf Hunter

5

Mathematica, 67 57 bytes

Agradecimentos a Martin Ender por descartar 10 bytes!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

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:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&salva um byte, evitando o Ife um monte de bytes, evitando IntegerStringe "-"<>.
Martin Ender

1
omg, _@__é mágica do mal
Greg Martin

3

JavaScript (ES6), 49 bytes

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
Eu acho que você precisa definirf
Tom Viner

@ TomViner Estou sempre fazendo isso. (Pelo menos eu tive a contagem de byte direita.)
Neil


1

Perl 6 , 43 bytes

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

Explicação:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

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-10e, a partir disso, a sequência final1-3-5-7-10 .

Experimente online .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.