Знайдіть фіксовану точку


24

З огляду на ціле число і деяку функцію чорного поля знаходять фіксовану точку в послідовності, визначеній .x1 f: ℤ → ℤfxk+1 := f(xk)

Деталі

  • Значення, xяк кажуть, є фіксованою точкою fif x = f(x).

    Наприклад, якщо f(x) := round(x/pi)і у нас є відправна точка, то ми отримуємо , потім , потім і, нарешті, що означає, що подання має повернутися .x1 = 10x2 = f(x1) = f(10) = 3x3 = f(x2) = f(3) = 1x4 = f(x3) = f(1) = 0x5 = f(x4) = f(0) = 00

  • Можна припустити, що створена послідовність насправді містить фіксовану точку.
  • Ви можете використовувати нативний тип для цілих чисел замість .
  • Ви можете використовувати будь-яку мову, для якої є стандартні параметри для функцій чорного поля, що вводяться у стандартний метапост IO . Якщо у вашій мові немає такої за замовчуванням, сміливо додайте її у сенсі визначення функцій чорного поля та переконайтеся, що зв’яжіть ваші пропозиції з цим визначенням. Також не забудьте проголосувати за них.

Приклади

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

Зауважте, що хоча в деталях мається на увазі, що функція чорної скриньки буде сходитися на фіксованій точці, останній приклад говорить інакше
phflack

1
@phflack Blackbox має лише сходитися для даного входу.
недолік

О, спочатку я думав, що подання не надано x_0, що викликало у мене певну плутанину. Я подумав, що рішення повинно бути (Jelly) ~Nƭ⁻Ç$¿, яке є щось на зразок, (псевдокод) for x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x); . Це може стояти ще одного виклику.
користувач202729

1
Примітка для майбутніх відвідувачів: Якщо знайти будь-яку фіксовану точку не працює, ви повинні знайти фіксовану точку, доступну з x_0. Це гарантовано, що існує.
користувач202729

А якщо не існує фіксованої точки для функції f та одного початкового значення x0 ... Яким має бути значення, яке воно має повернути? І якщо x0 = 0 і f = int (9 / (x-1)) з для x1 = x0 + 1 f (x1) = f (1) - це вже одна помилка ... Що повинен повернути оператору для цього f, x0?
RosLuP

Відповіді:


16

Власне , 1 байт

Y

Спробуйте в Інтернеті!

Yнасправді є функцією фіксованої точки. У прикладі TIO показано, що функція взята як рядок і £використовується для перетворення її на функцію в стеку. Також можна просто натиснути функцію в стек , як так . Це єдині два способи отримати вхід функції насправді.


7
Ви просто знали, що одного дня цей виклик буде опублікований, чи не так? : P
Erik the Outgolfer

2
@EriktheOutgolfer Я насправді використовував Yдля декількох викликів. Я, мабуть, надзвичайно відомий : П
Мего

11

APL (Dyalog) , 2 байти

⍣=

Спробуйте в Інтернеті!

Примітка: Я визначаю O←⍣=у вхідному розділі через помилку в похідних монадичних операторів, не можна визначити так, як TIO любить визначати речі.

Це оператор, яким можна користуватися як би (function⍣condition) ⍵

Він застосовується function, fдо до (f ⍵) condition ⍵повернення вірно.

⍣=є похідним монадичним оператором, який приймає монадичну функцію fяк лівий аргумент і застосовує його до правого аргументу , доf ⍵ = ⍵


Можливо, зауважте, що ⍣=це похідний монадичний оператор, який приймає функцію як лівий операнд і знаходить точку фіксації заданого початкового значення. Я хотів би використовувати іншу букву для ⍣=ніж , fяк це про perator, а НЕ е помазання.
Адам

Так. Я б. Заплутано те, що ви називаєте функцію "введення" fу своєму описі, але потім TIO f- ваш оператор рішення. Ви також можете перемістити O←⍣=вгору в поле Код, щоб дозволити його підрахувати і вказати, що це фактичне рішення, а решта (Введення) просто тестує його.
Адам

Мені схоже на помилку. Я поговорю з відповідним колегою завтра.
Adám

