Trả về chữ số thứ n của chuỗi chuỗi aliquot


20

0. ĐỊNH NGH

Một chuỗi là một danh sách các số.
Một chuỗi là tổng của một danh sách các số.
Tập hợp các số tự nhiên chứa tất cả "số nguyên không âm lớn hơn 0".
Một ước (trong bối cảnh này) của một số tự nhiên k là một số tự nhiên tôi , như vậy mà k ÷ i cũng là một số tự nhiên.

1. UY TÍN

Một vài câu hỏi khác trên trang web này đề cập đến khái niệm về phần tử hoặc chuỗi các ước của số tự nhiên a nhỏ hơn a . Xác định các số có thể liên quan đến việc tính toán tổng của các ước này, được gọi là một chuỗi tổng hoặc aliquot. Mỗi số tự nhiên có tổng số riêng của nó, mặc dù giá trị của tổng số của một số không nhất thiết phải là duy nhất cho số đó. ( Exempli gratia , mọi số nguyên tố có tổng số tiền là 1.)

2. THÁCH THỨC

Cho một số tự nhiên n, trả về nchữ số thứ tự của chuỗi các khoản tiền. Một số chuỗi đầu tiên trong chuỗi, bắt đầu với chuỗi cho 1, là:

{0, 1, 1, 3, 1, 6, 1, 7, 4, 8, 1, 16, 1, 10, 9, 15, 1, 21, 1, 22, 11, 14, 1, 36, 6, 16, 13}

Nối liền, trông giống như:

0113161748116110915121122111413661613

Đầu vào có thể là không có chỉ mục hoặc một chỉ mục, theo sở thích của bạn. Các giải pháp phải là các chương trình hoặc chức năng có khả năng trả về chữ số thứ 10.000 (đầu vào tối đa 9999hoặc 10000). Giải pháp làm việc ngắn nhất sẽ thắng.

3. TRƯỜNG HỢP KIỂM TRA

Các cặp đầu vào-đầu ra chính xác phải bao gồm, nhưng không giới hạn ở những điều sau:

   0 or     1    ->    0
   4 or     5    ->    1
  12 or    13    ->    6
9999 or 10000    ->    7

Số đứng trước "hoặc" là 0 được lập chỉ mục; số sau đây là 1 chỉ mục.
Trường hợp thử nghiệm bổ sung có thể được cung cấp theo yêu cầu.

4. TÀI LIỆU THAM KHẢO

OEIS có một danh sách các số và tổng của chúng.


2
Thử thách đầu tiên tốt đẹp, btw. :)
Martin Ender

1
nếu ngôn ngữ không thể quản lý chuỗi ký tự 10k ?? (ví dụ: giới hạn 4k Oracle SQL khủng khiếp ) là câu trả lời hợp lệ nếu đó là giới hạn ngôn ngữ?
Giacomo Garabello

@MartinEnder, cảm ơn! Và cảm ơn vì liên kết đó; nó đã được khai sáng Có bất cứ điều gì ngoài đó giải thích làm thế nào để điều trị câu trả lời trong các ngôn ngữ với những hạn chế? Tôi không thể tìm thấy bất cứ điều gì, nhưng tôi biết điều đó không có nghĩa là nó không có ở đó. :)
Joe

Tôi có thể hoàn toàn dày, nhưng các số trong chuỗi đó được tính như thế nào?
Tom Carpenter

@TomCarpenter: Đối với phần tử đầu tiên, lấy tất cả các ước của 1 nhỏ hơn 1 và cộng chúng lại với nhau. (1 là ước số duy nhất của 1, vì vậy phần tử đầu tiên kết thúc bằng không.) Phần tử thứ hai, ước số của 2 nhỏ hơn 2 (chỉ có 1 phù hợp với điều này); thứ ba, ước của 3 (vẫn chỉ là 1); vân vân Các ước của 4 là {1, 2} và 1 + 2 == 3, vì vậy phần tử thứ tư là 3. Tôi cũng mất một lúc để tìm ra nó;)
Joe

Câu trả lời:


6

05AB1E , 14 11 10 byte

Tính n = 9999 trong khoảng 15 giây. Mã số:

ÌL€Ñ€¨OJ¹è

Giải trình:

Ì           # Increment implicit input by 2
 L          # Generate the list [1 .. input + 2]
  ۄ        # For each, get the divisors
    ۬      # For each, pop the last one out
      O     # Sum all the arrays in the array
       J    # Join them all together
        ¹è  # Get the nth element

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


6

Toán học, 51 byte

