Encontre o Inteiro Serializado

16

Tarefa

Escreva um programa que receberá (como entrada) um número inteiro positivo. Ele será contado a partir de 0, acrescentando cada número inteiro a String, continuando apenas se o comprimento do Stringfor menor que o valor da entrada.

Um número inteiro serializado é definido como o número inteiro completo com o valor máximo pertencente a String. Por "totalmente formado", o número inteiro não deve ter dígitos ausentes (o que ocorreria se a restrição de comprimento do Stringfosse atendida).

A saída do programa deve ser o número inteiro serializado para sua respectiva entrada positiva.


Regras

  • É código de golfe, então a resposta mais curta (em bytes) vence!
  • A entrada sempre será positiva.
  • A saída deve ser um número inteiro na base 10 (decimal).
  • O programa deve ser indexado em 0.

Exemplo de entrada | Resultado

   5 | 4   (0 1 2 3 4              - Length of 5)
  11 | 9   (0 1 2 3 4 5 6 7 8 9 1  - Length of 11)
  12 | 10  (0 1 2 3 4 5 6 7 8 9 10 - Length of 12)
1024 | 377 (0 1 2 3 4 5 6 7 8 ...  - Length of 1024)

Notas)

Jacob G.
fonte
6
caso de teste sugerido:11
Rod
@ Rod Adicionou, espero que seja mais fácil de entender!
Jacob G.
Adicionar aspas à sequência nos exemplos pode facilitar a compreensão de que é uma sequência.
Isaacg
Então, os primeiros N-1dígitos da constante Champernowne , com um 0prefixo?
Mego 14/11

Respostas:

8

JavaScript (ES6), 40 37 bytes

f=(n,i=s='0')=>(s+=++i)[n]?i-1:f(n,i)
<input type=number min=1 value=1 oninput=o.textContent=f(this.value)><pre id=o>0

Editar: salvou 3 bytes com alguma ajuda do @Arnauld.

Neil
fonte
6

05AB1E , 10 7 bytes

Idéia para usar prefixos da resposta de Jonathan's Jelly

LηJ€g›O

Experimente online!

Explicação

L         # range [1 ... input]
 η        # prefixes
  J       # join each to string
   €g     # get length of each string
     ›    # input is greater than string length
      O   # sum
Emigna
fonte
5

Japonês , 13 bytes

1n@P±X l >U}a

Teste online!

Explicação

1n@ P± X l >U}a
1nX{P+=X l >U}a
                   Implicit: U = input integer, P = empty string
  X{         }a    Return the first integer X in [0, 1, 2, ...] that returns a truthy value:
    P+=X             Append X to P.
         l >U        Return P.length > U.
                   This returns the first integer that can't fit into the U-char string.
1n                 Subtract 1 from the result.
                   Implicit: output result of last expression
ETHproductions
fonte
4

Haskell , 55 53 50 bytes

