Bir çarpanlara ayırma oyunu


13

Giriş

Tek bir tamsayı .1x1015

Çıktı

ürününe sahip maksimum pozitif tamsayı sayısı .x

Örnekler

Girdi: 1099511627776. Çıktı: 9. Olası en uygun faktör listesi: (1, 2, 4, 8, 16, 32, 64, 128, 4096).

Girdi: 127381. Çıktı 4. Olası bir optimal faktör listesi: (1, 17, 59, 127).

Bu eski soru ile ilgili .


9
Birkaç test örneği daha ekleyebilir misiniz? (Tercihen makul büyüklüktedir.)
Arnauld

8
Çoğu cevap hakkındaki yorumlarınız göz önüne alındığında: bunun yerine verimli kod arıyorsanız, bu kesinlikle olarak etiketlenmemelidir code-golf. Yaklaşan bir zorluk için ya fastest-codeda düşünebilirsiniz fastest-algorithm. Tüm cevapların belirtilen aralık dahilinde sınırlı bir süre içinde çalışmasını gerçekten istiyorsanız, açıkça belirtilmiş olmalıdır. (Ve code-golftamamen çatışmaması için daha küçük bir aralık tavsiye ederdim .)
Arnauld

@ Arnauld Hayır Kod-golf yapmak için dikkatliim ve kimse bunun için yargılanmıyor. Kodun belirtilen girdi aralıkları için çalışabilmesi harika olurdu.
Anush


1
Çünkü OEIS'de bulamadığım bir x=1, 2, ...şey elde f(x)=1, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 3, 4, 2, 3ediyorum. Faktöriyel sayılar için kayıtların görüneceği yeterince açıktır x. Örneğin en küçük xşekilde f(x)=13olacaktır 13!. Sanırım fsadece asal çarpanın üssüne bağlı. Yani bulmak için f(13^4*19^7*29^2)basitleştirebiliriz f(2^7*3^4*5^2).
Jeppe Stig Nielsen

Yanıtlar:


5

Wolfram Dili (Mathematica) , 52 bayt

