Küp Kuzgunluğu Mesafe Numaraları


15

Bu Numberphile girişinden ilham alındı

Arka fon

Küp mesafe numaraları tamsayı n olan tam sayıların kümesi olarak burada tanımlanan mesafe uzağa belirli bir için x . Basit bir örnek için, ile n=100ve x=2, küp mesafe numaraları vardır{92,108} .

Bu, yalnızca x değiştirilerek daha büyük bir sete genişletilebilir . İle x ∈ {1,2,3,4}aynı ve n=100biz sonuçta set var{36,73,92,99,101,108,127,164} .

Diyelim tanımlayan CD'yi (n, x) tüm tamsayılar kümesi olarak n ± z³birliktez ∈ {1,2,3,...,x} .

Şimdi bu küp mesafe sayılarının bazı özelliklerine odaklanabiliriz . Sayıların sahip olabileceği birçok özel özellikten, burada ilgilendiğimiz iki özellik, öncelik ve ana bölücülerdir .

Yukarıdaki örnek CD (100,4)73, 101, 127 için hepsinin asal olduğuna dikkat edin . Bunları setten çıkarırsak kalırız {36,92,99,108,164}. Bu sayıların tüm ana bölenleri (sırayla) {2,2,3,3,2,2,23,3,3,11,2,2,3,3,3,2,2,41}, yani 5 ayrı ana bölenimiz var {2,3,23,11,41}. Bu nedenle bu tanımlayabilirsiniz CD (100,4) sahiptir ravenity 1 arasında 5.

Buradaki zorluk, kuzgunluğu veren en az baytta bir işlev veya program yazmaktır belirli bir girdinin .

Giriş

  • İki pozitif tamsayı nve xherhangi bir uygun biçimde.

Çıktı

  • CD (n, x) ile hesaplandığında, iki giriş numarasının ravenliğini açıklayan tek bir tam sayı .

kurallar

  • Giriş / çıkış herhangi bir uygun yöntemle yapılabilir .
  • Standart boşluk deliği kısıtlamaları geçerlidir.
  • Hesaplama kolaylığı için, giriş verilerinin CD (n, x) setinde sadece pozitif sayılara sahip olacağı (yani hiçbir CD (n, x) negatif sayı veya sıfır olmayacak ) olacağını varsayabilirsiniz .
  • İşlev veya program n + x³, dilinizin yerel tamsayı veri türüne sığması için giriş numaralarını işleyebilmelidir . Örneğin, 32 bit işaretli tam sayı türü için, tüm giriş numaraları n + x³ < 2147483648mümkündür.

Örnekler

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

Dipnotlar

1 - Öyle adlandırıldı, çünkü setin temel ilmiyle değil, farklı bir kuş türü ile ilgileniyoruz . "Ortak" bölücülerle uğraştığımız için, ortak kuzgunu kullanmayı seçtim .


100,4Verim 5 nasıl ? Bu setin küp mesafe sayılardır 36,164ve asal o setin faktörlerdir 2,3,41(yani setin faktörlerdir beri {2, 3, 4, 6, 9, 12, 18, 36}ve {2, 4, 41, 82, 164}sırasıyla). Bu nedenle, çıktı 5 değil 3 olmalıdır.
R. Kap

2
@ R.Kap 100,4, OP'nin Arka Plan bölümünde açıkladığı örnektir. Hatanız 1..x, hepsini düşünmeniz gerektiği gibi görünüyor , bu yüzden [1,2,3,4]bu dava için.
FryAmTheEggman

@FryAmTheEggman Oh. Tamam. Şimdi anladım.
R. Kap

[Ruh-VEE-nuh-tee] (ya da IPA okuyanlarınız için / rəˈviːnəti /) telaffuz edilir mi?
Leaky Nun

1
@KennyLau Kafamda "rah-VIN-eh-ty" olarak telaffuz ettim
AdmBorkBork

Yanıtlar:


4

Jöle, 16 bayt

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

Alır x ve n bu sırayla, komut satırı bağımsız değişkenleri olarak. Çevrimiçi deneyin!

Nasıl çalışır

Œ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 bayt

Acaba bir numara var mı?

l{st#mP+Q^d3s_BMSE

Test Takımı .

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 bayt

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

Bu, iki tamsayıyı kabul eden ve bir tam sayı döndüren bir işlevdir.

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

Teknik özellikler güncellendi; hakkında endişe gerekmez 0 'artık bu.
Dennis

@Dennis Nice, kafalar için teşekkürler.
Alex


2

MATL , 21 bayt

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

Girdi olan x, nbir satır ile birbirlerinden ayrılmıştır.

Çevrimiçi deneyin!

açıklama

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

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

Bu, aşağıdaki gibi kullanılan bir ikili fiildir:

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

Burada deneyin.

açıklama

#@~.@(,@: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
@:+(neden bu kadar üzücü, harika saç adam?
AdmBorkBork

Yanıt olarak TIO bağlantısı lütfen?
Rɪᴋᴇʀ

@EasterlyIrk TIO'da J yok. Tryj.tk adresine bir bağlantı ekleyeceğim.
Zgarb

@Zgarb okai .___
Rɪᴋᴇʀ

2

Python 3,5, 218 198 bayt:

( Bana 20 bayt kazandığı için @Blue sayesinde.)

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

Güzel bir tek çizgili lambda işlevi, biraz uzun olsa da. Python'u kullandığımdan beri, ilk adım için kompozitleri bulmak için kendi yolumu bulmalıydım ve son adım için ana bölücüler vardı, bu yüzden çok kolay değildi ve bu kendim için en kısa olanıydım . alabilir. Yine de, ihtiyaç duyduğu her şeyi yapıyor ve bundan gurur duyuyorum. :) Ancak, bu daha aşağı golf için herhangi bir ipucu bekliyoruz.


Birkaç şey: == 0 kullanmayın, <1 kullanın ve! = 0,> 0 için. Ayrıca, neden sonunda z% 1 ve z% z? Bunlar her zaman doğru olacak gibi görünüyor.
Mavi

@Mavi Evet, haklısın. Her zaman doğru olacaklar, bu yüzden bu parçaya bile ihtiyaç duyulmuyor. Yani, onu kaldıracağım. Ve ayrıca, diğer ipuçları için teşekkürler! :)
R. Kap

1

PARI / GP , 79 bayt

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

İşte benim basit anlaşılır uygulama. Yukarıdaki optimize edilmiş sürüm, iki vektörü tek, biraz daha karmaşık bir vektörde birleştirir.

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

Bu gerçekten ilginç. Kodu denemek için bir tarayıcı içi bağlantı görüyorum, ancak girişi nasıl göndereceğinizden emin değilim. Bir açıklama yapabilir misiniz?
AdmBorkBork

@TimmyD: Yukarıdakilerden birini f(beğen f=(n,x)->...) olarak atarsanız, ile test edebilirsiniz f(100,4). Alternatif olarak, ile bir satırda çağırabilirsiniz ((n,x)->...)(100,4).
Charles


1

Yakut, 132 , 120 114 bayt

Bu çözümün hala çok fazla golf gerektirdiğinin farkındayım. Herhangi bir golf ipuçları bekliyoruz.

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 bayt

Herhangi bir golf ipuçları hoş geldiniz :)

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 Dili (Mathematica) , 90 bayt

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

Çevrimiçi deneyin!

golf oynamadan: kod çoğunlukla sağdan sola okunur,

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       *)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.