多维数据集距离数的稀有度


15

灵感来自这个 Numberphile进入

背景

整数n立方距离数在此定义为一组整数,它们是给定x的距离。举一个简单的例子,使用和时,立方体距离数为。n=100x=2{92,108}

只需更改x即可将其扩展为更大的集合。使用x ∈ {1,2,3,4}和相同n=100,我们得到结果集{36,73,92,99,101,108,127,164}

让我们来定义CD(N,X)的所有整数的集合n ± z³z ∈ {1,2,3,...,x}

现在我们可以集中讨论这些立方距离数字的一些特殊属性。在数字可以具有的许多特殊属性中,我们在此处感兴趣的两个属性是素数素数除数

对于上面的示例CD(100,4),请注意它们73, 101, 127都是素数。如果将它们从集合中删除,则剩下{36,92,99,108,164}。这些数字的所有主除数都是(按顺序){2,2,3,3,2,2,23,3,3,11,2,2,3,3,3,2,2,41},这意味着我们有5个不同的主除数{2,3,23,11,41}。因此,我们可以定义CD(100,4)具有ravenity 15

这里的挑战是以最小的字节编写一个函数或程序,以输出给定输入的泛滥

输入值

  • 两个正整数nx,采用任何方便的格式。

输出量

  • 当用CD(n,x)计算时,一个整数,描述两个输入数字的奇异性。

规则

  • 输入/输出可以通过任何合适的方法
  • 适用标准漏洞限制。
  • 为了便于计算,您可以假设输入数据将使CD(n,x)在集合中仅具有正数(即,没有CD(n,x)会具有负数或零)。
  • 该函数或程序应该能够处理输入数字,以便n + x³适合您语言的本机整数数据类型。例如,对于32位带符号整数类型,所有输入数字n + x³ < 2147483648都可以。

例子

n,x   - output
2,1   - 0   (since CD(2,1)={1,3}, distinct prime divisors={}, ravenity=0)
5,1   - 2
100,4 - 5
720,6 - 11

脚注

1-如此命名是因为我们对布景的基数不感兴趣,而是对另一种鸟类感兴趣。由于我们正在处理“公共”除数,因此我选择使用公共乌鸦


如何100,4产生5?该集合的立方距离数为36,164,并且该集合的素数2,3,41(因为该集合的因数分别为{2, 3, 4, 6, 9, 12, 18, 36}{2, 4, 41, 82, 164})。因此,输出应为3,而不是5
R.甲

2
@ R.Kap 100,4是OP在背景技术部分中说明的示例。您的错误似乎是您应该考虑所有因素1..x,因此[1,2,3,4]对于这种情况。
FryAmTheEggman '16

@FryAmTheEggman哦。好的。我明白了
R. Kap

它会读为[ruh-VEE-nuh-tee](或对于阅读IPA的人来说是/ rəˈviːnəti /)吗?
Leaky Nun

1
@KennyLau在我的脑海中,我将其发音为“ rah-VIN-eh-ty”
AdmBorkBork

Answers:


4

果冻,16个字节

ŒRḟ0*3+µÆfFœ-µQL

按此顺序将xn作为命令行参数。在线尝试!

怎么运行的

ŒRḟ0*3+µÆfFœ-µQL  Main link. Arguments, x, n

ŒR                Range; yield [-x, ..., x].
  ḟ0              Filter out 0.
    *3            Cube each remaining integer.
      +           Add n to all cubes.
       µ          Begin a new, monadic link. Argument: A (list of sums)
        Æf        Factorize each k in A.
          F       Flatten the resulting, nested list.
           œ-     Perform multiset difference with A.
                  If k in A is prime, Æf returns [k], adding on k too many to the
                  flat list. Multiset difference with A removes exactly one k from
                  the results, thus getting rid of primes.
                  If k is composite (or 1), it cannot appear in the primes in the
                  flat list, so subtracting it does nothing.
             µ    Begin a new, monadic link. Argument: D (list of prime divisors)
              Q   Unique; deduplicate D.
               L  Compute the length of the result.

4

Pyth- 21 19 18字节

我想知道是否有把戏。

l{st#mP+Q^d3s_BMSE

测试套件

l                   Length
 {                  Uniquify
  s                 Combine divisor lists
   t#               Filter by if more than one element
     PM             Take prime factorization of each number
       +RQ          Add each num in list to input
          s_BM      Each num in list and its negative (with bifurcate)
              ^R3   Cube each num in list
                 SE Inclusive unary range - [1, 2, 3,... n] to input

3

朱莉娅107字节

f(n,x)=endof(∪(foldl(vcat,map(k->[keys(factor(k))...],filter(i->!isprime(i),[n+z^3for z=[-x:-1;1:x]])))))

该函数接受两个整数并返回一个整数。

取消高尔夫:

function f(n, x)
    # Get all cube distance numbers
    cubedist = [n + z^3 for z = [-x:-1; 1:x]]

    # Filter out the primes and zeros
    noprimes = filter(i -> !isprime(i) && i > 0, cubedist)

    # Factor each remaining number
    factors = map(k -> [keys(factor(k))...], noprimes)

    # Flatten the list of factors
    flat = foldl(vcat, factors)

    # Return the number of unique elements
    return endof(∪(flat))
end

规范已更新;您不必再担心0了。
丹尼斯

@丹尼斯·尼斯,感谢大家的注意。
Alex A.


2

MATL,21字节

:3^t_h+tZp~)"@Yf!]vun

输入为xn以换行符分隔。

在线尝试!

说明

:       % take n implicitly. Generate [1,2,...,n]
3^      % raise to 3, element-wise
t_h     % duplicate, negate, concatenate horizontally: [1,2,...,n,-1,2,...-n]
+       % take x implicitly. Add to that array
t       % duplicate
Zp      % array that contains true for primes
~       % logical negate
)       % apply index to keep only non-primes
"       % for each number in that array
  @     %   push that number
  Yf!   %   prime factors, as a column array
]       % end for each
v       % concatenate vertically all factors
u       % remove repeated factors
n       % number of elements of that array. Implicitly display

