Faktorisasi Array


13

Diberikan array bilangan bulat positif, menghasilkan larik stabil dari faktor prima yang berbeda dari bilangan bulat ini. Dengan kata lain, untuk setiap integer dalam input secara berurutan, dapatkan faktor prima, sortir, dan tambahkan bilangan prima yang belum ada dalam output ke output.

Uji Kasus

[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]
[] -> []

Keluaran dapat berupa larik atau daftar bilangan bulat atau string, keluaran terbatas, atau sarana standar lainnya untuk menghasilkan daftar angka yang dipesan.

Ini adalah , jadi jawaban tersingkat dalam byte menang.



5
Ini adalah salah satu tantangan yang menurut saya “terlalu sederhana”. Hampir setiap jawaban akan terlihat seperti ini: (a) putaran atas input, dan Ye Olde Prime Factorization Code dengan tambahan bersyarat; (B) rantai empat built-in. Tidak ada banyak ruang untuk kreativitas. Mungkin jawabannya akan membuktikan saya salah, tapi saya ragu. Ada sangat sedikit golf daripada faktorisasi utama di sini, dan itu sudah dilakukan sampai mati.
Lynn

1
@ Lynn itu sepele untuk bermain golf, tapi tidak sepele untuk hampir semua hal lain. Tidak yakin apakah itu alasan untuk hal-hal sepele di sini: /
Stephen

Bisakah Anda memberi tahu saya mana yang merupakan "faktor utama yang berbeda" dari 1?
J42161217

1
@DigitalTrauma Ya. Kalau tidak, itu hanya akan "output set semua faktor utama dari input"
Stephen

Jawaban:



5

Sekam , 3 byte

1 byte disimpan berkat @Zgarb .

uṁp

Cobalah online!


Penjelasan

uṁp Program lengkap.

  Faktor prima masing-masing.
 ṁ Fungsi peta lebih dari daftar dan menyatukan hasilnya.
kamu unik. 

3
Σ†bisa .
Zgarb

@ Zgarb Terima kasih banyak. Seperti yang Anda tahu, ini jawaban Husk pertama saya :)
Mr. Xcoder

Sangat menyenangkan melihat orang baru menggunakan Sekam. :)
Zgarb

1
@Zgarb Tampaknya sangat bagus (terutama ketika itu mengungguli Jelly: P)
Mr. Xcoder

5

Utilitas Bash + GNU, 37

  • 21 byte disimpan berkat @muru (wow!)
factor|tr \  \\n|awk '!/:/&&!a[$0]++'

Cobalah online .


1
Saya pikir nl|sort|...dapat dilakukan dengan menggunakan awk: awk '!a[$0]++'(cetak jika tidak terlihat sebelumnya; jadi pesanan tidak pernah hilang), menghemat 15 byte. Kemudian sedperintah dapat dihilangkan dengan menggunakan yang sedikit lebih lama awk: factor|awk '!/:/&&!a[$0]++' RS='[ \n]+'(membagi catatan pada spasi dan baris baru, lewati catatan dengan :), menyimpan 4 byte lainnya.
muru

1
Saya baru menyadari bahwa saya dapat menyimpan dua byte lagi pada komentar sebelumnya dengan menggunakan tr: factor|tr \ \\n|awk '!/:/&&!a[$0]++'(itu adalah dua spasi setelah backslash pertama)
muru

@muru luar biasa - terima kasih! (Saya tidak akan kesal jika Anda memposting ini sebagai jawaban Anda sendiri, yang secara signifikan mengalahkan golf asli saya)
Digital Trauma

4

MATL , 6 byte

"@Yfvu

Cobalah online!

Penjelasan:

"      % 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.

Informasi MATL menarik: umumnya, semua fungsi berlaku untuk vektor (array) dengan mudah. Tetapi dalam kasus ini, jumlah faktor adalah variabel untuk setiap input, dan Matlab dan dengan ekstensi MATL umumnya hanya berurusan dengan matriks persegi, jadi saya harus menggunakan for loop ".

Lebih lanjut, MATL memiliki dua operator gabungan utama: hdan v, penggabungan horizontal dan vertikal. Perilaku mereka berbeda secara signifikan: vmenyatukan seluruh tumpukan, meskipun hanya memiliki satu elemen seperti pada iterasi pertama kami. hmengambil tepat dua elemen dan akan gagal jika hanya ada satu, sehingga tidak cocok untuk aplikasi ini.


4

Brachylog , 6 byte

ḋᵐ↔ᵐcd

Cobalah online!

Brachylog , 6 byte

