Đây có phải là số nguyên tố liên tiếp / số mũ không đổi?


22

Cách đây một thời gian, tôi đã xem xét hệ số nguyên tố của 27000:

27000 = 2 3 × 3 3 × 5 3

Có hai điều đặc biệt về điều đó:

  • liên tiếp-thủ : Các số nguyên tố là liên tiếp: 2 là số nguyên tố 1, 3 là số nguyên tố 2, 5 là số nguyên tố thứ 3.
  • hằng số mũ : Số mũ là như nhau cho mọi số nguyên tố (luôn luôn là 3)

Toán học diễn đạt:

Số nguyên x là số nguyên tố liên tiếp / số mũ không đổi nếu tồn tại các số nguyên dương n , k , m sao cho x = p n m × p n +1 m × ... × p n + k m , trong đó p j là số nguyên tố thứ j

Nhiệm vụ của bạn là kiểm tra xem một số nguyên dương có đáp ứng các điều kiện này không.

Đầu vào:

Một số nguyên dương> 1, dưới bất kỳ hình thức hợp lý nào.

Đầu ra:

Một trong hai giá trị, ít nhất một trong số đó phải là hằng số, cho biết liệu đầu vào có phải là số mũ liên tiếp / số nguyên tố không đổi hay không.

Trường hợp cạnh:

  • Số nguyên tố là trung thực, vì hệ số cho số nguyên tố pp 1
  • các số khác có thể được viết là p m trong đó p là số nguyên tố cũng là sự thật.

Quy tắc:

  • Tiêu chuẩn áp dụng.
  • Không phải lo lắng về tràn số nguyên, nhưng số lên tới 255 phải hoạt động.
  • Mã ngắn nhất trong byte thắng.

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

Sự thật:

2
3
4
5
6
7
8
9
11
13
15
27000
456533

Giả mạo:

10
12
14
72
10000000

Đây là một kịch bản python tạo ra một số trường hợp thử nghiệm.

Việc tôi chấp nhận một câu trả lời không có nghĩa là thử thách đã kết thúc; người chiến thắng vẫn có thể thay đổi!


Bạn có thể đến bằng cách này bằng cách tạo một danh sách tất cả các số như vậy và kiểm tra xem đầu vào có trong danh sách không
Kỹ sư Toast

@EngineerToast Có vô số con số thật.
Alexis Olson

@AlexisOlson Chắc chắn, nhưng một hữu hạn có thể được xử lý như số nguyên bởi nhiều ngôn ngữ.
Kỹ sư Toast

Biểu thức toán học của bạn có Pj không liên quan đến x = Pn^mphần. Tôi cho rằng bạn có nghĩa là Pn là thủ tướng thứ n
Veskah

@Veskah n có một giá trị cụ thể (chỉ số của số nguyên tố đầu tiên chia x ), vì vậy, nói Pn là số nguyên tố thứ n rất khó xử nếu bạn cũng muốn ám chỉ rằng Pn + 1 là số nguyên tố thứ n + 1 .
Dennis

Câu trả lời:



7

Regex (Bản thảo), 276 205 201 193 189 byte

So sánh bội số (số mũ) của các yếu tố nguyên tố khác nhau là một vấn đề thú vị để giải quyết với biểu thức ECMAScript - việc thiếu các phản hồi tồn tại qua các vòng lặp khiến cho việc đếm bất cứ điều gì trở thành một thách thức. Ngay cả khi tính các đặc điểm số trong câu hỏi là có thể, thường thì một cách tiếp cận gián tiếp hơn làm cho golf tốt hơn.

Cũng như các bài đăng regex ECMA khác của tôi, tôi sẽ đưa ra cảnh báo spoiler: Tôi khuyên bạn nên học cách giải quyết các vấn đề toán học đơn phương trong biểu thức chính của ECMAScript. Đó là một hành trình hấp dẫn đối với tôi và tôi không muốn làm hỏng nó cho bất kỳ ai có khả năng muốn thử nó, đặc biệt là những người quan tâm đến lý thuyết số. Xem bài đăng trước đó để biết danh sách các vấn đề được đề xuất liên quan đến spoiler để giải quyết từng vấn đề một.

