Dizi Çarpanlarına Ayırma


13

Bir pozitif tamsayı dizisi verildiğinde, bu tamsayıların belirgin ana faktörlerinin sabit bir dizisini çıktılar. Başka bir deyişle, girişteki her tamsayı için sırayla, birincil faktörlerini alın, sıralayın ve çıktıda zaten olmayan primerleri ekleyin.

Test Durumları

[1,2,3,4,5,6,7,8,9,10] -> [2,3,5,7]
[10,9,8,7,6,5,4,3,2,1] -> [2,5,3,7]
[100,99,98,1,2,3,4,5] -> [2,5,3,11,7]
[541,60,19,17,22] -> [541,2,3,5,19,17,11]
[1,1,2,3,5,8,13,21,34,45] -> [2,3,5,13,7,17]
[6,7,6,7,6,7,6,5] -> [2,3,7,5]
[1] -> []
[8] -> [2]
[] -> []

Çıktı, bir dizi veya tamsayıların veya karakter dizilerinin listesi, sınırlandırılmış çıktı veya sıralı bir sayı listesi çıktısının başka herhangi bir standart aracı olabilir.

Bu , bayt en kısa cevap kazanır.



5
Bu “çok basit” olduğunu düşündüğüm zorluklardan biri. Hemen hemen her cevap aşağıdakilerden birine benzer: (b) dört yerleşik zincir. Yaratıcılık için fazla yer yok. Belki cevaplar yanlış olduğunu kanıtlar, ama bundan şüpheliyim. Burada golf için asıl çarpanlara ayırma işleminden çok daha az şey var ve bu ölümle sonuçlandı.
Lynn

1
@Lynn, golf sahaları için önemsizdir, ancak neredeyse her şey için önemsiz değildir. Burada önemsizliğin sebebi olup olmadığından emin değilim: /
Stephen

Hangisinin 1'in "belirgin ana faktörleri" olduğunu söyleyebilir misiniz?
J42161217

1
@DigitalTrauma Evet. Aksi takdirde sadece "girdinin tüm ana faktörlerinin setini çıktılar" olacaktır
Stephen

Yanıtlar:



5

Kabuk , 3 bayt

@Zgarb sayesinde 1 bayt kaydedildi .

uṁp

Çevrimiçi deneyin!


açıklama

uṁp Tam program.

  Her birinin ana faktörleri.
 function İşlevi liste üzerinde eşleyin ve sonucu birleştirin.
u Benzersiz. 

3
Σ†olabilir .
Zgarb

@Zgarb Çok teşekkürler. Anlayacağınız gibi, bu benim ilk Husk cevabım :)
Bay Xcoder

Husk kullanan yeni insanlar görmek güzel. :)
Zgarb

