Znajdź szeregową liczbę całkowitą

16

Zadanie

Napisz program, który weźmie (jako dane wejściowe) dodatnią liczbę całkowitą. Następnie odlicza 0, dodając każdą liczbę całkowitą do a String, kontynuując tylko, jeśli długość Stringjest mniejsza niż wartość wejściowa.

Odcinkach liczba całkowita jest określona jako w pełni uformowanej całkowitą o maksymalnej wartości należące doString . Przez „w pełni uformowany” liczba całkowita nie powinna zawierać brakujących cyfr (co mogłoby się zdarzyć, gdyby spełnione było ograniczenie długości String).

Wyjście programu powinno być serializowaną liczbą całkowitą dla jego odpowiedniego, dodatniego wejścia.


Zasady

  • To jest golf golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach)!
  • Dane wejściowe zawsze będą dodatnie.
  • Dane wyjściowe muszą być liczbami całkowitymi w bazie 10 (dziesiętne).
  • Program musi być indeksowany jako 0.

Przykładowe dane wejściowe | Wynik

   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)

Uwaga (y)

Jacob G.
źródło
6
sugerowany przypadek testowy:11
Rod
@Rod Dodał go, mam nadzieję, że łatwiej to zrozumieć!
Jacob G.,
Dodanie znaków cudzysłowu do ciągu w przykładach może ułatwić zrozumienie, że jest to ciąg.
isaacg,
Więc pierwsze N-1cyfry stałej Champernowne , z 0dopisaną?
Mego

Odpowiedzi:

8

JavaScript (ES6), 40 37 bajtów

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

Edycja: Zapisano 3 bajty z pewną pomocą @Arnauld.

Neil
źródło
6

05AB1E , 10 7 bajtów

Pomysł na użycie prefiksów z odpowiedzi Jonathan's Jelly

LηJ€g›O

Wypróbuj online!

Wyjaśnienie

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
źródło
5

Japt , 13 bajtów

1n@P±X l >U}a

Przetestuj online!

Wyjaśnienie

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
ETHprodukcje
źródło
4

Haskell , 55 53 50 bajtów

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

Wypróbuj online!

Wykorzystanie jest (1024#"") 0

H.PWiz
źródło
4

Galaretka ,  11 10  9 bajtów

RD;\L€<⁸S

Łącze monadyczne przyjmujące dodatnią liczbę całkowitą i zwracające nieujemną liczbę całkowitą.

Wypróbuj online!

W jaki sposób?

redagowanie...

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
źródło
4

Pyth, 8 7 bajtów

tf<Q=+d

Wypróbuj online. Zestaw testowy.

PurkkaKoodari
źródło
Kocham to! Używanie krojenia jako porównania jest genialne.
isaacg,
@isaacg Jest to jedna z fajnych cech gry w golfa w Pyth (on). Wpadłem na pomysł, gdy zobaczyłem odpowiedź Neila (indeksowanie zamiast krojenia, ale ten sam pomysł). < num seqbył również bardzo pomocny.
PurkkaKoodari,
3

Perl 6 , 36 bajtów

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

Wypróbuj online!

  • 0 ...^ {...}jest sekwencją liczb od zera do jednej mniejszej niż liczba, dla której blok kodu w nawiasach klamrowych zwraca wartość true. (... bez karetki zwróciłby pierwszą liczbę, dla której blok zwrócił wartość prawda).
  • [~] 0 .. $^ato konkatenacja liczb od 0bieżącej liczby $^a(parametr do bloku kodu).
  • .combto lista wszystkich znaków (cyfr) w połączonym ciągu. Zinterpretowany jako liczba, ocenia długość łańcucha. .charsbyłoby bardziej naturalne użycie tutaj, ponieważ oblicza bezpośrednio długość łańcucha, ale nazwa jest dłuższa o jeden znak.
  • $_ jest argumentem funkcji najwyższego poziomu.
  • [*-1] wybiera ostatni element wygenerowanej listy.
Sean
źródło
2

QBIC , 34 bajty

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

Wyjaśnienie

{           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
źródło
2

J, 26 bajtów

(>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
źródło
1

R , 43 bajty

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

Wypróbuj online!

Leaky Nun
źródło
0

WendyScript , 42 bajty

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

f(1024) // returns 377

Wypróbuj online!

Nie golfowany:

let f => (x) {
  let n = ""
  for i : 0->x { 
    n+=i
    if n.size >= x 
    ret i
  }
  ret
}
Felix Guo
źródło
0

PHP, 41 bajtów

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

Wypróbuj online .

Tytus
źródło
0

Java 8, 64 bajty

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

Lub niewielkie alternatywy o tej samej liczbie bajtów:

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;}

Wyjaśnienie:

Wypróbuj tutaj.

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
źródło
0

Rubinowy, 44 bajty

Zainspirowany odpowiedzią JAVA Kevina Cruijssena. -4 bajty dzięki G B.

->n{i,t=0,'';t+="#{i+=1}"while t.size<n;i-1}
wyświetlana nazwa
źródło
(i + = 1; t + = i.to_s) jest taki sam jak t + = "# {i + = 1}", tylko 4 bajty dłużej
GB
A jeśli to zrobisz, nie potrzebujesz już zmiennej t, możesz odjąć rozmiar od n, a następnie porównać z 0.
GB