Tính các thừa số nguyên tố


27

Chúng tôi đã có một thử thách nhân tố chính cách đây một thời gian, nhưng thử thách đó đã gần sáu năm và hầu như không đáp ứng các yêu cầu hiện tại của chúng tôi, vì vậy tôi tin rằng đã đến lúc cần một cái mới.

Thử thách

Viết chương trình hoặc hàm lấy đầu vào là số nguyên lớn hơn 1 và xuất hoặc trả về danh sách các thừa số nguyên tố của nó.

Quy tắc

  • Đầu vào và đầu ra có thể được cung cấp bởi bất kỳ phương pháp tiêu chuẩn và trong bất kỳ định dạng tiêu chuẩn.
  • Các yếu tố trùng lặp phải được đưa vào đầu ra.
  • Đầu ra có thể theo thứ tự bất kỳ.
  • Đầu vào sẽ không ít hơn 2 hoặc nhiều hơn 2 31 - 1.
  • Xây dựng được cho phép, nhưng bao gồm một giải pháp không tích hợp được khuyến khích.

Các trường hợp thử nghiệm

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

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


2
Sẽ tốt hơn nhiều nếu bạn không cho phép tích hợp sẵn.
Bộ đệm đã đọc

2
@TheBitByte Những thách thức không cho phép tích hợp thường bị coi là Do X mà không có thách thức Y , đặc biệt là đôi khi rất khó để biết liệu một giải pháp có tích hợp về mặt kỹ thuật hay không.
Sản phẩm ETH

1
Vậy thì, hãy tận hưởng dòng giải pháp <5 byte! Khi tôi viết bài này, Pyth đã thực hiện nó trong 1 byte.
Bộ đệm đã đọc

2
@TheBitByte Hãy nghĩ về nó như một thách thức ngôn ngữ, chủ yếu. Cố gắng đánh bại giải pháp của Python hoặc một số ngôn ngữ khác mà không có nội dung.
isaacg

1
@isaacg Vâng, ngôn ngữ theo ngôn ngữ là một cách tốt hơn để xem xét nó, tôi đồng ý.
Bộ đệm đã đọc

Câu trả lời:




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]

Thử ilần lượt từng ước số tiềm năng . Nếu ilà một ước số, hãy chuẩn bị trước và khởi động lại với n/i. Khác, cố gắng ước số cao nhất tiếp theo. Bởi vì các ước số được kiểm tra theo thứ tự tăng dần, chỉ có các số nguyên tố được tìm thấy.

Là một chương trình, cho 55 byte:

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

8

Toán học, 38 30 byte

Cảm ơn @MartinEnder cho 8 byte!

Join@@Table@@@FactorInteger@#&

Thế còn FactorInteger[#][[All, 1]]&? 26 byte
David G. Cò

@ DavidG.Stork sẽ không hoạt động vì nó sẽ không lặp lại các yếu tố chính nếu sức mạnh lớn hơn 1.
JungHwan Min



4

JavaScript (ES6), 44 byte

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

Không hiệu quả khủng khiếp do thực tế là nó lặp từ 2 đến mọi yếu tố chính, bao gồm cả yếu tố cuối cùng. Bạn có thể cắt giảm độ phức tạp thời gian một cách đáng kể với chi phí là 5 byte:

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


3

Trên thực tế , 6 byte

w`in`M

Hãy thử trực tuyến!

Giải trình:

w`in`M
w       factor into primes and exponents
 `in`M  repeat each prime # of times equal to exponent

Bạn có thể chỉ cần sử dụng obây giờ, phải không?
Oliver

@Oliver Có, nhưng tôi thường không cập nhật câu trả lời cũ với nội dung.
Mego




2

giai điệu điếc , 3 byte

Ngôn ngữ này còn khá trẻ và chưa thực sự sẵn sàng cho bất cứ điều gì quan trọng, nhưng nó có thể làm yếu tố chính:

A/D

Điều này sẽ đợi đầu vào của người dùng, và sau đó xuất ra danh sách các yếu tố chính.


2

MATLAB, 6 byte

Tôi nghĩ rằng điều này không yêu cầu bất kỳ lời giải thích.

factor

1

Bash + coreutils, 19 byte

factor|sed s/.*:.//

Hãy thử trực tuyến!


Bạn có thể tắt một byte nếu khoảng trắng không quan trọng trong đầu ra bằng cách sử dụng factor|sed s/.*://. Ngoài ra factor|cut -d: -f2(hoặc factor|cut -d\ -f2để phù hợp với đầu ra hiện tại của bạn) có cùng độ dài byte nhưng sẽ chạy nhanh hơn và sử dụng ít bộ nhớ hơn.
Caleb

Tôi sẽ hỏi OP về khoảng trắng. Đáng buồn thay, tôi cần factor|cut -d\ -f2-phải loại bỏ không gian hàng đầu, dài hơn một byte.
Dennis

1

Mẻ, 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

Lục giác , 58 byte

Chưa chơi golf, nhưng @MartinEnder vẫn có thể phá hủy điều này

In ra các yếu tố được phân tách bằng không gian, với một khoảng trắng ở cuối

Chơi gôn

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

Trả tiền:

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

Giải thích đến sau.




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

Phiên bản bị đánh cắp:

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

Thử nó

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

Thử nó (Lưu ý: nó không có đủ thời gian được phân bổ để kết thúc)


Một phiên bản hiệu suất cao hơn nhiều là hơi dài hơn ở mức 100 byte.

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

Thử nó


Mở rộng: (phiên bản 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

Có điều này ngồi xung quanh từ một số chương trình Project Euler. Loại bỏ các tối ưu hóa vì lợi ích của sự ngắn gọn, và đây là kết quả. Đương nhiên, VB rất dài dòng, vì vậy nó khá dài. Tôi không tính khoảng trắng hàng đầu. Nó có thể được bỏ qua, nhưng dễ đọc hơn với nó.

Cái này lấy một số nguyên làm tham số và in các thừa số nguyên tố bằng dấu phẩy sau. Có một dấu phẩy ở cuối.

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

Một giải pháp đệ quy:

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?", ":""));}}

Hãy thử trực tuyến!


Tham khảo ý chính này để biết cách gửi bài này có thể được chơi thêm: gist.github.com/kritixilithos/fde37dc5a8ae54852aa134a6e70ea495 . Nếu bạn cần làm rõ điều gì đó, vui lòng ping tôi ở byte thứ 19 :)
Kritixi Lithos

0

Ruby, 61 byte

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

Phiên bản dựng sẵn ngắn nhất tôi có thể nghĩ ra.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.