不同底数的素数


17

挑战:

您将获得以10为底的数字。对于从10倒数到2的每个基数:

  1. 以原始输入数字为基数10的字符串,并删除该数字中对基数无效的所有数字。
  2. 解释在该基数中得到的数字字符串。如果给出1或0,则终止整个过程。
  3. 输出或打印其最大质数,以十进制数表示。

输出可以是最大素数的数组。

示例案例:

输入:

987654321

输出:

379721
10593529
1091
179
1493
293
19
7

交替:

[379721,10593529,1091,179,1493,293,19,7]

这将打印的987654321最大素数因子,87654321 9 = 42374116 10,7654321 8 = 2054353 10,依此类推,直到其达到1 2,在那里它停止。


2
我不清楚这个过程。我可能可以从示例中弄清楚,但是您应该有明确的说明,因此不需要这样做。因此,我们转换为较低的基数,删除无效数字,然后打印最大的素数?我们将这个因素印在什么基础上?然后,我们是否用最大的素数和较低的基数执行相同的过程?还是用我们考虑的数字来做?我们从10还是9开始?
xnor

欢迎光临本站!
DJMcMayhem

2
我尝试重写挑战以使其更加清晰。我希望这就是您的意图。如果没有,请随时进行更改。
xnor

4
我发现主要操作中最主要的因素是基本转换。许多语言只是通过内置的素因数分解直接执行此操作,而其他语言则基本上必须进行第二次单独的挑战。基本转换也是内置或无效的。当操作是内置的时,您希望它们成为高尔夫的通行之地,实际上分解和基本转换都是如此。尽管如此,对于第一个挑战还是有好处的,但是下一次要记住的事情。
xnor

3
这有可能受到Google Code Jam的启发吗?
Mego

Answers:


6

Pyth,25个字节

sfTm>1PiFdC,.u-N`tYKrT1zK
                       z   get input as a string
            .u      rT1    cumulative reduce over [10,9,...,2]
              -N`tY        remove one minus the number (10,9,...) from the input
          C,       K    K  pair each step along the chain with corresponding base
   m                       map over [["987654321", 10],...]:
       iFd                   apply the base-conversion (splat over i)
      P                      prime factorization, smallest to largest
    >1                       take [the last element], or [] if empty (1 or 0)
 fT                        remove the []s from 0s or 1s
s                          join the one-element arrays together

在这里尝试。



4

MATL17 15字节

9:PQ"G@ZAYfXzX>

这将数字作为带引号的字符串,默认情况下是允许的。

在线尝试!

说明

9:PQ     % Push array [10, 9, ..., 2]
"        % For each number in that array. These are the bases to be considered
  G      %   Push input. Forces for input to be taken implicitly first time
  @      %   Push current base
  ZA     %   Convert from that base to base 10, discarding non-valid digits
  Yf     %   Prime factors. Gives empty for input 1, and 0 for input 0
  Xz     %   Non-zero values. Gives empty if previous result was 0, or else
         %   leaves it as it was
  X>     %   Maximum of array. For empty input gives empty
         % Implicitly end for each
         % Implicitly display. Empty arrays are not displayed

对于输入不以1结尾的输入,此输出最后输出
0。– poi830

对于输入“ 98765432”和“ 98765”(随机示例),在终止前输出正确的数字,然后为0。
poi830 '16

1
@ poi830现在解决了
Luis

1

朱莉娅101字节

f(s,x=[],b=10)=(t=filter(c->c<=47+b,s))>"1"&&b>1?f(s,[x;maximum(keys(factor(parse(Int,t,b))))],b-1):x

这是一个递归函数,它接受输入作为字符串并返回一个数组。

取消高尔夫:

function f(s, x=[], b=10)
    # Filter the string down to only the digits valid for base b
    t = filter(c -> c <= 47 + b, s)

    # If the filtered string isn't "1" or "0" and b is a valid base
    if t > "1" && b > 1
        # Call the function again, appending the maximum prime factor
        # of t in base b to the argument x and decrementing the base
        f(s, [x; maximum(keys(factor(parse(Int, t, b))))], b-1)
    else
        # Otherwise return the array
        x
    end
end

1

Mathematica,83个字节

FactorInteger[Select[IntegerDigits@#,#<a&]~FromDigits~a][[-1,1]]~Table~{a,10,2,-1}&

匿名函数,返回一个列表。老实说,没有那么复杂。


0

Ruby,120个字节

递归函数,将输入作为字符串。

f=->n,b=2{require'prime';i=n.tr([*b.to_s..?9].join,"").to_i(b)
b>10?[]:f[n,b+1]+[*i>1?Prime.prime_division(i).max[0]:p]}

1
您可以使用-rprime命令行标志代替来保存一些字节require
门把手

-rprime由于某些原因对我不起作用...
Value Ink

0

Pyke,19字节,无竞争

(添加splat_node函数)
DTAbPe
;1TtD=T`"":r

在这里尝试!

以引号输入,并退出并返回错误。

说明(用\ n替换换行符):

D                    - Duplicate the first item on the stack (And get it from input first time)
 TAb                 - Convert input to base (whatever's in T, 10 default)
    Pe               - get the highest prime factor of the number
      \n;1           - print it out and get rid of it
          TtD=T      - T -= 1
               `"":  - input = input.replace(str(t), "")
                   r - GOTO start
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.