Asal faktörlerin toplamı


27

2013 en önemli faktörleşmeye sahiptir 3*11*61. 2014 en önemli faktörleşmeye sahiptir 2*19*53. Bu ayrıştırmaları ilişkin ilginç bir özellik, 2013 ve 2014 aynı sayıda olduğunu toplamı arasında çarpanlama içinde farklı asal varolduğudur: 11+61=19+53=72.

1'den büyük iki pozitif tamsayı girişi olarak alan ve ikinci sayıdaki seçilen asal çarpanların toplamına eşit bir sayının seçilmiş asal çarpanların toplamı varsa, bir truthy değeri döndüren bir program veya işlev yazın. Aksi takdirde falsey değeri.


Açıklamalar

  • İkiden fazla ana faktör kullanılabilir. Sayıların asal faktörlerinin hepsinin toplamda kullanılması gerekmez. İki sayının kullandığı primer sayısının eşit olması şart değildir.
  • Bir sayının çarpanlara ayrılmasında bir asıl 1'den büyük bir güce yükseltilmiş olsa bile, sayının asal toplamında yalnızca bir kez kullanılabilir.
  • 1 asal değildir.
  • Her iki giriş numarası da daha küçük olacaktır 2^32-1.

Test durumları

5,6
    5=5
    6=2*3
    5=2+3
==>True

2013,2014
    2013=3*11*61
    2014=2*19*53
    11+61=19+53
==>True

8,15
    8=2^3
    15=3*5
    No possible sum
==>False

