Số của tôi là duy nhất


21

Trong thử thách này, chúng tôi đã học được cách mã hóa mọi số nguyên dương bằng cách sử dụng các cây hệ số.

Đây là cách nó làm việc:

  • Chuỗi rỗng có giá trị là 1.

  • (S)trong đó Sbất kỳ biểu thức nào có giá trị S ước tính cho số nguyên tố S th.

  • ABnơi ABlà những biểu hiện arbirary với các giá trị của AB lần lượt có giá trị A * B .

Ví dụ: nếu chúng tôi muốn đại diện cho 7, chúng tôi sẽ làm

  7 -> (4) -> (2*2) -> ((1)(1)) -> (()())

Hóa ra chúng ta có thể đại diện cho mọi số nguyên bằng phương pháp này. Trong thực tế, một số con số chúng ta có thể đại diện theo nhiều cách. Bởi vì phép nhân là 10 giao hoán

((()))()

()((()))

Đồng thời một số số chỉ có thể được biểu diễn theo 1 cách. Lấy 8 làm ví dụ. 8 chỉ có thể được đại diện là

()()()

Và vì tất cả các nguyên tử của chúng ta đều giống nhau, chúng ta không thể sử dụng giao hoán để sắp xếp lại chúng.


Vì vậy, bây giờ câu hỏi là "Những số nào chỉ có thể được biểu diễn theo 1 cách?". Quan sát đầu tiên là một cái tôi mới bắt đầu quay lại đó. Có vẻ như sức mạnh hoàn hảo có một số tính chất đặc biệt. Theo nghiên cứu sâu hơn, chúng ta có thể tìm thấy 36, đó là 6 2 là một sức mạnh hoàn hảo nhưng có nhiều đại diện.

(())()(())()
(())()()(())
()(())()(())
()(())(())()
()()(())(())

Và điều này có ý nghĩa bởi vì 6 đã được sắp xếp lại, do đó, bất kỳ số nào chúng ta tạo ra trong số 6 cũng phải được sắp xếp lại.

Vì vậy, bây giờ chúng tôi có một quy tắc:

  • Một số có một đại diện duy nhất nếu nó là một sức mạnh hoàn hảo của một số với một đại diện duy nhất.

Quy tắc đó có thể giúp chúng tôi giảm việc xác định xem một số tổng hợp là duy nhất để xác định xem một số nguyên tố có phải là duy nhất hay không. Bây giờ chúng ta có quy tắc đó, chúng tôi muốn tìm ra điều gì làm cho một số nguyên tố duy nhất. Điều này thực sự là khá rõ ràng. Nếu chúng ta lấy một số duy nhất và gói nó trong ngoặc đơn, kết quả phải là duy nhất và, đi theo cách khác nếu n có nhiều biểu diễn thì số nguyên tố thứ n phải có nhiều biểu diễn. Điều này mang lại quy tắc thứ hai:

  • Số nguyên tố thứ n là duy nhất khi và chỉ khi n là duy nhất.

Cả hai quy tắc này đều được đệ quy, vì vậy chúng ta sẽ cần một trường hợp cơ bản. Số duy nhất nhỏ nhất là gì? Người ta có thể bị cám dỗ để nói 2 bởi vì nó chỉ (), nhưng 1, chuỗi rỗng, thậm chí còn nhỏ hơn và là duy nhất.

  • 1 là duy nhất.

Với ba quy tắc này, chúng ta có thể xác định xem một số có cây nhân tố duy nhất hay không.

Bài tập

Bạn có thể đã thấy nó đến, nhưng nhiệm vụ của bạn là lấy một số nguyên dương và xác định xem nó có phải là duy nhất không. Bạn nên viết một chương trình hoặc hàm thực hiện tính toán này. Bạn nên xuất một trong hai giá trị có thể, những giá trị này tùy thuộc vào bạn nhưng một giá trị sẽ đại diện cho "có", là đầu ra khi đầu vào là duy nhất và một giá trị đại diện cho "không" là đầu ra khác.

Câu trả lời của bạn nên được ghi bằng byte với ít byte hơn.

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

Dưới đây là cặp số duy nhất đầu tiên:

1
2
3
4
5
7
8
9
11
16
17
19
23
25
27
31

Đề nghị kiểm tra

5381 -> Unique

Có vẻ như OEIS A214577 bằng cách nào đó có liên quan, vì vậy nếu bạn cần thêm các trường hợp thử nghiệm ở đó, nhưng tôi không biết chúng giống nhau nên bạn có thể tự chịu rủi ro.


Tôi tin rằng các yếu tố chính phải được sắp xếp nhưng bất cứ điều gì.
Nissa

1
@Jonathan ALLan không, tất cả đều ở đây.
Nissa

Trường hợp thử nghiệm được đề xuất: 5381
Nissa

@StephenLeppik Đã thêm trường hợp thử nghiệm, cảm ơn.
Thuật sĩ lúa mì

