Lấy lại nguyên tố từ sức mạnh nguyên tố


13

Định nghĩa : công suất nguyên tố là số tự nhiên có thể được biểu thị dưới dạng p n trong đó p là số nguyên tố và n là số tự nhiên.

Nhiệm vụ : Cho công suất nguyên tố p n > 1, trả về số nguyên tố p.

Tủ thử :

input output
9     3
16    2
343   7
2687  2687
59049 3

Ghi bàn : Đây là . Câu trả lời ngắn nhất trong byte thắng.


1
Có thể nlà 1?
dùng202729

@ user202729: Trong trường hợp thử nghiệm thứ 4 n = 1.
Emigna

15
Có lẽ sẽ khó khăn hơn để có được phần sức mạnh thay vì phần chính. Như vậy, đây chỉ là "Lấy yếu tố thấp nhất không phải là 1"
Jo King

Câu trả lời:




7

Java 8, 46 39 37 byte

n->{int r=1;for(;n%++r>0;);return r;}

-7 byte gián tiếp nhờ @Tsathoggua .
-2 byte nhờ JoKing

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

Giải trình:

n->{               // Method with integer as both parameter and return-type
  int r=1;         //  Start the result-integer `r` at 1
  for(;n%++r>0;);  //  Increase `r` by 1 before every iteration with `++r`
                   //  and loop until `n` is divisible by `r`
  return r;}       //  After the loop, return `r` as result

Theo câu trả lời của Luis Mendo trong python3 , có thể viết n->{for(int i=1;++i<=n;)if(n%i<1)return i;}để có 43 ký tự không? (Tôi không nói tiếng Java.)
Tsathoggua

@Tsathoggua Như bạn có ngay bây giờ, vì các phương thức Java phải luôn có lợi nhuận. n->{for(int i=1;++i<=n;)if(n%i<1)return i;return n;}sẽ làm việc, nhưng không may là lâu hơn. Tuy nhiên, Java có thể có một trả về trong các vòng lặp vô hạn, tuy nhiên, điều này thực sự tiết kiệm byte, vì vậy cảm ơn! n->{for(int i=1;;)if(n%++i<1)return i;}. Vì cuối cùng isẽ trở thành n(như với trường hợp thử nghiệm 2687) và n%n==0, i<=nkhông bắt buộc trong trường hợp này.
Kevin Cruijssen

1
Làm thế nào về 37 byte . Tôi không đủ quen thuộc với Java để xem có thể chơi gôn nữa không
Jo King

@JoKing Tôi không thấy bất cứ điều gì để chơi gôn hơn nữa, vì vậy cảm ơn vì -2.
Kevin Cruijssen

5

Trăn 3 , 36 35 byte

-1 byte nhờ mathmandan

f=lambda n,x=2:n%x and f(n,x+1)or x

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

Hàm đệ quy tìm thấy thừa số thứ nhất lớn hơn 1


1
Đẹp. Bạn có thể (thường) lưu một byte nếu bạn thay thế if/elsebằng and/or. Giống như , f=lambda n,x=2:n%x and f(n,x+1)or x.
mathmandan


4

Khoảng trắng , 80 61 60 byte

[S S T  T   N
_Push_-1][S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_number][N
S S N
_Create_Label_LOOP][S S S T N
_Push_1][T  S S T   _Subtract][S N
S _Duplicate][S S S N
_Push_0][T  T   T   _Retrieve][S N
T   _Swap][T    S T T   _Modulo][N
T   T   N
_If_0_Jump_to_Label_LOOP][S S T T   N
_Push_-1][T S S N
_Multiply][T    N
S T _Print_as_number]

-20 byte nhờ @JoKing .

Chữ cái S(dấu cách), T(tab) và N(dòng mới) được thêm vào dưới dạng chỉ tô sáng.
[..._some_action]chỉ thêm vào giải thích.