ḋᵐoᵐcd

Cobalah online!


Penjelasan

ḋᵐ Peta dengan dekomposisi utama (yang mengembalikan faktor-faktor dalam urutan terbalik).
  ↔ᵐ Balikkan masing-masing (atau oᵐ - pesan masing-masing).
    c Concatenate (ratakan).
     d Berduplikasi.


3

PowerShell , 102 byte

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

Cobalah online!

(Pinjam ide faktorisasi dari jawaban TessellatingHeckler pada "Dapatkan engkau di belakang saya Setan-Perdana!")

Mengambil input sebagai array literal $x. Membuat array kosong baru $a. Loops berakhir $x. Setiap iterasi kita loop dari 2ke angka saat ini, memeriksa apakah itu merupakan faktor -andprima, kemudian |sortoutput dari itu, dan menambahkannya $a. Ketika kita selesai melalui $x, kita kemudian output $atetapi |selecthanya -uangka-angka uniknya Ini mengeksploitasi fakta bahwa yang unik bergerak dari kiri ke kanan, mempertahankan kejadian pertama, yang cocok dengan deskripsi masalah. Angka-angka itu ditinggalkan di jalur pipa dan hasilnya tersirat.


3

CJam, 11 byte

{:mfe__&1-}

Fungsi yang mengambil array int dan output array int.

Versi Uji


Bagaimana saya membedakan keluaran dengan banyak karakter? Setidaknya untuk pengujian (online) saya menghasilkan string, bukan array int.
Stephen

Sebagai fungsi, datatype keluarannya adalah array int. CJam secara otomatis mencetak tumpukan ini, dan mencetak array tanpa pembatas. Saya tidak tahu apakah itu cukup baik untuk keperluan Anda. Jika Anda ingin pembatas tambahkan S*di dalam braket tutup.
geokavel

Saya percaya stack berbasis stack dapat dihasilkan oleh ToS, jadi tidak apa-apa, saya hanya ingin tahu. Terima kasih.
Stephen




2

Mathematica, 64 byte

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

memasukkan

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


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

2

Haskell, 77 byte

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

Penjelasan:

  • yang x!ykembali Operator daftar semua faktor prima dari xyang lebih besar dari atau sama dengany
  • yang (!2)fungsi mengembalikan daftar semua faktor prima dari argumen
  • fungsi pada baris terakhir mengimplementasikan fungsionalitas yang diperlukan

Cobalah online.


2

Brachylog , 6 byte

ḋᵐoᵐcd

Cobalah online!

Penjelasan

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

Fais untuk [10,9,8,7,6,5,4,3,2,1]. Seharusnya [2, 5, 3, 7], tidak[2, 3, 5, 7]
Tn. Xcoder

Anda dapat memperbaikinya untuk +1 byte:ḋᵐoᵐcd
Tn. Xcoder

@ Mr.Xcoder Terima kasih, sudah diperbaiki. Persyaratan imo yang cukup tidak masuk akal.
Fatalkan

Ini tidak benar-benar tidak masuk akal, karena itu kecil, sedikit kurang sepele. Saya juga memposting jawaban saya sendiri, tetapi saya menggunakan yang dibalik terlebih dahulu sebagai ganti pesanan. Tidak yakin mengapa faktor prima dihasilkan dalam urutan terbalik?
Tn. Xcoder

@Fatalize well - tantangannya bukan "mengurutkan faktor-faktor utama yang berbeda dari daftar," itu "beralih melalui daftar dan menambahkan faktor-faktor utama yang berbeda."
Stephen

2

Ohm v2 , 3 byte

Namun 3-byter lain (berkat bahasa dengan auto-vektorisasi).

m{U

Cobalah online!


Penjelasan

m Faktor prima. Melakukan vektorisasi otomatis pada input.
 {Ratakan.
  U Uniquify.

2

Japt , 6 byte

mk c â

Menguji


Penjelasan

Input array secara implisit U. Peta ( m) di atasnya, dapatkan faktor ( k) dari setiap elemen. Ratakan ( c), dapatkan elemen unik ( â) dan keluaran secara implisit.


2

Python 3 , 128 125 116 byte

Ini adalah solusi Python murni. Tidak ada paket. Terima kasih kepada Halvard karena telah menghemat 9 byte.

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

Cobalah online!

Python 2 , 133 127 126 byte

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)

Cobalah online!

Python 2 , 142 138 134 byte

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

Cobalah online!

Sangat terkejut belum ada jawaban Python. Bekerja pada golf.



@HalvardHummel Terima kasih
Tn. Xcoder

2

Deorst , 16 byte

EDkE]l1FeFPkEQE_