Vì vậy, đừng đọc thêm nữa nếu bạn không muốn một số phép thuật regex unary tiên tiến được làm hỏng cho bạn . Nếu bạn thực sự muốn tự mình tìm ra phép thuật này, tôi khuyên bạn nên bắt đầu bằng cách giải quyết một số vấn đề trong biểu thức ECMAScript như được nêu trong bài đăng được liên kết ở trên.

Trọng tải chính từ một regex mà tôi đã phát triển trước đây hóa ra rất phù hợp với thử thách này. Đó là regex tìm ra số nguyên tố có bội số cao nhất . Giải pháp đầu tiên của tôi là rất lâu và sau đó tôi đã chơi nó theo từng giai đoạn, đầu tiên viết lại nó để sử dụng cái nhìn phân tử , và sau đó chuyển nó trở lại ECMAScript đơn giản bằng cách sử dụng một kỹ thuật tiên tiến để giải quyết vấn đề thiếu cái nhìn phân tử , và sau đó đánh golf xuống nhỏ hơn nhiều so với giải pháp ECMAScript ban đầu.

Phần từ regex đó áp dụng cho vấn đề này là bước đầu tiên, tìm thấy Q, yếu tố nhỏ nhất của N chia sẻ tất cả các yếu tố chính của nó. Khi chúng ta có số này, tất cả những gì chúng ta phải làm để chỉ ra rằng N là "số mũ không đổi" được chia N cho Q cho đến khi chúng ta không thể kéo dài hơn nữa; nếu kết quả là 1, tất cả các số nguyên tố đều có bội số bằng nhau.

Sau khi gửi câu trả lời bằng thuật toán được phát triển trước đó của tôi để tìm Q, tôi nhận ra rằng nó có thể được tính theo một cách hoàn toàn khác: Tìm hệ số không vuông góc lớn nhất của N (sử dụng thuật toán tương tự như biểu thức chính số của số Carmichael của tôi ). Hóa ra, điều này không gây khó khăn gì cả * về việc bước đi xung quanh việc thiếu giao diện phân tử và giao diện có chiều dài thay đổi (không cần phải sử dụng kỹ thuật nâng cao được sử dụng trước đây) và ngắn hơn 64 byte! Ngoài ra, nó giúp loại bỏ sự phức tạp của việc xử lý N và số nguyên tố N không vuông như các trường hợp đặc biệt khác nhau, giảm thêm 7 byte từ giải pháp này.

(Vẫn còn những vấn đề khác đòi hỏi kỹ thuật tiên tiến trước đây được sử dụng để đánh bại tính toán của Q, nhưng hiện tại không có vấn đề nào được thể hiện qua các bài đăng PPCG của tôi.)

Tôi đặt bài kiểm tra bội số trước bài kiểm tra số nguyên tố liên tiếp vì bài kiểm tra chậm hơn nhiều; đặt các thử nghiệm có thể thất bại nhanh hơn trước tiên làm cho regex nhanh hơn cho đầu vào được phân phối đồng đều. Nó cũng tốt hơn để đặt nó lên hàng đầu, bởi vì nó sử dụng nhiều phản hồi hơn (sẽ tốn nhiều tiền hơn nếu chúng là hai chữ số).

Tôi đã có thể giảm 4 byte từ regex này (193 → 189) bằng một thủ thuật được tìm thấy bởi Grimy có thể rút ngắn phân chia trong trường hợp thương số được đảm bảo lớn hơn hoặc bằng số chia.

