Sabit Bir Nokta Bul


24

Bir tamsayı verilen ve bazı kara kutu işlevi verilen sırayla sabit bir nokta bulmak .x1 f: ℤ → ℤfxk+1 := f(xk)

ayrıntılar

  • Bir değer xsabit bir nokta olduğu söylenir fise x = f(x).

    Örneğin, eğer f(x) := round(x/pi)bir başlangıç ​​noktamız varsa ve o zaman alırız , o zaman , o zaman , ve nihayetinde gönderim geri dönmeli demektir .x1 = 10x2 = f(x1) = f(10) = 3x3 = f(x2) = f(3) = 1x4 = f(x3) = f(1) = 0x5 = f(x4) = f(0) = 00

  • Oluşturulan dizinin gerçekte sabit bir nokta içerdiğini varsayabilirsiniz.
  • Yerine tamsayılar için yerel türünü kullanabilirsiniz ℤ.
  • Standart IO meta gönderisine girilen kara kutu işlevleri için varsayılanların olduğu herhangi bir dili kullanabilirsiniz . Dilinizde böyle bir varsayılan yoksa , kara kutu işlevlerinin tanımı anlamında bir tane eklemekten çekinmeyin ve önerilerinizi bu tanımda bağladığınızdan emin olun. Ayrıca onlara oy vermeyi unutma.

Örnekler

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

Kara kutu fonksiyonunun sabit noktada birleşeceğine dair detaylarda ima
— edilmekle birlikte

1
@ phflack Blackbox sadece verilen giriş için birleşmelidir.
— kusur

Oh, aslında gönderime x_0 verilmediğini düşündüm, bu bana biraz karışıklık yarattı. Bir çözümün (Jelly ~Nƭ⁻Ç$¿kodu) gibi bir şey olması gerektiğini düşündüm (sözde kod) for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x); . Bu başka bir meydan okumaya değer olabilir.
— user202729

1
Gelecek ziyaretçiler için Not: Bulma herhangi eser, sen gelmez sabit nokta gerekir x_0 erişilebilir sabit noktasını bulmak. Bir var olduğu garantilidir.
— user202729

Ve eğer sabit bir nokta yoksa, bir f fonksiyonu ve bir de x0 ilk değeri için ... Dönmesi gereken değer ne olmalı? Ve eğer x0 = 0 ve f = int (9 / (x-1)) x1 = x0 + 1 için ise f (x1) = f (1) zaten bir hataydı ... Bu f için işleci ne döndürmeli, x0?
— RosLuP

Yanıtlar:


16

Aslında , 1 bayt

Y

Çevrimiçi deneyin!

YAslında sabit nokta işlevidir. TIO örneğinde, işlev bir dize olarak gösterilmiştir £ve yığını yığında bir işleve dönüştürmek için kullanılır. Sadece yığınına işlevi itmek mümkündür şöyle . Bunlar aslında Fonksiyon girişi yapmak için iki yoldur.


7
Az önce bir gün bu mücadelenin gönderileceğini biliyordun, değil mi? : P
— Outgolfer Erik

2
@EriktheOutgolfer Aslında Ybazı zorluklar için kullandım . Görünüşe göre son derece tanıdık : P
— Mego

11

APL (Dyalog) , 2 bayt

⍣=

Çevrimiçi deneyin!

NB: Ben tanımlamak O←⍣=nedeniyle türetilen monadic operatörler TIO şeyleri tanımlamak için sever o şekilde tanımlanamaz olduğu bir hatadan giriş bölümünde.

⍣ Gibi kullanılabilecek bir operatör (function⍣condition) ⍵

Bu uygular function, fe ⍵kadar (f ⍵) condition ⍵getiri gerçek.

⍣=Bir monadic işlevini alan bir türetilmiş monadic operatörüdür fsol argüman olarak ve onun sağ argüman uygular, ⍵kadarf ⍵ = ⍵


Belki de not ⍣=a, türetilmiş monadik operatör verilen başlangıç değerinin üzerinde düzeltme noktası sol terim olarak bir fonksiyon alan ve bulur. Ben farklı bir harf kullanmak ⍣=daha fbir olduğu gibi o perator değil, bir f fonksiyonu.
— Adám

Evet. İsterim. Açıklamanızdaki "giriş" işlevini çağırmanız kafa karıştırıcıdır f, ancak daha sonra TIO'da fçözüm operatörünüzdür. O←⍣=Sayılana izin vermek ve asıl çözümün bu olduğunu ve geri kalanın (Giriş) yalnızca onu test ettiğini belirtmek için yukarı hareket ettirebilirsiniz .
— Adám

