生成n进制数


34

次要数字是一个正整数,其主要因子(无多重性)均小于或等于其平方根。4是次级数,因为它的唯一质数是2,它等于其平方根。但是,15它不是次要数字,因为它有5一个素数,它大于平方根(~ 3.9)。因为所有素数都以素数为素,所以素数都不是次要数。前几个辅助数字如下:

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

除所有素数必须小于或等于其立方根之外,三次数的定义与此类似。前几个三级数如下:

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

通常,一个n元数是一个其素因子都小于或等于其n次方的数。因此,一个正整数Xn进制数当且仅当它的每一个素数因子的p满足pñX。因此,初等数均为正整数(所有素数均小于或等于其自身),四进制数的所有素数均小于或等于其第四根,依此类推。

挑战

给定整数kn作为输入,输出kn进制数。k可以是零索引或一索引(您的选择),并且n始终为正。

例子

这些是每个序列中的前20个元素,最多10个数字:

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

Answers:


10

果冻,12字节

Æf*³<‘Ạ
1Ç#Ṫ

nk(一个索引)作为命令行参数。

在线尝试!

怎么运行的

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.

这里没有节省字节,但是我仍然很想念,ÆfṪ*³<‘因为我们知道,如果有任何因素伪造了正确的意愿。
乔纳森·艾伦

6

Brachylog,21个字节

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

在线尝试!

这个答案是一个索引。

说明

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字节

合理的速度,但遗憾的是受最大递归次数的限制。

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

怎么运行的

我们尝试直接验证后一个假设,而不是分解整数i并验证其所有素数均小于或等于x = floor(i 1 / n。这就是内部函数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

我们检查是否有任何整数d[2 ...我的1 / n ]划分。如果不是,则该假设无效,我们返回1。如果是,我们递归地在i = i / d上重复该过程,直到失败或初始整数被完全分解(i == 1),在这种情况下,我们递减k。反过来,递归调用外部函数f(),直到k == 0为止。

注意:由于诸如的浮点舍入误差125**(1/3) == 4.9999…x的实际计算值是floor((i + 1)1 / n

演示版

(此处带有97字节的ES6版本,以实现更好的兼容性。)


6

JavaScript(ES7),93 79字节

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)

我听不懂Arnauld的回答,所以我写了自己的书,很方便地把它缩短了两个字节。编辑:在@ETHproductions的帮助下保存了14个字节。取消高尔夫:

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

有趣的是,在我注意到一个错误并决定进行评估之前,我的地址也正好是93个字节,++i**(1/n)而不是i**(1/n)因为诸如的浮点舍入错误125**(1/3) == 4.999...。(编写方式,我认为您的代码不受此影响。)
Arnauld 2016年

@ETHproductions实际上,我记得将其包括在字节数中,我只是忘了将其包括在答案中……
Neil

@ETHproductions似乎可以工作,但是我将任务移到m了另外两个字节上。
尼尔,

5

Haskell,86个字节

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

说明:

%%%%表示上一行中的代码)

    [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 #

filterlambda很少得到回报,列表理解通常更短: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

哦,您也可以省略0:,因为索引可以从0开始。
nimi

...甚至更好:m#n=[k|k<-[1..],last[n|n<-[1..k],all((>0).rem n)[2..n-1],k雷姆n<1]^n<=k]!!m
nimi

3

Pyth,13个字节

e.f.AgL@ZQPZE

在线尝试。

确实像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位元组

->\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]}

我的偶然见解是,您无需查看的每个因素n,而只需查看内部函数f计算的最大因素。不幸的是,它用更大的输入来打击堆栈。

可以通过使用is-primeInts上的内置方法添加素数测试来提高鲁棒性,但要花费更多的字符。


3

外壳,10个字节

!fS≤ȯ^⁰→pN

在线尝试!

说明

我花了一段时间才能找出使用的空单的回报1,而不是-Inf它的叶子1在列表中(否则将花费2个字节再次加前缀):

!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个字节

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}

零索引。

它是一个递归函数,一直持续到找到行中的下一个数字为止。用于numbers打包查找主要因素。


2

MATL,21个字节

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

此解决方案使用基于一的索引,并且输入是nk

在线尝试!

说明

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

很好~ 地用于重新调整第二个输入的位置:-)
路易斯·门多

1

Brachylog v2,16个字节

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

在线尝试!

感谢丹尼斯的果冻液为我安排在正确的方向思考。

说明

这是一个稍微简化的版本,更易于解析:

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

Helper谓词(第2行):输入为指数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

主谓词(第1行):输入是一个包含索引k(从1开始)和指数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个字符,106个字节

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

测试:

  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 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.