^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))

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

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \2.
# If N is square-free, \2 will be unset.
(?=
    # Search through all factors of N, from largest to smallest, searching for one that
    # satisfies the desired property. The first factor tried will be N itself, for which
    # \2 will be unset.
    (|(x+)\2*(?=\2$))     # for factors < N: \2 = factor of N; tail = \2
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\4*$)    # \4 = smallest prime factor of tail
        (?=(x+)(\5+$))    # \5 = tail / \4 (implicitly); \6 = tool to make tail = \5
        \6                # tail = \5
        (?!\4*$)          # Assert that tail is no longer divisible by \4, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that either \2 is unset, or that the result of repeatedly
# dividing tail by \2 is 1.
(?=
    .*$\2
|
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \2-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \2-1 above, and can use a better-golfed form of the division.
        (?=
            (              # \8 = tail / \2
                (x*)       # \9 = \8-1
                (?=\2\9+$)
                x
            )
            (\8*$)         # \10 = tool to make tail = \8
        )
        \10               # tail = \8
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \11 = a factor of N
        (                      # \12 = a non-factor of N between \11 and \13
            (x+)(?=\13+$)      # \13 = a factor of N smaller than \11
            (x+)               # \14 = tool (with \15) to make tail = \13
        )
        (?!\12+$)
        (x+)                   # \15 = tool to make tail = \12
    )
    \11*(?=\11$)               # tail = \11

    # Assert that \11, \12, and \13 are all prime
    (?!
        (\15\14?)?             # tail = either \11, \12, or \13
        ((xx+)\18+|x?)$
    )
)


* Nó vẫn sạch hơn với giao diện phân tử, không có trường hợp đặc biệt nào cho N không có hình vuông. Điều này giảm 6 byte, mang lại giải pháp 195 187 183 byte :

^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (?*(x+))              # \1 = proposed factor of N
    \1*(?=\1$)            # Assert that \1 is a factor of N; tail = \1
    # Assert that tail is square-free (its prime factors all have single multiplicity)
    (
        (?=(xx+?)\3*$)    # \3 = smallest prime factor of tail
        (?=(x+)(\4+$))    # \4 = tail / \3 (implicitly); \5 = tool to make tail = \4
        \5                # tail = \4
        (?!\3*$)          # Assert that tail is no longer divisible by \3, i.e. that that
                          # prime factor was of exactly single multiplicity.
    )*x$
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(?=
    (
        # In the following division calculation, we can skip the test for divisibility
        # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
        # capture \1-1 above, and can use a better-golfed form of the division.
        (?=
            (             # \7 = tail / \1
                (x*)      # \8 = \7-1
                (?=\1\8+$)
                x
            )
            (\7*$)        # \9 = tool to make tail = \7
        )
        \9                # tail = \7
    )*
    x$                    # Require that the end result is 1
)

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
(?!
    (                          # \10 = a factor of N
        (                      # \11 = a non-factor of N between \10 and \12
            (x+)(?=\12+$)      # \12 = a factor of N smaller than \10
            (x+)               # \13 = tool (with \14) to make tail = \12
        )
        (?!\11+$)
        (x+)                   # \14 = tool to make tail = \11
    )
    \10*(?=\10$)               # tail = \10

    # Assert that \10, \11, and \12 are all prime
    (?!
        (\14\13?)?             # tail = either \10, \11, or \12
        ((xx+)\17+|x?)$
    )
)

Ở đây, nó được chuyển đến giao diện có chiều dài thay đổi:

Regex (ECMAScript 2018), 198 195 194 186 182 byte

^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))

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

# For the purposes of these comments, the input number = N.
^