Dùng thử trực tuyến (chỉ có không gian thô, tab và dòng mới).

Giải thích bằng mã giả:

Integer n = STDIN as integer
Integer i = -1
Start LOOP:
  i = i - 1
  if(n modulo-i is negative)
    Go to next iteration of LOOP
  else
    i = i * -1
    Print i
    Exit with error: No exit defined

Chạy ví dụ: input = 9

Command   Explanation                    Stack        Heap     STDIN    STDOUT    STDERR

SSTTN     Push -1                        [-1]
SSSN      Push 0                         [-1,0]
TNTT      Read STDIN as integer          [-1]         {0:9}    9
NSSN      Create Label_LOOP              [-1]         {0:9}
 SSSTN    Push 1                         [-1,1]       {0:9}
 TSST     Subtract top two (-1-1)        [-2]         {0:9}
 SNS      Duplicate top (-2)             [-2,-2]      {0:9}
 SSSN     Push 0                         [-2,-2,0]    {0:9}
 TTT      Retrieve                       [-2,-2,9]    {0:9}
 SNT      Swap top two                   [-2,9,-2]    {0:9}
 TSTT     Modulo top two (9%-2)          [-2,-1]      {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-2]         {0:9}

 SSTTN    Push -1                        [-2,-1]      {0:9}
 TSST     Subtract top two (-2-1)        [-3]         {0:9}
 SNS      Duplicate top (-2)             [-3,-3]      {0:9}
 SSSN     Push 0                         [-3,-3,0]    {0:9}
 TTT      Retrieve                       [-3,-3,9]    {0:9}
 SNT      Swap top two                   [-3,9,-3]    {0:9}
 TSTT     Modulo top two (9%-3)          [-3,0]       {0:9}
 NTSN     If neg.: Jump to Label_LOOP    [-3]         {0:9}
 SSTTN    Push -1                        [-3,-1]      {0:9}
 TSSN     Multiply top two (-3*-1)       [3]          {0:9}
 TNST     Print as integer               []           {0:9}             3
                                                                                  error

Chương trình dừng với một lỗi: Không tìm thấy lối ra.


1
Bạn có cần i == nkiểm tra? n%ndù sao cũng sẽ là 0
Jo King

@JoKing À, tất nhiên rồi. Cảm ơn, 19 byte được lưu ngay tại đó. :)
Kevin Cruijssen

Bạn chỉ có thể lặp nếu không n%ivà gọi in sau đó?
Jo King

1
@JoKing Tôi khá chắc chắn là không. Khoảng trắng không thực sự có vòng lặp, nó chỉ nhảy vào nhãn. Ba lựa chọn duy nhất tôi có là: 1. nhảy đến một nhãn nhất định vô điều kiện; 2. nhảy đến một nhãn nhất định nếu đỉnh của ngăn xếp là 0; 3. nhảy đến một nhãn nhất định nếu đỉnh của ngăn xếp là âm. Thật không may, không có "nhảy đến nhãn nếu tích cực" để tiếp tục vòng lặp. Tôi có thể thực hiện điều này bằng cách nhân với -1 trước khi kiểm tra âm tính, nhưng tôi nghi ngờ điều đó sẽ ngắn hơn.
Kevin Cruijssen

1
Đã thử làm điều đó với một mô đun âm và kết thúc tại <s> 62 </ s> 60 byte (yay). Hóa ra bạn không thể lưu trữ tại các địa chỉ heap âm (mặc dù 0 đã lưu một vài byte)
Jo King






2

Forth (gforth) , 34 byte

: f 1 begin 1+ 2dup mod 0= until ;

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

Giải trình

  1. Số nguyên lặp bắt đầu từ 2
  2. Dừng lại và quay lại khi bạn tìm thấy một số chia n mà không có phần còn lại

Giải thích mã

