キューブ距離のラビニティ数


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}

これで、これらの立方体距離番号の特別なプロパティに注目できます。数値が持つことができる多くの特別なプロパティのうち、ここで興味のある2つのプロパティはprimalityprime divisorsです。

上記の例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 1のを5

ここでの課題は、特定の入力のラビニティを出力する関数またはプログラムを最小バイトで記述することです。

入力

  • 任意の便利な形式の2つの正の整数、nおよびx

出力

  • CD(n、x)を使用して計算された場合、2つの入力数値のラベニティを記述する単一の整数。

ルール

  • 入力/出力は、適切な方法で行うことができます。
  • 標準的な抜け穴の制限が適用されます。
  • 計算を簡単にするために、入力データは、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- セットの基本的な性質には興味がなく、異なる種類の鳥に興味があるため、そのように名付けられました。「一般的な」除数を扱っているため、一般的なravenを使用することにしました。


どのように100,45を生成しますか?そのセットの立方体距離の数値はであり、そのセット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

@FryAmTheEggmanああ。はい。わかった。
R. Kap

[ruh-VEE-nuh-tee](またはIPAを読んだ人の場合は/ rforviːnəti/)と発音しますか?
リーキー修道女

1
私の頭の中で@KennyLauは、私が"RAH-VIN-EH-TY"としてそれを発音
AdmBorkBork

回答:


4

ゼリー、16バイト

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

かかるXおよびnはこの順に、コマンドライン引数として。オンラインでお試しください!

使い方

Œ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]])))))

これは、2つの整数を受け入れて整数を返す関数です。

ゴルフをしていない:

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を心配する必要はありません。
デニス

@デニスニース、ありがとう。
アレックス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

回答のTIOへのリンクをお願いします。
Rɪᴋᴇʀ

@EasterlyIrk TIOにはJがありません。tryj.tkへのリンクを追加します。
-Zgarb

@Zgarb岡井.___
Rɪᴋᴇʀ

2

Python 3.5、218 198バイト:

20バイト節約してくれた@Blueに感謝します。)

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

ちょっと長いかもしれませんが、素敵な1行のラムダ関数です。Pythonを使用していたので、最初のステップでコンポジットを見つけ、次に最後のステップで素因数を見つける独自の方法を考え出さなければなりませんでした。 。それを得ることができた。それにもかかわらず、それは必要なことを行い、私はそれを誇りに思っています。:)しかし、これをもう少しゴルフで打つためのヒントは大歓迎です。


いくつかのこと:== 0を使用せず、<1を使用し、!= 0、> 0を使用します。また、なぜz%1とz%zが最後にあるのでしょうか?それらは常に真実であるように思えます。
ブルー

@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))))

これが私の最初の簡単な実装です。上記の最適化されたバージョンは、2つのベクトルを1つのやや複雑なベクトルに組み合わせます。

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

これは本当に面白いです。コードを試すためのブラウザ内リンクがありますが、実際に入力を送信する方法がわかりません。説明できますか?
AdmBorkBork

@TimmyD:上記のいずれかをf(などf=(n,x)->...)に割り当てると、でテストできますf(100,4)。または、を使用して1行で呼び出すことができます((n,x)->...)(100,4)
チャールズ

1

ルビー、138バイト

->(n,x){require'prime'
v=((-x..x).to_a-[0]).map{|i|n+i**3}.reject{|e|Prime.prime?(e)}
Prime.each(v[-1]).select{|i|v.any?{|e|e%i==0}}.size}

それはだったしゃれの Y挑戦。:-)


彼らは真剣にRubyで素数を見つける方法を構築していますか?うわー...私はPythonにはそれがないとは信じられません。
R. Kap

うん。ruby-doc.org/stdlib-2.3.0/libdoc/prime/rdoc/Prime.htmlを参照してください-バージョン1.9.3でも動作するはずです。
jose_castro_arnaud

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       *)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.