# Assert that all of N's prime factors are of equal multiplicity
# Step 1: Find Q, the largest square-free factor of N (which will also be the smallest
# factor of N that has all the same prime factors as N) and put it in \1.
(?=
    (x+)(?=\1*$)      # \1 = factor of N; head = \1
    (?<=              # This is evaluated right-to-left, so please read bottom to top.
        ^x
        (
            (?<!^\5*)        # Assert that head is no longer divisible by \6, i.e. that
                             # that prime factor was of exactly single multiplicity.
            \3               # head = \4
            (?<=(^\4+)(x+))  # \4 = head / \5 (implicitly); \3 = tool to make head = \4
            (?<=^\5*(x+?x))  # \5 = smallest prime factor of head
        )*
    )
)
# Step 2: Require that the result of repeatedly dividing tail by \1 is 1.
(
    # In the following division calculation, we can skip the test for divisibility
    # by \1-1 because it's guaranteed that \2 <= \8. As a result, we did not need to
    # capture \1-1 above, and can use a better-golfed form of the division.
    (?=
        (             # \7 = tail / \1
            (x*)      # \8 = \7-1
            (?=\1\8+$)
            x
        )
        (\7*$)        # \9 = tool to make tail = \7
    )
    \9                # tail = \7
)*
x$                    # Require that the end result is 1

# Assert that there exists no trio of prime numbers such that N is divisible by the
# smallest and largest prime but not the middle prime.
# This is evaluated right-to-left, so please read bottom to top, but switch back to
# reading top to bottom at the negative lookahead.
(?<!
    # Assert that \13, \15, and \17 are all prime.
    (?!
        (\14\16?)?           # tail = either \13, \15, or \17
        ((xx+)\12+|x?)$
    )

    (?<=^\13+)
    (                        # tail = \13
        (x+)                 # \14 = tool to make tail = \15
        (?<!^\15+)
        (
            (x+)             # \16 = tool (with \14) to make tail = \17
            (?<=^\17+)(x+)   # \17 = a factor of N smaller than \13
        )                    # \15 = a non-factor of N between \13 and \17
    )                        # \13 = a factor of N
)

Bạn có thể thay thế .*$\2bằng\2^
H.PWiz

Mặc dù, tôi tin rằng điều này là hợp lệ:^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
H.PWiz

Dường như không gần với tối ưu
H.PWiz

6

Thạch , 13 6 5 byte

ÆEt0E

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

Vẫn còn tồn tại ... (cảm ơn Erik vì -1 byte)


Giải trình

ÆE     # get a list of prime exponents (noooo long builtin name)
  t0   # remove zeroes on both sides (leading or trailing)
    E  # all remaining elements are equal

œl-> t. Không có lý do nào để các số 0 ở cuối xuất hiện trong đầu ra của ÆE.
Erik the Outgolfer


@dylnan Điều đó thất bại trong năm 2250 .
Dennis

@Dennis Cảm ơn, tôi đã nhận ra rằng nó sẽ không hoạt động nhưng tôi hy vọng nó sẽ truyền cảm hứng cho một giải pháp bốn byte
dylnan

6

JavaScript (ES6), 87 byte

Trả về 0 cho giá trị trung thực hoặc số nguyên khác không cho giá trị giả.

f=(n,k=2,j,i)=>n%k?j*(P=d=>k%--d?P(d):d==!i)(k)|j-i|(n>1&&f(n,k+1,j||i)):f(n/k,k,j,-~i)

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

Đã bình luận

f = (                     // f() = recursive function taking:
  n,                      //   n = input
  k = 2,                  //   k = current factor
  j,                      //   j = reference exponent, initially undefined
  i                       //   i = current exponent, undefined each time we start testing
) =>                      //       the next factor
  n % k ?                 // if k is not a divisor of n:
    j * (                 //   ignore the primality of k if j is still undefined
      P = d =>            //     P() = function testing if k is prime:
        k % --d ?         //       decrement d; if d is not a divisor of k:
          P(d)            //         do a recursive call until it is
        :                 //       else:
          d == !i         //         unless i is already defined: d must not be equal to 1
                          //         (if it is: k is the next prime but does not divide n)
    )(k) |                //   initial call to P() with d = k
    j - i | (             //   if both i and j are defined, they must be equal
      n > 1 &&            //   if n is not yet equal to 1,
      f(n, k + 1, j || i) //   go on with k + 1; if j is undefined, set it to i
    )                     //   (otherwise, stop recursion and return what we have)
  :                       // else:
    f(n / k, k, j, -~i)   //   increment the current exponent and go on with n / k

