Buat fungsi, ekspresi, atau program yang melakukan hal berikut:
- Ambil faktor prima dari angka berapa pun dan jumlahkan. Misalnya, faktor utama 28 adalah 2 2 7, dijumlahkan menjadi 11.
- Lipat gandakan hasilnya dengan jumlah faktor prima untuk angka yang diberikan. Misalnya, 28 memiliki 3 faktor utama yang berjumlah 11. 11 * 3 adalah 33.
- Ulangi proses ini secara rekursif, simpan daftar yang dihasilkan (yang dimulai dengan nomor asli), hingga Anda mencapai nomor yang sudah termasuk dalam daftar. Berhenti tanpa menambahkan nomor akhir itu, sehingga daftar tidak mengandung duplikat. Progres untuk 28 adalah 28 33, karena 33 menghasilkan 28 lagi.
- Hitung elemen dalam daftar yang dihasilkan. Dalam kasus 28, jawabannya adalah 2.
Berikut ini hasilnya 0<n<=10
, sehingga Anda dapat memeriksa algoritme Anda.
2 1 1 10 1 11 1 9 5 10
(Seperti yang ditunjukkan oleh balpha, jawabannya higley(1)
adalah 2, dari daftar 1 0. Saya awalnya punya 1, karena bug dalam algoritma asli saya yang ditulis dalam J.)
Karena saya seorang SOB yang sombong dan belum menemukan ini di OEIS , sebut saja ini "Higley Sequence," setidaknya selama durasi golf code ini. Sebagai bonus tambahan, temukan dua yang pertama n
memiliki yang terendah di higley(n)
mana n
tidak prima dan n>1
. (Saya pikir hanya ada dua, tapi saya tidak bisa membuktikannya.)
Ini adalah kode standar golf, jadi seperti biasa, penekanan tombol paling sedikit menang, tetapi saya meminta Anda untuk memperbaiki jawaban yang cerdas dalam bahasa lain, bahkan jika itu bertele-tele.
highley(1) == 1
? Seseorang tidak memiliki faktor prima, jadi daftar yang dihasilkan di 4) adalah[1, 0]
, jadihighley(1) == 2
seperti yang saya lihat.Jawaban:
J,
4745Mungkin ini akan jauh lebih pendek tanpa menggunakan
^:_
, tetapi otak saya sudah cukup digoreng.Sunting: (47-> 45) Hari kupon ganda.
Pemakaian:
sumber
#@((~.@,((+/*#)@:q:)@{:)^:_)`2:@.(=&1)
yaitu 38 karakter.{
,{.
, dan{:
semua hal yang berbeda berarti, tapi{-
(misalnya) jelas merupakan suatu urutan dua hal,{
dan-
.Golfscript,
68 67 6261 karakterIni adalah ekspresi: ia mengambil
n
stack dan meninggalkan hasilnya di stack. Untuk mengubahnya menjadi program yang mengambiln
dari stdin dan mencetak hasilnya ke stdout, ganti[
dengan yang pertama~
Inti dari itu adalah
[.2@{1$1$%{)}{\1$/1$}if}*;;]
(28 karakter) yang mengambil nomor teratas pada stack dan (dengan algoritma yang sangat tidak efisien) menghasilkan daftar faktor prima. Setara dengan kode-gaya C:Yang
0+
sebelumnya{+}*
adalah menangani kasus khususn==1
, karena Golfscript tidak suka melipat operasi biner di atas daftar kosong.Salah satu fixpoint non-prime adalah 27; Saya menemukan ini tanpa menggunakan program dengan mempertimbangkan pemetaan (p a
->
a 2 p), yang merupakan fixpoint jika a == p (a-1) / 2 , dan mencoba kecila
. (a==1
Memberikan fixpointedness bilangan prima).Pencarian dengan program menghasilkan fixpoint kedua: 30 = (2 + 3 + 5) * 3
Lampiran: bukti bahwa hanya ada dua fixpoint non-prime
Notasi:
sopfr(x)
adalah jumlah dari faktor utamax
, dengan pengulangan (A001414).Omega(x)
adalah jumlah faktor utamax
(A001222). Jadi fungsi penerus Higley adalahh(x) = sopfr(x) Omega(x)
Misalkan kita memiliki fixpoint
N = h(N)
yang merupakan produkn=Omega(N)
bilangan prima.N = p_0 ... p_{n-1} = h(N) = n (p_0 + ... + p_{n-1})
Teori bilangan dasar:
n
terbagi menjadip_0 ... p_{n-1}
, sehinggaw=Omega(n)
bilangan prima adalah faktor utaman
. Wlog kita akan menganggap mereka yang terakhirw
. Jadi kita bisa membagi kedua sisi dengann
dan mendapatkanp_0 ... p_{n-w-1} = p_0 + ... + p_{n-1}
atau
p_0 ... p_{n-w-1} = p_0 + ... + p_{n-w-1} + sopfr(n)
Mengingat bahwa semua bilangan prima
p_0
untukp_{n-w-1}
lebih besar dari 1, meningkatkan salah satu dari mereka meningkatkan LHS lebih dari RHS. Jadi untuk yang diberikann
, kita dapat menghitung semua solusi kandidat.Secara khusus, tidak ada solusi jika LHS lebih besar dari pengaturan RHS semua bilangan prima "bebas" menjadi 2. Yaitu tidak ada solusi jika
2^{n-w} > 2 (n-w) + sopfr(n)
Karena
sopfr(n) <= n
(dengan persamaan hanya untuk n = 4 atau n prime), kita dapat membuat pernyataan yang lebih lemah bahwa tidak ada fixpoint jika2^{n-w} > 3 n - 2 w
Memegang
w
tetap kita dapat memilih nilain
memuaskan yang berbedaw=Omega(n)
. Tersebut terkeciln
adalah2^w
. Perhatikan bahwa jika2^{n-w}
setidaknya 3 (yaitu jikan-w>1
, yang benar jikan>2
) maka peningkatann
sambil memegangw
konstan akan meningkatkan LHS lebih dari RHS. Perhatikan juga bahwa untukw>2
dan mengambil kemungkinan sekecil mungkinn
, ketimpangan terpenuhi, dan tidak ada titik perbaikan.Itu meninggalkan kita dengan tiga kasus:
w = 0
dann = 1
;w = 1
dann
prima; atauw = 2
dann
semi-prime.Kasing
w = 0
.n = 1
, begituN
juga prime.Kasing
w = 1
. Jikan = 2
ituN = 2p
dan kami membutuhkanp = p + 2
, yang tidak memiliki solusi. Jikan = 3
kemudian kita punyapq = p + q + 3
dan dua solusi,(p=2, q=5)
dan(p=3, q=3)
. Jikan = 5
demikian2^4 > 3 * 5 - 2 * 1
, maka tidak ada solusi lebih lanjut denganw = 1
.Kasing
w = 2
. Jikan = 4
ituN = 4pq
dan kami membutuhkanpq = p + q + 4
. Ini memiliki solusi integerp=2, q=6
, tetapi tidak ada solusi utama. Jikan = 6
demikian2^4 > 3 * 6 - 2 * 2
, maka tidak ada solusi lebih lanjut denganw = 2
.Semua kasing habis, sehingga satu-satunya fixpoint non-prime adalah 27 dan 30.
sumber
n
sebelum dihitung, apakah ada non-priman
setelah 49 yang urutannya tidak berakhir dalam 28?n
yang terikat dihigley(n)
atas. (Itu akan memungkinkan penyederhanaan loop - cukup iteratef(n)
times dan kemudian buang duplikat).Ruby, 92 karakter
Solusi ini mengasumsikan higley (1) sebenarnya 2, bukan 1 (lihat komentar balpha di atas):
sumber
Oktaf - 109 karakter
sumber
MATL , 19 byte
Cobalah online!
sumber