Bana bir böcek gibi görünüyor. Yarın ilgili meslektaşı ile konuşacağım.
— Adám

@ Adám Güncelleme. Hata
— giderilirse haber verin


9

MATLAB , 41 bayt

function x=g(f,x);while f(x)-x;x=f(x);end

Orada da bu güzellik fonksiyon dosyaları gerekmez. Maalesef biraz daha uzun:

i=@(p,c)c{2-p}();g=@(g,f,x)i(f(x)==x,{@()x,@()g(g,f,f(x))});q=@(f,x)g(g,f,x)

Çevrimiçi deneyin!


7
Bu cevap örnek olarak verilmiş ve kimsenin cevap vermesini engellememiştir.
— kusur

Tabii, eğer bu Octave'ı aradıysan, iki saniyeyi kaldırabilirsin ;. Çevrimiçi deneyin! .
— 17:17

Ve anonim işlevinizde, @()önce x50 bayt için kaldırabilirsiniz . Yardım işlevinizi tamamlama biçiminiz için de Kudos ( g(g)sonunda), yalnızca 51 bayt yapmayı başardım @(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x). Her iki yaklaşımın hala daha kısa olan bir kombinasyonu olup olmadığını merak ediyorum.
— 17:17

6

Standart ML (MLton) , 30 bayt

fun& $g=if$ =g$then$else&(g$)g

Çevrimiçi deneyin! Olarak kullanın & n blackbox.

Kara kutu işlevleri aşağıdaki gibi tanımlanır:

fun blackbox1 x = floor(Math.sqrt(Real.fromInt(abs x)))

fun blackbox2 x = c(c(c(x))) 
and c x = if x mod 2 = 0 then x div 2 else 3*x+1

fun blackbox3 _ = ~42

fun blackbox4 x = 2-x

Ungolfed versiyonu:

fun fixpoint n g = if n = g n then n else fixpoint (g n) g

1
SML vahşi doğada görmek güzel! Üniversitemizde fonksiyonel programlama dersimizde kullanıyoruz.
— vijrox



4

Python 2 , 39 37 33 bayt

-2 bayt için @ Mr.Xcoder'e teşekkürler

s=lambda k:s(f(k))if k-f(k)else k

Çevrimiçi deneyin!

f olarak adlandırılan kara kutu işlevini varsayar


Fonksiyonun bir parametre olarak iletilmesine gerek yok mu? Önceden tanımlanmış değişkenlerin kabul edilen bir giriş yöntemi olduğunu sanmıyorum.
— mbomb007