Điều này đã được phá vỡ bởi sự thay đổi của j||iđể i. Bây giờ nó mang lại rất nhiều tích cực sai.
Deadcode

@Deadcode Tôi không thể kiểm tra hoặc sửa lỗi này ngay bây giờ, vì vậy bây giờ tôi mới quay lại.
Arnauld

5

Camam , 30 29 byte

{mFz~)-!\__W=,\0=>\-:mp1#W=&}

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

Câu trả lời đầu tiên của tôi sau khi nghỉ gần 2 (!), Vì vậy nó có thể được chơi gôn nhiều hơn. Đây là một khối lấy đầu vào là một số nguyên (cũng có thể được ánh xạ cho các mảng số nguyên).

Giải trình

{        e# Begin block
 mF      e# Factor input, giving an array of primes and their powers
 z~      e# Transpose and dump, giving an array of primes and an array of powers
 )-      e# Check that the powers are the same: subtract each power from the last element
 !       e# Negate to make sure they're all 0
 \__W=,  e# Get the range from 0 to the largest prime minus one
 \0=>    e# Slice that array so it only includes everything larger than the smallest prime
 \-      e# Remove the original primes from the range array
 :mp     e# Check each element for primality. If the input's primes are consecutive,
         e# this will contain no primes
 1#W=    e# Make sure a "1" is not found
 &       e# If the powers are the same AND primes are consecutive, return 1. Otherwise, 0.
}

5

Stax , 5 6 byte

╣♥qJ╬c

Chạy và gỡ lỗi nó

Giải nén, không được chỉnh sửa, và nhận xét, nó trông như thế này.

|n    get the exponents of the prime factorization
0:D   trim leading zeroes
:u    array has exactly a single distinct element

Chỉnh sửa: Điều này không hoạt động 512. Tôi sẽ suy nghĩ một chút và hy vọng sẽ sửa chữa sau. Nó hoạt dộng bây giờ.


3

Stax , 9 byte

1 là sự thật, 0 là giả dối

αAG<└\{┬⌠

Chạy và gỡ lỗi nó

Giải trình

|nX0-u%x:^=      # Full Program, unpacked, implicit input
|n               # Exponents of sequential primes in factorization. (eg. 20 -> [2 0 1])
  X              # Save to X register
   0-            # Remove all '0' from array
     u%          # Get unique numbers and get length of array
       x         # Copy back the array saved to X
        :^       # Is it ascending
         =       # Are the two comparisons equal? implicit output

Có thể chơi golf nhiều hơn, nhưng nó bao gồm các trường hợp tôi bị thiếu trong giải pháp cuối cùng.


3

MATL , 12 11 10 byte

YFtgYsg)Zs

Hãy thử nó tại MATL Online!

Cảm ơn Luis Mendo cho phần loại bỏ hàng đầu. Ông cũng chỉ ra rằng việc hoán đổi các giá trị thật được cho phép, vì vậy giá trị này trả về 0 cho các số thỏa mãn các yêu cầu thách thức và bất kỳ giá trị dương nào khác.

Grosso Modo, điều này tạo ra số mũ của thừa số nguyên tố tuần tự, loại bỏ các số 0 đứng đầu và tính toán độ lệch chuẩn.


Tôi nghĩ rằng 0iYFhdzhoạt động cho 7 byte: thêm 0 vào số mũ của hệ số tuần tự, sự khác biệt liên tiếp, số lượng không phải là số không. Kết quả là 1đầu vào iff thỏa mãn yêu cầu
Luis Mendo

