Tạo số n-ary


34

Số thứ cấp là một số nguyên dương có các thừa số nguyên tố (không có bội số) đều nhỏ hơn hoặc bằng căn bậc hai của nó. 4là một số phụ, bởi vì thừa số nguyên tố duy nhất của nó là 2, bằng căn bậc hai của nó. Tuy nhiên, 15không phải là số phụ, bởi vì nó có 5yếu tố chính, lớn hơn căn bậc hai ( ~ 3.9). Bởi vì tất cả các số nguyên tố đều có chính là số nguyên tố, không có số nguyên tố nào là số phụ. Một vài số phụ đầu tiên như sau:

1, 4, 8, 9, 12, 16, 18, 24, 25, 27, 30, 32, 36, 40, 45, 48, 49, 50, 54, 56

Một số thứ ba được định nghĩa tương tự, ngoại trừ tất cả các thừa số nguyên tố phải nhỏ hơn hoặc bằng gốc khối của nó. Một số số thứ ba đầu tiên như sau:

1, 8, 16, 27, 32, 36, 48, 54, 64, 72, 81, 96, 108, 125, 128, 135, 144, 150, 160, 162

Nói chung, một số n-ary là một số có các thừa số nguyên tố đều nhỏ hơn hoặc bằng gốc n-th của nó. Do đó, một số nguyên dương x là một nsố thứ tự iff mỗi thừa số nguyên tố của nó thỏa mãn . Do đó, các số chính là tất cả các số nguyên dương (tất cả các thừa số nguyên tố nhỏ hơn hoặc bằng chính chúng), các số thứ tự có tất cả các thừa số nguyên tố của chúng nhỏ hơn hoặc bằng gốc thứ tư, v.v.ppnx

Các thách thức

Cho số nguyên knlàm đầu vào, xuất số kthứ nba. kcó thể bằng 0 hoặc một chỉ mục (lựa chọn của bạn) và nsẽ luôn dương.

Ví dụ

Đây là 20 phần tử đầu tiên trong mỗi chuỗi có tới 10 số ary:

Primary: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Secondary: 1, 4, 8, 9, 12, 16, 18, 24, 25, 27, 30, 32, 36, 40, 45, 48, 49, 50, 54, 56
Tertiary: 1, 8, 16, 27, 32, 36, 48, 54, 64, 72, 81, 96, 108, 125, 128, 135, 144, 150, 160, 162
Quarternary: 1, 16, 32, 64, 81, 96, 108, 128, 144, 162, 192, 216, 243, 256, 288, 324, 384, 432, 486, 512
5-ary: 1, 32, 64, 128, 243, 256, 288, 324, 384, 432, 486, 512, 576, 648, 729, 768, 864, 972, 1024, 1152
6-ary: 1, 64, 128, 256, 512, 729, 768, 864, 972, 1024, 1152, 1296, 1458, 1536, 1728, 1944, 2048, 2187, 2304, 2592
7-ary: 1, 128, 256, 512, 1024, 2048, 2187, 2304, 2592, 2916, 3072, 3456, 3888, 4096, 4374, 4608, 5184, 5832, 6144, 6561
8-ary: 1, 256, 512, 1024, 2048, 4096, 6561, 6912, 7776, 8192, 8748, 9216, 10368, 11664, 12288, 13122, 13824, 15552, 16384, 17496
9-ary: 1, 512, 1024, 2048, 4096, 8192, 16384, 19683, 20736, 23328, 24576, 26244, 27648, 31104, 32768, 34992, 36864, 39366, 41472, 46656
10-ary: 1, 1024, 2048, 4096, 8192, 16384, 32768, 59049, 62208, 65536, 69984, 73728, 78732, 82944, 93312, 98304, 104976, 110592, 118098, 124416

Câu trả lời:


10

Thạch , 12 byte

Æf*³<‘Ạ
1Ç#Ṫ

Lấy nk (một chỉ mục) làm đối số dòng lệnh.

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

Làm thế nào nó hoạt động

1Ç#Ṫ     Main link. Left argument: n. Right argument: k

1        Set the return value to 1.
 Ç#      Execute the helper link above for r = 1, 2, 3, ... until k of them return
         a truthy value. Yield the list of all k matches.
   Ṫ     Tail; extract the last match.


Æf*³<‘Ạ  Helper link. Argument: r

Æf       Compute all prime factors of r.
  *³     Elevate them to the n-th power.
    <‘   Compare all powers with r + 1.
      Ạ  All; return 1 if all comparisons were true, 0 if one or more were not.

Không có tiết kiệm byte ở đây, nhưng tôi vẫn đầy đặn ÆfṪ*³<‘vì chúng tôi biết rằng nếu có bất kỳ yếu tố nào làm sai lệch cái bên phải.
Jonathan Allan

6

Brachylog , 21 byte

:[1]cyt
,1|,.$ph:?^<=

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

Câu trả lời này là một chỉ mục.

Giải trình

Input: [N:K]

:[1]cy              Retrieve the first K valid outputs of the predicate below with N as input
      t             Output is the last one

,1                  Output = 1
  |                 Or
   ,.$ph            Take the biggest prime factor of the Output
        :?^<=       Its Nth power is less than the Output