2

J,30个字节

#@~.@(,@:q:-.0&,)@:+(|#^&3)@i:

这是二元动词,用法如下:

   f =: #@~.@(,@:q:-.0&,)@:+(|#^&3)@i:
   100 f 4
5

在这里尝试。

说明

#@~.@(,@:q:-.0&,)@:+(|#^&3)@i:
                            i:  Range from -x to x
                    (     )@    Apply this verb to the range:
                       ^&3        a) every item cubed
                     |            b) absolute value of every item
                      #           c) every item in a) repeated b) times; this removes 0
                                     and produces some harmless duplication
                   +            Add n to every element of the resulting list
     (          )@:             Apply this verb to the resulting vector:
             0&,                  a) the vector with 0 appended
      ,@:q:                       b) flat list of prime divisors in the vector
                                     (and some extra 0s since we flatten an un-even matrix)
           -.                     c) list b) with elements of a) removed; this gets rid of
                                     the extra 0s and all primes that were in the list
#@~.@                           Remove duplicates and take length

2
@:+(为什么这么难过,真棒人?
AdmBorkBork '16

链接到TIO以作答吗?
Rɪᴋᴇʀ

@EasterlyIrk TIO没有J。我将添加一个链接到tryj.tk。
Zgarb '16

@Zgarb冈井.___
Rɪᴋᴇʀ

2

蟒3.5,218个 198字节:

感谢@Blue为我节省了20个字节。)

lambda r,n:len({z for z in{v for f in{t for u in[[r-q**3,r+q**3]for q in range(1,n+1)]for t in u if any(t%g<1 for g in range(2,t))}for v in range(2,f)if f%v<1}if all(z%g>0 for g in range(2,z))})

一个不错的单行lambda函数,尽管可能有点长。自从我使用Python以来,我不得不想出自己的第一步查找复合物的方法,然后是最后一步的主要除数的方法,所以这并不是很容易,这是我自己最短的。可以做到。尽管如此,它可以做所需的事情,我为此感到自豪。:)但是,欢迎您提供任何有关打高尔夫球的技巧。


几件事:不要使用== 0,请使用<1,对于!= 0,请使用> 0。另外,为什么最后z%1和z%z?那些似乎永远都是真的。
2016年

@Blue是的,你是对的。它们将永远是真实的,因此甚至不需要该部分。所以,我将其删除。另外,还要感谢其他提示!:)
R. Kap

1

PARI / GP,79字节

(n,x)->omega(factorback(select(k->!isprime(k),vector(2*x,i,n+(i-(i<=x)-x)^3))))

这是我最初的简单实现。上面的优化版本将两个向量合并为一个稍微复杂的向量。

(n,x)->omega(factorback(select(k->!isprime(k),concat(vector(x,i,n-i^3),vector(x,i,n+i^3)))))

这真的很有趣。我看到有一个浏览器内链接来尝试该代码,但是我不确定如何实际提交输入。你能提供一个解释吗?
AdmBorkBork '16

@TimmyD:如果您将以上任意一项分配给f(如f=(n,x)->...),则可以使用进行测试f(100,4)。或者,您可以使用一行来调用它((n,x)->...)(100,4)
查尔斯


1

红宝石,132个 120 114字节

我很清楚,该解决方案仍然需要大量打高尔夫球。欢迎打高尔夫球。

require'prime'
->n,x{(-x..x).map{|i|j=n+i**3;j.prime?||(j==n)?[]:j.prime_division.map{|z|z[0]}}.flatten.uniq.size}

开球:

require 'prime'

def ravenity(n, x)
  z = []
  (-x..x).each do |i|
    j = n + i**3
    m = j.prime_division
    if j.prime? || j == n
      z << []
    else
      z << m.map{|q| q[0]}
    end
  return z.flatten.uniq.size
end

1

Python的3.5 - 177个 175 159字节

欢迎任何打高尔夫球的技巧:)

a=range
p=lambda n:any(n%x<1for x in a(2,n))
r=lambda n,x:len(set(sum([[x for x in a(2,z+1)if z%x<1&1>p(x)]for z in filter(p,[n+z**3for z in a(-x,x+1)])],[])))

取消高尔夫:

def is_composite(n):
    return any(n % x == 0 for x in range(2, n))

def prime_factors(n):
    return {x for x in range(2, n+1) if n % x == 0 and not is_composite(x)}

def ravenity(n, x):
    nums = [n + z**3 for z in range(-x, x+1)]
    nums = filter(is_composite, nums)
    factors = map(prime_factors, nums)
    factors = sum(factors, [])
    #remove duplicates
    factors = set(factors)
    return len(factors)

0

Wolfram语言(Mathematica),90个字节

Tr[1^Union[First/@Join@@FactorInteger/@Select[z=Range@#2^3;Join@@{#-z,#+z},Not@*PrimeQ]]]&

在线尝试!

取消投放:该代码通常从右到左读取,

F[n_, x_] := 
  Length[Union[                                        (* number of unique elements   *)
    First /@                                           (* drop multiplicities         *)
      Join @@                                          (* join all prime factor lists *)
        FactorInteger /@                               (* compute prime factors       *)
          Select[                                      (* select those...             *)
            Join @@ {n - Range[x]^3, n + Range[x]^3},  (* ...candidates...            *)
            Not@*PrimeQ]]]                             (* ...that are not prime       *)
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.