반 지수 함수


21

반 지수 함수는 자체 구성 될 때, 지수 함수를 제공 한 것이다. 예를 들어, 경우는 f(f(x)) = 2^x, 다음 f반 지수 함수 될 것이다. 이 도전에서는 특정 반 지수 함수를 계산합니다.

특히 다음 속성을 사용하여 음이 아닌 정수에서 음이 아닌 정수로 함수를 계산합니다.

  • 일정하게 증가하는 다음과 같은 경우 x < y, 다음f(x) < f(y)

  • 최소 지수 지수 : 모두 x,f(f(x)) >= 2^x

  • 사 전적으로 작은 : 위의 속성을 가진 모든 기능 중, 출력 하나 최소화 f(0)그 선택 최소화 주어, f(1)다음 f(2), 등등.

입력 0, 1, 2, ...에 대한이 함수의 초기 값은 다음 과 같습니다.

[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]

이 함수는 함수 또는 전체 프로그램으로 다음 방법 중 하나를 통해 출력 할 수 있습니다.

  • 가지고 x입력으로 출력 f(x).

  • 받아 x출력 먼저 입력으로서 xf.

  • 을 모두 무한대로 출력합니다 f.

촬영할 경우 x출력 f(x), x제로 색인해야합니다.

참조 구현

이것은 코드 골프입니다-가장 짧은 코드는 바이트 단위입니다. 언제나처럼 표준 허점 은 금지되어 있습니다.


F (F (0)) = F (1) = 2이지만 2 ^ 0 = 1 : 0의 정의는 확인되지 않은 것으로 보인다
나우 Fouilleul

및 1 : F (F (1)) = F (2) = 3하지만, 2 ^ 2 = 1
나우 Fouilleul

1
@NahuelFouilleul 요구 사항은 f (f (x)) > = 2 ^ x입니다.
Martin Ender

1
OEIS에 제출해야합니까 ?
Jeppe Stig Nielsen

답변:


8

자바 스크립트 (ES7), 51 48 바이트

@Arnauld 덕분에 3 바이트 절약

f=i=>i?f[f[q=f(i-1),r=f[i]||q+1]=(i>1)<<i,i]=r:1

n을 받아서 시퀀스에서 n 번째 항목을 출력합니다 .


자바 스크립트 (ES7), 70 68 64 바이트

f=(n,a=[],q=1)=>n?f(n-1,a,(n=2**a.indexOf(a.push(q)))<++q?q:n):a

시퀀스 x의 첫 번째 x항목을 받아서 배열로 반환 하는 재귀 함수입니다 .

작동 원리

배열 a 는 원하는 길이에 도달 할 때까지 한 번에 한 항목 씩 절차 적으로 생성됩니다. xnor의 훌륭한 Python 답변에 사용 된 무한 기술의 포트는 더 짧을 것입니다.

각 인덱스 i (0 인덱스) 에 대해 다음을 관찰 할 수 있습니다 .

  • 경우 의 항목으로 존재 인덱스에 J ( A [J] = 1 )이면 A는 [I]은 적어도 있어야 2 J .

