Diberikan bilangan bulat dan beberapa fungsi kotak hitam menemukan titik tetap dalam urutan yang ditentukan oleh .x1
f: ℤ → ℤ
f
xk+1 := f(xk)
Detail
Nilai
x
dikatakan titik tetapf
jikax = f(x)
.Misalnya jika
f(x) := round(x/pi)
dan kita memiliki titik awal maka kita dapatkan , lalu , lalu , dan akhirnya yang berarti pengiriman harus kembali .x1 = 10
x2 = f(x1) = f(10) = 3
x3 = f(x2) = f(3) = 1
x4 = f(x3) = f(1) = 0
x5 = f(x4) = f(0) = 0
0
- Anda dapat mengasumsikan bahwa urutan yang dihasilkan sebenarnya berisi titik tetap.
- Anda dapat menggunakan tipe asli untuk bilangan bulat sebagai pengganti
ℤ
. - Anda dapat menggunakan bahasa apa pun yang ada default untuk input fungsi kotak hitam di pos meta IO standar . Jika tidak ada standar untuk bahasa Anda, jangan ragu untuk menambahkannya dalam arti fungsi kotak hitam , dan pastikan untuk menautkan proposal Anda dalam definisi itu. Juga jangan lupa untuk memilih mereka.
Contohnya
f(x) = floor(sqrt(abs(x)))
0 -> 0, all other numbers -> 1
f(x) = c(c(c(x))) where c(x) = x/2 if x is even; 3*x+1 otherwise
all positive numbers should result in 1,2 or 4 (Collatz conjecture)
f(x) = -42
all numbers -> -42
f(x) = 2 - x
1 -> 1
~Nƭ⁻Ç$¿
, yang merupakan sesuatu seperti, (kode semu)for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x);
. Itu mungkin bernilai tantangan lain.Jawaban:
Sebenarnya 1 byte
Cobalah online!
Y
adalah fungsi titik tetap di Sebenarnya. Dalam contoh TIO, fungsi ditampilkan diambil sebagai string, dan£
digunakan untuk mengubahnya menjadi fungsi pada stack. Mungkin juga untuk hanya mendorong fungsi ke tumpukan seperti itu . Ini adalah dua cara hanya untuk mendapatkan input fungsi di Sebenarnya.sumber
Y
beberapa tantangan. Saya tampaknya sangat paham : PAPL (Dyalog) , 2 byte
Cobalah online!
NB: Saya mendefinisikan
O←⍣=
di bagian input karena bug di operator monadik turunan tidak dapat didefinisikan dengan cara TIO suka mendefinisikan sesuatu.⍣
Adalah operator yang bisa digunakan suka(function⍣condition) ⍵
Ini berlaku
function
,f
, untuk⍵
sampai(f ⍵) condition ⍵
kembali benar.⍣=
adalah operator turunan monadik yang menggunakan fungsi monadikf
,, sebagai argumen kiri dan menerapkannya pada argumen kanannya⍵
,, hinggaf ⍵ = ⍵
sumber
⍣=
adalah operator monadik turunan yang mengambil fungsi sebagai operan kiri dan menemukan titik perbaikan pada nilai awal yang diberikan. Saya akan menggunakan huruf yang berbeda untuk⍣=
dibandingkanf
karena merupakan o perator, bukan f pengurapan.f
dalam deskripsi Anda, tetapi kemudian pada TIO,f
adalah operator solusi Anda. Anda juga dapat memindahkan bagianO←⍣=
atas dalam bidang Kode untuk membiarkannya dihitung dan menunjukkan bahwa itu adalah solusi aktual, dan sisanya (Input) hanya mengujinya.Haskell, 17 byte
Cobalah online!
sumber
until=<<((==)=<<)
menemukan titik perbaikan dari fungsi yang diberikan.MATLAB , 41 byte
Ada juga keindahan ini yang tidak membutuhkan file fungsi. Sayangnya ini sedikit lebih lama:
Cobalah online!
sumber
;
s. Cobalah online! .@()
sebelumx
untuk 50 byte. Kudos juga untuk cara Anda membungkus fungsi pembantu Anda (dengang(g)
pada akhirnya), saya hanya berhasil melakukan 51 byte@(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x)
. Saya bertanya-tanya apakah ada kombinasi dari kedua pendekatan yang masih lebih pendek.ML Standar (MLton) , 30 byte
Cobalah online!Gunakan sebagai
& n blackbox
.Fungsi kotak hitam didefinisikan sebagai berikut:
Versi tidak disatukan:
sumber
R ,
3635 byteterima kasih kepada JayCe untuk bermain golf satu byte
Cobalah online!
Verifikasi contoh fungsi!
R port solusi flawr.
sumber
function(f,x){while(x-(x=f(x)))0;x}
menghemat satu byte.0
bagus Terimakasih banyak!Mathematica, 11 byte
Cobalah online!
Mathematica, 10 byte
Cobalah online!
sumber
Python 2 ,
393733 byteterima kasih kepada @ Mr.Xcoder untuk -2 byte
Cobalah online!
mengasumsikan fungsi kotak hitam diberi nama f
sumber
f
, bukankah itu bentuk asumsi input dalam variabel? (sunting: ninja'd oleh mbomb)JavaScript (Node.js) ,
252221 byteterima kasih Herman Lauenstein untuk menunjukkan kepada saya konsensus ini
berkat @ l4m2 untuk -1 byte
Mengasumsikan fungsi kotak hitam diberi nama
f
.Cobalah online!
sumber
Jelly , 3 byte
Cobalah online!
Mengambil argumen kiri sebagai string yang mewakili tautan Jelly (
2_
misalnya), dan argumen kanan sebagai integerBagaimana itu bekerja
sumber
Brain-Flak , 24 byte
Cobalah online!
(untuk fungsi kotak hitam
x -> 2-x
pada contoh di bawah ini)Fungsi kotak hitam yang disediakan harus berupa program, yang diberikan
x
di bagian atas tumpukan, pop,x
dan tekanf(x)
- dengan kata lain, harus mengevaluasi fungsif
pada nilai di bagian atas tumpukan.Mini-Flak Setara adalah 26 byte (terima kasih kepada Wheat Wizard karena telah menyimpan 2 byte):
(tidak termasuk komentar dan spasi)
Ambil fungsi (di dalam
<>
) dan angka dari input. (perhatikan bahwa Brain-Flak adalah bahasa esoterik dan tidak dapat mengambil argumen fungsional sebagai masukan)x0
Contoh fungsi kotak hitam:
x -> 2-x
: Coba online!Penjelasan:
sumber
Swift ,
4742 bytePendekatan naif, mengasumsikan bahwa fungsi kotak hitam diberi nama
f
sumber
{...}as(<parameter types>)-><return type>
. Jika Anda tidak menentukan tipe kembalinya, ia akan memunculkan error build-time jadi saya tidak berpikir itu valid seperti sekarang (perhatikan bahwa para pemain harus dimasukkan dalam jumlah byte). Kiriman pertama Anda baik-baik saja.C (gcc) , 40 byte
Cobalah online! Perhatikan bahwa flag tidak diperlukan, mereka ada di sana untuk membantu menguji fungsi fixpoint yang didefinisikan di atas.
Ini adalah fungsi yang mengambil int
n
dan pointer fungsib : int → int
. Menyalahgunakan fakta bahwa menulis ke argumen variabel pertama menetapkaneax
register, yang setara dengan mengembalikan † . Kalau tidak, ini cukup standar sejauh C golf berlangsung.n^b(n)
memeriksa ketimpangann
dan kotak hitam yang diterapkann
. Ketika tidak sama, itu memanggil fungsi fixpointf
lagi secara rekursif dengan aplikasi dan kotak hitam sebagai argumen. Kalau tidak, ia mengembalikan fixpoint.† Kutipan diperlukan, saya samar-samar ingat membaca ini di suatu tempat dan google tampaknya mengkonfirmasi kecurigaan saya
Ini menyatakan input dengan mengetik parameter K & R-style:
Bit misterius pada baris kedua di atas menyatakan
b
sebagai pointer fungsi yang mengambil parameter integer — tipe default_
diasumsikan bilangan bulat. Demikian pula,n
diasumsikan bilangan bulat, danf
diasumsikan mengembalikan bilangan bulat. Bagaimana mengetik secara implisit?sumber
Bersih , 46 byte
Mengasumsikan fungsi didefinisikan sebagai
f :: !Int -> Int
Dibutuhkan kepala dari daftar aplikasi tak terbatas yang
f f f ... x
difilter untuk elemen manaf el == el
.Cobalah online!
Jika Anda ingin mengubah fungsi di TIO, sintaks Clean's lambda adalah:
\argument = expression
(sebenarnya jauh lebih rumit, tapi untungnya kita hanya perlu fungsi unary)
sumber
APL (Dyalog Unicode) , 14 byte
Cobalah online!
Fungsi di header setara dengan
f(x) = floor(sqrt(abs(x)))
Terima kasih @ Adm karena telah menunjukkan bahwa jawaban asli tidak valid sesuai dengan konsensus PPCG.
Bagaimana itu bekerja:
sumber
f
ditugaskan, yang saya pikir dilarang oleh konsensus PPCG.{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}
akan menjadi solusi operator yang valid.Oktaf , 37 byte
Cobalah online!
Oktaf memiliki tugas sebaris tetapi MATLAB tidak, jadi ini adalah port Octaw golfier solusi flawr .
Hal ini juga port baik untuk R .
sumber
Kotlin , 50 byte
Cobalah online!
sumber
Keempat (gforth), 36 byte
Versi ini hanya mengasumsikan
f
sudah ditentukan sebelumnya. Ini tidak sekeren solusi di bawahnya. Kedua program keluar dengan stack overflow jika tidak ditemukan, atau stack underflow jika ditemukan (setelah mencetak hasilnya).Cobalah online
Keempat (gforth), 52 byte
Ini memungkinkan token eksekusi fungsi dilewatkan sebagai parameter, dan jelas merupakan solusi yang lebih keren.
Cobalah online
Penjelasan:
sumber
Ruby ,
3128 byteCobalah online!
sumber
tinylisp repl, 28 byte
Diasumsikan bahwa fungsi
f
sudah ditentukan sebelumnya.Cobalah online! (Fungsi contohnya adalah
f(x) = (x*2) mod 10
.)Tidak disatukan
Jika
f(x)
samax
, makax
adalah titik tetap; Kembalikan. Jika tidak, cari titik tetap secara rekursif mulai darif(x)
bukanx
.sumber
APL NARS 65 karakter
operator v akan mengembalikan ∞ (atau mungkin -oo atau Nan) untuk kesalahan, jika tidak satu nilai x dengan x = f (x). Dalam pengujian f = lantai (sqrt (abs (x))), f1 = 2-x, f2 = c (c (c (x))) dengan c = x% 2 == 0? X / 2: 3 * x +1
sumber
Clojure,
4543 byteNah, ini yang terpendek dan paling jelek:
+
apakah ada bukannya angka sehingga tidak sama dengan nilai apa pun darix0
.55 byte dan fungsional:
Contoh:
sumber
opcode x86, 8 byte
Ambil input:
ecx
(nilai ), (alamat fungsi, ambil input dari , tulis hasil tanpa mengubah nilai danx0
edx
ecx
eax
ecx
edx
)8086 opcode, 7 byte (tetapi lambat)
Jika ada titik tetap, looping 65536 kali selalu mengendarainya di sana.
Ambil input:
ax
(nilai awal ), (alamat fungsi, ambil input dari , tulis output ke tanpa mengubah nilai dan ). Keluarkan titik tetap dalam register .x0
dx
ax
ax
cx
dx
ax
sumber
Perl 5, 18 + 1 (
-p
)coba online
sumber
Java 8, 42 byte
Ini membutuhkan a
Function<Integer, Integer>
atauIntFunction<Integer>
danint
atauInteger
(kari) dan mengembalikan titik tetap.Cobalah secara Online
Mengambil keuntungan dari fakta bahwa Java mengevaluasi subekspresi dari kiri ke kanan (jadi yang lama
i
dibandingkan dengan yang baru), properti yang saya tidak sadari ketika menulis ini!sumber