Çarpanlarına ayırın! …kötü


15

Meraklı bir çocuk bir sayı veya aşağıdaki formda bir ifade çarpanlara bir programı kullanır: p1^e1 * p2^e2 * ... * pn^en. Eşdeğer 1üsler, örn.360 = 2^3 * 3^2 * 5

Çocuk bu çıktıyı programa yeni girdi olarak yazar, ancak ^işareti anlamıyor, bu yüzden bazen ilgili ana ve üsleri birleştirenlerden bir veya daha fazlasını atlıyor. Örneğin(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Bu hatalar nedeniyle tekrar girebileceği farklı bir çarpanlara ayırma yapabilir (0 veya daha fazlasını atlayarak ^). Çarpanlara ayırma artık değişmeyene kadar işlemi tekrarlar (belki artık başka bir şey kalmaz ^veya çıktıyı doğru kopyalar).

Bir integer n( n>1) verilen tüm olası sayıları artan sırayla çıkaran bir program veya işlev yazmalısınız n. Örneğin, girdi 16için olası son faktörleştirmeler(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Giriş ayrıntıları:

  • girdi, daha büyük tek bir tamsayıdır 1
  • çıkış sayısı daha büyük olan hiçbir girdi verilmeyecektir 2^31-1
  • 1000çıkış numaralarından daha fazlasını üreten hiçbir giriş verilmeyecektir

Çıktı ayrıntıları:

  • kendi dilinize uygun bir tamsayı listesi

Örnekler:

Giriş => Çıkış

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

Bu kod golf çok kısa bir program kazanır.


Factorize It zaten yok mu?
Doktor

5
@Optimizer Bu oldukça farklı.
randomra

1
360 için son sayı 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange Teşekkürler, düzenlendi.
randomra

Yanıtlar:


5

CJam - 66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

Http://cjam.aditsu.net/ adresinde deneyin.

Açıklama:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*) Teşekkürler Martin


cjam god tanrı cjam kodu
kaine

Herhangi bir miktar ^'bir adımda kaldırılabilir. Yani 58564 = 2^2 * 11^4üretebilmeli 2508 = 22 * 114.
randomra

@randomra bu tür şeyler için bir örnek eklemelisiniz
aditsu quit çünkü SE EVIL

@randomra şimdi daha iyi olmalı
aditsu çıkın çünkü SE EVIL

Harika! Örnek eklendi. Atladığım için üzgünüm.
randomra

4

Yakut, 219

Bunu başlatmak için:

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

Sayı dizisi döndüren bir işlev s oluşturur.

https://ideone.com/iOMGny

Şöyle kullanın:

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

Tüm bunları bir cep telefonuna yazmak çok eğlenceli ...


3

Perl, 193 bayt

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

Okunabilirlik için yeni satırlar eklendi.

For döngüsü, sonraki sayıyı ( $x) çarpanlara %fve güçlere hash ( ) olarak çarpar. Özyinelemeli işlev ( R), ^işaretleri kaldırarak elde edilebilecek tüm sayıları üretmek için bu karmayı kullanır . Bu sayılar bir kuyruğa ( @q) eklenir ve işlem dış while döngüsü tarafından tekrarlanır. Kuyruktaki her sayı, @ryazdırma için benzersiz, sıralı bir dizide ( ) tutulur .


3

Pyth, 46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

Burada deneyin.

Çoklu ^hata düzeltildi . Örneğin:

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

Bu kodun, soru sorulduktan sonra aktarılan resmi derleyiciye yönelik birkaç hata düzeltmesine dayandığını unutmayın. Ancak, herhangi bir yeni dil özelliği kullanmaz.


58564 için ne elde edersiniz?
aditsu bıraktı çünkü SE EVIL

[230, 456, 1311, 58564, 322102].
isaacg

@aditsu Sorun düzeltildi.
isaacg

Pyth titizlikle belgelenmediği için (bulgularıma dayanarak) hata düzeltmeleri ve yeni özellikler arasında ayrım yapmak zordur, bu yüzden bu girişi kazanan cevap olarak seçmemeye karar verdim.
randomra

@randomra Bu yanıtı kabul etmeme kararınızı anlıyorum. Ancak, sadece bugfix ne olduğunu belirtmek istiyorum: uBaşka bir azaltma içinde bir reduce ( ) kullanmak imkansızdı. Uygun yerde 2 değerini 3 olarak değiştirdim, böylece azaltma 2 yerine 3 giriş alacaktı. Hepsi bu.
isaacg
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.