@ Adám Оновлено. Повідомте мене, якщо помилку виправлять
H.PWiz


9

MATLAB , 41 байт

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

Також є ця краса , яка не потребує файлів функцій. На жаль, це трохи довше:

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)

Спробуйте в Інтернеті!


7
Ця відповідь була покликана як приклад і нікому не заважає відповісти.
недолік

Звичайно, якби ви назвали цю Октаву, ви могли б видалити два ;с. Спробуйте в Інтернеті! .
Санчіз

А в анонімній функції ви можете видалити @()попереднє xна 50 байт. Кудо також для того, як ви завершите свою функцію помічника ( g(g)зрештою), мені вдалося зробити лише 51 байт @(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x). Мені цікаво, чи є якась комбінація обох підходів, яка ще коротша.
Санчіз

6

Стандартний ML (MLton) , 30 байт

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

Спробуйте в Інтернеті! Використовувати як & n blackbox.

Функції чорного поля визначаються наступним чином:

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

Негольована версія:

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

1
Приємно бачити SML в дикій природі! Ми використовуємо це для класу функціонального програмування в нашому університеті.
vijrox

6

R , 36 35 байт

завдяки JayCe за те, що ти граєш на байті

function(f,x){while(x-(x=f(x)))0;x}

Спробуйте в Інтернеті!

Перевірте приклади функцій!

R порт недосконалого рішення.


Для чого це варто ... function(f,x){while(x-(x=f(x)))0;x}економить один байт.
JayCe

О 0, приємно. Велике спасибі!
Джузеппе


4

Python 2 , 39 37 33 байт

завдяки @ Mr.Xcoder за -2 байти

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

Спробуйте в Інтернеті!

передбачає, що функція чорного поля буде названа f


Чи не потрібно функцію передавати як параметр? Я не думаю, що визначені змінні є прийнятим методом введення.
mbomb007

Я не впевнений, що вам дозволяється припускати функцію f, чи не є форма припущення введення змінною? (редагувати: ninja'd - mbomb)
FlipTack


4

JavaScript (Node.js) , 25 22 21 байт

дякую Герману Лауенштейну за те, що він показав мені цей консенсус
завдяки @ l4m2 за -1 байт

Передбачає ім'я функції чорного поля f.

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

Спробуйте в Інтернеті!



f (k) -k замість
l4m2


4

Мозок-Флак , 24 байти

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

Спробуйте в Інтернеті!

(для функції чорного поля x -> 2-x в прикладі нижче)

Функція чорної скриньки повинна бути програмою, що надається xу верхній частині стека, поп xі натисканняf(x) - інакше кажучи, вона повинна оцінювати функцію fза значенням у верхній частині стека.

Еквівалентний Mini-Flak - 26 байт (завдяки майстру пшениці за збереження 2-х байт):

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

(не рахуючи коментарів та пробілів)

Візьміть функцію (всередині <>) та число з введення. (зауважте, що Brain-Flak є езотеричною мовою і не може приймати функціональний аргумент як вхідний)x0


Приклад функцій blackbox:

x -> 2-x: Спробуйте в Інтернеті!


Пояснення:


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

Свіфт , 47 42 байти

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

Наївний підхід передбачає, що функція чорного поля є названою f


Я сумніваюся щодо вашої другої спроби, оскільки це складне закриття, і його тип неоднозначний, якщо ви прямо не подаєте це рішення {...}as(<parameter types>)-><return type>. Якщо ви не вкажете його тип повернення, він видасть помилки під час збирання, тому я не думаю, що він є дійсним на даний момент (зауважте, що склад повинен бути включений у кількість байтів). Однак ваше перше подання чудово.
Містер Xcoder

2

C (gcc) , 40 байт

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

Спробуйте в Інтернеті!Зауважте, що прапори не потрібні, вони знаходяться там, щоб допомогти випробувати функцію фіксації, визначену вище.

Це функція, яка приймає int nта функцію вказівника b : int → int. Зловживання тим фактом, що записування до першого аргументу змінної встановлює eaxрегістр, що еквівалентно поверненню . Інакше це досить стандартно, що стосується C гольфу. n^b(n)перевіряє нерівність nта застосовано до цього чорне поле n. Якщо вона нерівна, вона викликає функцію fixpoint fзнову рекурсивно з додатком та чорною скринькою в якості аргументів. В іншому випадку він повертає точку фіксації.

† Потрібно цитування, я туманно пам’ятаю, що читав це десь, і Google ніби підтверджує мої підозри

Він оголошує введення з параметром стилю K & R:

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

Біт таємниці у другому рядку вище заявляється bяк функціональний покажчик, який приймає цілий параметр - типом за замовчуванням _вважається ціле число. Аналогічноn вважається цілим числом, і fпередбачається повернути ціле число. Ураг для неявного введення тексту?


2

Чисто , 46 байт

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

Припускає, що функція визначена як f :: !Int -> Int

Він займає голову нескінченного списку заяв Росії f f f ... x відфільтрованих для тих елементів, де f el == el.

Спробуйте в Інтернеті!

Якщо ви хочете змінити функцію в TIO, лямбда-синтаксис Clean є:

\argument = expression

(насправді це набагато складніше, але, на щастя, нам потрібні лише одинарні функції)


2

APL (Dyalog Unicode) , 14 байт

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

Спробуйте в Інтернеті!

Функція в заголовку еквівалентна f(x) = floor(sqrt(abs(x)))

Дякуємо @ Adám за те, що вказали, що оригінальна відповідь не була дійсною відповідно до консенсусу PPCG.

Як це працює:

{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}  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⍵)} було б нормально для окремої анонімної функції від її імені (n)
RosLuP

