Mathematica, 70 69 bayt
1##&@@(Prime[BitXor[PrimePi@#+1,1]-1]^#2&)@@@FactorInteger@#/._@_->1&
Bir tamsayı alan ve döndüren adsız bir işlev. Girişe bir hata verir, 1
ancak yine de doğru sonucu hesaplar.
açıklama
Her zamanki gibi, tüm sözdizimsel şeker nedeniyle, okuma sırası biraz komik. Bir &
doğru tanımlayan bir isimsiz fonksiyonu ve argümanlar ile ifade edilir #
, #2
, #3
vs.
...FactorInteger@#...
Girdiyi çarpanlarına ayırarak başlıyoruz. Bu, {prime, exponent}
giriş 12
verir gibi bir çift listesi verir {{2, 2}, {3, 1}}
. Biraz rahatsız edici, 1
verir {{1, 1}}
.
(...&)@@@...
Bu , soldaki işlevi 1. düzeydeki tamsayılar listesine uygular , yani işlev her çift için çağrılır, asal ve üssü ayrı bağımsız değişkenler olarak iletir ve sonuçların bir listesini döndürür. (Bu, işlevi liste üzerinde eşlemeye benzer, ancak iki ayrı bağımsız değişken almak bir çift almaktan daha uygundur.)
...PrimePi@#...
Yerleşik kullanarak (asal) girdiye kadar olan ve dahil olan prim sayısını hesaplıyoruz PrimePi
. Bu bize asalın indeksini verir.
...BitXor[...+1,1]-1...
Sonuç artar, XOR'lu hale getirilir 1
ve tekrar azaltılır. Bu 1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, yani tüm 1 tabanlı endeksleri değiştirir. Giriş bu Not 1
verecektir 0
için PrimePi
daha sonra bu eşleştirilir -1
, bu işlemde. Bununla daha sonra ilgileneceğiz.
...Prime[...]^#2...
Şimdi n. Üssü elde ediyoruz (burada n , bir önceki hesaplamadan elde edilen sonuçtur). Bu noktada Prime[-1]
bir hata atar, ancak değerlendirmeden kendini döndürür. Bu durumda güç, şu 1
ana kadar tüm işlemin {Prime[-1]}
girdi 1
ve diğer tüm girdiler için doğru ana güçlerin bir listesi olmasını sağlar.
1##&@@...
Sonra, tüm ana güçleri çoğaltırız. 1##&
işlevi için standart bir golf hüneridir Times
. Bkz bu ipucunu nasıl çalıştığını için (bölüm "argümanların Diziler").
Son olarak, 1
yukarıdakilerin hepsiyle sonuçlanan girdilere dikkat etmeliyiz Prime[-1]
. Bunu basit bir değiştirme kuralıyla kolayca düzeltebiliriz. Bunun f@x
kısa olduğunu unutmayın f[x]
. Sadece bu formun herhangi bir ifadesini eşleştirmek istiyoruz (çünkü diğer tüm sonuçlar tamsayı olacak, yani atom ifadeleri) ve yerine bir 1
:
.../._@_->1
Burada, /.
kısaltması ReplaceAll
, _@_
formun her şey için bir kalıptır f[x]
(tek çocukla yani herhangi bileşik ifade) ve ->1
"ile değiştir diyor 1
".