İşlevin olduğunu kabul etmenize izin verildiğinden emin değilim f, girişin bir değişkende olduğunu varsaymanın bir formu değil mi? (edit: ninja'd by mbomb)
— FlipTack



4

Jöle , 3 bayt

vÐL

Çevrimiçi deneyin!

Soldaki argümanı bir Jelly bağlantısını ( 2_örneğin) temsil eden bir dize ve sağdaki argümanı bir tamsayı olarak alır.

Nasıl çalışır

 ÐL - While the output is unique...
v   -   Evaluate the function with the argument given

4

Brain-Flak , 24 bayt

(()){{}(({})<>[({})])}{}

Çevrimiçi deneyin!

(kara kutu işlevi için x -> 2-x aşağıdaki örnekte için)

Sağlanan kara kutu işlevi x, yığının üstüne verilen , açılır xve f(x)diğer bir deyişle, işlevi değerlendiren bir program olmalıdır.f üstündeki değerdeki .

Eşdeğer Mini Flak 26 bayttır (2 bayt tasarrufu için Buğday Sihirbazı sayesinde):

(()){{}(({})( )[{}({})])}{}
             ^ put the function f here

(yorumları ve boşlukları saymamak)

Fonksiyonu (içinde <>) ve bir sayı almakx0 girişten alın. (Brain-Flak'ın ezoterik bir dil olduğunu ve girdi olarak işlevsel argüman alamayacağını not edin)


Örnek kara kutu işlevleri:

x -> 2-x: Çevrimiçi deneyin!


Açıklama:


(()){{}(({})<f>[({})])}{}   Main program.
                            Implicit input from stdin to stack.
(  )                        Push
 ()                         literal number 1.
                            Now the content of the stack: [1, x0]
    {                 }     While stack top ≠ 0:
                            current stack content: [something ≠ 0, x]
     {}                       Pop stack top (something). stack = [x]
       (             )        Push
        ({})                    Stack top = x. Current stack = [x]
             f                  Evaluate f. Current stack = [f(x)]
            < >                   (suppress the value of f(x), avoid adding it)
               [    ]           plus the negative of
                ({})            the top of the stack ( = -f(x) )
                              In conclusion, this change (x) on the stack to
                              (f(x)), and then push (x + -f(x))
                            If it's 0, break loop, else continue.
                       {}   Pop the redundant 0 on the top.
                            Implicit output stack value to stdout.


3

Swift , 47 42 bayt

func h(_ n:Int){f(n)==n ?print(n):h(f(n))}

Naif yaklaşım, kara kutu fonksiyonunun isimlendirildiğini varsayar. f


İkinci girişiminiz konusunda şüpheliyim, çünkü bu karmaşık bir kapanış ve açıkça belirtilmedikçe türü belirsiz {...}as(<parameter types>)-><return type>. Döndürme türünü belirtmezseniz, derleme zamanı hataları atar; bu nedenle şu anda geçerli olduğunu sanmıyorum (almanın bayt sayısına dahil edilmesi gerektiğini unutmayın). İlk gönderiminiz iyi.
— Bay Xcoder,

2

C (gcc) , 40 bayt

f(n,b)int(*b)(_);{n=n^b(n)?f(b(n),b):n;}

Çevrimiçi deneyin! Bayrakların gerekli olmadığına dikkat edin, yukarıda belirtilen düzeltme noktası işlevinin test edilmesine yardımcı olmak için orada olduklarını unutmayın.

Bu, int nve işlev işaretçisini alan bir işlevdir b : int → int. İlk değişken argümanına yazmanın kötüye kullanılması, eaxsicile dönen † ile eşdeğer olan kayıt defterini ayarlar . Aksi takdirde, bu C golf kadarıyla oldukça standart. n^b(n)eşitsizliği nve uygulanan kara kutuyu denetler n. Eşit olmadığında, fargüman olarak uygulama ve kara kutu ile tekrar tekrar sabitleme işlevini çağırır . Aksi takdirde, düzeltme noktasını döndürür.

† Alıntı yapmalı, bunu bir yerde okuduğumu hatırladım ve google şüphelerimi onaylıyor gibi görünüyor.

K & R-stili parametre yazarak giriş yapar:

f(n, b)
int(*b)(_);
{
    n=n^b(n)?f(b(n),b):n;
}

Yukarıdaki ikinci satırdaki yay bitinin bbir tamsayı parametresi alan bir işlev işaretçisi olduğu bildirilir - varsayılan türün _bir tamsayı olduğu varsayılır. Benzer şekilde nbir tamsayı folduğu varsayılır ve bir tamsayı döndürdüğü kabul edilir. Kapalı yazma için yaşasın?


2

Temiz , 46 bayt

import StdEnv
p x=hd[n\\n<-iterate f x|f n==n]

İşlevin olarak tanımlandığını varsayar f :: !Int -> Int

Burada, f f f ... xbu elemanlar için filtre uygulanmış sonsuz uygulama listesinin başına geçer f el == el.

Çevrimiçi deneyin!

TIO'daki işlevi değiştirmek istiyorsanız, Clean'in lambda sözdizimi şöyledir:

\argument = expression

(aslında çok daha karmaşık, ama çok şükür ki sadece tek işlevler istiyoruz)


2

APL (Dyalog Unicode) , 14 bayt

{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}

Çevrimiçi deneyin!

Başlıktaki işlev eşdeğerdir f(x) = floor(sqrt(abs(x)))

Orjinal cevabın PPCG konsensüsüne göre geçerli olmadığına dikkat çektiğiniz için teşekkürler @ Adám.

Nasıl çalışır:

{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵} ⍝ Main 'function' (this is actually an operator)
      :         ⍝ if
 ⍵=⍺⍺⍵          ⍝ the right argument (⍵) = the left function (⍺⍺, which is f) of ⍵
       ⍵        ⍝ return ⍵
        ⋄       ⍝ else
         ∇⍺⍺⍵   ⍝ return this function (∇) with argument f(⍵)

{⍵ = f⍵: ⍵⋄∇ (f⍵)} adsız işlevinden (n)
— isminden ayrılmaya hazırdır

2
Bu f, PPCG konsensüsünün yasak olduğunu düşündüğüm, önceden imzalı olduğunu varsayar . {⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}geçerli bir operatör çözümü olacaktır.
— Adám



1

İleri (gforth), 36 bayt

Bu sürüm sadece fönceden tanımlanmış olduğunu varsayar . Altındaki çözüm kadar soğuk değil. Her iki program da bulunamazsa yığın taşması ya da bulunursa yığın taşması ile çıkar (sonucu yazdırdıktan sonra).

Çevrimiçi deneyin

: g dup f over = IF . THEN recurse ;

İleri (gforth), 52 bayt

Bu, bir işlevin yürütme belirtecinin bir parametre olarak geçirilmesine izin verir ve kesinlikle daha soğuk bir çözümdür.

: g 2dup execute rot over = IF . THEN swap recurse ;

Çevrimiçi deneyin

Açıklama:

: g             \ x1 f          Define g. Params on the stack. f is on top
2dup execute    \ x1 f x2       duplicate both params, execute f(x1)
rot over        \ f x2 x1 x2    move x1 to top and copy x2 to top
= IF . THEN                     compare, if equal, print
swap recurse ;                  otherwise, recurse


1

tinylisp repl, 28 bayt

(d P(q((x)(i(e(f x)x)x(P(f x

İşlevin fönceden tanımlanmış olduğunu varsayar .

Çevrimiçi deneyin! (Örnek işlevf(x) = (x*2) mod 10 .)

Ungolfed

(load library)
(def P
 (lambda (x)
  (if (equal? (f x) x)
   x
   (P (f x)))))

Eğer f(x)eşittir x, o zaman xsabit bir noktadır; iade etmek. Aksi takdirde, özyinelemeden başlamak f(x)yerine sabit bir nokta arayın x.


1

APL NARS 65 karakter

r←(f v)n;c
   c←0⋄→B
E: r←∞⋄→0
A: n←r
B: r←f n⋄c+←1⋄→E×⍳c>1e3⋄→A×⍳r≠n

v operatörü hata için ∞ (veya muhtemelen -oo veya Nan) döndürür, aksi halde x = f (x) olan bir x değeridir. F = kat testinde (sqrt (abs (x))), f1 = 2-x, f2 = c (c (c (x))), c = x% 2 == 0? X / 2: 3 * x +1

  f←⌊∘√∘|
  f v 0
0
  f v 9
1
  f1←{2-⍵}
  f1 v 1
1
  f1 v ¯10
∞
  f1 v 2
∞
  c1←{0=2∣⍵:⍵÷2⋄1+3×⍵}
  f2←c1∘c1∘c1
  f2 v 1
1
  f2 v 2
2
  f2 v 7
2
  f2 v 82
4

1

Clojure, 45 43 bayt

Bu en kısa ve en çirkin:

#(loop[a + b %2](if(= a b)a(recur b(% b))))

+ Bir sayı yerine var mı, böylece herhangi bir değere eşit olmaz x0 .

55 bayt ve işlevsel:

#(reduce(fn[a b](if(= a b)(reduced a)b))(iterate % %2))

Örnek:

(def f #(...))
(defn collaz [x] (if (even? x) (-> x (/ 2)) (-> x (* 3) (+ 1))))
(f (->> collaz (repeat 3) (apply comp)) 125)
; 1

1

x86 opcode, 8 bayt

fun:
        call    edx          ; 2B
        cmpxchg eax,    ecx  ; 3B, on 8086 use xchg and cmp instead
        jnz     fun          ; 2B
        ret                  ; 1B

Girdi almak: ecx(değer ), (işlev adresi, girdi almak , değerini değiştirmeden sonuç yazmak vex0edxecxeaxecxedx )

8086 opcode, 7 bayt (ancak yavaş)

    xor     cx,     cx
    call    dx
    loop    $-2
    ret

Sabit bir nokta varsa, 65536 kez döngü her zaman oraya sürün.
: Giriş al ax(başlangıç değeri ), (fonksiyon adresi, take girişi için, yazma çıkış değerini değiştirmeden ve ). Sabit noktayı register'a alın .x0dxaxaxcxdx
ax


Cevabı daha okunaklı yaparsanız kesinlikle yardımı olacaktır.
— user202729

düzeltmek için daha fazla düzenleme
— l4m2


0

Java 8, 42 bayt

Bu bir Function<Integer, Integer>veya veya IntFunction<Integer>bir intveya Integer(köri) alır ve sabit noktayı döndürür.

f->i->{while(i!=(i=f.apply(i)));return i;}

Çevrimiçi Deneyin

Java'nın alt ifadeleri soldan sağa (yani eskiyle iyenisiyle karşılaştırılır) değerlendirmesinden, bunu yazarken habersiz olduğum bir özellikten faydalanır!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.