1
@Zgarb Çok hoş görünüyor (özellikle Jelly: P'den daha fazla olduğunda)
Bay

5

Bash + GNU yardımcı programları, 37

  • @Muru sayesinde 21 bayt kaydedildi (wow!)
factor|tr \  \\n|awk '!/:/&&!a[$0]++'

Çevrimiçi deneyin .


1
Bence nl|sort|...yapılabilir awk: awk '!a[$0]++'(daha önce görülmezse yazdır; böylece sipariş asla kaybolmaz), 15 bayt tasarruf. Daha sonra sedkomut biraz daha uzun awkbir komut kullanılarak ortadan kaldırılabilir : factor|awk '!/:/&&!a[$0]++' RS='[ \n]+'(boşluklar ve satırsonlarındaki kayıtları böl, kayıtları atla :) ve 4 bayt daha kaydet.
muru

1
Ben sadece kullanarak önceki yorum başka bir iki bayt kaydedebilirsiniz fark etti tr: factor|tr \ \\n|awk '!/:/&&!a[$0]++'(bu ilk ters eğik çizgi sonra iki boşluk)
muru

@muru awesome - teşekkürler! (Bunu kendi cevabınız olarak gönderirseniz üzülmezdim, bu benim orijinalimi önemli ölçüde geride bıraktı)
Digital Trauma

4

MATL , 6 bayt

"@Yfvu

Çevrimiçi deneyin!

Açıklama:

"      % Loop over input
 @     % Push the array element
  Yf   % Prime factors
    v  % Concatenate entire stack vertically (does nothing the first iteration)
     u % Stably get distinct (unique, in MATLAB terminology) elements. Does so every loop but this is code golf, not fastest code.

İlginç MATL tidbitleri: genellikle, tüm fonksiyonlar vektörler (diziler) için de aynı şekilde geçerlidir. Ancak bu durumda, her girdi için faktör sayısı değişkendir ve Matlab ve uzatma ile MATL genellikle sadece kare matrislerle ilgilidir, bu yüzden bir for döngüsü kullanmak zorunda kaldım ".

Ayrıca, MATL'nin iki ana birleştirme operatörü vardır: hve vyatay ve dikey birleştirme. Davranışları önemli ölçüde farklıdır: vilk yinelememizde olduğu gibi tek bir öğe olsa bile tüm yığını birleştirir. htam olarak iki öğe alır ve yalnızca bir tane varsa başarısız olur ve bu uygulama için uygun olmaz.




3

PowerShell , 102 bayt

param($x)$a=@();$x|%{$a+=(2..($z=$_)|?{!($z%$_)-and'1'*$_-match'^(?!(..+)\1+$)..'}|sort)};$a|select -u

Çevrimiçi deneyin!

(TessellatingHeckler en dan Borrows faktörizasyonu fikri cevabı üzerine üzerine "Get sana arkamda Şeytan-Prime!")

Girdiyi değişmez dizi olarak alır $x. Yeni bir boş dizi oluşturur $a. Döngüler $x. Her bir yinelemeden 2geçerli sayıya kadar döngü yaparız , bunun bir faktör olup olmadığını kontrol eder -and, daha sonra |sortbunun çıktısıdır ve ekleriz $a. Biz geçmekte tamamladıktan $xbiz o zaman çıktı $aama |selectsadece -ubunların nique sayılar. Bu, benzersizleştirmenin soldan sağa gitmesi ve sorun oluşumuyla eşleşen ilk oluşumunu korumasından faydalanır. Bu sayılar ardışık düzende bırakılır ve çıktı örtüktür.


3

CJam, 11 bayt

{:mfe__&1-}

Ints dizisini alan ve ints dizisini çıkaran işlev.

Test Sürümü


Çıktıyı birden çok karakterle nasıl ayırt edebilirim? En azından benim (çevrimiçi) testlerim için bir dizi değil, bir dize çıktılar.
Stephen

Bir işlev olarak, çıktı veri tipi bir ints dizisidir. CJam yığını otomatik olarak yazdırır ve sınırlayıcı olmadan dizileri yazdırır. Bunun amacınız için yeterince iyi olup olmadığını bilmiyorum. Sınırlayıcılar istiyorsanız S*, yakın köşeli parantez içine ekleyin .
geokavel

Yığın tabanlı şeritlerin zaten ToS tarafından verilebileceğine inanıyorum, bu yüzden iyi, sadece merak ediyordum. Teşekkürler.
Stephen




2

Mathematica, 64 bayt

Select[DeleteDuplicates[First/@FactorInteger@#~Flatten~1],#>1&]&

giriş

[{100, 99, 98, 1, 2, 3, 4, 5}]


Select[#&@@@Gather[#&@@@Join@@FactorInteger@#],#>1&]&
matrix89

2

Haskell, 77 bayt

import Data.List
x!y|y>x=[]|x`mod`y<1=y:(x`div`y)!y|1<2=x!(y+1)
nub.((!2)=<<)

Açıklama:

  • x!yOperatör döner tüm asal faktörlerin bir liste xdaha büyük olan veya eşity
  • (!2)işlevi, bağımsız değişkeni tüm asal faktörlerin bir listesini döndürür
  • son satırdaki işlev gerekli işlevselliği uygular

Çevrimiçi deneyin.


2

Brachylog , 6 bayt

ḋᵐoᵐcd

Çevrimiçi deneyin!

açıklama

ḋᵐ         Map prime decomposition
  oᵐ       Map order
    c      Concatenate
     d     Remove duplicates

Fais için [10,9,8,7,6,5,4,3,2,1]. O olmalı [2, 5, 3, 7], değil[2, 3, 5, 7]
Sayın Xcoder

+1 bayt için bunu düzeltebilirsiniz:ḋᵐoᵐcd
Bay Xcoder

@ Mr.Xcoder Teşekkürler, düzeltildi. Oldukça duyusal olmayan gereksinim imo olsa.
Ağustos'ta

Küçük, çok az daha az önemsiz olduğu için bu gerçekten mantıklı değil . Ben de kendi cevabımı gönderdim, ama önce sipariş yerine tersini kullandım. Asal faktörlerin neden ters sırada oluşturulduğundan emin değil misiniz?
Bay Xcoder

@Fatalize iyi - meydan okuma "listenin farklı asal faktörler sıralanır", "bu liste boyunca yinelenen ve farklı asal faktörler eklemek" değildir.
Stephen

2

Ohm v2 , 3 bayt

Yine başka bir 3 byter (otomatik vektörlü diller sayesinde).

m{U

Çevrimiçi deneyin!


açıklama

m Temel faktörler. Giriş üzerinde otomatik vektörleşir.
 {Düzleştir.
  U Benzersiz.

2

Japt , 6 bayt

mk c â

Dene


açıklama

Örtülü dizi girişi U. Her öğenin mfaktörlerini ( k) alarak harita ( ) . Düzleştir ( c), benzersiz öğeleri ( â) al ve dolaylı olarak çıktı al.


2

Python 3 , 128125 116 bayt

Bu saf bir Python çözümüdür. Paket yok. 9 bayt kazandığı için Halvard'a teşekkürler.

def f(l):y=[k for i in l for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))];print(sorted({*y},key=y.index))

Çevrimiçi deneyin!

Python 2 , 1331212126 bayt

def f(l):y=sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]);print sorted(set(y),key=y.index)

Çevrimiçi deneyin!

Python 2 , 142131134 bayt

l=input();r=[]
for i in sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]):r+=[i]*(i not in r)
print r

