Hitung faktor prima

27

Kami memiliki tantangan faktorisasi utama beberapa waktu yang lalu, tetapi tantangan itu sudah hampir enam tahun dan hampir tidak memenuhi persyaratan kami saat ini, jadi saya percaya ini saatnya untuk yang baru.

Tantangan

Tulis program atau fungsi yang memasukkan bilangan bulat lebih besar dari 1 dan menampilkan atau mengembalikan daftar faktor prima.

Aturan

  • Input dan output dapat diberikan dengan metode standar apa pun dan dalam format standar apa pun.
  • Faktor duplikat harus dimasukkan dalam output.
  • Output mungkin dalam urutan apa pun.
  • Masukan tidak akan kurang dari 2 atau lebih dari 2 31 - 1.
  • Built-in diizinkan, tetapi termasuk solusi non-builtin dianjurkan.

Uji kasus

2 -> 2
3 -> 3
4 -> 2, 2
6 -> 2, 3
8 -> 2, 2, 2
12 -> 2, 2, 3
255 -> 3, 5, 17
256 -> 2, 2, 2, 2, 2, 2, 2, 2
1001 -> 7, 11, 13
223092870 -> 2, 3, 5, 7, 11, 13, 17, 19, 23
2147483646 -> 2, 3, 3, 7, 11, 31, 151, 331
2147483647 -> 2147483647

Mencetak gol

Ini adalah , jadi kode terpendek dalam byte menang.

Produksi ETH
sumber
2
Akan jauh lebih baik jika Anda melarang built-in.
Buffer Over Read
2
@TheBitByte Tantangan yang melarang built-in umumnya dipandang rendah sebagai Do X tanpa Y tantangan, terutama karena kadang-kadang sulit untuk mengatakan apakah suatu solusi secara teknis built-in.
ETHproduksi
1
Kalau begitu, nikmati masuknya solusi <5 byte! Saat saya menulis ini, Pyth sudah melakukannya dalam 1 byte.
Buffer Over Read
2
@TheBitByte Anggap itu sebagai tantangan bahasa per bahasa, terutama. Cobalah untuk mengalahkan solusi Python, atau bahasa lain tanpa builtin.
isaacg
1
@isaacg Ya, bahasa demi bahasa adalah cara yang lebih baik untuk melihatnya, saya setuju.
Buffer Over Read

Jawaban:

15

Pyth , 1 byte

P

Saya suka peluang Pyth dalam tantangan ini.

isaacg
sumber
16
Sampai bahasa "P" muncul dan melakukannya dalam 0 byte
downrep_nation
13

Python 2 , 55 byte

f=lambda n,k=2:n/k*[0]and(f(n,k+1),[k]+f(n/k,k))[n%k<1]

Cobalah online!

Dennis
sumber
1
Saya yakin Anda sudah menunggu selama satu jam ...
ETHproduk
10

Python 2, 53 byte

f=lambda n,i=2:n/i*[f]and[f(n,i+1),[i]+f(n/i)][n%i<1]

Mencoba setiap pembagi potensial isecara bergantian. Jika iadalah pembagi, tambahkan dan mulai kembali dengan n/i. Lain, coba pembagi tertinggi berikutnya. Karena pembagi diperiksa dalam urutan yang meningkat, hanya yang utama yang ditemukan.

Sebagai sebuah program, untuk 55 byte:

n=input();i=2
while~-n:
 if n%i:i+=1
 else:n/=i;print i
Tidak
sumber
8

Mathematica, 38 30 byte

Terima kasih @MartinEnder selama 8 byte!