2
Це передбачає, що fпопередньо призначений, що, на мою думку, заборонено консенсусом PPCG. {⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}було б дійсним рішенням оператора.
Adám



1

Четвертий (gforth), 36 байт

Ця версія просто передбачає f, що визначена заздалегідь. Це не так круто, як розчин під ним. Обидві програми виходять із переповненням стека, якщо його не знайдено, або підливом стека, якщо він знайдений (після друку результату).

Спробуйте в Інтернеті

: g dup f over = IF . THEN recurse ;

Четвертий (gforth), 52 байти

Це дозволяє передавати маркер виконання функції як параметр і, безумовно, є більш крутим рішенням.

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

Спробуйте в Інтернеті

Пояснення:

: 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

тинілісп репл , 28 байт

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

Припускає, що функція f заздалегідь визначена.

Спробуйте в Інтернеті! (Приклад функція f(x) = (x*2) mod 10.)

Безумовно

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

Якщо f(x)дорівнює x, то xце фіксована точка; поверніть його. В іншому випадку рекурсивно шукайте фіксовану точку, починаючи з, f(x)а не x.


1

APL NARS 65 символів

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 оператор поверне ∞ (або, можливо, -oo або Nan) для помилки, інакше одне значення x з x = f (x). У тесті f = пол (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 байт

Ну, це найкоротший і найгідніший:

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

+ є замість числа, щоб воно не було рівним жодному значенню x0 .

55 байт і функціонал:

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

Приклад:

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

1

x86 опкод, 8 байт

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

Прийняти введення: ecx(значення ), (адреса функції, взяти вхід з , записати результат до, не змінюючи значенняx0edxecxeaxecx і edx)

8086 опкод, 7 байт (але повільно)

    xor     cx,     cx
    call    dx
    loop    $-2
    ret

Якщо існує фіксована точка, петлі 65536 разів завжди запускайте її туди.
Прийміть введення: ax(початкове значення ), (адреса функції, приймайте вхід з , записуйте вихід без зміни значення і ). Виведіть фіксовану точку в регістр .x0dxaxaxcxdx
ax


Це, безумовно, допоможе, якщо ви зробите відповідь більш читаною.
користувач202729

більше редагувати, щоб зробити його правильним
l4m2


0

Java 8, 42 байти

Це приймає a Function<Integer, Integer>або IntFunction<Integer>і intабо Integer(викривлений) і повертає фіксовану точку.

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

Спробуйте це в Інтернеті

Користується тим, що Java оцінює підекспресії зліва направо (тому старе iпорівнюється з новим), властивість, про яку я не знав, коли писав це!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.