半指数関数


21

半指数関数は、それ自体となるとき、指数関数を与えるものです。たとえば、の場合f(f(x)) = 2^xf半指数関数になります。この課題では、特定の半指数関数を計算します。

具体的には、次のプロパティを使用して、非負の整数から非負の整数への関数を計算します。

  • 単調増加:if x < y、thenf(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出力まず、入力としてxの値f

  • すべてを無限に出力しますf

を取得xして出力する場合はf(x)xインデックスをゼロにする必要があります。

リファレンス実装

これはコードゴルフです-バイト単位の最短コードが勝ちます。いつものように、標準的な抜け穴は禁止されています。


0の定義は検証されていないようです:f(f(0))= f(1)= 2 but 2 ^ 0 = 1
ナウエル・フイユ

および1の場合:f(f(1))= f(2)= 3しかし2 ^ 1 = 2
ナウエルフイユ

1
@NahuelFouilleul要件はf(f(x))> = 2 ^ xです。
マーティンエンダー

1
OEISに提出する必要がありますか?
ジェッペスティグニールセン

回答:


8

JavaScript(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番目の項目を出力します。


JavaScript(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は、必要な長さに達するまで、一度に1項目ずつ手続き的に生成されます。(xnorの優れたPythonの回答で使用されている無限の手法の移植版は、おそらくより短いでしょう。)

各インデックスi(0インデックス)について次の観察を行うことができます。

  • 場合iは、アイテムとして存在するインデックスでJ[J] = I)、次いで、[I]は、少なくともする必要がある2 J

これは、f(f(j))が少なくとも2 jである必要があり、f(f(j))a [a [j]]と同等であり、a [i]と同等であるためです。

通常、正しいオプションは正確に2 jですです。しかしながら、単数の場合について、I = 22は屈折率でアレイ内に存在J = 1、そのことを意味する2 jがあろう2私たちが持っているであろうと、この手段ブト2の両方で、A [1]及び[2] 。これを回避するには、最大2 ja [i-1] + 1(前の項目より1つ多い)を使用します。これにより、i = 2に対して3が得られます。

また、この手法はjが存在するかどうかを判断します。存在しない場合、JSの.indexOf()メソッドは-1を返し、a [i-1] + 1および2 -1 = 0.5の最大値を取得します。シーケンス内のすべてのアイテムは少なくとも1であるため、これは常に前のアイテムに1を加えたものを返します。

(私は夜遅くにこの説明を書いているので、何かが紛らわしいか、何かを見逃したか教えてください)


272整数オーバーフローの問題により、inputs およびupは誤った答えを与えることに注意してください。データ型の制限まで機能するため、これは問題ありません。
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

Python 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

うーん... Pythonの2は、Python 3から(多くの場合、より少ないバイト)異なっている
user202729

1
予想どおり、半指数関数は2次関数よりもはるかに大きくなります。ソリューションはで「範囲外のリストインデックス」を取得しx=1000ます。あなたは試してみたいかもしれません2**x-非常に大きいですが、codegolfはcodegolfです。
user202729

@ user202729ああ、これは本当です。残念ながら2**x、Pythonが続行するには範囲が広すぎるため、入力が大きくなるとまったく異なる問題が発生します。
notjagan

0

Swift、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.