Join@@Table@@@FactorInteger@#&
JungHwan Min
sumber
Bagaimana dengan FactorInteger[#][[All, 1]]&? 26 byte
David G. Stork
@ DavidG. Kerja itu tidak akan berhasil karena tidak akan mengulangi faktor utama jika kekuatannya lebih besar dari 1.
JungHwan Min
5

Haskell , 48 byte

(2%)
n%1=[]
n%m|mod m n<1=n:n%div m n|k<-n+1=k%m

Cobalah online! Contoh penggunaan: (2%) 1001hasil [7,11,13].

Laikoni
sumber
4

JavaScript (ES6), 44 byte

f=(n,x=2)=>n-1?n%x?f(n,x+1):[x,...f(n/x)]:[]

Sangat tidak efisien karena fakta bahwa ia beralih dari 2 hingga setiap faktor utama, termasuk yang terakhir. Anda dapat memotong kompleksitas waktu secara dramatis dengan biaya 5 byte:

f=(n,x=2)=>x*x>n?[n]:n%x?f(n,x+1):[x,...f(n/x,x)]
Produksi ETH
sumber
3

Sebenarnya , 6 byte

w`in`M

Cobalah online!

Penjelasan:

w`in`M
w       factor into primes and exponents
 `in`M  repeat each prime # of times equal to exponent
Mego
sumber
Anda mungkin bisa menggunakan osekarang, kan?
Oliver
@ Lebih Ya, tapi saya biasanya tidak memperbarui jawaban lama dengan builtin
Mego
3

J, 2 byte

q:

Badan harus minimal 30 karakter.

alephalpha
sumber
3

Japt, 2 byte

Uk

Built-in kdigunakan pada input U. Juga merujuk ke suatu negara.

Uji secara online!

Produksi ETH
sumber
2

tuli-nada , 3 byte

Bahasa ini cukup muda dan belum benar-benar siap untuk jurusan apa pun, tetapi dapat melakukan faktorisasi utama:

A/D

Ini akan menunggu input pengguna, dan kemudian menampilkan daftar faktor prima.

Kade
sumber
2

MATLAB, 6 byte

Saya pikir ini tidak memerlukan penjelasan apa pun.

factor
cacat
sumber
1

Bash + coreutils, 19 byte

factor|sed s/.*:.//

Cobalah online!

Dennis
sumber
Anda dapat mengurangi byte jika spasi tidak menjadi masalah dalam menggunakan output factor|sed s/.*://. Juga factor|cut -d: -f2(atau factor|cut -d\ -f2untuk mencocokkan keluaran Anda saat ini) adalah panjang byte yang sama tetapi akan berjalan lebih cepat dan menggunakan lebih sedikit memori overhead.
Caleb
Saya akan bertanya kepada OP tentang ruang putih. Sayangnya, saya harus factor|cut -d\ -f2-menghilangkan ruang terdepan, yang satu byte lebih lama.
Dennis
1

Batch, 96 byte

@set/an=%1,f=2,r=0
:l
@set/af+=!!r,r=n%%f
@if %r%==0 echo %f%&set/an/=f
@if %n% gtr 1 goto l
Neil
sumber
1

Hexagony , 58 byte

Belum bermain golf, tapi @MartinEnder seharusnya bisa menghancurkan ini

Mencetak faktor-faktor yang dipisahkan ruang, dengan ruang tambahan

Golf:

2}\..}$?i6;>(<...=.\'/})."@...>%<..'':\}$"!>~\{=\)=\}&<.\\

Ditata:

     2 } \ . .
    } $ ? i 6 ;
   > ( < . . . =
  . \ ' / } ) . "
 @ . . . > % < . .
  ' ' : \ } $ " !
   > ~ \ { = \ )
    = \ } & < .
     \ \ . . .

Penjelasan datang nanti.

Biru
sumber
1

05AB1E , 1 byte

Ò

Cobalah online!

Erik the Outgolfer
sumber
1
Saya ingin tahu berapa banyak orang yang akan mengalahkan Dennis ...
Erik the Outgolfer
1

CJam, 2 byte

mf

cjam.aditsu.net / ...

Ini sebuah fungsi. Martin, sepertinya aku mengantuk.

Erik the Outgolfer
sumber
1

C, 92 byte

int p(int n){for(int i=2;i<n;i++)if(n%i==0)return printf("%d, ",i)+p(n/i);printf("%d\n",n);}