@LuisMendo Xin lỗi vì phản hồi chậm, nhưng bạn có thể đăng câu đó dưới dạng câu trả lời riêng. Nó chắc chắn là rất khác nhau.
Ông Xcoder

OK, tôi đã đăng nó dưới dạng câu trả lời
Luis Mendo

3

Java 10, 223 191 178 176 168 byte

n->{var s=new java.util.HashSet();for(int f=1,i=1,x,j;n>1;){for(x=++i,j=2;j<x;)x=x%j++<1?1:x;if(x>1){for(j=0;n%i<1&&n>(f=0);n/=i)j++;if(f<1)s.add(j);}}return s.size();}

Trả lại 1như là sự thật, và >=2như chim ưng.

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

Giải trình:

n->{                   // Method with integer parameter and boolean return-type
  var s=new java.util.HashSet();
                       //  Set to keep track of the prime exponents
  for(int f=1,         //  Prime-flag, starting at 1
          i=1,x,j;     //  Index and temp integers
          n>1;){       //  Loop as long as `n` is still larger than 1
    for(x=++i,         //   Set `x` to `i`, after we've increased `i` by 1 first with `++i`
        j=2;           //   Set `j` to 2 (first prime)
        j<x;)          //   Inner loop as long as `j` is still smaller than `x`
      x=x%j++<1?       //    If `x` is divisible by `j`:
         1             //     Set `x` to 1
        :              //    Else:
         x;            //     Leave `x` unchanged
    if(x>1){           //    If `x` is larger than 1 (if `i` is a prime):
      for(j=0;         //     Use `j` as counter, and set it to 0
          n%i<1        //     If `n` is divisible by `i`:
                       //      And loop as long as `n` is still divisible by `i`,
          &&n>         //      and `n` is larger than 0
              (f=0);   //      (and set `f` to 0 at the same time)
          n/=i)        //       Divide `n` by `i`
        j++;           //       And increase `j` by 1
      if(f<1)          //     If the flag `f` is now/still 0:
        s.add(j);}}    //      Add counter `j` to the Set
  return s.size();}    //  Return the amount of items in the Set
                       //  (1 being true, >=2 being false)

Một số ví dụ đầu vào:

n=15:

  • Cờ vẫn còn 1 cho số 2 đầu tiên (vì 15 không chia hết cho 2).
  • Cờ đi từ 1để 0ngay khi chúng tôi đang ở Thủ 3. Kể từ 15 chia hết cho 3, ntrở thành 5 (15/3 1 ), và trở thành Set[] → [1] .
  • Sau đó, chúng tôi kiểm tra số nguyên tố tiếp theo 5. Vì 5 chia hết cho 5, ntrở thành 1 (5/5 1 ) và Tập hợp giữ nguyên ( [1] → [1]).
  • Bây giờ n=1, vì vậy chúng tôi dừng vòng lặp bên ngoài. Tập hợp ( [1]) chỉ chứa một mục, 1từ cả hai số nguyên tố 3 và 5 liền kề, vì vậy chúng tôi trả về đúng.

n=14:

  • Cờ đi từ 1đến 0cho số 2 đầu tiên (vì 14 chia hết cho 2). ntrở thành 7 (14/2 1 ) và Set trở thành [] → [1].
  • Sau đó, chúng tôi kiểm tra số nguyên tố tiếp theo 3. Vì 7 không chia hết cho 3, nvẫn giữ nguyên và Set trở thành [1] → [1,0].
  • Sau đó, chúng tôi kiểm tra số nguyên tố tiếp theo 5. Vì 7 cũng không chia hết cho 5, nvẫn giữ nguyên và Set vẫn giữ nguyên ( [1,0] → [1,0]).
  • Sau đó, chúng tôi kiểm tra số nguyên tố tiếp theo 7. Vì 7 chia hết cho 7, ntrở thành 1 (7/7 1 ) và Set vẫn giữ nguyên ( [1,0] → [1,0]).
  • Bây giờ n=1, vì vậy chúng tôi dừng vòng lặp bên ngoài. Tập hợp ( [1,0]) chứa hai mục, 1từ các số nguyên tố 2 và 7 không liền kề và 0từ các số nguyên tố 3 và 5, vì vậy chúng tôi trả về sai.

