Terkait: Iterated phi (n) berfungsi .
Tantangan Anda adalah menghitung fungsi phi yang diulang:
f(n) = number of iterations of φ for n to reach 1.
Dimana φ
adalah fungsi totient Euler .
OEIS terkait .
Ini grafiknya:
Aturan:
Tujuan Anda adalah untuk output f(n)
dari n=2
ke n=100
.
Ini kode-golf, jadi kode terpendek menang.
Berikut nilai yang dapat Anda periksa:
1, 2, 2, 3, 2, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 5, 3, 4, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 5, 5, 6, 4, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 4, 6, 5, 5, 5, 6, 5, 6, 5, 5, 6, 6, 5, 6, 6, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 5, 6, 7, 5, 7, 5, 6, 6, 7, 5, 6, 6, 6, 6, 6, 6, 7, 5, 6, 6
code-golf
math
sequence
kolmogorov-complexity
number-theory
Seni Cukup Indah
sumber
sumber
x
seperti ituphi(x)
adalah nomor tetap tertentu.f(n)
, daripada menjalankannya pada berbagai nomor tetap. Ini juga membuat perbedaan antara bahasa dengan kemampuan untuk menerapkan fungsi pada rentang dengan lebih sedikit byte (sebagian tantangan bunglon?)Jawaban:
Haskell ,
5352 byteTerima kasih nimi karena telah menghemat 1 byte!
Cobalah online!
sum[1|1<-gcd n<$>[1..n]]
memberiφ(n)
(Diambil dari flawr , terima kasih!)f
adalah fungsi rekursif yang menghitung1+φ(n)
jika n tidak1
, dan output0
jikan
ini1
, karena tidak ada lagi iterasi yang akan diambil untuk mencapai1
Akhirnya
f<$>[2..100]
membuat daftarf
diterapkan untuk setiap elemen[2..100]
sumber
Haskell ,
70 6968 byteFungsi
(\n->sum[1|1<-gcd n<$>[1..n]])
ini adalah fungsi totient, yang berulang kali kami terapkan dalam fungsi anonim. Terima kasih @laikoni untuk -1 byte!EDIT: Saya baru saja menemukan @xnor menggunakan fungsi total yang tepat ini dalam tantangan sebelumnya .
Cobalah online!
sumber
MATL ,
1615 byteCobalah online!
Penjelasan
Versi lama, 16 byte
Cobalah online!
Penjelasan
sumber
2 3 3 4 3
, ketika tantangan mengatakan bahwa itu seharusnya1 2 2 3 2
Jelly ,
1211109 byteCobalah online!
-1 byte terima kasih kepada HyperNeutrino!
-1 byte terima kasih kepada Tn. Xcoder!
-1 byte terima kasih kepada Dennis
Bagaimana itu bekerja
Karena ini dibuat oleh Dennis, saya (dimengerti) tidak tahu mengapa ini bekerja, hanya saja itu terjadi.
sumber
f(n)
dari2
ke100
, dan pertanyaan tidak menyebutkan input, jadi saya pikir ini adalah versi yang benarf
untukn=2
ken=100
, bukan hanya satu nilai.#
dalam kasus ini? Sesuatu seperti ini (yang jelas tidak berfungsi tetapi ditulis oleh seseorang yang memahami sintaksisnya dengan jelas!)€
biasanya lebih baik daripada#
.APL (Dyalog) ,
502925 byteLihat bu, tidak ada built-in totient!
4 byte disimpan berkat @ H.PWiz
Cobalah online!
Bagaimana?
Rupanya saya pergi untuk formula yang lebih panjang (dan lebih sulit) pertama. Lihat riwayat revisi.
⍳⍵
-1
untukn
⍵∨
- gcd dengann
1=
- sama dengan 1?+/
- jumlah semuanyaIni adalah totient. Semua sisanya adalah pembungkus untuk penghitungan (
1+∇
) dan menerapkan pada rentang2..100
(¨1+⍳99
).sumber
Mathematica, 44 byte
-10 byte dari @Misha Lavrov
-2 byte dari @ user202729
Cobalah online!
sumber
J REPL, 23 byte
Saya belum memeriksanya, tetapi ini mungkin berfungsi dalam J biasa jika Anda mendefinisikannya sebagai kata benda (Saya menggunakan ini pada ponsel saya di REPL).
Built-in, yo.
Saya akan mengatakan bahwa setidaknya ada 2-3 byte untuk mencukur (off-by-one karena cara
a:
kerjanya, harus digunakan|
sebagai noop, dll).sumber
+/*<:5&p:^:a:2+i.99
untuk 19 byte Cobalah online!"+
sebagai ganti"0
, sehingga dapat menjadi sama<:#@(5&p:^:a:)"+i.99
+/1<a:5&p:2+i.99
a:
kode Anda? Bagaimana cara kerjanya^:
?(5&p:)^:a: m
dapat dilakukan dengana: 5&p: m
menggunakan definisi lain tentang&
kapan angka dua diikat dengan kata benda dan kemudian disebut secara dyadically.JavaScript (ES6),
115...10499 byteHard-coding mungkin lebih pendek, tetapi mari kita coba pendekatan matematika murni.
sumber
Python 2 , 80 byte
Cobalah online!
sumber
Python 2 , 82 byte
Cobalah online!
Ini menggunakan pengamatan bahwa:
f(a*b) = f(a) + f(b) - 1
, kecuali-1
dihilangkan jikaa
danb
keduanya samaf(p) = f(p-1) + 1
kapanp
prima, denganf(2)=1
Ini menyiratkan bahwa jika
n
memiliki faktorisasi utaman = 2**a * 3**b * 5**c * 7**d * 11**e * ...
, makaf(n) = max(a,1) + b + 2*c + 2*d + 3*e + ...
, di mana masing-masingp>2
dalam faktorisasi berkontribusif(p-1)
.Saya tidak yakin apakah ini terus bertahan
n=100
, tetapi jika ya, mereka memberikan cara untuk mendefinisikan dan menghitungf
tanpa menggunakanφ
.sumber
Bubblegum , 49 byte
Cobalah online!
sumber
PowerShell , 110 byte
Cobalah online!
Pendekatan matematis.
Sebenarnya, melihat melalui itu, sangat mirip dengan jawaban C , tetapi dikembangkan secara mandiri. Buat array
0
s, loop dari2
ke100
, lalu hitungphi
menggunakangcd
formulasi. Bagian dalam parens pada akhirnya menyimpan hasilnya ke$a
untuk putaran berikutnya, dan menempatkan salinan pada pipa, yang menghasilkan output implisit.PowerShell, 112 byte
Cobalah online!
Kode-keras. Ho-hum.
Lebih pendek dari saya bisa mendapatkan pendekatan matematika sekitar 10-15 byte.sumber
Python 2 , 83 byte
Cobalah online!
Menggabungkan estimasi heuristik dengan konstanta hardcoded yang mengoreksi setiap estimasi sebagai salah satu
-0
atau-1
.sumber
Sekam ,
1017 byteCobalah online!
Sunting : +7 byte untuk benar-benar memetakan fungsi pada rentang yang diminta, sebelum itu hanya fungsi komputasi A003434 .
Penjelasan
Hitung berikut A003434 :
Bagian ini
m(....)ḣ100
hanya memetakan fungsi tersebut pada rentang [2..100], tidak yakin bagaimana saya melewatkan bagian itu sebelumnya: Ssumber
PHP, 98 byte
Cobalah online!
Saya mengemas semua digit menjadi string biner. Setelah membongkar, mengubahnya menjadi sebuah array dan kemudian menggabungkan array lagi, saya hanya perlu menambahkan 1,2 dan menambahkan 6 karena tidak akan cocok atau menyebabkan kode kontrol muncul.
sumber
Perl 6 , 47 byte
Cobalah online!
sumber
05AB1E , 11 byte
Cobalah online!
Penjelasan
sumber
C, 112 byte
Tidak Disatukan:
Cobalah online!
sumber
Alumin , 87 byte
Cobalah online!
Penjelasan
sumber
Pyth, 38 byte (tidak kompetitif)
Cobalah di Pyth Herokuapp , karena itu tidak berfungsi pada TIO untuk alasan apa pun.
Saya tidak ragu solusi Pyth eksplisit lebih kecil, tetapi saya ingin melihat seberapa kecil saya bisa mendapatkan kode dengan mengompresi urutan, dan belajar Pyth kurasa. Ini menggunakan fakta bahwa batas atas dari urutan adalah
log2(n)+1
.Penjelasan
Saya mendapat string terkompresi melalui
Ci_.e+1-sl+1ksb"122323333434344534444545444545555545455645555655565646555656556656665656565656656757566756666667566"3
, yang merupakan kebalikan dari kode di atas dengan beberapa jenis konversi.sumber
Ohm v2 , 41 byte
Cobalah online!
Secara harfiah sepenuhnya dikodekan ... Saya benar-benar mengambil urutan di atas, menanggalkan semua yang bukan angka, menafsirkannya sebagai basis 8, kemudian mengubahnya menjadi representasi 255 nomor basis built-in Ohm. Itulah yang dilakukan kutipan. Kemudian, program hanya mengubahnya menjadi basis 8 lagi.
sumber