Tìm một điểm cố định


24

Cho một số nguyên và một số hàm hộp đen tìm một điểm cố định trong chuỗi được xác định bởi .x1 f: ℤ → ℤfxk+1 := f(xk)

Chi tiết

  • Một giá trị xđược cho là một điểm cố định fnếu x = f(x).

    Chẳng hạn, nếu f(x) := round(x/pi)và chúng ta có điểm bắt đầu thì chúng ta sẽ nhận được , sau đó , và cuối cùng , điều đó có nghĩa là bài nộp sẽ trở lại .x1 = 10x2 = f(x1) = f(10) = 3x3 = f(x2) = f(3) = 1x4 = f(x3) = f(1) = 0x5 = f(x4) = f(0) = 00

  • Bạn có thể giả định rằng chuỗi được tạo thực sự chứa một điểm cố định.
  • Bạn có thể sử dụng loại bản địa cho số nguyên thay cho .
  • Bạn có thể sử dụng bất kỳ ngôn ngữ nào có mặc định cho đầu vào chức năng hộp đen trong bài đăng meta IO tiêu chuẩn . Nếu không có mặc định như vậy cho ngôn ngữ của bạn, vui lòng thêm một ý nghĩa theo định nghĩa của các chức năng hộp đen và đảm bảo liên kết các đề xuất của bạn trong định nghĩa đó. Cũng đừng quên bỏ phiếu cho họ.

Ví dụ

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

Lưu ý rằng mặc dù hàm ý rằng các chức năng của hộp đen sẽ hội tụ vào điểm cố định, ví dụ cuối cùng lại nói khác
phflack

1
@phflack Hộp đen chỉ phải hội tụ cho đầu vào đã cho.
flawr

Ồ, ban đầu tôi nghĩ rằng bài nộp không được đưa ra x_0, điều này gây cho tôi một số nhầm lẫn. Tôi nghĩ rằng một giải pháp nên là (Jelly) ~Nƭ⁻Ç$¿, đó là một cái gì đó giống như, (mã giả) for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x); . Điều đó có thể có giá trị thách thức khác.
dùng202729

1
Lưu ý cho khách truy cập trong tương lai: Tìm bất kỳ điểm cố định nào không hoạt động, bạn phải tìm một điểm cố định có thể truy cập từ x_0. Nó được đảm bảo rằng có tồn tại một.
dùng202729

Và nếu không tồn tại một điểm cố định, đối với hàm f và một giá trị ban đầu x0 ... Giá trị mà nó phải trả về là gì? Và nếu x0 = 0 và f = int (9 / (x-1)) với x1 = x0 + 1 f (x1) = f (1) thì đã có một lỗi ... Điều gì sẽ trả về toán tử cho f, x0?
RosLuP

Câu trả lời:


16

Trên thực tế , 1 byte

Y

Hãy thử trực tuyến!

Ylà hàm điểm cố định trong thực tế. Trong ví dụ TIO, hàm được hiển thị được lấy dưới dạng chuỗi và £được sử dụng để chuyển đổi nó thành hàm trên ngăn xếp. Cũng có thể chỉ cần đẩy chức năng lên ngăn xếp như vậy . Đây là hai cách duy nhất để có được một chức năng đầu vào trong thực tế.


7
Bạn chỉ biết rằng một ngày nào đó thử thách này sẽ được đăng, phải không? : P
Erik the Outgolfer 8/12/17

2
@EriktheOutgolfer Tôi thực sự đã sử dụng Ycho một số thử thách. Tôi dường như cực kỳ biết trước : P
Mego

11

APL (Dyalog) , 2 byte

⍣=

Hãy thử trực tuyến!

Lưu ý: Tôi xác định O←⍣=trong phần đầu vào do lỗi trong các toán tử đơn nguyên xuất phát không thể được định nghĩa theo cách mà TIO thích xác định mọi thứ.

Là một toán tử có thể được sử dụng như (function⍣condition) ⍵

Nó áp dụng function, fđể cho đến khi (f ⍵) condition ⍵trở thành sự thật.

⍣=là một toán tử đơn nguyên dẫn xuất có một hàm đơn trị f, như là đối số bên trái của nó và áp dụng nó cho đối số bên phải của nó , cho đến khif ⍵ = ⍵


Có thể lưu ý rằng đó ⍣=là một toán tử đơn trị dẫn xuất có chức năng là toán hạng bên trái và tìm điểm sửa chữa trên giá trị ban đầu đã cho. Tôi sẽ sử dụng một lá thư khác nhau cho ⍣=hơn fvì nó là một o perator, không phải là một e bôi.
Adám

Vâng. Tôi sẽ. Thật khó hiểu khi bạn gọi hàm "đầu vào" ftrong mô tả của mình, nhưng sau đó trên TIO, flà toán tử giải pháp của bạn. Bạn cũng có thể di chuyển O←⍣=lên trong trường Mã để cho phép nó được tính và chỉ ra rằng đó là giải pháp thực tế và phần còn lại (Đầu vào) chỉ đang thử nghiệm nó.
Adám