n=72:

  • Cờ đi từ 1đến 0cho số 2 đầu tiên, vì 72 chia hết cho 2 (nhiều lần). Vì vậy, ntrở thành 9 (72/2 3 ) và Set trở thành[] → [3] .
  • Sau đó, chúng tôi kiểm tra số nguyên tố tiếp theo 3. Vì 9 chia hết cho 3 (nhiều lần), ntrở thành 1 (9/3 2 ) và Set trở thành [3] → [3,2].
  • Bây giờ n=1, vì vậy chúng tôi dừng vòng lặp bên ngoài. Tập hợp ( [3,2]) chứa hai mục, 3từ số nguyên tố 2 và 2từ số nguyên tố 3, vì vậy chúng tôi trả về false.

1
Bạn có thể xóa <2và trả về một int (xác định rằng bạn trả về 1 cho sự thật).
lãng phí

@wastl Ah, đã bỏ lỡ quy tắc về chỉ một trong hai giá trị là nhất quán. Trong trường hợp đó 1là sự thật và 2cao hơn là falsey. Cảm ơn.
Kevin Cruijssen

Nhờ ai cho tôi tiền thưởng, nhưng tại sao?
Kevin Cruijssen

1
Tôi đã bắt đầu tiền thưởng "Trả lời hiện có" để thu hút sự chú ý nhiều hơn đến câu trả lời ECMAScript của tôi, điều mà tôi vẫn tin rằng nó xứng đáng hơn nó nhận được (tôi coi tiền thưởng đã thất bại). Khi tuần lễ kết thúc, tôi phải chọn một câu trả lời khác ngoài câu trả lời của mình để trao giải thưởng, hoặc để nó mặc định cho người được bình chọn cao nhất. Tôi không nghĩ bất kỳ ai xứng đáng với điều đó, nhưng câu trả lời của bạn có lời giải thích tốt nhất, và đó là lý do tại sao tôi trao nó cho bạn; giải thích tốt là cách quá hiếm trên PPCG. Đối với câu trả lời của tôi, tôi cho rằng tôi phải viết cho nó một bài viết tốt hơn, mà tôi dự định khi có thời gian.
Deadcode

1
@Deadcode Ah, vậy đó là lý do. Tôi nghĩ có lẽ ai đó đã bắt đầu tiền thưởng, nhưng họ vô tình để nó hết hạn và nó đã đến với tôi. Vẫn còn một chút bối rối tại sao câu trả lời của tôi sau đó và không phải là bình chọn cao nhất. Tôi phải nói rằng tôi rất ấn tượng với tất cả các câu trả lời Regex của bạn. Tôi đã nhìn thấy một số trong số họ, và mỗi khi tôi ngạc nhiên. Đặc biệt là khi tôi trở lại sau cùng một câu trả lời và bạn đã chơi nó thậm chí còn tải nhiều hơn. : DI chỉ nhận thấy tôi đã không nhìn thấy cũng không ủng hộ người cho thử thách này, vì vậy tôi mới làm. Bạn biết đấy, tôi sẽ thêm một tiền thưởng cho câu trả lời này của bạn . :)
Kevin Cruijssen

2

J , 16 byte

Cảm ơn rất nhiều đến FrownyFrog cho -8 byte!