때문에 이것은 사실이다 F (F (j)의) 적어도 있어야 2 J , 및 F (F (j)) 에 상당 A [A [J] 에 차례로 당량이고, A [I] .

일반적으로 올바른 옵션은 정확히 2 j 입니다. 그러나 특이한 경우 i = 2의 경우 , 인덱스 j = 1 의 배열에 2 가 존재합니다 . 이는 2 j2 임을 의미합니다. 그러나 이것은 a [1]a [2]에 2 를 갖습니다 . 이 문제를 해결하기 위해, 우리는 최대 소요 2 J를 그리고 A [I-1] + 1 (보다 이전 항목 이상) 제공, (3)을 위한 I = 2 .

이 기술은 또한 j 가 존재 하는지 여부를 결정하는데주의를 기울입니다. 존재하지 않는 경우 JS의 .indexOf()메소드는 -1을 반환 하여 최대 a [i-1] + 12 -1 = 0.5가 됩니다. 시퀀스의 모든 항목 이 1 이상 이므로 항상 이전 항목에 1을 더한 값을 반환합니다.

(저는 늦은 밤에이 설명을 작성하고 있으므로 혼동되거나 빠진 것이 있으면 알려주세요)


272정수 오버플로 문제로 인해 입력 과 위로 응답이 잘못되었습니다. 데이터 유형의 한계까지 작동하므로 괜찮습니다.
isaacg

희망적으로 문제를 해결하는 2**대신 사용하십시오 1<<.
user202729

이제 .99솔루션을 죽입니다. 그러나 왜 +.99뿐만 아니라 사용 +.9합니까? 차이점이 뭐야?
user202729

@ user202729 바보 같은 느낌이 들었습니다. 이것은 내가 사용 Math.log2(...)하고 있었고 천장을 계산해야했던 이전 버전에서 남았습니다 . 이제는 전혀 필요하지 않습니다. 감사! 나는 원래 의 2**것을 사용 2**...+.99|0했지만 1<<을 필요로하지 않기 때문에 더 짧았습니다 |0. 이제 차이가 없다고 생각합니다 ...
ETHproductions




1

젤리 , 14 바이트

iL’2*»Ṁ‘$ṭ
⁸Ç¡

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

작동 원리

⁸Ç¡         Main link. No arguments.

⁸           Set the left argument and the return value to [].
 Ç¡         Read an integer n from STDIN and call the helper link n times, first on
            [], then on the previous result. Return the last result.


iL’2*»Ṁ‘$ṭ  Helper link. Argument: A (array)

 L          Take the length of A. This is the 0-based index of the next element.
i           Find its 1-based index in A (0 if not present).
  ’         Decrement to a 0-based index (-1 if not present).
   2*       Elevate 2 to the 0-based index.
      Ṁ‘$   Take the maximum of A and increment it by 1.
            Note that Ṁ returns 0 for an empty list.
     »      Take the maximum of the results to both sides.
         ṭ  Tack (append) the result to A.

0

파이썬 2 , 111 바이트

def f(x):
 a=range(1,2**x)
 for i in range(1,x):a[i]=max(a[i],a[i-1]+1);a[a[i]]=max(a[a[i]],2**i)
 return a[:x]

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

이것은 user202729 의 답변을 크게 수정 한 것입니다. 이 개선 사항을 주석으로 게시했지만 답변이 삭제되어 주석이 비활성화됩니다.


입력 258에서 "목록 색인이 범위를 벗어났습니다"예외로 인해 실패합니다. 문제 x**2가 너무 작습니다.
isaacg

음 ... 파이썬 (2) (3) 파이썬에서 (종종 적은 바이트) 다른
user202729

1
예상 한 바와 같이 반 지수는 2 차보다 훨씬 큽니다. 솔루션은에서 "목록 색인이 범위를 벗어났습니다"를 얻습니다 x=1000. 시도해보고 싶을 수도 2**x있지만 codegolf는 codegolf입니다.
user202729

@ user202729 아, 맞습니다. 불행히도 이제는 더 큰 입력에 대해 완전히 다른 문제가 발생하여 2**x파이썬이 계속하기에는 너무 큰 범위를 만듭니다.
notjagan

0

스위프트 , 137 바이트

func f(n:Int){var l=Array(1...n).map{$0>3 ?0:$0},p=8;if n>3{for i in 3..<n{if l[i]<1{l[i]=l[i-1]+1};if l[i]<n{l[l[i]]=p};p*=2}};print(l)}

입력을 Int(정수) 로 취하고 [Int](정수 배열) 로 인쇄합니다 .

언 골프 버전

func f(n:Int){
    var l = Array(1...n).map{$0 > 3 ? 0 : $0} // Create the range from 1 to n and set all
    var p = 8                                 // values greater than 3 to 0
    if n > 3 {
        for i in 3 ..< n {
            if l[i] < 1 {
                l[i] = l[i - 1] + 1
            }
            if l[i] < n {
                l[l[i]] = p
            }
            p *= 2
        }
    }
    print(l)
}

궁금합니다. 전에 공백을 제거하면 ?어떻게 되나요?
ETHproductions

@ETHproductions 정수는 선택적으로 연결될 수 없기 때문에 컴파일러 오류가 발생 합니다.
허먼 L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.