Versi tidak disatukan:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int prime(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            printf("%d, ", i);
            return prime(number / i); //you can golf away a few bytes by returning the sum of your recursive function and the return of printf, which is an int
        }                             //this allow you to golf a few more bytes thanks to inline calls
    }
    printf("%d\n", number);
}

int main(int argc, char **argv) {
    prime(atoi(argv[1]));
}
Valentin Mariette
sumber
0

Perl 6 , 77 64 byte  

{my$a=$_;.is-prime??$_!!map ->\f{|({$a%f||($a/=f)&&f}...^*!= f)},(2... *>$a)}

Cobalah

{my$a=$_;map ->\f{|({$a%f||($a div=f)&&f}...^ f>*)},(2... *>$a)}

Cobalah (Catatan: tidak punya cukup waktu untuk menyelesaikannya)


Versi yang jauh lebih performan sedikit lebih lama yaitu 100 byte.

{my$a=$_;map ->\f{|({$a.is-prime??($/=$a)&&($a=0)||$/!!($a%f||($a div=f)&&f)}...^ f>*)},(2... *>$a)}

Cobalah


Diperluas: (versi 64 byte)

{
  my $a = $_;  # the input 「$_」 is read-only by default
  map
    -> \f {
      |(              # slip ( flattens into outer list )

        # generate sequence of 0 or more 「f」s
        {
          $a % f      # is it not evenly divisible

          ||          # if it is evenly divisible
          ($a div=f)  # divide it
          &&          # and
          f           # return 「f」
        }
        ...^   # keep doing that until
        f > *  # 「f」 is bigger
      )

    },

    # do that over the following list

    (2 ... * > $a) # generate a sequence from 2
                   # up to whatever the value of $a
                   # is at the time of the check
}
Brad Gilbert b2gills
sumber
0

VB.NET, 86 byte

Apakah ini duduk di sekitar dari beberapa program Project Euler. Dihapus optimasi untuk kepentingan kependekan, dan ini adalah hasilnya. Secara alami, VB sangat bertele-tele, jadi cukup panjang. Saya tidak menghitung spasi putih terkemuka. Itu bisa dihilangkan, tetapi lebih mudah dibaca dengan itu.

Ini mengambil integer sebagai parameter, dan mencetak faktor prima dengan koma setelah. Ada koma tertinggal di akhir.

Sub A(a)
    For i=2To a ' VB re-evaluates a each time, so the /= at the end of the loop shortens this
        While a Mod i=0 ' this is a factor. We've grabbed primes before this, so this must be a prime factor
            Console.Write(i &",") ' output
            a/=i ' "mark" the prime as "used"
        End While
    Next
End Sub
Brian J
sumber
0

Perl 6 , 51 byte

Solusi rekursif:

sub f(\n,\d=2){n-1??n%d??f n,d+1!!(d,|f n/d,d)!!()}
Sean
sumber
0

Java (OpenJDK) , 259 byte

import java.util.*;interface g{static void main(String[]z){int a=new Scanner(System.in).nextInt();int b=0;int[]l={};for(int i=2;i<=a;i++){for(;a%i<1;l[b-1]=i){l=Arrays.copyOf(l,b=l.length+1);a/=i;}}for(int i=0;i<b;i++)System.out.print(l[i]+(i<b-1?", ":""));}}

Cobalah online!

Pavel
sumber
Rujuk ke intisari ini untuk melihat bagaimana pengiriman ini dapat di- golf lebih lanjut: gist.github.com/kritixilithos/fde37dc5a8ae54852aa134a6e70ea495 . Jika Anda perlu mengklarifikasi sesuatu, silakan ping saya di byte ke 19 :)
Kritixi Lithos
0

Ruby, 61 byte

require'prime';->x{x.prime_division.flat_map{|x|[x[0]]*x[1]}}

Versi builtin terpendek yang bisa saya pikirkan.

Seims
sumber
0

Ruby , 48 byte

->x{r,*c=2;0while(x%r<1?(x/=r)&&c<<r:x>=r+=1);c}

Cobalah online!

Sedikit terlambat ke pesta, tapi ... kenapa tidak?

GB
sumber