เรนจ์ไฟต์ของหมายเลข Cube ระยะทาง


15

แรงบันดาลใจจากรายการ Numberphile นี้

พื้นหลัง

หมายเลขก้อนระยะของจำนวนเต็มnมีการกำหนดไว้ที่นี่เป็นชุดของจำนวนเต็มที่มีระยะออกไปเพื่อให้x สำหรับตัวอย่างง่ายๆด้วยn=100และx=2ที่หมายเลขก้อนระยะทาง{92,108}เป็น

นี้สามารถยื่นออกไปในชุดที่มีขนาดใหญ่ขึ้นได้ง่ายๆโดยการที่แตกต่างกันx ด้วยx ∈ {1,2,3,4}เดียวกันเรามีชุดผลลัพธ์n=100{36,73,92,99,101,108,127,164}

ให้กำหนดซีดี (n, x)เป็นชุดของจำนวนเต็มทั้งหมดด้วยn ± z³z ∈ {1,2,3,...,x}

ตอนนี้เราสามารถมุ่งเน้นไปที่บางส่วนของคุณสมบัติพิเศษเหล่านี้หมายเลขก้อนระยะ คุณสมบัติพิเศษมากมายว่าตัวเลขสามารถมีสองคุณสมบัติที่เรากำลังสนใจในที่นี่มีprimalityและที่สำคัญตัวหาร

สำหรับตัวอย่างซีดีด้านบน(100,4)โปรดทราบว่า73, 101, 127ทั้งหมดนั้นดีเลิศ {36,92,99,108,164}ถ้าเราลบจากชุดที่เราจะเหลือ ทั้งหมด divisors สำคัญของตัวเลขเหล่านี้ (ตามลำดับ) {2,2,3,3,2,2,23,3,3,11,2,2,3,3,3,2,2,41}ซึ่งหมายความว่าเรามี 5 {2,3,23,11,41}divisors ดังนั้นเราจึงสามารถกำหนดว่าCD (100,4)มีravenity 15ของ

ความท้าทายที่นี่คือการเขียนฟังก์ชั่นหรือโปรแกรมในไบต์ที่น้อยที่สุดที่ส่งออกความรุนแรงของอินพุตที่กำหนด

อินพุต

  • จำนวนเต็มบวกสองค่าnและxในรูปแบบที่สะดวกใด ๆ

เอาท์พุต

  • จำนวนเต็มเดียวอธิบายravenityของทั้งสองใส่ตัวเลขเมื่อคำนวณกับซีดี (n, x)

กฎระเบียบ

  • อินพุต / เอาต์พุตสามารถผ่านใด ๆวิธีการที่เหมาะสม
  • มีข้อ จำกัดช่องโหว่มาตรฐาน
  • เพื่อความสะดวกในการคำนวณคุณสามารถสันนิษฐานได้ว่าข้อมูลอินพุตจะเป็นเช่นนั้นว่าซีดี (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. Kap

2
@ R.Kap 100,4เป็นตัวอย่างที่ OP อธิบายในส่วนพื้นหลัง ความผิดพลาดของคุณน่าจะเป็นสิ่งที่คุณควรพิจารณาทั้งหมด1..xดังนั้น[1,2,3,4]ในกรณีนี้
FryAmTheEggman

@FryAmTheEggman โอ้ ตกลง. ฉันเข้าใจแล้ว.
R. Kap

มันจะออกเสียง [ruh-VEE-nuh-tee] (หรือ / rəˈviːnəti / สำหรับคนที่อ่าน IPA) หรือไม่?
Leun Nun

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

Test Suite

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

Julia, 107 ไบต์

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

นี่คือฟังก์ชั่นที่ยอมรับสองจำนวนเต็มและคืนค่าจำนวนเต็ม

Ungolfed:

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อีกต่อไป
เดนนิส

@ เดนนิส Nice, ขอบคุณสำหรับหัวขึ้น
Alex A.


2

MATL , 21 ไบต์

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

ป้อนข้อมูลx, nแยกจากกันโดยขึ้นบรรทัดใหม่

ลองออนไลน์!

คำอธิบาย

:       % 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:

นี่คือคำกริยา dyadic ใช้ดังนี้:

   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 okai .___
2559

2

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

ฟังก์ชั่นแลมบ์ดาแบบหนึ่งแถวที่ดีแม้ว่ามันอาจจะค่อนข้างยาว ตั้งแต่ฉันใช้ 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))))

นี่คือการใช้งานที่ตรงไปตรงมาของฉันดั้งเดิม รุ่นที่ได้รับการปรับปรุงด้านบนจะรวมเวกเตอร์สองตัวไว้ในเวกเตอร์เดียวที่ซับซ้อนกว่าเล็กน้อย

(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)แล้วคุณสามารถทดสอบได้ด้วย ((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}

มันเป็นความท้าทายปุนและ :-)


พวกเขาจริงจังในการหาช่วงเวลาในรูบีหรือไม่ ว้าว ... ฉันไม่อยากจะเชื่อว่า 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}

Ungolfing:

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)])],[])))

Ungolfed:

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.