6

JavaScript (ES7), 95 90 byte

Hợp lý nhanh chóng nhưng đáng buồn bị giới hạn bởi số lần thu hồi tối đa.

f=(k,n,i=1)=>(F=(i,d)=>i-1?d>1?i%d?F(i,d-1):F(i/d,x):1:--k)(i,x=++i**(1/n)|0)?f(k,n,i):i-1

Làm thế nào nó hoạt động

Thay vì bao gồm một số nguyên i và xác minh rằng tất cả các thừa số nguyên tố của nó nhỏ hơn hoặc bằng x = floor (i 1 / n ) , chúng tôi cố gắng xác nhận trực tiếp giả định sau. Đó là mục đích của hàm bên trong F () :

F = (i, d) =>         // given an integer i and a divisor d:
  i - 1 ?             //   if the initial integer is not yet fully factored
    d > 1 ?           //     if d is still a valid candidate
      i % d ?         //       if d is not a divisor of i
        F(i, d - 1)   //         try again with d-1 
      :               //       else
        F(i / d, x)   //         try to factor i/d
    :                 //     else
      1               //       failed: yield 1
  :                   //   else
    --k               //     success: decrement k

Chúng tôi kiểm tra xem có bất kỳ số nguyên d nào trong [2 ... i 1 / n ] chia i không . Nếu không, giả định không hợp lệ và chúng tôi trả về 1 . Nếu có, chúng tôi lặp lại một cách đệ quy quy trình trên i = i / d cho đến khi nó không thành công hoặc số nguyên ban đầu được bao gồm đầy đủ ( i == 1 ), trong trường hợp đó chúng tôi giảm k . Đổi lại, hàm ngoài f () được gọi đệ quy cho đến khi k == 0 .

Lưu ý: Do các lỗi làm tròn điểm nổi như 125**(1/3) == 4.9999…, giá trị tính toán thực tế cho xsàn ((i + 1) 1 / n ) .

Bản giới thiệu

(Ở đây có phiên bản ES6 97 byte để tương thích tốt hơn.)


6

JavaScript (ES7), 93 79 byte

f=(k,n,g=(i,j=2)=>i<2?--k?g(++m):m:j**n>m?g(++m):i%j?g(i,j+1):g(i/j,j))=>g(m=1)

Tôi không thể hiểu câu trả lời của Arnauld vì vậy tôi đã tự viết và thuận tiện là nó có hai byte ngắn hơn. Chỉnh sửa: Đã lưu 14 byte với sự trợ giúp từ @ETHproductions. Ung dung:

function ary(k, n) {
    for (var c = 1;; c++) {
        var m = c;
        for (var i = 2; m > 1 && i ** n <= c; i++)
            while (m % i == 0) m /= i;
        if (m == 1 && --k == 0) return c;
    }
}

Thật thú vị, tôi cũng chính xác là 93 byte trước khi tôi nhận thấy một lỗi và quyết định đánh giá ++i**(1/n)thay i**(1/n)vì các lỗi làm tròn dấu phẩy động như 125**(1/3) == 4.999.... (Cách viết, tôi nghĩ mã của bạn không bị ảnh hưởng bởi điều này.)
Arnauld

@ETHproductions Trên thực tế, tôi nhớ đưa nó vào số byte, tôi chỉ quên đưa nó vào câu trả lời ...
Neil

@ETHproductions Có vẻ hoạt động, nhưng tôi đã chuyển nhiệm vụ msang cạo thêm hai byte.
Neil

5

Haskell, 86 byte

m#n=(0:1:filter(\k->last[n|n<-[2..k],all((>0).rem n)[2..n-1],k`rem`n<1]^n<=k)[2..])!!m

Giải trình:

(%%%% biểu thị mã từ dòng trên)

    [n|n<-[2..k],all((>0).rem n)[2..n-1],k`rem`n<1]  -- generates all prime factors of k
    last%%%%^n<=k                                    -- checks whether k is n-ary
    (0:1:filter(\k->%%%%)[2..])!!m                   -- generates all n-ary nubmers and picks the m-th
     m#n=%%%%                                        -- assignment to the function #

filtervới lambda hiếm khi trả hết, một sự hiểu biết danh sách thường ngắn hơn: m#n=(0:1:[k|k<-[2..],last[n|n<-[2..k],all((>0).rem n)[2..n-1],krem n<1]^n<=k])!!m.
nimi

Ồ, bạn cũng có thể bỏ qua 0:, vì lập chỉ mục có thể dựa trên 0.
nimi

... thậm chí tốt hơn: m#n=[k|k<-[1..],last[n|n<-[1..k],all((>0).rem n)[2..n-1],kremn<1]^n<=k]!!m
nimi

3

Bình thường, 13 byte

e.f.AgL@ZQPZE

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

Hoạt động thực sự giống như giải pháp Jelly.

e.f.AgL@ZQPZE
                 Implicit: read n into Q.
            E    Read k.
 .f              Find the first k integers >= 1 for which
   .A            all
          P      prime factors of
           Z     the number
     gL          are at most
         Q       the n'th
       @         root of
        Z        the number.