1
@ H.PWiz Tôi sẽ nói rằng một chương trình đầy đủ có thể lỗi là đầu ra vì đó là một dạng đầu ra cho một chương trình, nhưng một hàm phải trả về một giá trị.
Thuật sĩ lúa mì

Câu trả lời:


9

Husk , 11 10 byte

Đã lưu một byte nhờ Zgarb!

Ωεo?oṗ←¬Ep

Trả về 1cho duy nhất, 0nếu không

Hãy thử trực tuyến! Hoặc trả lại 50 đầu tiên

Giải trình:

Ωε              Until the result is small (either 1 or 0), we repeat the following
         p     Get the prime factors
  o?           If ...
        E      they are all equal:
    ȯṗ←           Get the index of the first one into the primes
               Else:
       ¬          Not the list (since non-empty lists are truthy, this returns 0)

Ồ, và lời giải thích của bạn nói " ȯp←".
Erik the Outgolfer

@EriktheOutgolfer Bắt tốt, đã sửa
H.PWiz

Tôi nghĩ ṁ¬có thể chỉ ¬vì danh sách phải không trống trong nhánh đó.
Zgarb

@Zgarb Ôi lạ quá, tôi nghĩ bạn đã cho tôi tiền boa đó trước đây
H.PWiz

7

Thạch , 10 byte

Sau khi RẤT NHIỀU xung quanh!

ÆET0ṪḊ?µl¿

Một liên kết đơn âm lấy một số nguyên dương và trả về 1nếu nó là duy nhất hoặc 0nếu không.

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

Làm sao?

ÆET0ṪḊ?µl¿ - Link: number, n     e.g. 11          or 13            or 20
         ¿ - while:
        l  - ...condition: (left) logarithm with base (right)
           -               note: x log 0 and x log 1 both yield None, which is falsey
       µ   - ...do the monadic chain: (first pass shown)
ÆE         -   prime exponent array   [0,0,0,0,1]    [0,0,0,0,0,1]    [2,0,1]
  T        -   truthy indexes         [5]            [6]              [1,3]
      ?    -   if:
     Ḋ     -   ...condition: dequeue (i.e. if length > 1)
   0       -   ...then: literal zero   -              -               0
    Ṫ      -   ...else: tail           5              6               -
           - end result                1              0               0

Đợi đã, logarit, cái gì?!

Hãy chạy qua một số ví dụ về vòng lặp.

Nếu n=31( 31 1 , số nguyên tố thứ mười một):

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |       31 |        31 |    1.000 -> continue
         2 |       11 |        31 |    0.698 -> continue
         3 |        5 |        11 |    0.671 -> continue
         4 |        3 |         5 |    0.683 -> continue
         5 |        2 |         3 |    0.631 -> continue
         6 |        1 |         2 |    0.000 -> stop, yielding left = 1

Nếu n=625 ( 5 4 ):

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |      625 |       625 |    1.000 -> continue
         2 |        3 |       625 |    0.171 -> continue
         3 |        2 |         3 |    0.631 -> continue
         4 |        1 |         2 |    0.000 -> stop, yielding left = 1

Nếu n=225( 5 2 × 3 2 ):

log test # |  left, x |  right, b |  x log b
-----------+----------+-----------+----------
         1 |      225 |       225 |    1.000 -> continue
         2 |     *  0 |       225 |-inf+nanj -> continue
         3 |     ** 0 |         0 |     None -> stop, yielding left = 0

*The dequeued list was not empty
**Tailing an empty list in Jelly yields 0

4

APL (Dyalog) , 42 byte

CY'dfns'
{1≥⍵:11=≢∪r3pco⍵:∇11pcor0}

Sử dụng ⎕CY'dfns'với dfnses không khả thi trên tio.


Câu trả lời của tôi khá giống với câu trả lời của bạn, mặc dù vậy, tôi đã viết phiên bản đầu tiên vào khoảng 4 giờ trước
H.PWiz

@ H.PWiz nhìn người đàn ông, tôi không thực sự quan tâm khi mọi người gửi cùng một ngôn ngữ mặc dù tôi thường chỉ muốn bình luận khi tôi tìm giải pháp ngắn hơn, nhưng điều này gần như giống nhau. Tôi không phiền bạn giữ nó, nhưng tôi thấy câu trả lời trông khá vô dụng. Về thời gian - đó là cách nó hoạt động. Tôi bỏ hàng tá câu trả lời vì có người khác đến trước. Tôi (và tôi tin rằng phần còn lại) đang làm điều đó cho vui chứ không phải là một cuộc thi thực sự.
Uriel

Xin lỗi vì mất quá nhiều thời gian để nhận được nó, nhưng tôi đã xóa câu trả lời của mình. Nhìn lại, một nhận xét có vẻ như sẽ phù hợp hơn. Tôi nghĩ, vì tôi mới tham gia APL vào thời điểm đó, một câu trả lời như vậy đòi hỏi một nỗ lực khá đáng kể và tôi cảm thấy một nhận xét sẽ khiến nó cảm thấy lãng phí
H.PWiz


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.