Напівекспоненціальна функція


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як вхід, виведіть перші xзначення f.

  • Нескінченно вивести все f.

Якщо ви хочете взяти xта вивести f(x), xмає бути індексовано нуль.

Довідкова реалізація

Це код гольфу - найкоротший код у виграші байтів. Стандартні лазівки , як завжди, заборонені.


Здається, визначення не перевірено для 0: f (f (0)) = f (1) = 2, але 2 ^ 0 = 1
Nahuel Fouilleul

а для 1: f (f (1)) = f (2) = 3, але 2 ^ 1 = 2
Науель Фульє

1
@NahuelFouilleul вимога f (f (x)) > = 2 ^ x.
Мартін Ендер

1
Чи слід подавати в OEIS ?
Jeppe Stig Nielsen

Відповіді:


8

JavaScript (ES7), 51 48 байт

Збережено 3 байти завдяки @Arnauld

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 процесуально генерується, по одному елементу, поки він не досягне потрібної довжини. (Порт нескінченної техніки, що використовується у відмінному відповіді Python xnor, швидше за все, буде коротшим.)

Ми можемо зробити наступне спостереження для кожного індексу i (0-індексується):

  • Якщо я існую як елемент в під індексом J ( а [J] = I ), то а [я] має бути по крайней мере , 2 J .

Це вірно, тому що f (f (j)) має бути не менше 2 j , а f (f (j)) еквівалентно a [a [j]] , що в свою чергу еквівалентно [i] .

Зазвичай правильний варіант рівно 2 j . Однак для особливого випадку я = 2 , 2 існує в масиві під індексом J = 1 , що означає , що 2 J було б 2 бут це означає , що ми мали б 2 на обох A [1] і в [2] . Щоб обійти це, ми беремо максимум 2 j та a [i-1] + 1 (на один більше, ніж попередній елемент), що дає 3 при i = 2 .

Ця методика також має вирішити, чи існує j чи ні - якщо цього немає, .indexOf()метод JS повертає -1 , що призводить до отримання максимуму [i-1] + 1 та 2 -1 = 0,5 . Оскільки всіх елементів у послідовності принаймні 1 , це завжди поверне попередній елемент плюс один.

(Я пишу це пояснення пізно вночі, тому, будь ласка, повідомте мене, якщо щось бентежить чи я щось пропустив)


Зауважте, що введення 272та вгору дають неправильні відповіді через цілі проблеми переповнення. Це добре, оскільки працює до межі типу даних.
isaacg

Використовуйте 2**замість того, щоб 1<<сподіватися виправити проблему.
user202729

Тепер .99вбиває рішення. Але навіщо використовувати +.99і не просто +.9? Яка різниця?
користувач202729

@ 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 відповіді «s. Я б опублікував це покращення як коментар, але відповідь видалено, і тому коментарі відключені.


Це не вдається з винятком "індекс списку поза діапазоном" на вході 258. Я думаю, що проблема в тому, що x**2це занадто мало.
isaacg

Ну ... Python 2 відрізняється (часто менше байтів) від Python 3.
user202729

1
Як і очікувалося, напівекспоненція є значно більшою, ніж квадратична. Рішення отримує "індекс списку поза діапазоном" на x=1000. Ви можете спробувати 2**x- жахливо великий, але кодегольф - це кодогольф.
user202729

@ user202729 А, це правда. На жаль, зараз він стикається з зовсім іншою проблемою з більшими вхідними 2**xданими, що створює занадто великий діапазон для продовження роботи Python.
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 Це призводить до помилки компілятора, оскільки цілі числа не можуть бути необов'язковими ланцюжками .
Герман Л
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.