Toán học, 70 69 byte
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Một hàm không tên lấy và trả về một số nguyên. Nó ném một lỗi vào đầu vào1
nhưng vẫn tính kết quả chính xác.
Giải trình
Như thường lệ, do tất cả các cú pháp cú pháp, thứ tự đọc là một chút buồn cười. Một &
trên định nghĩa đúng một chức năng vô danh và đối số của nó được gọi bằng #
, #2
, #3
vv
...FactorInteger@#...
Chúng tôi bắt đầu bằng cách bao thanh toán đầu vào. Điều này đưa ra một danh sách các cặp {prime, exponent}
ví dụ đầu vào 12
cho {{2, 2}, {3, 1}}
. Hơi bất tiện, 1
cho {{1, 1}}
.
(...&)@@@...
Điều này áp dụng hàm bên trái cho danh sách các số nguyên ở cấp 1, đó là hàm được gọi cho mỗi cặp, chuyển số nguyên tố và số mũ thành các đối số riêng biệt, sau đó trả về danh sách kết quả. (Điều này tương tự như ánh xạ hàm qua danh sách, nhưng nhận hai đối số riêng biệt sẽ thuận tiện hơn so với nhận một cặp.)
...PrimePi@#...
Chúng tôi tính toán số lượng các số nguyên tố lên đến và bao gồm đầu vào (số nguyên tố) bằng cách sử dụng tích hợp PrimePi
. Điều này cho chúng ta chỉ số của nguyên tố.
...BitXor[...+1,1]-1...
Kết quả được tăng lên, XOR'ed với 1
và giảm xuống một lần nữa. Hoán đổi này 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, tức là tất cả các chỉ số dựa trên 1. Lưu ý rằng đầu vào 1
sẽ mang lại 0
cho PrimePi
sau đó được ánh xạ tới -1
trong quá trình này. Chúng ta sẽ giải quyết nó sau.
...Prime[...]^#2...
Bây giờ chúng ta có được số nguyên tố thứ n (trong đó n là kết quả của phép tính trước đó), là số nguyên tố được hoán đổi chính xác và nâng nó lên lũy thừa của số nguyên tố ban đầu trong hệ số của đầu vào. Tại thời điểm Prime[-1]
này sẽ ném một lỗi nhưng sẽ trở lại không đánh giá được. Sức mạnh trong trường hợp này là 1
do toàn bộ quá trình cho đến nay mang lại {Prime[-1]}
đầu vào 1
và một danh sách các quyền hạn chính xác cho tất cả các đầu vào khác.
1##&@@...
Tiếp theo, chúng tôi chỉ cần nhân lên tất cả các quyền hạn. 1##&
là một thủ thuật đánh golf tiêu chuẩn cho Times
chức năng. Xem mẹo này (phần "Trình tự lập luận") để biết cách hoạt động của nó.
Cuối cùng, chúng ta cần quan tâm đến đầu vào 1
mà tất cả các kết quả trên dẫn đến Prime[-1]
. Chúng ta có thể dễ dàng khắc phục điều đó bằng một quy tắc thay thế đơn giản. Hãy nhớ rằng đó f@x
là viết tắt của f[x]
. Chúng tôi chỉ muốn khớp bất kỳ biểu thức nào của dạng đó (vì tất cả các kết quả khác sẽ là số nguyên, tức là biểu thức nguyên tử) và thay thế nó bằng 1
:
.../._@_->1
Ở đây, /.
viết tắt của ReplaceAll
, _@_
là một mẫu cho bất kỳ dạng nào f[x]
(nghĩa là bất kỳ biểu thức ghép nào với một con) và ->1
nói "thay thế bằng 1
".