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.


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:




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

8

Mathematica, 38 30 byte

Terima kasih @MartinEnder selama 8 byte!

Join@@Table@@@FactorInteger@#&

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



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


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

Anda mungkin bisa menggunakan osekarang, kan?
Oliver

@ Lebih Ya, tapi saya biasanya tidak memperbarui jawaban lama dengan builtin
Mego




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.


2

MATLAB, 6 byte

Saya pikir ini tidak memerlukan penjelasan apa pun.

factor

1

Bash + coreutils, 19 byte

factor|sed s/.*:.//

Cobalah online!


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


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.




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]));
}




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
}

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

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)!!()}

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!


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.


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?

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.