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.