Trông giống như một lỗi với tôi. Tôi sẽ nói chuyện với đồng nghiệp có liên quan vào ngày mai.
Adám

@ Adám Cập nhật. Hãy cho tôi biết nếu lỗi được khắc phục
H.PWiz

10

Haskell, 17 byte

until=<<((==)=<<)

Hãy thử trực tuyến!


3
Trong trường hợp ai đó quan tâm: đây là một lời giải thích tại sao until=<<((==)=<<) tìm thấy một điểm sửa chữa của một chức năng nhất định.
Laikoni

9

MATLAB , 41 byte

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

Cũng có vẻ đẹp này không cần tập tin chức năng. Thật không may, nó dài hơn một chút:

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)

Hãy thử trực tuyến!


7
Câu trả lời này có ý nghĩa như một ví dụ và không ngăn ai trả lời.
flawr

Tất nhiên, nếu bạn gọi Octave này, bạn có thể xóa hai ;s. Hãy thử trực tuyến! .
Sanchise

Và trong hàm ẩn danh của bạn, bạn có thể loại bỏ @()trước x50 byte. Kudos cũng vậy vì cách bạn bọc chức năng của trình trợ giúp (với g(g)phần cuối), tôi chỉ quản lý để thực hiện 51 byte @(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x). Tôi tự hỏi liệu có sự kết hợp nào của cả hai phương pháp mà vẫn ngắn hơn không.
Sanchise

6

ML chuẩn (MLton) , 30 byte

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

Hãy thử trực tuyến! Sử dụng như là& n blackbox .

Các chức năng hộp đen được định nghĩa như sau:

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

Phiên bản bị đánh cắp:

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

1
Thật tốt khi thấy SML trong tự nhiên! Chúng tôi sử dụng nó cho lớp lập trình chức năng của chúng tôi tại trường đại học của chúng tôi.
vijrox



4

Python 2 , 39 37 33 byte

cảm ơn @ Mr.Xcoder cho -2 byte

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

Hãy thử trực tuyến!

giả sử hàm hộp đen được đặt tên f


Không phải chức năng cần phải được thông qua như là một tham số? Tôi không nghĩ các biến được xác định trước là một phương thức nhập được chấp nhận.
mbomb007