(=&#+/\=@#])_&q:

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

Giải pháp cũ của tôi:

J , 24 byte

[:(1=[:#@~.{.@I.}.])_&q:

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

Giải trình:

_&q: số mũ nguyên tố

{.@I.}.] loại bỏ các số 0 đứng đầu bằng cách tìm phần tử khác không đầu tiên:

     }.   drop
       ]  from the list of exponents
{.@       as much items as the first of the 
   I.     indices of non-zero elements

1=[:#@~. kiểm tra nếu tất cả các số còn lại bằng nhau:

  [:#@~.  finds the length of the list after removing the duplicates
1=        is it 1?



2

Octave , 67 byte

@(x)~any(diff(find(h=histc(factor(x),primes(x))))-1)&h(h>0)==max(h)

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

Tôi tin rằng đây là giải pháp duy nhất sử dụng biểu đồ.

Giải trình:

Điều này tạo ra một biểu đồ, trong đó biến được tính là các yếu tố của đầu vào và được đặt trong các thùng primes(x) , tất cả đều là số nguyên tố nhỏ hơn đầu vào. Sau đó chúng tôi tìm vị trí của các thừa số nguyên tố, lấy sự khác biệt giữa từng chỉ số và trừ đi một. Nếu có bất kỳ phần tử nào không bằng 0 (tức là sự khác biệt của các chỉ số của số nguyên tố không phải là 1), thì điều này sẽ dẫn đến một giá trị sai lệch, nếu không nó sẽ trả về giá trị trung thực.

Sau đó, chúng tôi nói rằng tất cả các phần tử khác không trong biểu đồ đều bằng phần tử tối đa. Nếu có các giá trị không bằng nhau thì điều này sẽ dẫn đến một giá trị giả, nếu không nó sẽ trả về một giá trị trung thực.

Nếu cả hai khối đó là trung thực thì đầu vào của chúng tôi là một số mũ lũy thừa nguyên tố liên tiếp!


1

APL (Dyalog Extended) , 28 byte

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵}

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

Làm sao:

{f p`↓⍭⍵⋄(1=≢∪p)∧∨/f⍷⍸1⍭⍳⍵} ⍝ Monadic function, takes an argument ⍵
       ⍭⍵                     ⍝ Prime factors and exponents of ⍵
     `                         split the resulting matrix in 2 vectors
 f p                           assign the factors to f and the powers to p
                               then
                          ⍳⍵    range [1..⍵]
                        1      primality check for each element in the vector
                                where; returns the indices of truthy values
                     f          find the factors; returns a boolean vector
                   ∨/            logical OR reduction
                                logical AND
           (   p)               unique members of the powers
                                tally; returns the number of elements in the vector
            1=                   check if there's only one element



0

J , 14 byte

1#.2~:/\0,_&q:

1 trong đầu ra chỉ ra số mũ liên tục.

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

        0,_&q:   zero followed by the prime exponents of input
   2~:/\         for every two consecutive values, 1 if they are different
1#.              convert from base-1, just add them up

0

Sạch sẽ , 127 byte

import StdEnv
@n=[]== $n
?n#j= $n
= @n||j==filter@[hd j..last j]&&any(\p=(prod j)^p==n)[1..n]
$n=[i\\i<-[2..n-1]|n/i*i==n&& @i]

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

Xác định hàm ? :: Int -> Boolsử dụng $ :: Int -> [Int]để xác định và @ :: Int -> Boolkiểm tra tính nguyên thủy.


0

APL (NARS) 41 ký tự, 82 byte

{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}

{π⍵} là hệ số hóa hàm của đối số trong danh sách các thừa số nguyên tố (lặp lại nếu một số nguyên tố xuất hiện nhiều thời gian hơn);
{1π⍵} là hàm số nguyên tố tiếp theo (lưu ý rằng trong trường hợp này, đối số của nó không phải là vô hướng mà là một mảng các số nguyên). kiểm tra:

  h←{(1=≢∪+/¨{v=⍵⊃v}¨⍳≢v)∧(1↓w)≡¯1↓1πw←∪v←π⍵}
  (2..30)/⍨h¨2..30
2 3 4 5 6 7 8 9 11 13 15 16 17 19 23 25 27 29 30 
  h¨27000 456533 72 10000000
1 1 0 0 
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.