Yarım Üstel Fonksiyon


21

Bir yarı-üstel fonksiyon kendisi ile oluşan zaman bir üstel fonksiyon verendir. Örneğin, eğer öyleyse f(f(x)) = 2^x, fyarı üstel bir işlev olacaktır. Bu mücadelede, belirli bir yarı üstel fonksiyon hesaplayacaksınız.

Özellikle, işlevi negatif olmayan tam sayılardan negatif olmayan tam sayılara aşağıdaki özelliklerle hesaplarsınız:

  • Monotonik olarak artan: eğer x < yöyleysef(x) < f(y)

  • En az yarım üstel At: hepsi için x,f(f(x)) >= 2^x

  • Sözlüksel olarak en küçük: Yukarıdaki özelliklere sahip tüm işlevler arasında f(0), bu seçimi en aza indiren f(1), ardından f(2)vb.

Girişler için bu fonksiyonun başlangıç ​​değerleri 0, 1, 2, ...:

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

Bu işlevi, bir işlev olarak veya tam bir program olarak aşağıdaki yöntemlerden biriyle çıkarabilirsiniz:

  • xGirdi olarak alın , çıktı f(x).

  • xGirdi olarak alın , ilk xdeğerleri çıktılayın f.

  • Sonsuz olarak hepsini çıktı f.

Almak xve çıktı almak istiyorsanız f(x), xsıfır dizinli olmalıdır.

Referans uygulaması

Bu kod golf - bayt cinsinden en kısa kod kazanır. Standart boşluklar her zamanki gibi yasaklandı.


tanımı 0 için doğrulanmadı: f (f (0)) = f (1) = 2 ama 2 ^ 0 = 1
Nahuel Fouilleul

ve 1 için: f (f (1)) = f (2) = 3 ancak 2 ^ 1 = 2
Nahuel Fouilleul

1
@NahuelFouilleul gereksinimi f (f (x)) > = 2 ^ x.
Martin Ender

Yanıtlar:


8

JavaScript (ES7), 51 48 bayt

@Arnauld sayesinde 3 bayt kaydedildi

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

İçinde Alır n ve çıkışlar n 'dizisindeki inci madde.


JavaScript (ES7), 70 68 64 bayt

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

Dizinin xilk xöğelerini dizi olarak alan ve döndüren özyinelemeli bir işlev .

Nasıl çalışır

Dizi , bir istenen uzunluğuna gelene kadar prosedür, aynı anda tek bir öğe olarak oluşturulur. ( Xnor'ın mükemmel Python cevabında kullanılan sonsuz tekniğin limanı daha kısa olacaktır.)

Her indeks i (0 indeksli) için aşağıdaki gözlemi yapabiliriz :

  • Eğer I bir öğe olarak var olan bir göstergesi de j ( a [j] i = ), daha sonra bir [ı] az olması gerekir 2 j .

Çünkü bu durum geçerlidir f (f (h)) , en az olması gerekir 2 j ve f (f (i)) eşittir , [a [j]] , dönüş eşdeğeri olduğu, bir [ı] .

Normalde doğru seçenek tam olarak 2 j'dir . Bununla birlikte, tekil durum için i = 2 , j = 1 indeksindeki dizide 2 vardır, yani 2 j olacaktır 2 biz olurdu, bu aracı -but 2 hem de a [1] ve bir [2] . Bunun üstesinden gelmek için, en fazla 2 j ve bir [i-1] + 1 (önceki öğeden bir tane)alırız; bu, i = 2 için 3 verir.

Bu teknik aynı zamanda olup olmadığına karar özen olur j değil mi var eğer, JS en .indexOf()yöntem döner -1 , max alarak açar bir [I-1] + '1 ve 2 -1 = 0.5 . Dizideki tüm öğeler en az 1 olduğundan , bu her zaman önceki öğeye artı bir değerini döndürür.

(Bu açıklamayı gece geç saatlerde yazıyorum, bu yüzden lütfen kafam karıştıysa ya da bir şeyleri özledim mi lütfen bildirin)


272Tamsayı taşması sorunları nedeniyle girdi ve girişlerin yanlış cevap verdiğini unutmayın . Bu, veri tipinin sınırına kadar çalıştığı için sorun değil.
isaacg

Umarım sorunu çözmek 2**yerine kullanın 1<<.
user202729

Şimdi .99çözümü öldürüyor. Ama neden +.99sadece kullanmıyorsunuz +.9? Fark ne?
user202729

@ user202729 Kendimi aptal gibi hissediyorum - orada kullandığım Math.log2(...)ve tavanı hesaplamak zorunda kaldığım önceki bir sürümde kalmıştı. Şimdi hiç gerekli değil. Teşekkürler! Ben 2**şeye bakacağım - 2**...+.99|0orijinal olarak kullanıyordum , ama 1<<daha kısa çünkü buna ihtiyacım yoktu |0. Şimdi fark olmadığını düşünüyorum ...
ETHproductions




1

Jöle , 14 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

⁸Ç¡         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 bayt

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]

Çevrimiçi deneyin!

Bu önemli bir değişikliktir user202729 'ın cevabı. Bu iyileştirmeyi yorum olarak yayınlardım, ancak cevap silindi ve bu nedenle yorumlar devre dışı bırakıldı.


Bu, 258 numaralı girişte "liste dışı aralık" istisnasıyla başarısız oluyor. Sorunun x**2çok küçük olduğunu düşünüyorum .
isaacg

Şey ... Python 2, Python 3'ten farklı (genellikle daha az bayt).
user202729

1
Beklendiği gibi, yarı üstel ikinci dereceden çok daha büyük. Çözüm, "liste dizini aralık dışında" olsun x=1000. Denemek isteyebilirsiniz 2**x- çok büyük, ama codegolf codegolf.
user202729

@ user202729 Ah, bu doğru. Ne yazık ki, şimdi 2**xPython'un devam edemeyecek kadar büyük bir alanı yaratan daha büyük girdilerle tamamen farklı bir problemle karşılaşıyor .
13

0

Swift , 137 bayt

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)}

Girişi Int(tamsayı) olarak alır ve yazdırır.[Int] (integer array) .

Ungolfed versiyonu

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)
}

Merak ediyorum, önceki boşluğu kaldırırsanız ne olacak ??
ETHProductions

@ETHproductions Bir derleyici hatasına neden olur, çünkü tamsayılar isteğe bağlı olarak zincirlenemez .
Herman L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.