21,25
    21=3*7
    25=5^2
    No possible sum (can't do 3+7=5+5 because of exponent)
==>False

Bu kod golfü. Standart kurallar geçerlidir. Bayt cinsinden en kısa kod kazanır.


6
Bunun gibi zorluklardan hoşlanıyorum, ancak golf dilleri için, bir yerleşikler zinciri olacak: faktör, benzersiz, altkümeler, toplamlar, örtüşme.
xnor

İki maddeli bir dizi olarak girdi alabilir miyiz?
ETHProductions,

@ETHproductions Varsayılan olarak, evet.
lirtosiast

Peki ya 14 (2 * 7) ve 21 (3 * 7), truefaktörü paylaştıkları için 7?
Simon Forsberg

@SimonForsbergMcFeely Evet
Arcturus

Yanıtlar:


10

Julia, 95 93 bayt

g(x)=reduce(vcat,map(p->map(sum,p),partitions([keys(factor(x))...])))
f(a,b)=g(a)∩g(b)!=[]

Birincil işlev şudur fve yardımcı işlevi çağırır g.

Ungolfed:

function g(x::Integer)
    # Find the sum of each combination of prime factors of the input
    return reduce(vcat, map(p -> map(sum, p), partitions([keys(factor(x))...])))
end

function f(a::Integer, b::Integer)
    # Determine whether there's a nonzero intersection of the factor
    # sums of a and b
    return !isempty(g(a)  g(b))
end

Darth Alephalpha sayesinde 2 bayt kaydedildi


3
Bunun reddedildiğini fark ettim. Gözden kaçtığım bir şey var mı? Eğer yanlışsa, düzeltmekten mutlu olurum, ama olduğu gibi benim için iyi çalışıyor ve tüm test durumlarını geçiyor.
Alex A.

Bence map(p->mapdaha kısa (m=map)(p->m.
alephalpha

@DarthAlephalpha İyi görüşme, teşekkürler.
Alex A.

7

Pyth, 11 bayt

t@FmsMy{PdQ

Formdaki giriş 30,7.

t@FmsMy{PdQ     implicit: Q=input tuple
      y         powerset of
       {        unique elements of
        Pd      prime factorizations of d
    sM          Map sum over each element of the powerset
    sMy{Pd      lambda d: all sums of unique prime factors of d
   m      Q     Map over Q. Produces a two-element list.
 @F             Fold list intersection
t               Remove first element, which is a 0.
                If no other common sums, the remaining empty list is falsy.

1
Bu, şimdi bir Pyth cevabı ile aynıdır, taşınmış bir harf hariç;)
ETHproductions

@ETHProductions, Maltysen'in tamir etmeden önce cevapladığım; bu yüzden devam edeceğim.
lirtosiast


4

Haskell, 115 106 bayt

import Data.Numbers.Primes
import Data.List
p=map sum.tail.subsequences.nub.primeFactors
a#b=p a/=p a\\p b

Kullanım örneği: 2013 # 2014-> True.

pArgümanının tüm asal çarpanlarının bir listesini yapar, kopyaları kaldırır, tüm alt sıraların bir listesini yapar, birincisini (her zaman boş liste olan) bırakır ve son olarak da sıraları toplar. #Aradaki p afarkın eşit olup olmadığını kontrol eder p a \\ p b. Eşit değilse, en az bir ortak unsur vardır.


3

Japt, 25 bayt

[UV]=N®k â à mx};Ud@J<VbX

Çıkışlar trueveya false. Çevrimiçi deneyin!

Ungolfed ve açıklama

[UV]=N®   k â à mx};Ud@ J<VbX
[UV]=NmZ{Zk â à mx};UdX{J<VbX

          // Implicit: N = list of inputs
[UV]=N    // Set variables U and V to the first to items in N,
mZ{    }  // with each item Z mapped to:
Zk        //  Generate list of Z's factors.
â         //  Keep only the unique items.
à         //  Generate all combinations.
mx        //  Sum each combination.
UdX{      // Check if any item X in U fulfills this condition:
J<VbX     //  -1 is less than V.indexOf(X).
          // Implicit: output last expression

Fazladan bir bayt için, bir zaman karmaşıklığına sahip olmanın avantajıyla, factorize-benzersiz-birleştirme toplamı kodunu her iki giriş arasında bölebilirsiniz O(O(25-byte version)^2):

Uk â à mx d@J<Vk â à mx bX

3

CJam, 23 bayt

q~{mf_&0a\{1$f++}/}/&0-

Burada test et.

Doğruluk değeri tüm ortak toplamlar olacak, sahte değer boş dizedir.

açıklama

q~     e# Read and evaluate input.
{      e# For each of the two numbers...
  mf   e# Get the prime factors.
  _&   e# Remove duplicates.
  0a\  e# Put an array containing a 0 below to initialise the list of possible sums.
  {    e# For each prime factor...
    1$ e#   Make a copy of the available sums so far.
    f+ e#   Add the current factor to each of them.
    +  e#   Combine with the list of sums without that factor.
  }/
}/
&      e# Set intersection between the two lists of sums.
0-     e# Remove the 0 which is always in the intersection.

3

Brachylog , 10 9 bayt

{ḋd⊇+ℕ₁}ᵛ

Çevrimiçi deneyin!

Tahmini [the sum, the sum]varsa geri döndürme başarılı olur ve toplam mevcut değilse başarısız olur.

{            Start of inline predicate.
 ḋ           The prime factors of the input,
  d          with duplicates removed.
   ⊇         Some subset of the unique prime factors
    +ℕ₁      has a sum greater than 0 which is output.
       }ᵛ    The predicate can have the same output for both elements of the input.

Fatalize (Brachylog'ın yaratıcısı) sayesinde -1 bayt, meta-yüklem doğrulamasının olduğunu hatırlatıyor .


1
Bir bayt kaydetmek ᵛ - verifyyerine kullanabilirsiniz ˢ=.
38’de öldürmek

2

MATL , 23 bayt

2:"iYfutn2w^1-:B!Y*]!=z

Bu sürümden önceki sürüm olan 2.0.2 sürümünü kullanır .

Sayılar iki ayrı giriş olarak verilmiştir. Çıktı 0veya 1.

Örnek

>> matl 2:"iYfutn2w^1-:B!Y*]!=z
> 2013
> 2014
1

açıklama

2:           % vector of two numbers, to generate two iterations
"            % for loop
  i          % input number                                                 
  Yfu        % get prime factors without repetitions
  tn         % duplicate and get number of elements in array N 
  2w^1-:     % numbers from 1 to 2^N                                        
  B!Y*       % convert to binary, transpose and matrix multiply to produce all sums
]            % end                                                      
!=z          % true if any value is equal to any other

2

Mathematica, 58 bayt

Tr/@Rest@Subsets[#&@@@FactorInteger@#]&/@IntersectingQ@##&

Açıklama:

Bu anonim bir işlevdir.

İlk önce, IntersectingQiki listenin kesişme halinde olup olmadığını kontrol eder. Ancak girdiler listeler yerine sayılardır, dolayısıyla değerlendirilmemiştir. Örneğin, eğer girişler ise 2013ve 2014sonra IntersectingQ@##&döner IntersectingQ[2013, 2014].

Tr/@Rest@Subsets[#&@@@FactorInteger@#]&bir tamsayı alan, tekrar etmeden asal çarpanların bir listesini alan, güç kümesini alan, boş kümeyi kaldıran ve ardından her kümenin toplamını alan başka bir adsız işlevdir. Yani Tr/@Rest@Subsets[#&@@@FactorInteger@#]&[2013]döner {3, 11, 61, 14, 64, 72, 75}.

Sonra Tr/@Rest@Subsets[#&@@@FactorInteger@#]&ifadenin üzerine eşleyin IntersectingQ[2013, 2014]. Tr/@Rest@Subsets[#&@@@FactorInteger@#]&[2013]ve Tr/@Rest@Subsets[#&@@@FactorInteger@#]&[2014]]listeler, bu yüzden toplama sonucunu alabiliriz.


IntersectingQİlk arama inanılmaz! :)
Martin Ender

Bir açıklama ekler misiniz?
Lynn

2

PARI / GP , 98 bayt

Faktör, yakalama primesleri ( [,1]), boş olmayan alt kümeler üzerinde döngü, toplam ve uniq, sonra bunun iki sayı için kesişimine neden olur. Dönen değer, 0 olmadıkça gerçeğe yakın olan kavşakların sayısıdır.

f(n,v=factor(n)[,1])=Set(vector(2^#v-1,i,vecsum(vecextract(v,i))))
g(m,n)=#setintersect(f(m),f(n))

2

APL (Dyalog Genişletilmiş) , 23 17 bayt SBCS

-5 ngn sayesinde

Anonim tam yapıştırma işlevi.

1<≢⍤∩⍥(∊0+⍀.,∪⍤⍭)

Çevrimiçi deneyin!

⍥{} Her iki argümana aşağıdaki isimsiz fonksiyonu uygulayın:

 asal faktörler

 sonra

 Bunların eşsiz olanları

0+⍀., Her faktöre birleştirilmiş sıfırın ek tablo azaltma

ε nlist (düzleştirmek)

 kavşak

 sonra

 Bunların taksisi

1< birden fazla var mı (biri hiçbir faktörün toplamı olmadığı için)


sadece uygun dyalog özelliklerini kullanma: p+.×⊤1↓⍳2*≢p←->1↓∊(⊢,+)/0,⍨
ngn

daha kısa:1↓∊∘.+/0,¨
ngn

hangi 1↓∊0∘.+.,bir inouter ürün - ne sıklıkta görüyorsun :)
ngn

Eğer doğru anlıyorsam , bu da çalışması gerekir:1<∘≢∩⍥{∊0∘.+.,∪⍭⍵}
ngn

@ ngn Teşekkürler. Bitti.
AdAm

2

05AB1E , 10 8 bayt

f€æO`å¦à

@Emigna sayesinde -2 bayt .

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

f         # Get all distinct prime factors of both values in the (implicit) input-list
          #  i.e. [2013,2014] → [[3,11,61],[2,19,53]]
 ۾       # Get the powerset for each
          #  → [[[],[3],[11],[3,11],[61],[3,61],[11,61],[3,11,61]],
          #     [[],[2],[19],[2,19],[53],[2,53],[19,53],[2,19,53]]]
   O      # Sum each inner-most list
          #  → [[0,3,11,14,61,64,72,75],[0,2,19,21,53,55,72,74]]
    `     # Push both lists to the stack
     å    # Check for each value in the second list if it's present in the first list
          #  → [1,0,0,0,0,0,1,0]
      ¦   # Remove the first item (since the powerset included empty leading lists)
          #  → [0,0,0,0,0,1,0]
       à  # Check if any are truthy by taking the maximum (which is output implicitly)
          #  → 1

1
f€æO`å¦à8 için çalışmalı.
Emigna


1

Python 3 , 206 bayt

Bu, 2 sayı alan ve ortak sahip oldukları herhangi bir asal faktör toplamını içeren bir kümeyi döndüren bir lambda işlevidir (m). Python'da bu, boş olmadığında bir gerçeğe yakın değer ve boşken bir falsey değeridir.

Düzenleme: Orijinal yanıtımın asıl girdilerde @JoKing'in belirttiği gibi işe yaramadığı ortaya çıktı. Bu, (bazı diğer hatalarla birlikte) 40 baytlık trajik maliyetle düzeltildi.

q=__import__('itertools').permutations
def p(n):
 i,s=2,set()
 while~-n:
  if n%i:i+=1
  else:n//=i;s|={i}
 return s
s=lambda f:{sum(i)for l in range(1,len(f)+1)for i in q(f,l)}
m=lambda a,b:s(p(a))&s(p(b))

Yorumları kullanarak hızlı açıklama:

#Alias for permutations function
q=__import__('itertools').permutations
#Returns set of prime factors of n, including n, if prime
def p(n):
 i,s=2,set()
 while~-n:
  if n%i:i+=1
  else:n//=i;s|={i}
 return s
#Returns all possible sums of 2 or more elements in the given set
s=lambda f:{sum(i)for l in range(1,len(f)+1)for i in q(f,l)}
#Returns any shared possible sums of prime factors of a and b (the intersection of the sets)
m=lambda a,b:s(p(a))&s(p(b))

Çevrimiçi deneyin!


Bu, ilk test için işe yaramaz 5,6, çünkü asıl girdileri ele almaz
Jo King,

@JoKing Bunu yakaladığınız için teşekkürler. Cevap güncellendi.
senox13

1

APL (NARS), 50 karakter, 100 bayt

{⍬≢↑∩/+/¨¨{⍵∼⊂⍬}¨{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}¨∪¨π¨⍵}

burada π argümanındaki faktör dizisini bulur;

{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵} 

tüm alt kümeleri bulan işlev olurdu ... şunu söylemeliyim ki {⍵operator itsArguments} ¨ (her bir sol için) ve ¨ (her bir sağ için) döngüleri sabit sayıda döngü taklit edebilir ve ¨¨, tamam bir kümenin altkümelerini görmek için ... bu şekilde görülebilir, döngüleri tanımlamaktaki sembolleri azaltıyor gibi görünür ...; Ölçek

  h←{⍬≢↑∩/+/¨¨{⍵∼⊂⍬}¨{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}¨∪¨π¨⍵}
  h 5 6
1
  h 2013 2014
1
  h 8 15
0
  h 21 25
0

Küçük bir analiz:

π¨⍵  for each arg apply factor 
∪¨ for each arg apply unique
{0=⍴⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}¨ for each arg apply subsets
{⍵∼⊂⍬}¨ for each argument subtract Zilde enclosed (that would be the void set)
+/¨¨ for each arg (for each arg apply +/)
⍬≢↑∩/ apply intersection, get the first argument and see if it is Zilde (this it is right because enclosed Zilde it seems is the void set)

1

Japt , 14 bayt

®k â ã mx
rf Ê

@Shaggy sayesinde 3 bayt kaydedildi

Dene


İkinci satır ÎfUÌ lveya daha kısa olabilir rf l. Bunu yapmanın en kısa yolu olurdu, ama Oliver seni dövdü.
Shaggy,

1

Jöle , 18 9 bayt

ÆfŒPḊ§)f/

Çevrimiçi deneyin!

-Jonathan Allan'a -9 ve müthiş yardımlar için teşekkürler :).

Girdiyi iki eleman dizisi olarak alır. Kod açıklaması:

      )    Call Chain 1 for each integer in the input array

ÆfŒPḊ§     Chain 1:
Æf           Compute a list of the prime factors of the integer
  ŒP         Powerset of P, with duplicates and an empty element
    Ḋ        Drop said empty element
     §       Vectorized sum: sum every combination

       f/  Chain 2:
        /    Reduce (the resulting list of two lists of possible sums) by...
       f     ...removing elements to the left that are not in the right

¹


Girişi iki değerin bir listesi olarak alın ve kaçının ,. ẒƇHiçbir olmayan asal asal-faktörler vardır, gereksiz olduğunu. O zaman ÆFḢ€ sadece Æf, ikincisi bize, örneğin 26=2*13ve 125=5*5*5süre zarfında ihtiyaç duyabileceğimiz tekrarları vermesi dışında 2+13=5+5+5. Hatta bununla ancak yerine örneğin yeterince iyi değil 26kullanım 182=2*7*13da bulmak gerekir 2+13=5+5+5bunun yerine güç set (istiyoruz - ama değil ŒP(kullanabileceğimiz lider, boş, eleman olmadan) ). S€burada ile değiştirilebilir §. - Muhtemelen baytları $ve ile kaydedebilirsiniz Ɗ.
Jonathan Allan

Ben Kullanabileceğimiz sonunda bahsedilenler Quicks gerek yok )ve benim düzeltmelerle doğru şekilde çalışmak (artı değiştirme işlemlerinin œ&ile f:) kodu 9 bayt ÆfŒPḊ§)f/ deneyin-it
Jonathan Allan

Bir açıklama ile güncellendi. Tekrar teşekkürler :)!
Ven,

1
Açıklamanızı biraz güncelledim.
Jonathan Allan

0

Gaia , 16 11 bayt

ḍzΣ¦
↑@↑&ỵ!

Çevrimiçi deneyin!

Üst fonksiyon (birinci satır), ana faktörlerin güç kümesinin toplamını hesaplar ve ikinci fonksiyon, kesişim unsurlarından herhangi birinin sıfır olmadığını tespit eder.

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.