고정 소수점 찾기


24

정수 와 일부 블랙 박스 함수가로 정의 된 순서에서 고정 소수점을 찾습니다 .x1 f: ℤ → ℤfxk+1 := f(xk)

세부

  • xfif 의 고정 소수점이라고 합니다 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 블랙 박스는 주어진 입력에 대해서만 수렴해야합니다.
flawr

오, 원래 나는 제출물에 x_0이 주어지지 않았다고 생각하여 혼란을 주었다. 나는 해결책이 (Jelly) 여야한다고 생각했는데 ~Nƭ⁻Ç$¿(pseudo code)와 같습니다 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에 대해 고정 소수점이 없으면 반환 해야하는 값은 무엇입니까? 그리고 x1 = x0 + 1에 대한 x0 = 0이고 f = int (9 / (x-1)) f (x1) = f (1)이 이미 하나의 오류 인 경우 ... f에 대한 연산자를 반환해야하는 것은 x0?
RosLuP

답변:


16

실제로 1 바이트

Y

온라인으로 사용해보십시오!

Y실제로 고정 소수점 함수입니다. TIO 예제에서 함수는 문자열로 표시되어 £스택의 함수로 변환하는 데 사용됩니다. 그것은 단지 스택 기능을 밀어 수도 있습니다 과 같이 . 이것들은 실제로 함수 입력을 얻는 유일한 두 가지 방법입니다.


7
언젠가이 도전이 게시 될 것임을 알고 있었습니까? : P
Outgolfer Erik

2
@EriktheOutgolfer 나는 실제로 Y몇 가지 도전에 사용 했습니다. 나는 분명히 매우 잘 알고있다 : P
Mego

11

APL (Dyalog) , 2 바이트

⍣=

온라인으로 사용해보십시오!

주의 : 나는 정의 O←⍣=로 인해 파생 된 모나드 연산자 TIO 일을 정의하기를 좋아하는 방식으로 정의 될 수 있다는 점에서 버그에 입력 섹션.

다음과 같이 사용할 수있는 연산자입니다 (function⍣condition) ⍵

그것은 적용 function, f까지 (f ⍵) condition ⍵true를 반환합니다.

⍣=f의 왼쪽 인수로 monadic 함수를 가져 와서 오른쪽 인수에 적용 할 때까지 파생 된 monadic 연산자입니다.f ⍵ = ⍵


아마도 참고 ⍣=A는 유도 모나드 연산자 지정된 초기 값에 대한 수정 위치를 왼쪽 피연산자로서의 기능을 취하고 찾는다. 나는에 대해 다른 문자를 사용 것 ⍣=보다 f그것이 그대로 perator 아닌 f를 기름 부음.
Adám

네. 그렇습니다. f설명에서 "입력"함수를 호출하는 것이 혼란 스럽지만 TIO에서는 f솔루션 운영자입니다. O←⍣=코드 필드에서 위로 이동하여 계산하고 실제 솔루션이고 나머지 (입력)가 테스트 중임을 지적 할 수 있습니다.
Adám

나에게 벌레처럼 보인다. 내일 관련 동료와 이야기하겠습니다.
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
이 대답은 예를위한 것이며 다른 사람이 대답하는 것을 막지 않습니다.
flawr

물론이 옥타브를 호출하면 두 개의을 제거 할 수 ;있습니다. 온라인으로 사용해보십시오! .
Sanchises

그리고 익명 함수에서 @()이전 x의 50 바이트를 제거 할 수 있습니다 . 헬퍼 함수를 ​​감싸는 방식 ( 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

파이썬 2 , 39 37 33 바이트

-2 바이트에 대한 @ Mr.Xcoder 덕분에

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

온라인으로 사용해보십시오!

블랙 박스 함수의 이름이 f라고 가정합니다.


함수를 매개 변수로 전달할 필요가 없습니까? 사전 정의 된 변수가 허용되는 입력 방법이라고 생각하지 않습니다.
mbomb007

함수가이라고 가정 할 수 있는지 확실 f하지 않습니다. 입력이 변수에 있다고 가정하지 않습니까? (편집 : mbomb의 닌자 ')
FlipTack




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

스위프트 , 47 42 바이트

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

순진한 접근 방식, 블랙 박스 기능의 이름이 있다고 가정 f


복잡한 클로저이고 명시 적으로 캐스팅하지 않는 한 유형이 모호하기 때문에 두 번째 시도에 대해 의심 스럽습니다 {...}as(<parameter types>)-><return type>. 반환 유형을 지정하지 않으면 빌드 타임 오류가 발생하므로 현재로서는 유효하지 않다고 생각합니다 (캐스트는 바이트 수에 포함되어야합니다). 그래도 첫 제출은 괜찮습니다.
Mr. 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않으면 응용 프로그램과 블랙 박스를 인수로 사용 하여 수정 점 함수 를 재귀 적으로 다시 호출합니다 . 그렇지 않으면 수정 점을 리턴합니다.

† 인용이 필요했습니다. 어딘가에서이 글을 읽은 것을 모호하게 기억합니다.

K & R 스타일 매개 변수 입력으로 입력을 선언합니다.

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

위의 두 번째 줄에있는 아케인 비트 b는 정수 매개 변수를받는 함수 포인터로 선언 합니다. 기본 유형은 _정수로 간주됩니다. 마찬가지로 n정수 f로 가정하고 정수를 리턴하는 것으로 가정합니다. 암시 적 입력을위한 Hooray?


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)을
구분할 수 있습니다.

2
이것은 fPPCG 합의에 의해 금지 된 것으로 미리 할당되어 있다고 가정합니다 . {⍵=⍺⍺⍵:⍵⋄∇⍺⍺⍵}유효한 운영자 솔루션입니다.
Adám



1

4 번째 (2 번째), 36 바이트

이 버전 f은 사전 정의 된 것으로 가정합니다 . 아래 솔루션만큼 시원하지 않습니다. 두 프로그램 모두 발견되지 않은 경우 스택 오버플로 또는 발견 된 경우 스택 언더 플로 (결과 인쇄 후)로 종료됩니다.

온라인으로 사용해보십시오

: g dup f over = IF . THEN recurse ;

4 번째 (2 번째), 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)등호 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 = f (x)를 갖는 하나의 값 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

클로저, 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 opcode, 8 바이트

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

입력 받기 : ecx(value ), (함수 주소,에서 입력 받기 , 및 의 값을 수정하지 않고 결과 쓰기 )x0edxecxeaxecxedx

8086 opcode, 7 바이트 (그러나 느림)

    xor     cx,     cx
    call    dx
    loop    $-2
    ret

고정 점이있는 경우 65536 회 반복하면 항상 그곳에 운전합니다.
입력 : ax(초기 값 ), (함수 주소,에서 입력을 받음, 및 의 값을 수정하지 않고 출력을 쓰십시오 ). 레지스터의 고정 점을 출력합니다 .x0dxaxaxcxdx
ax


대답을 더 읽기 쉽게 만들면 확실히 도움이 될 것입니다.
user202729

더 정확한 수정을 위해 편집
l4m2


0

자바 8, 42 바이트

이것은 Function<Integer, Integer>or IntFunction<Integer>및 and int또는 Integer(curried) 고정 점을 반환합니다.

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

온라인으로 사용해보십시오

Java가 하위 표현식을 왼쪽에서 오른쪽으로 평가한다는 사실을 이용합니다 (따라서 이전 i은 새로운 것과 비교됩니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.