: f               \ Define a new word
  1               \ place a 1 on the stack (to use as a counter/index)
  begin           \ start indefinite loop
    1+ 2dup       \ increment counter and duplicate counter and prime power
    mod           \ calculate power % index
  0= until        \ end the loop if modulus is 0 (no remainder)
;                 \ end word definition




1

U + 1D414 là một ký tự, nhưng trong UTF-8 và UTF-16, ký tự này được biểu thị bằng 4 byte.
Ruud Helderman

1
@RuudHelderman Đúng, nhưng điều này không có trong UTF-8 hay UTF-16.
Okx

1
@RuudHelderman Bạn có thể muốn xem Neim codepage .
JungHwan Min

@JungHwanMin Cảm ơn; duyệt các bài nộp Neim trước đó của Okx, tôi nhận thấy phản ứng hơi thờ ơ của mình không phải là lần đầu tiên. Tính năng thông minh, nhưng xa rõ ràng; đảm bảo giải thích (như được thực hiện ở đây ). Trích dẫn thông tin thẻ golf-code : "Trừ khi câu hỏi được chỉ định để ghi theo ký tự, nó sẽ được ghi bằng byte. Nếu không chỉ định mã hóa ký tự để sử dụng để ghi điểm, các câu trả lời sử dụng điểm mã Unicode ngoài 0 đến 255 nên nêu mã hóa được sử dụng. "
Ruud Helderman

@RuudHelderman theo đồng thuận meta , nếu một câu trả lời không chỉ định mã hóa, nó sẽ mặc định là mã hóa mặc định của ngôn ngữ. Nếu điều đó không tồn tại, thì đó là UTF-8. Trong trường hợp này, Neim có một mã hóa mặc định được xác định, do đó, nó được coi là mã hóa của câu trả lời, mà không có người trả lời phải giải thích như vậy.
JungHwan Min


1

Toán học, 17 byte

Divisors[#][[2]]&

Số chia nhỏ thứ hai.





0

PowerShell , 31 byte

param($a)(2..$a|?{!($a%$_)})[0]

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

Xây dựng một phạm vi từ 2đến đầu vào $a, lấy ra các phần tử đó where( ?) hoạt động modulo %dẫn đến một số không !(...)(nghĩa là các phần tử là ước của $a), và sau đó lấy phần tử nhỏ nhất [0]. Đó là còn lại trên đường ống, đầu ra là ẩn.


0

Perl 6 , 22 byte

{grep($_%%*,2..$_)[0]}

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

Khối mã ẩn danh lọc các yếu tố của phạm vi 2 đến đầu vào và trả về mã đầu tiên. Tôi đã thử sử dụng ^$để lưu 2 byte, nhưng nó không hoạt động trong trường hợp đầu vào là số nguyên tố.


0

Visual Basic .NET (.NET Framework v4.5), 123 71 byte

-52 byte nhờ @Jo King

Function A(n)
For i=n To 2 Step-1
A=If(n Mod i=0,i,A)
Next
End Function

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

Ung dung:

Function A(input As Long) As Long
    For i = input To 2 Step -1
        A = If (input Mod i = 0, i, A)
    Next
End Function

Giải trình:

Các itìm kiếm vòng ngược từ số đầu tiên, và tìm thấy tất cả các số đó chia đều. Bởi vì chúng ta đang đi lùi, nhỏ nhất được lưu trữ trong vaiA .

VB cung cấp cho bạn một biến miễn phí phù hợp với tên hàm của bạn (trong trường hợp của tôi A). Khi kết thúc thực hiện chức năng, giá trị trong biến đó được trả về (chặn một Returncâu lệnh rõ ràng .


1
Bạn không cần kiểm tra chính. Yếu tố nhỏ nhất của một số (khác 1) được đảm bảo là số nguyên tố, nếu không sẽ có một yếu tố nhỏ hơn
Jo King

@JoKing! Tất nhiên, không thể tin rằng tôi đã bỏ lỡ điều đó. Cảm ơn!
Brian J






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.