Cobalah online!

Dilakukan dengan bantuan dari @cairdcoinheringaahing di chatroom Deorst (perhatikan bahwa solusinya berbeda).


Penjelasan

EDkE] l1FeFPkEQE_ Program lengkap.

ED Dorong daftar pembagi setiap elemen.
  k Cegah tumpukan agar tidak disusun ulang.
   E] Ratakan tumpukan.
     l1Fe Hapus 1s dari tumpukan (karena caird bergegas dan membuat 1 prima!) - Harus dihapus dalam rilis bahasa di masa depan.
         FP Simpan bilangan prima.
           k Cegah tumpukan agar tidak disusun ulang.
            EQ Deduplicate.
              E_ Keluarkan hasilnya.

2

Deorst , 16 byte

EDkE]EQFPkl1FeE_

Cobalah online!

Dilakukan dengan bantuan dari @ Mr.Xcoder. Ini terlalu lama untuk bahasa pseudogolf.

Bagaimana itu bekerja

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 byte

mPs}

Coba di sini!

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

Aduh, aku ninja sama sekali - Baik kami punya pendekatan berbeda :)
Tn. Xcoder

: P Perbedaan satu byte. Saya pikir itu diizinkan atau setidaknya menurut konsensus terakhir yang saya baca
Blue

Ya, jawaban rangkap, bahkan byte-ke-byte diperbolehkan
Tn. Xcoder


1

SAYA, 17 byte

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

Cobalah online!

Bagaimana?

  • input yang dievaluasi
  • pembagi (vektorisasi / verifikasi)
  • meratakan
  • ’⊢f(‘decrement, filter, increment (hapus 1)
  • 53ǵ'string 'P'dalam codepage MY, yang merupakan pengujian primality. Sedihnya 0x35=53adalah bilangan prima ke-16, dan tidak ada perintah untuk mendorong 16ke stack> _ <.
  • ƒ sebagai fungsi
  • f( saring dengan itu
  • ū unikkan
  • keluaran

1

C ++, 118 byte

[](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;}

Perlu melewati input dalam std::vector<int>, mengembalikan yang lain std::vector<int>untuk output.


1

J, 10 byte

~.(#~*),q:

Saya yakin beberapa J-er pintar bisa membuat ini lebih pendek.



1

Python 2, 88 119 103 byte

Kita mulai. Dengan penyortiran yang benar.

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*

Saya tidak bisa menjalankannya di TIO, karena paketnya tidak didukung. Itu berjalan di mesin saya tho. Berikut ini adalah hasil tes saya:

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([],[])                         #[]

Entah bagaimana saya tidak bisa menjadikan fungsinya sebagai fungsi lambda. Setiap kali saya mencoba mengembalikan pemahaman daftar, ia mengembalikan [Tidak, Tidak, ...]. Jika saya hanya mengabaikan sesuatu, bisakah seseorang menunjukkan kesalahan itu? Terima kasih untuk umpan baliknya!


Edit:

Menggunakan algoritma penyortiran Tn. Xcoders, saya dapat mengurangi kode sebanyak 16 byte. Terima kasih untuk bagian itu.

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

Tampaknya ini tidak benar. Kasing uji kedua harus keluar [2, 5, 3, 7]. Urutan output penting.
Mego

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

Urutan output penting. Baca kembali penjelasannya, atau lihat jawaban lain - Saya tidak tahu bagaimana lagi menjelaskannya.
Stephen

@Stephen. Diperbarui rutin, dengan output yang benar. Butuh beberapa saat sampai saya perhatikan perbedaan di setiap baris. Fokus saat membaca sangat membantu.
Simon

@Simon menghemat tiga byte dengan menyingkirkan spasi setelah parens - s.append(x) for-> s.append(x)for, primefac(i)) for-> primefac(i))for, []) if->[])if
Stephen

1

Braingolf , 7 byte

&(p)u=;

Cobalah online!

Oh, lihat, ini pada dasarnya rantai 4 built-in

Penjelasan

&(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

Gagal untuk [10,9,8,7,6,5,4,3,2,1]. - Perintah penting: Anda harus kembali [2, 5, 3, 7]bukan [2, 3, 5, 7].
Tn. Xcoder

Anda dapat memperbaikinya untuk -1 byte . Karena Khanya membahayakan di sini.
Tn. Xcoder

@ Mr.Xcoder oh benar ya, tidak menyadari bahwa mereka seharusnya dalam urutan kejadian, bukan urutan naik. Diperbaiki
Skidsdev

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.