(Tindak lanjuti pertanyaan saya tentang bertukar bit dengan tetangga mereka .)
Tugas
Diberikan bilangan bulat positif x = (2 a · 3 b ) · (5 c · 7 d ) · (11 e · 13 f ) ·… , cetak bilangan bulat yang diperoleh dengan menukar eksponen dalam faktorisasi ini untuk setiap pasangan bilangan prima berturut-turut, y = (2 b · 3 a ) · (5 d · 7 c ) · (11 f · 13 e ) ·…
A061898 di OEIS. Ini adalah kode-golf , jadi program terpendek (dalam byte) menang!
Uji kasus
1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871
Jawaban:
Jelly , 10 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Jelly,
171611 byte5 byte berkat Dennis.
Cobalah online!
Penjelasan
Versi 16-byte sebelumnya
Cobalah online!
Penjelasan
Versi 17 byte sebelumnya:
Cobalah online!
Penjelasan
sumber
Mathematica,
7069 byteFungsi tanpa nama yang mengambil dan mengembalikan integer. Itu melempar kesalahan pada input
1
tetapi masih menghitung hasil yang benar.Penjelasan
Seperti biasa, karena semua gula sintaksis, urutan bacaannya agak lucu. Sebuah
&
pada mendefinisikan kanan fungsi yang tidak disebutkan namanya dan argumen yang disebut dengan#
,#2
,#3
, dllKami mulai dengan memfaktorkan input. Ini memberikan daftar pasangan
{prime, exponent}
mis. Input12
memberi{{2, 2}, {3, 1}}
. Agak nyaman,1
memberi{{1, 1}}
.Ini menerapkan fungsi di sebelah kiri ke daftar bilangan bulat di level 1, yaitu fungsi dipanggil untuk setiap pasangan, melewati bilangan prima dan eksponen sebagai argumen yang terpisah, dan kemudian mengembalikan daftar hasil. (Ini mirip dengan memetakan fungsi di atas daftar, tetapi menerima dua argumen terpisah lebih nyaman daripada menerima pasangan.)
Kami menghitung jumlah bilangan prima hingga dan termasuk input (prima) menggunakan built-in
PrimePi
. Ini memberi kita indeks prima.Hasilnya bertambah, XOR'ed dengan
1
dan dikurangi lagi. Ini swap1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, yaitu semua indeks berbasis 1. Perhatikan bahwa masukan1
akan menghasilkan0
untukPrimePi
yang kemudian dipetakan ke-1
dalam proses ini. Kami akan mengatasinya nanti.Kita sekarang mendapatkan perdana ke- n (di mana n adalah hasil dari perhitungan sebelumnya), yang merupakan perdana yang ditukar dengan benar, dan menaikkannya ke kekuatan prime asli dalam factorisation dari input. Pada titik ini
Prime[-1]
akan terjadi kesalahan tetapi akan kembali sendiri tidak dievaluasi. Kekuatan dalam hal ini adalah1
sehingga seluruh proses sejauh ini menghasilkan{Prime[-1]}
input1
dan daftar kekuatan utama yang benar untuk semua input lainnya.Selanjutnya, kita gandakan semua kekuatan utama.
1##&
adalah trik golf standar untukTimes
fungsinya. Lihat tip ini (bagian "Urutan argumen") untuk cara kerjanya.Akhirnya, kita perlu berhati-hati terhadap masukan
1
yang menghasilkan semua hal di atasPrime[-1]
. Kami dapat dengan mudah memperbaikinya dengan aturan penggantian yang sederhana. Ingat ituf@x
kependekan darif[x]
. Kami hanya ingin mencocokkan ekspresi apa pun dari bentuk itu (karena semua hasil lainnya akan berupa bilangan bulat, yaitu ekspresi atomik), dan ganti dengan1
:Di sini,
/.
kependekan dariReplaceAll
,_@_
adalah pola untuk segala bentukf[x]
(yaitu setiap ekspresi majemuk dengan anak tunggal) dan->1
mengatakan "ganti dengan1
".sumber
Python 2,
149139 byte10 byte berkat Dennis.
sumber
input()
bekerja di Python 2?eval(input())
di Python 3.MATL , 17 byte
Cobalah online!
Penjelasan
Ini tidak menggunakan eksponen secara langsung. Alih-alih, ia menukar masing-masing (mungkin diulang) faktor prima dengan prima berikutnya atau sebelumnya.
sumber
Julia, 64 byte
Cobalah online!Kasing uji terakhir membutuhkan terlalu banyak memori untuk TIO, tetapi saya telah memverifikasi secara lokal.
Bagaimana itu bekerja
Untuk menghindari input casing khusus 1 - produk dari kamus kosong tidak ditentukan - kami mengalikan input n dengan 2 dan membagi hasil akhir dengan pasangannya 3 .
factor(2n)
memberikan semua eksponen positif faktor prima 2n sebagai kamus. Saat beralih ke kamus, kita akan mendapatkan pasangan key-value / prime-eksponent. Fungsiprod
akan mengambil pasangan ini, menerapkan fungsi anonimt->...
kepada mereka dan mengembalikan produk dari hasil.Untuk setiap pasangan t = (p, e) ,
endof(~t[1])
atauendof(primes(t[1]))
mengembalikan k , jumlah bilangan prima yang kurang atau sama dengan p , artinya p adalah bilangan prima k .+1$1-1
akan menambah k , XOR k +1 dengan 1 dan menurunkan hasilnya. Jika k adalah ganjil, k + 1 adalah genap, maka kenaikan XOR dan hasil akhirnya adalah k + 1 . Jika k adalah genap, k + 1 adalah ganjil, sehingga XOR menurun dan hasil akhirnya adalah k - 1 .Akhirnya, kami menghitung semua bilangan prima kurang atau sama dengan 3n dengan
(~3n)
atauprimes(3n)
(faktor prima tertinggi 2n kurang atau sama dengan n jika n> 2 , dan selalu ada bilangan prima antara n dan 2n ), pilih satu di indeks k + 1 atau k - 1 , dan mengangkatnya ke e th daya dengan^t[2]
.sumber
Python 2,
1121091089594 byteUji di Ideone .
Bagaimana itu bekerja
Ketika f dipanggil, ia pertama menghitung 1 / n . Jika hasilnya bukan nol, n adalah 1 dan f mengembalikan 1 .
Jika n> 1 , berikut ini terjadi.
Jika n tidak habis dibagi dengan p [1] (awalnya 2 ),
n%p[1]
menghasilkan nilai kebenaran dandipanggil.
Cabang ini menghasilkan bilangan prima sampai yang kedua dari belakang membagi secara merata n . Untuk melakukannya, ia menggunakan wajar berikut dari teorema Wilson .
Setiap saat, m sama dengan faktorial dari k - 1 (awalnya 6 = 3! Dan 4. Dalam setiap iterasi, hasil
m*m%k*[k]
akan ditambahkan ke daftar bilangan prima p . Dengan wajar,m*m%k
adalah 1 jika k adalah prima dan 0 jika tidak, jadi ini menambahkan k ke p jika dan hanya jika k adalah bilangan prima.Jika n dapat dibagi dengan p [1] ,
n%p[1]
hasilkan 0 dandieksekusi.
Jika p berisi jumlah bilangan prima yang genap,
len(p)*2%4
akan menghasilkan 0 dan multiplikasi pertama mengambil nilai p [0] . Jika p berisi jumlah ganjil dari bilangan prima,len(p)*2%4
akan menghasilkan 2 dan multiplikasi pertama mengambil nilai p [2] .Dalam kedua kasus, ini adalah bilangan prima yang eksponennya harus ditukar dengan bilangan p [1] , jadi kami membagi n dengan p [1] (mengurangi eksponen dengan 1 ) dan mengalikan hasil
f(n/p[1])
dengan bilangan prima yang sesuai (meningkat eksponen dengan 1 ).Perhatikan bahwa
f(n/p[1])
me - reset k , m dan p ke nilai standarnya.f(n/p[1],k,m,p)
akan meningkatkan efisiensi, dengan biaya enam byte tambahan.sumber
Pyth, 25 byte
Suite uji.
Penjelasan
sumber
Julia,
155131127 byteIni adalah fungsi anonim yang menerima integer dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel. Itu memerlukan versi Julia <0,5 karena fungsionalitas utama telah dihapus dari Base di 0,5.
Tidak Disatukan:
Cobalah online! (Termasuk semua kasus uji)
sumber
Sebenarnya, 15 byte
Cobalah online!
Penjelasan:
sumber
05AB1E, 22 byte
Dijelaskan
Cobalah online
sumber
J, 21 byte
Mendapat eksponen utama dari n sebagai kekuatan utama dengan nol. Kemudian mempartisi mereka menjadi sublists nonoverlapping ukuran 2 sambil mengisi dengan nol tambahan. Kemudian balikkan setiap sublist, dan ratakan menjadi daftar. Akhirnya, konversikan kembali dari eksponen utama ke angka.
Pemakaian
Penjelasan
sumber