Çevrimiçi deneyin!

Çok Python cevap yoktu şaşırttı. Golf üzerinde çalışıyor.



@HalvardHummel Thanks
Bay

2

Deorst , 16 bayt

EDkE]l1FeFPkEQE_

Çevrimiçi deneyin!

Deorst sohbet odasında @cairdcoinheringaahing'in yardımıyla bitti (çözümlerin farklı olduğunu unutmayın).


açıklama

EDkE] l1FeFPkEQE_ Tam program.

ED Her elemanın bölenleri listesine basın.
  k Yığının yeniden sıralanmasını önleyin.
   E] Yığını düzeltin.
     l1Fe Yığındaki 1'leri kaldırın (çünkü caird koştu ve 1 asal yaptı!) - Gelecekteki dil sürümlerinde kaldırılmalıdır.
         FP Asal değerleri koruyun.
           k Yığının yeniden sıralanmasını önleyin.
            EQ Veri Tekilleştirme.
              E_ Sonucu çıktılar.

2

Deorst , 16 bayt

EDkE]EQFPkl1FeE_

Çevrimiçi deneyin!

@ Mr.Xcoder'ın yardımıyla yapıldı. Bu sahte bir dil için çok uzun.

Nasıl çalışır

EDkE]EQFPkl1FeE_ - Full program, implicit input: [1,2,3,4,5]

ED               - Get divisors. Vectorizes. STACK = [[1], [1,2], [1,3], [1,2,4], [1,5]]
  k              - Turn off sorting for the next command
   E]            - Flatten the stack. STACK = [1, 1, 2, 1, 3, 1, 2, 4, 1, 5]
     EQ          - Deduplicate stack in place. STACK = [1, 2, 3, 4, 5]
       FP        - Filter by primality 1 is considered prime. STACK = [1, 2, 3, 5]
         k       - Turn off sorting for the next command
          l1     - Push 1. STACK = [1, 2, 3, 5, 1]
            Fe   - Filter elements that are equal to the last element. STACK = [2, 3, 5]
              E_ - Output the whole stack

1

Pyke , 4 bayt

mPs}

Burada deneyin!

mP   -   map(factorise, input)
  s  -  sum(^)
   } - uniquify(^)

Ah, seni çok kötü ninja ettim - İyi farklı yaklaşımlarımız var :)
Bay Xcoder

: P Bir bayt farkı. Sanırım ya da en azından okuduğum son fikir birliğine göre izin verildi
Blue

Evet, yinelenen cevaplara, bayt-bayta bile izin verilir
Bay Xcoder


1

MY, 17 bayt