(n#x)a|l<-a++show x=last$x-1:[n#l$x+1|length l<=n]

Experimente online!

O uso é (1024#"") 0

H.PWiz
fonte
4

Geléia ,  11 10  9 bytes

RD;\L€<⁸S

Um link monádico que pega um número inteiro positivo e retorna um número inteiro não negativo.

Experimente online!

Quão?

editando ...

RD;\L€<⁸S - link: number n
R         - range -> [1,2,...10,11,...,n-1]
 D        - convert to decimal (vectorises) -> [[1],[2],...,[1,0],[1,1],...D(n-1)]
   \      - cumulative reduce by:
  ;       -   concatenation -> prefixes i.e.: [[1],[1,2],...,[1,2,...,1,0],[1,2,...,1,0,1,1],[1,2,...,1,0,1,1,...Flattened(D(n))]]
    L€    - length of €ach -> [1,2,3,...,11,13,...,length([1,2,...,1,0,1,1,...Flattened(D(n))])]
       ⁸  - chain's left argument, n
      <   - less than? (vectorises)
        S - sum (yields the number of prefixes that are less than or equal in length to n)
          -   Note: `0` is excluded from the range and all the prefixes, but including
          -         it would mean comparing to n+1 AND decrementing at the end (for a
          -         total cost of a byte)
Jonathan Allan
fonte
4

Pitão, 8 7 bytes

tf<Q=+d

Experimente online. Suíte de teste.

PurkkaKoodari
fonte
Eu amo isso! Usar a fatia como comparação é brilhante.
Isaacg
@isaacg É uma das boas características de golfe de Pyth (on). Tive a ideia quando vi a resposta de Neil (indexar em vez de cortar, mas a mesma ideia). < num seqtambém foi muito útil.
PurkkaKoodari
3

Perl 6 , 36 bytes

{(0...^{([~] 0..$^a).comb>$_})[*-1]}

Experimente online!

  • 0 ...^ {...}é a sequência de números de zero a um menor que o número para o qual o bloco de código entre chaves retorna verdadeiro. ( ...sem o sinal de intercalação retornaria o primeiro número para o qual o bloco retornou verdadeiro.)
  • [~] 0 .. $^aé a concatenação de números 0até o número atual $^a(o parâmetro para o bloco de código).
  • .combé uma lista de todos os caracteres (dígitos) na sequência concatenada. Interpretado como um número, ele avalia o comprimento da sequência. .charsseria mais natural usar aqui, pois ele avalia diretamente o comprimento da string, mas o nome é um caractere mais longo.
  • $_ é o argumento para a função de nível superior.
  • [*-1] seleciona o último elemento da lista gerada.
Sean
fonte
2

QBIC , 34 bytes

{A=!p$~_lB+A|>:|_xp-1|\B=B+A]p=p+1

Explicação

{           DO infinitely
A=!p$       Set A$ to p cast to num
            Note that p starts out as 0.
~      >:   IF the input number is exceeded by
 _l   |     the length of
   B+A      A$ and B$ combined
_xp-1|      THEN QUIT, printing the last int successfully added to B$
            The _X operator quits, (possibly) printing something if followed by a-zA-Z
            _x is slightly different, it prints the expression between the operator _x and |
\B=B+A      ELSE add A$ to B$
]           END IF
p=p+1       Raise p, and rerun
steenbergh
fonte
2

J, 26 bytes

(>i:1:)([:+/\[:>.10^.1+i.)

((>i:1:)([:+/\[:>.10^.1+i.))"0 ] 5 11 12 1024 2000 20000 100000 1000000
4 9 10 377 702 5276 22221 185184
Eelvex
fonte
1

R , 43 bytes

n=scan();sum(cumsum(floor(log10(1:n))+1)<n)

Experimente online!

Freira Furada
fonte
0

WendyScript , 42 bytes

<<f=>(x){<<n=""#i:0->x{n+=i?n.size>=x/>i}}

f(1024) // returns 377

Experimente online!

Ungolfed:

let f => (x) {
  let n = ""
  for i : 0->x { 
    n+=i
    if n.size >= x 
    ret i
  }
  ret
}
Felix Guo
fonte
0

PHP, 41 bytes

while(strlen($s.=+$i++)<=$argn);echo$i-2;

Experimente online .

Titus
fonte
0

Java 8, 64 bytes

n->{int i=0;for(String t="0";;t+=++i)if(t.length()>n)return~-i;}

Ou pequenas alternativas com a mesma contagem de bytes:

n->{int i=0;for(String t="";;t+=i++)if(t.length()>n)return i-2;}
n->{int i=-1;for(String t="";;t+=++i)if(t.length()>n)return~-i;}

Explicação:

Experimente aqui.

n->{                  // Method with integer as both parameter and return-type
  int i=0;            //  Integer `i`, starting at 0
  for(String t="0";   //  String, starting at "0"
      ;               //  Loop indefinitely
       t+=++i)        //    After every iteration: append the String with `i+1`
                      //    by first increasing `i` by 1 with `++i`
    if(t.length()>n)  //   If the length of the String is larger than the input:
      return~-i;      //    Return `i-1`
                      //  End of loop (implicit / single-line body)
}                     // End of method
Kevin Cruijssen
fonte
0

Ruby, 44 bytes

Inspirado na resposta JAVA de Kevin Cruijssen. -4 bytes graças a G B.

->n{i,t=0,'';t+="#{i+=1}"while t.size<n;i-1}
Nome em Exibição
fonte
(i + = 1; t + = i.to_s) é o mesmo que t + = "# {i + = 1}", apenas 4 bytes mais
GB
E se você fizer isso, não precisará mais da variável t, poderá subtrair o tamanho de n e comparar com 0.
GB
0

Perl 5 , 31 + 1 ( -p) = 32 bytes

$".=++$\while$_>=length$"}{$\--

Experimente online!

Xcali
fonte