Array[##&@@IntegerDigits[Tr@Divisors@#-#]&,#][[#]]&

Hàm không tên được nhận và trả về một số nguyên và sử dụng lập chỉ mục dựa trên 1. Xử lý đầu vào 10000ngay lập tức.

Giải trình

Đây là một triển khai rất rõ ràng của định nghĩa, sử dụng thực tế là các ntổng ước đầu tiên luôn luôn đủ để xác định nchữ số thứ. Như thường lệ, thứ tự đọc của Mathematica golf là một chút buồn cười:

Array[...&,#]...&

Điều này tạo ra một danh sách với tất cả các kết quả của việc áp dụng chức năng giấu tên ở bên trái để tất cả các giá trị itừ 1để ntoàn diện.

...Tr@Divisors@#-#...

Chúng tôi bắt đầu bằng cách tính toán các ước số i, tổng hợp chúng Trvà trừ đi iđể nó chỉ là tổng của các ước số nhỏ hơn i.

...IntegerDigits[...]...

Điều này biến kết quả thành một danh sách các chữ số thập phân của nó.

##&@@...

Và điều này loại bỏ đầu "danh sách", để tất cả các danh sách chữ số được tự động nối với nhau trong kết quả của Array. Để biết thêm chi tiết về cách thức ##hoạt động, hãy xem phần "Trình tự lập luận" trong bài viết này .

...[[#]]

Cuối cùng, chúng tôi chọn nchữ số thứ từ kết quả.


4

Brachylog , 40 byte

:2-I,?:?:1yrc:Im.;0.
:1e:2f+.
>.>0,?:.%0

Đây là 1 chỉ mục, mất khoảng 0,15 giây N = 100, 15 giây cho N = 1000. Tôi hiện đang chạy N = 10000, tôi sẽ báo cáo thời gian chạy sau khi kết thúc (Nếu ước tính của tôi là chính xác, sẽ mất khoảng 8 giờ)

Chỉnh sửa : bằng cách sửa lỗi lan truyền ràng buộc sớm trong Brachylog, giờ đây (trên mã dài hơn 3 byte) mất khoảng 2.5vài phút 10000nhưng trả về out of global stacklỗi.

Giải trình

  • Vị ngữ chính: Input = N

    :2-I,                 I = N - 2
         ?:?:1y           Find the N first valid outputs of predicate 1 with input N
               rc         Reverse and concatenate into a single number
                 :Im.     Output is the Ith digit of that number
                     ;    Or (I strictly less than 0)
                      0.  Output is 0
    
  • Vị ngữ 1: tính tổng của các ước

    :1e                   Get a number between N and 1
       :2f                Find all valid outputs of predicate 2 with that number as input
          +.              Output is the sum of those outputs
    
  • Vị ngữ 2: thống nhất đầu ra với ước số của đầu vào

    >.>0,                 Output is a number between Input and 0
         ?:.%0            Input is divisible by Output
    

1
Bạn có thể phân bổ ngăn xếp toàn cầu hơn với -Gtùy chọn. Mặc định là duy nhất 128M. Bạn có thể sử dụng ví dụ: swipl -G2Gđể sử dụng 2 GO.
chiếu

4

Pyth, 26 21 20 15 byte

@sm`sf!%dTtUdSh

Hãy thử trực tuyến. Bộ thử nghiệm.

Sử dụng lập chỉ mục dựa trên 0. Chương trình là O (n²) và hoàn thành với n = 9999 trong khoảng 14 phút trên máy 2008 của tôi.


Có chuyện gì với tìm kiếm chia số phức tạp đó? f!%dTr1dngắn hơn nhiều (nhưng cũng chậm hơn)
Jakube 12/07/2016

@Jakube rất tiếc, đã sửa đổi phiên bản sai cho giải pháp 20 byte.
PurkkaKoodari

f!%TYtUTlà những gì tôi từng có.
PurkkaKoodari

@Jakube tôi đổi sang đó. Nó vẫn đang chạy cho n = 9999, đã hơn 5 phút rồi: \
PurkkaKoodari

4

Thạch, 13 11 10 byte

2 byte nhờ @Adnan và 1 byte nữa nhờ @Dennis.

ÆDṖSDµ€Fị@

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

Sử dụng lập chỉ mục 1 dựa trên. Hoàn thành cho n = 10000 trong dưới 2 giây trực tuyến.


ÆDṖSDµ€Fị@tiết kiệm một byte.
Dennis

@Dennis vì vậy mà áp dụng cho toàn bộ chuỗi đầu tiên?
PurkkaKoodari

@ Pietu1998: Có, chính xác: nói chung, tại thời điểm phân tích cú pháp, được áp dụng cho chain.pop() if chain else chains.pop(). Chuỗi mới bắt đầu trống, vì vậy chuỗi hoàn thành cuối cùng được sử dụng thay thế.
Lynn

3

PHP, 90 byte

0 được lập chỉ mục

<?php for(;strlen($s)<=$a=$argv[1];$s.=$n)for($n=0,$j=++$i;--$j;)$i%$j||$n+=$j;echo$s[$a];

Hoàn toàn không tinh tế hoặc với một cách thông minh để tiếp cận nó cả.
Ngoài ra, như thường lệ, tạo ra ba thông báo bị bỏ qua.


3

J , 34 byte

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:

Đây là chỉ số 0 và sử dụng công thức dưới đây để tính tổng các ước số.

Công thức

Giải trình

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:  Input: n
                                >:  Increment n
                             i.@    Create the range [0, 1, ..., n]
    1                       +       Add one to each to get [1, 2, ..., n+1]
          (               )@        For each value
                        q:            Get the prime factors
                   /.~&.              For each group of equal prime factors
                #.~                     Raise the first to the first power, the second
                                        squared and so on, and sum them
             >:@                        Increment that sum
                      &.q:            Reduce the groups using multiplication
           -~                         Subtract the initial value from that sum
       ":@                            Convert each to a string
     <@                               Box each
 [:;                                Unbox each and concatenate the strings
{                                   Select the character from that string at index n
                                    and return it

2

MATL , 16 15 byte

:"@@q:\~fsV]vG)

Lập chỉ mục là 1 dựa trên.

Trường hợp thử nghiệm cuối cùng hết thời gian trong trình biên dịch trực tuyến, nhưng nó cho kết quả chính xác với trình biên dịch ngoại tuyến, trong khoảng 15 giây.

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

:         % Take input n. Push [1 2 ... n]
"         % For each k in [1 2 ... n]
  @       %   Push k
  @q:     %   Push [1 2 ... k-1]
  \       %   Modulo. Zero values correspond to divisors
  ~f      %   Indices of zeros. These are the divisors
  s       %   Sum
  V       %   Convert to string
]         % End for each
v         % Concatenate all stack contents vertically
G)        % Take n-th digit. Implicitly display

2

Haskell, 52 byte

(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!)

Ví dụ sử dụng: (([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12->6 .

Đó là một triển khai trực tiếp của định nghĩa: foreach nsum nó là ước số và chuyển đổi nó thành một chuỗi. Nối tất cả các chuỗi như vậy và chọn phần tử tại chỉ mục được yêu cầu. Sự lười biếng của Haskell chỉ lấy càng nhiều ntừ danh sách vô hạn [1..]khi cần.


1

Python 3.5, 103 93 92 byte:

R=range;A=lambda f:''.join([str(sum([j for j in R(1,i)if i/j%1==0]))for i in R(1,f+1)])[f-1]

Khá đơn giản thực hiện phương pháp được mô tả trong bài.

Dùng thử trực tuyến! (Ý)

Không hoàn thành trong vòng 5 giây được phân bổ trong trình biên dịch trực tuyến cho đầu vào 10000, nhưng nó hoàn thành trên máy của tôi cho cùng một đầu vào trong khoảng 8,5 giây.


1

Octave, 71 byte

Cái này chỉ là Octave. Nó sẽ không hoạt động trong MATLAB. Một hàm ảo được tạo để hoạt động trên các số có 1 chỉ mục. Nó có thể được đơn giản hóa hơn một chút. Sẽ có một cái nhìn tối nay.

@(x)c((c=num2str(arrayfun(@(n)sum(b(~rem(n,b=(1:n-1)))),1:x)))~=' ')(x)

Bạn có thể thử trực tuyến tại đây .

Đơn giản chỉ cần chạy lệnh ở trên, tiền tố với a=hoặc bất cứ điều gì (chỉ để bạn có thể sử dụng nó nhiều lần), và sau đó làm a(10000)hoặc bất cứ điều gì. Mất khoảng 7 giây để tính rằng chữ số thứ 10000 là 7.


1

Java 8, 220 byte

import java.util.stream.IntStream;
char a(int n){return IntStream.range(1,n+2).map(i->IntStream.range(1,i).filter(k->i%k==0).sum()).mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining("")).charAt(n);}

Chà, ít nhất thì cũng nhanh thôi. Trung bình 0,3 giây để có được phần tử 9999/10000 trên máy của tôi. Nó chỉ tạo ra nhiều khoản tiền như chỉ số bạn đã chỉ định. Điều này có nghĩa là chuỗi sẽ dài hơn một chút so với chỉ mục của bạn trong hầu hết các trường hợp, vì một số khoản tiền có 2 chữ số trở lên, nhưng đối với hầu hết các phần, nó chỉ tạo ra một chuỗi dài như chúng ta cần.

Sử dụng:

public static void main(String[] args) {
    System.out.println(a(0));
    System.out.println(a(4));
    System.out.println(a(12));
    System.out.println(a(9999));
}

Ung dung:

public static void main(String[] args) {
    System.out.println(all(0));
    System.out.println(all(4));
    System.out.println(all(12));
    System.out.println(all(9999));
}

static int aliquotSum(int n) {
    return IntStream.range(1, n).filter(k -> n % k == 0).sum();
}

static IntStream sums(int n) {
    return IntStream.range(1, n + 2).map(i -> aliquotSum(i));
}

static String arraycat(IntStream a) {
    return a.mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining(""));
}

static char all(int index) {
    return arraycat(sums(index)).charAt(index);
}
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.