⎕Ḋḟ’⊢f(‘53ǵ'ƒf(ū←

Çevrimiçi deneyin!

Nasıl?

  • değerlendirilmiş girdi
  • bölücüler (vectorized / vecizes)
  • düzleştirmek
  • ’⊢f(‘azaltma, filtre, artış (kaldırır 1)
  • 53ǵ''P'MY kod sayfasındaki dize , öncelik testi. Ne yazık ki 0x35=5316. asal sayıdır ve 16yığına> _ < itmek için bir komut yoktur .
  • ƒ işlev olarak
  • f( buna göre filtrele
  • ū uniquify
  • çıktı

1

C ++, 118 bayt

[](auto n){decltype(n)r;for(int m:n)for(int i=1,j;i++<m;){j=m%i;for(int x:r)j|=!(i%x);if(!j)r.push_back(i);}return r;}

Girişin a geçirilmesi gerekiyor, çıkış için bir tane daha std::vector<int>döndürür std::vector<int>.


1

J, 10 bayt

~.(#~*),q:

Bazı akıllı J-er'lerin bunu kısaltabileceğinden eminim.



1

Python 2, 88 119 103 bayt

İşte başlıyoruz. Doğru sıralama ile.

def f(l,s=[]):[s.append(x) for x in sum([list(primefac(i)) for i in l],[]) if x not in s];print s
from primefac import*

Görünüşe göre paket desteklenmediği için TIO üzerinde çalışamıyor. Tho makinemde çalışıyor. İşte Test çıktılarım:

f([1,2,3,4,5,6,7,8,9,10],[])     #[2, 3, 5, 7]
f([10,9,8,7,6,5,4,3,2,1],[])     #[2, 5, 3, 7]
f([100,99,98,1,2,3,4,5],[])      #[2, 5, 3, 11, 7]
f([541,60,19,17,22],[])          #[541, 2, 3, 5, 19, 17, 11]
f([1,1,2,3,5,8,13,21,34,45],[])  #[2, 3, 5, 13, 7, 17]
f([6,7,6,7,6,7,6,5],[])          #[2, 3, 7, 5]
f([1],[])                        #[]
f([8],[])                        #[2]
f([],[])                         #[]

Bir şekilde lambda fonksiyonu olarak işlevini yerine getiremedim. Liste anlayışını döndürmeye çalıştığımda, [None, None, ...] döndürür. Sadece bir şeye bakmazsam, birisi bu hatayı gösterebilir mi? Geri dönüşünüz için teşekkür ederiz!


Düzenle:

Bay Xcoders sıralama algoritmasını kullanarak kodu 16 bayt azaltabilirim. O kısım için teşekkürler.

from primefac import*
def f(l):a=sum([list(primefac(i))for i in l],[]);print sorted(set(a),key=a.index)

Bu doğru görünmüyor. İkinci test durumu çıktılanmalıdır [2, 5, 3, 7]. Çıkışların sırası önemlidir.
Mego

sorted(set().union(*map(primefac,l)))
Alex Hall

Çıktıların sırası önemlidir. Açıklamayı tekrar okuyun veya diğer cevaplara bakın - başka nasıl açıklayacağımı gerçekten bilmiyorum.
Stephen

@Stephen. Doğru çıktı ile rutin güncellendi. Her satırdaki farklılıkları fark edene kadar biraz zamanımı aldı. Okurken odaklanmak çok yardımcı olur.
Simon

@Simon parens sonra alanlardan kurtularak üç bayt tasarruf - s.append(x) for-> s.append(x)for, primefac(i)) for-> primefac(i))for, []) if->[])if
Stephen

1

Braingolf , 7 bayt

&(p)u=;

Çevrimiçi deneyin!

Oh bak, temelde 4 yerleşik bir zincir

açıklama

&(p)u=;  Implicit input from commandline args
 (.)     Sandbox loop, sandboxes each item in a separate stack and runs the
         code within the loop.
&        Append the entire sandboxed stack when loop ends, rather than only the
         top of stack after each iteration
  p      Prime factors
    u    Unique
     =   Print stack
      ;  Suppress implicit output

İçin başarısız [10,9,8,7,6,5,4,3,2,1]. - Sipariş önemlidir: [2, 5, 3, 7]yerine geri dönmelisiniz [2, 3, 5, 7].
Bay Xcoder

-1 bayt için bunu düzeltebilirsiniz . Çünkü Kburada sadece zarar veriyor.
Bay Xcoder

@ Mr.Xcoder oh evet, artan düzende değil, gerçekleşme düzeninde olmaları gerektiğinin farkında değildim. Düzeltildi
Skidsdev

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.