Tôi không chắc chắn bạn có được phép đảm nhận chức năng fnày không, đó có phải là một dạng giả định đầu vào nằm trong một biến không? (chỉnh sửa: ninja'd bởi mbomb)
FlipTack


4

JavaScript (Node.js) , 25 22 21 byte

cảm ơn Herman Lauenstein đã cho tôi thấy sự đồng thuận này
nhờ @ l4m2 cho -1 byte

Giả sử chức năng hộp đen được đặt tên f.

g=k=>f(k)-k?g(f(k)):k

Hãy thử trực tuyến!



f (k) -k thay vì
l4m2

4

Thạch , 3 byte

vÐL

Hãy thử trực tuyến!

Đưa đối số bên trái thành một chuỗi biểu thị một liên kết Jelly (2_ ví dụ) và đối số bên phải là số nguyên

Làm thế nào nó hoạt động

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

4

Brain-Flak , 24 byte

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

Hãy thử trực tuyến!

(cho chức năng hộp đen x -> 2-x trong ví dụ bên dưới)

Hàm hộp đen được cung cấp phải là một chương trình, được đưa ra xtrên đỉnh của ngăn xếp, bật xvà đẩy f(x)- nói cách khác, nó sẽ đánh giá chức năngf trên giá trị trên đỉnh của ngăn xếp.

Tương đương Mini-Flak là 26 byte (nhờ Wheat Wizard để lưu 2 byte):

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

(không tính các bình luận và khoảng trắng)

Lấy chức năng (bên trong <>) và một số từ đầu vào. (lưu ý rằng Brain-Flak là ngôn ngữ bí truyền và không thể lấy đối số chức năng làm đầu vào)x0


Các chức năng hộp đen ví dụ:

x -> 2-x: Hãy thử trực tuyến!


Giải trình:


(()){{}(({})<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 byte

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

Cách tiếp cận ngây thơ, giả định rằng chức năng hộp đen được đặt tên f


Tôi nghi ngờ về nỗ lực thứ hai của bạn, bởi vì nó là một đóng cửa phức tạp và loại của nó là mơ hồ trừ khi bạn rõ ràng đưa nó vào {...}as(<parameter types>)-><return type>. Nếu bạn không chỉ định loại trả về của nó, nó sẽ đưa ra các lỗi thời gian xây dựng vì vậy tôi không nghĩ rằng nó hợp lệ kể từ bây giờ (lưu ý rằng việc truyền phải được bao gồm trong số byte). Trình đầu tiên của bạn là tốt, mặc dù.
Ông Xcoder

2

C (gcc) , 40 byte

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

Hãy thử trực tuyến!Lưu ý rằng các cờ là không cần thiết, chúng ở đó để hỗ trợ kiểm tra chức năng fixpoint được xác định ở trên.

Đây là một hàm có một int nvà một con trỏ hàm b : int → int. Lợi dụng thực tế là văn bản cho lập luận biến đầu tiên thiết lập eaxđăng ký, tương đương với trở . Mặt khác, đây là tiêu chuẩn khá xa như C golf đi. n^b(n)kiểm tra sự bất bình đẳng nvà hộp đen áp dụng cho n. Khi không bằng nhau, nó gọi hàm fixpointf một cách đệ quy với ứng dụng và hộp đen làm đối số. Nếu không, nó trả về điểm cố định.

Cần dẫn nguồn, tôi mơ hồ nhớ đọc nó ở đâu đó và google dường như xác nhận sự nghi ngờ của tôi

Nó khai báo đầu vào với kiểu gõ tham số kiểu K & R:

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

Bit arcane trên dòng thứ hai ở trên tuyên bố blà một con trỏ hàm lấy tham số nguyên là loại mặc định _được coi là một số nguyên. Tương tự, nđược coi là một số nguyên và fđược giả sử trả về một số nguyên. Hoan hô cho gõ ngầm?


2

Sạch , 46 byte

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

Giả sử hàm được định nghĩa là f :: !Int -> Int

Nó đứng đầu danh sách vô hạn các ứng dụng f f f ... xđược lọc cho các phần tử đó f el == el.

Hãy thử trực tuyến!

Nếu bạn muốn thay đổi chức năng trong TIO, cú pháp lambda của Clean là:

\argument = expression

(thực ra nó phức tạp hơn nhiều, nhưng rất may chúng ta chỉ cần các hàm unary)


2

APL (Dyalog Unicode) , 14 byte

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

Hãy thử trực tuyến!

Hàm tại tiêu đề tương đương với f(x) = floor(sqrt(abs(x)))

Cảm ơn @ Adám đã chỉ ra rằng câu trả lời ban đầu không hợp lệ theo sự đồng thuận của PPCG.

Làm thế nào nó hoạt động:

{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}  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⍵)} sẽ ổn đối với chức năng ẩn danh riêng biệt với tên của nó (n)
RosLuP

2
Giả định này được chỉ định ftrước, điều mà tôi nghĩ là bị cấm bởi sự đồng thuận của PPCG. {⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}sẽ là một giải pháp vận hành hợp lệ.
Adám



1

Forth (gforth), 36 byte

Phiên bản này chỉ giả định fđược xác định trước. Nó không tuyệt như giải pháp bên dưới nó. Cả hai chương trình thoát với tràn ngăn xếp nếu không tìm thấy hoặc tràn ngăn xếp nếu tìm thấy (sau khi in kết quả).

Dùng thử trực tuyến

: g dup f over = IF . THEN recurse ;

Forth (gforth), 52 byte

Điều này cho phép mã thông báo thực thi của hàm được truyền dưới dạng tham số và chắc chắn là giải pháp mát hơn.

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

Dùng thử trực tuyến

Giải trình:

: 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 thay thế , 28 byte

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

Giả sử rằng hàm f được xác định trước.

Hãy thử trực tuyến! (Hàm ví dụ là f(x) = (x*2) mod 10.)

Bị đánh cắp

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

Nếu f(x)bằng x, thì xlà một điểm cố định; trả lại. Mặt khác, đệ quy tìm kiếm một điểm cố định bắt đầu từ f(x)thay vì x.


1

APL NARS 65 ký tự

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

Toán tử v sẽ trả về (hoặc có thể -oo hoặc Nan) khi có lỗi, một giá trị x khác với x = f (x). Trong thử nghiệm f = floor (sqrt (abs (x))), f1 = 2-x, f2 = c (c (c (x))) với 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 byte

Chà, đây là ngắn nhất và xấu nhất:

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

+có thay vì một số để nó không bằng bất kỳ giá trị nào của x0.

55 byte và chức năng:

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

Thí dụ:

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

1

op86 x86, 8 byte

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

Lấy đầu vào: ecx(giá trị ), (địa chỉ hàm, lấy đầu vào từ , ghi kết quả vào mà không sửa đổi giá trị củax0edxecxeaxecxedx)

Op86 8086, 7 byte (nhưng chậm)

    xor     cx,     cx
    call    dx
    loop    $-2
    ret

Nếu tồn tại một điểm cố định, lặp lại 65536 lần luôn luôn lái nó đến đó.
Lấy đầu vào: ax(giá trị ban đầu ), (địa chỉ hàm, lấy đầu vào từ , ghi đầu ra vào mà không sửa đổi giá trị của và ). Xuất điểm cố định trong thanh ghi .x0dxaxaxcxdx
ax


Nó chắc chắn sẽ giúp nếu bạn làm cho câu trả lời dễ đọc hơn.
dùng202729

chỉnh sửa thêm để làm cho chính xác
l4m2


0

Java 8, 42 byte

Điều này cần một Function<Integer, Integer>hoặc IntFunction<Integer>và một inthoặc Integer(quăn) và trả về điểm cố định.

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

Dùng thử trực tuyến

Lợi dụng thực tế là Java đánh giá các biểu hiện con từ trái sang phải (vì vậy cái cũ iđược so sánh với cái mới), một thuộc tính mà tôi không biết khi viết bài này!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.