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, 1ancak 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, #3vs.
...FactorInteger@#...
Girdiyi çarpanlarına ayırarak başlıyoruz. Bu, {prime, exponent}giriş 12verir gibi bir çift listesi verir {{2, 2}, {3, 1}}. Biraz rahatsız edici, 1verir {{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 1ve tekrar azaltılır. Bu 1 <-> 2, 3 <-> 4, 5 <-> 6, ..., yani tüm 1 tabanlı endeksleri değiştirir. Giriş bu Not 1verecektir 0için PrimePidaha 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 1ana kadar tüm işlemin {Prime[-1]}girdi 1ve 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, 1yukarıdakilerin hepsiyle sonuçlanan girdilere dikkat etmeliyiz Prime[-1]. Bunu basit bir değiştirme kuralıyla kolayca düzeltebiliriz. Bunun f@xkı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".