Max[Length/@Cases[Subsets@Divisors@#,{a__}/;1a==#]]&

Çevrimiçi deneyin!

@Attinat sayesinde 4 byte tasarruf edildi

İşte da 153 byte versiyonu olduğunu hesaplamamakta 1099511627776ve10^15

Max[Length/@Table[s=RandomSample@Flatten[Table@@@FactorInteger[#]];Last@Select[Times@@@TakeList[s,#]&/@IntegerPartitions@Length@s,DuplicateFreeQ],5!]]+1&      

Çevrimiçi deneyin!

İçin sonuç 10^15olduğunu 12

{1, 2, 4, 5, 10, 16, 25, 40, 50, 100, 125, 250}


1099511627776 ile Anlaşmalar
Anush

7
@Anush Çökmez. Sadece hafızaya ihtiyaç var. Bellek sınırlamaları hakkında hiçbir şey söylemediniz. Bu kod golf
J42161217

Evet anlıyorum. Soruda belirtilen giriş aralıklarının kodunu gerçekten çalıştırabilirseniz iyi olur.
Anush

6
@Anush Bu kod golfü. Güzel cevaplar değil. Lütfen kriterlerinizi belirtin. Bir cevap ya geçerli ya da değil. Sanırım burada sorun soru ... Belki "en yeterli algoritma" olarak değiştirmeniz gerekir
J42161217

3
@Anush Cevabımda bir düzenleme yaptım ve kontrol etmek istemeniz durumunda gerçekten hızlı ve verimli bir sürüm daha ekledim
J42161217


3

05AB1E , 9 bayt

Çok verimsiz. Çok sayıda bölücüye sahip sayılar için TIO'da zaman aşımına uğrar.

ÑæʒPQ}€gZ

Çevrimiçi deneyin!

açıklama

Ñ          # push a list of divisors of the input
 æ         # push the powerset of that list
  ʒPQ}     # filter, keep only the lists whose product is the input
      €g   # get the length of each
        Z  # take the maximum

TIO kodunuz 9 yerine 3 çıktı gibi görünüyor.
Anush

@Anush: Örneğinizden farklı bir sayıdır (çünkü birçok faktörden dolayı zaman aşımına uğramıştır). Muhtemelen daha farklı bir örnek kullanmalıyım.
Emigna

€gZéθgaynı bayttan biraz daha verimlidir .
Grimmy

@Grimy: Doğru. Buradaki büyük kötü adam olan filtre olduğu için çok fazla fark
yaratmayacak

2

Perl 6 , 38 bayt

{$!=$_;+grep {$!%%$_&&($!/=$_)},1..$_}

Çevrimiçi deneyin!

Bölenleri seçmek için açgözlü yaklaşımı benimser.


1099511627776
Anush

6
@Anush Sonunda bitiyor . Genellikle cevap, programın algoritması herhangi bir girdi ile çalışacaksa, istendiği kadar bellek ve zaman verildiğinde geçerlidir. Bu kod golf olduğundan , algoritmik karmaşıklık için değil kod uzunluğu için optimize
Jo King

2

Javascript (ES6), 39 bayt

f=(n,i=0)=>n%++i?n>i&&f(n,i):1+f(n/i,i)

Muhtemelen buraya ve buraya kaydedilebilecek birkaç bayt var. Sadece açgözlü algoritmayı faktörler için kullanır.


2

Jöle , 9 bayt

ŒPP=³ƊƇẈṀ

Çevrimiçi deneyin!

Birisi sayesinde -1 bayt

ErikTheOutgolfer sayesinde -2 bayt


OEIS süper üstü oyuncusu için bir girdi hazırlarken, 11 baytlık olası golf yapılabilir bir Jelly programı oluşturdum (bu farklı bir yaklaşım kullanıyor) ve bir Jelly cevabı yayınlamak pek mümkün değil, bu yüzden çözümünüzden bir bayt golf oynadığımı iddia edeceğim: ÆE×8‘½’:2S‘( A003056 için OEIS "formül" bölümünün gücü ile çalışır). Feragatname: yanlış olabilir, ancak test senaryolarında çalışır.
zamirim

1099511627776
Anush

@someone 36 kişi için çalışmıyor ama teşekkürler
HyperNeutrino

@Anush evet, gerçekten yavaş çünkü kod yazdı, verimlilik için optimize edilmedi
HyperNeutrino

1
ÆDx21


2

Brachylog , 8 bayt

f;?⟨⊇×⟩l

Çevrimiçi deneyin!

(Saf yaklaşım, {~×≠l}ᶠ⌉bunları ortadan kaldırmadan önce fazladan 1'ler ile sonsuz sayıda çözüm üretir ve böylece aslında sonlandırılamaz. Yine de, aynı bayt sayısı için olduğu için bu bir sorun değildir!)

Girdi değişkeni üzerinden girdi ve çıktı değişkeni üzerinden çıktı alır. TIO'daki başlık, faktör listesinin ne olduğunu göstermek için kodun çoğunun bir kopyasını içerir, ancak bu onsuz mükemmel şekilde çalışır. Yana ilk büyük sublists verir, bu yüklem aslında diğer birçok cevapları aynı şeyi yapar, ancak açıkça üreten ve faktörlerin tam POWERSET filtreleme olmadan, teşekkürler Backtracking için.

            The output
       l    is the length of
    ⊇       a sublist (the largest satisfying these constraints)
f           of the factors of
            the input
 ; ⟨  ⟩     which
     ×      with its elements multiplied together
  ?         is the input.


1

Gaia , 10 9 bayt

Π=
dz↑⁇(l

Çevrimiçi deneyin!

Başka bir yerde görüldüğü gibi aynı "algoritma" izler - numaraya eşit ürün ile en uzun bölen güç setini filtre ve uzunluğunu döndürür.

	| helper function
Π=	| is prod(list)==n (implicit)?
	|
	| main function; implicitly takes n
dz	| divisor powerset (in decreasing order of size)
  ↑⁇	| filter by helper function
    (l	| take the first element and take the length (implicitly output)

0

Deniz tarağı , 15 bayt

p}_`nq#:;qQ@s~Q

TIO bağlantısı çok yakında (dennis çekildiğinde)

Temelde @ Emigna'nın 05AB1E çözümünün bir limanı.

açıklama

                - Implicit Q = first input
p               - Print...
 }              - The last element of...
  _             - Sorted...
   `nq          - Lengths of... (map q => q.len)
           @s   - Items in powerset of
             ~Q - Proper divisors of Q
      #         - Where... (filter)
        ;q      - Product of subset
       :        - Equals...
          Q     - Q

0

C # (Visual C # Etkileşimli Derleyici) , 54 bayt

int f(int n,int i=0)=>n%++i<1?1+f(n/i,i):n>i?f(n,i):0;

@ Vrugtehagel ve @ JoKing'in cevaplarıyla aynı yaklaşımı kullanır.

Çevrimiçi deneyin!


Mantıklarınızı doğru bir şekilde uyguladığımı varsayarsak, 53 baytlık bir çözüm ("dönüş" anahtar kelimesinden kurtulamadığım): Çevrimiçi deneyin!
zamirim

1
@someone Teşekkürler, ancak metaya göre işlevlerin yeniden kullanılabilir olması gerekir . Ayrıca, fonksiyonun dışında bir noktalı virgül bırakmak, bu konuda bir meta yazı yapabilir beyanları kabul edilebilir olup olmadığını bilmiyorum.
Cehaletin Somutlaşması

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.