不動点を見つける


24

整数とブラックボックス関数を指定すると、で定義されたシーケンス内のの固定小数点を見つけます。x1 f: ℤ → ℤfxk+1 := f(xk)

詳細

  • xfifの固定小数点と呼ばれますx = f(x)

    たとえばf(x) := round(x/pi)、開始点がある場合、get 、then 、then 、およびfinally が返されます。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ブラックボックスは、与えられた入力に対してのみ収束する必要があります。
flawr

ああ、もともと私は提出物にx_0が与えられていないと思っていたので、混乱が生じました。私は解決策が(Jelly)~Nƭ⁻Ç$¿であるべきだと思った、それは(擬似コード)のようなものだfor x in [0, -1, 1, -2, 2, -3, 3, -4, 4, ...]: if (x == f(x)): break; print(x); 。それは別の挑戦に値するかもしれません。
user202729

1
未来の訪問者のための注意:検索すべての仕事、あなたはしない、固定小数点をしなければならない X_0から到達可能な固定点を探します。存在することが保証されています。
user202729

そして、関数fの固定小数点が存在しない場合、および初期値x0が1つ...返される値は何ですか?x1 = 0x0 + 1 f(x1)= f(1)でx0 = 0およびf = int(9 /(x-1))がすでに1つのエラーである場合...そのfの演算子を返すものは何ですか? x0?
RosLuP

回答:


16

実際には、1バイト

Y

オンラインでお試しください!

YActuallyの固定小数点関数です。TIOの例では、関数は文字列として解釈さ£れ、スタック上の関数に変換するために使用されています。それはちょうどスタックに機能をプッシュすることも可能ですので、のように。Actuallyで関数入力を取得する唯一の2つの方法です。


7
いつかこのチャレンジが投稿されることを知っていましたよね?:P
エリックアウトゴルファー

2
@EriktheOutgolfer実際Yにいくつかの課題に使用しました。私は明らかに非常に予言的です:P
Mego

11

APL(Dyalog)、2バイト

⍣=

オンラインでお試しください!

NB:私は定義O←⍣=によりモナド演算子を得ているのバグへの入力部には、TIOは、物事を定義するのが好きという方法で定義することはできません。

のように使用できる演算子です (function⍣condition) ⍵

これが適用されfunctionfへ、まで(f ⍵) condition ⍵trueを返します。

⍣=、モナド関数を受け取り派生単項演算子でありf、その左引数として、その右引数にそれを適用するまでは、f ⍵ = ⍵


多分それ⍣=は左オペランドとして関数を取り、与えられた初期値で不動点を見つける派生モナド演算子です 私はのために別の文字を使用する⍣=よりも、fそのまま入出力 peratorではなく、Fの慰め。
アダム

うん。私は...するだろう。f説明で「入力」関数を呼び出すのはわかりにくいですが、TIOではfソリューションオペレーターです。またO←⍣=、「コード」フィールドを上に移動してカウントできるようにし、それが実際のソリューションであり、残り(入力)がそれをテストしているだけであることを指摘することもできます。
アダム

私にはバグのように見えます。明日関係の同僚と話をします。
アダム

@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
この回答は例としてのものであり、誰も回答することを妨げるものではありません。
flawr

もちろん、このOctaveを呼び出した場合、2を削除できます;オンラインでお試しください!
Sanchises

そして、匿名関数では、50バイトの@()xを削除できます。ヘルパー関数をラップする方法(g(g)最後に)にも賞賛を送ります。51バイトしかできません@(g,x)(f=@(r,z){@()r(r,m),z}{(m=g(z)==z)+1}())(f,x)でした。両方のアプローチの組み合わせがまだ短いかどうか疑問に思っています。
Sanchises

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



4

パイソン239の 37 33バイト

-2バイトの@ Mr.Xcoderに感謝

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

オンラインでお試しください!

ブラックボックス関数の名前がfであると仮定します


関数をパラメーターとして渡す必要はありませんか?事前定義された変数は受け入れられたインプットメソッドではないと思います。
mbomb007

関数がfであると仮定できるかどうかはわかりませんが、それは入力が変数にあると仮定する形式ではありませんか?(編集:mbombによってninja'd)
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

Brain-Flak、24バイト

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

オンラインでお試しください!

x -> 2-x以下の例のブラックボックス関数の場合)

設けられたブラックボックス機能は、与えられたことを、プログラムである必要がありx、スタックの一番上にポップxとプッシュf(x)-他の言葉では、それが機能を評価する必要がありf、スタックの一番上に値に。

同等のMini-Flakは26バイトです(2バイトを保存してくれたWheat Wizardに感謝します):

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

(コメントとスペースはカウントしません)

入力から関数(内<>)と数値を取得します。(Brain-Flakは難解な言語であり、入力として機能的な引数を取ることができないことに注意してください)x0


ブラックボックス関数の例:

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

Swift47 42バイト

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

ナイーブアプローチ、ブラックボックス関数の名前を想定 f


複雑なクロージャーであり、明示的ににキャストしない限り、その型はあいまいなので、2回目の試行については疑問です{...}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。等しくない場合f、アプリケーションおよびブラックボックスを引数として、再帰的にfixpoint関数を呼び出します。それ以外の場合は、フィックスポイントを返します。

†引用が必要です、私はこれをどこかで読んだことを漠然と覚えており、グーグルは私の疑いを確認しているようです

K&Rスタイルのパラメーター入力で入力を宣言します。

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

上記の2行目の難解なビット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)))

PPCGコンセンサスによれば、元の回答が有効ではなかったことを指摘してくれた@Adámに感謝します。

使い方:

{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}  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)とは別の匿名関数のためのOKであろう
RosLuP

2
これは、f事前に割り当てられていることを前提としていますが、PPCGコンセンサスでは禁止されていると思います。{⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}有効なオペレーターソリューションになります。
アダム



1

Forth(gforth)、36バイト

このバージョンfは、事前定義されていることを前提としています。その下のソリューションほどクールではありません。両方のプログラムは、見つからない場合はスタックオーバーフローで終了し、見つかった場合はスタックアンダーフローで終了します(結果の出力後)。

オンラインで試す

: g dup f over = IF . THEN recurse ;

Forth(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

tinylisp repl、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)等しい場合xxは固定小数点です。それを返します。それ以外の場合、の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 = f(x)の1つの値xを返します。テストでは、f = floor(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バイト

さて、これは最短でuいです:

#(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取得:(初期値)、(関数アドレス、入力を取得、および値を変更せずに出力を書き込む) registerに固定小数点を出力します。x0dxaxaxcxdx
ax


答えをより読みやすくすることは確かに役立ちます。
user202729

それが正しいようにするより多くの編集
l4m2


0

Java 8、42バイト

これはFunction<Integer, Integer>or IntFunction<Integer>intor Integer(カリー)を取り、固定小数点を返します。

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

オンラインで試す

Javaが部分式を左から右に評価するという事実を利用します(したがって、古いものiが新しいものと比較されます)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.