Tìm số nguyên nối tiếp


16

Bài tập

Viết chương trình sẽ lấy (làm đầu vào) một số nguyên dương. Sau đó, nó sẽ đếm từ 0, nối từng số nguyên vào a String, chỉ tiếp tục nếu độ dài của Stringgiá trị nhỏ hơn giá trị của đầu vào.

Một số nguyên được tuần tự hóa được định nghĩa là số nguyên được hình thành đầy đủ với giá trị tối đa thuộc về String. Theo "hình thành đầy đủ", số nguyên sẽ không có chữ số bị thiếu (điều này sẽ xảy ra nếu giới hạn độ dài của số Stringđược đáp ứng).

Đầu ra của chương trình phải là số nguyên được tuần tự hóa cho đầu vào tích cực tương ứng của nó.


Quy tắc

  • Đó là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng!
  • Đầu vào sẽ luôn luôn tích cực.
  • Đầu ra phải là một số nguyên trong cơ sở 10 (thập phân).
  • Chương trình phải được lập chỉ mục 0.

Ví dụ đầu vào | Đầu ra

   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)

Lưu ý


6
trường hợp thử nghiệm được đề xuất:11
Rod

@Rod Đã thêm nó, hy vọng nó làm cho nó dễ hiểu hơn!
Jacob G.

Thêm dấu ngoặc kép vào chuỗi trong các ví dụ có thể giúp dễ hiểu rằng đó là chuỗi.
isaacg

Vì vậy, các N-1chữ số đầu tiên của hằng số Champernowne , với một tiền tố 0?
Mego

Câu trả lời:


8

JavaScript (ES6), 40 37 byte

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

Chỉnh sửa: Đã lưu 3 byte với một số trợ giúp từ @Arnauld.




5

Japt , 13 byte

1n@P±X l >U}a

Kiểm tra nó trực tuyến!

Giải trình

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




4

Thạch ,  11 10  9 byte

RD;\L€<⁸S

Một liên kết đơn âm lấy một số nguyên dương và trả về một số nguyên không âm.

Hãy thử trực tuyến!

Làm sao?

chỉnh sửa ...

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)


3

Perl 6 , 36 byte

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

Hãy thử trực tuyến!

  • 0 ...^ {...}là dãy số từ 0 cho đến khi nhỏ hơn số mà khối mã trong dấu ngoặc nhọn trả về true. (... không có dấu mũ sẽ trả về số đầu tiên mà khối trả về đúng.)
  • [~] 0 .. $^a là sự kết hợp của các số từ 0 tối đa số hiện tại $^a(tham số cho khối mã).
  • .comblà danh sách tất cả các ký tự (chữ số) trong chuỗi nối. Giải thích như một số, nó ước tính độ dài của chuỗi. .charssẽ tự nhiên hơn khi sử dụng ở đây, vì nó đánh giá trực tiếp độ dài của chuỗi, nhưng tên dài hơn một ký tự.
  • $_ là đối số của hàm cấp cao nhất.
  • [*-1] chọn phần tử cuối cùng của danh sách được tạo.

2

QBIC , 34 byte

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

Giải trình

{           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


2

J, 26 byte

(>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




0

Java 8, 64 byte

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

Hoặc các lựa chọn thay thế nhỏ có cùng số byte:

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

Giải trình:

Hãy thử nó ở đây.

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


0

Ruby, 44 byte

Lấy cảm hứng từ câu trả lời JAVA của Kevin Cruijssen. -4 byte nhờ G B.

->n{i,t=0,'';t+="#{i+=1}"while t.size<n;i-1}

(i + = 1; t + = i.to_s) giống như t + = "# {i + = 1}", chỉ dài hơn 4 byte
GB

Và nếu bạn làm điều đó, bạn không cần biến t nữa, bạn có thể trừ kích thước từ n và sau đó so sánh với 0.
GB

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.