e                Take the last one.

3

Perl 6, 88 byte

->\k,\n{sub f(\n,\d){n-1??n%%d??f n/d,d!!f n,d+1!!d};(1,|grep {$_>=f($_,2)**n},2..*)[k]}

Cái nhìn sâu sắc tình cờ của tôi là bạn không cần phải xem xét mọi yếu tố của nCái , chỉ là lớn nhất, đó là những gì chức năng bên trong ftính toán. Thật không may, nó thổi ngăn xếp với đầu vào lớn hơn.

Tính mạnh mẽ có thể được cải thiện bằng cách thêm một bài kiểm tra nguyên thủy, sử dụng is-primephương thức tích hợp sẵn trên Ints, với chi phí thêm vài ký tự.


3

Husk , 10 byte

!fS≤ȯ^⁰→pN

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

Giải trình

Mất một lúc để tìm ra cách sử dụng trong danh sách trống trả về 1thay vì -Infđể lại 1trong danh sách (nếu không sẽ tốn 2 byte để trả lại lần nữa):

!fS≤(^⁰→p)N  -- input n as ⁰ and k implicit, for example: 4 3
!f        N  -- filter the natural numbers by the following predicate (example on 16):
  S≤(    )   --   is the following less than the element (16) itself?
        p    --   ..prime factors (in increasing order): [2]
       →     --   ..last element/maximum: 2
     ^⁰      --   ..to the power of n: 16
             --   16 ≤ 16: yes
             -- [1,16,32,64,81..
!            -- get the k'th element: 32

2

R, 93 byte

f=function(k,n){x='if'(k,f(k-1,n)+1,1);while(!all(numbers::primeFactors(x)<=x^(1/n)))x=x+1;x}

Không có chỉ mục.

Đây là một hàm đệ quy cứ tiếp tục cho đến khi tìm thấy số tiếp theo trong dòng. Sử dụng để numbersgói để tìm các yếu tố chính.


2

MATL, 21 byte

x~`@YflG^@>~A+t2G<}x@

Giải pháp này sử dụng lập chỉ mục một dựa trên và các đầu vào là nk , tương ứng.

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

Giải trình

x       % Implicitly grab the first input and delete it
~       % Implicitly grab the second input and make it FALSE (0) (this is the counter)
`       % Beginning of the do-while loop
  @Yf   % Compute the prime factors of the current loop index
  1G^   % Raise them to the power of the first input
  @>    % Determine if each value in the array is greater than the current index
  ~A    % Yield a 0 if any of them were and a 1 if they weren't
  +     % Add this to the counter (increments only for positive cases)
  t2G<  % Determine if we have reached a length specified by the second input
}       % After we exit the loop (finally), ...
x@      % Delete the counter and push the current loop index to the stack
        % Implicitly display the result

Rất hay sử dụng ~ để tái sử dụng đầu vào thứ hai :-)
Luis Mendo

1

Brachylog v2 , 16 byte

{∧.ḋ,1⌉;?^≤}ᶠ⁽t

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

Tín dụng cho giải pháp Jelly của Dennis để giúp tôi suy nghĩ đúng hướng.

Giải trình

Đây là một phiên bản hơi vô dụng, dễ phân tích hơn:

↰₁ᶠ⁽t
∧.ḋ,1⌉;?^≤

Vị từ trợ giúp (dòng 2): đầu vào là số mũ n , đầu ra không bị giới hạn:

∧           Break implicit unification
 .ḋ         Get the prime factors of the output
   ,1       Append 1 (necessary because 1 has no prime factors and you can't take
            the max of an empty list)
     ⌉      Max (largest prime factor, or 1 if the output is 1)
      ;?    Pair that factor with the input (n)
        ^   Take factor to the power of n
         ≤  Verify that the result is less than or equal to the output

Ngữ chính (dòng 1): đầu vào là một danh sách có chứa chỉ số k (1-based) và số mũ n ; đầu ra không bị giới hạn:

  ᶠ⁽   Find the first k outputs of
↰₁     calling the helper predicate with n as input
    t  Get the last (i.e. kth) one

0

APL (NARS), 53 ký tự, 106 byte

r←a f w;c
c←0⋄r←1
→3×⍳∼∧/(πr)≤a√r⋄→0×⍳w≤c+←1
r+←1⋄→2

kiểm tra:

  1 f¨1..20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
  2 f¨1..20
1 4 8 9 12 16 18 24 25 27 30 32 36 40 45 48 49 50 54 56 
  3 f¨1..20
1 8 16 27 32 36 48 54 64 72 81 96 108 125 128 135 144 150 160 162 
  4 f¨1..20
1 16 32 64 81 96 108 128 144 162 192 216 243 256 288 324 384 432 486 512 
  10 f¨1..20
1 1024 2048 4096 8192 16384 32768 59049 62208 65536 69984 73728 78732 82944 93312 98304 104976 110592 118098 124416 


0

Japt , 14 byte

Lấy nlàm đầu vào đầu tiên và k(1 chỉ mục) làm đầu vào thứ hai.

@_k e§Vq}aXÄ}g

Thử nó

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.