Hàm nửa số mũ


21

Hàm nửa hàm mũhàm mà khi được cấu tạo với chính nó sẽ cho hàm số mũ. Ví dụ, nếu f(f(x)) = 2^x, sau đó fsẽ là một hàm số mũ. Trong thử thách này, bạn sẽ tính một hàm số mũ cụ thể.

Cụ thể, bạn sẽ tính hàm từ các số nguyên không âm sang các số nguyên không âm với các thuộc tính sau:

  • Tăng đơn điệu: nếu x < y, thìf(x) < f(y)

  • Ít nhất là một nửa số mũ: Đối với tất cả x,f(f(x)) >= 2^x

  • Nhỏ nhất về mặt số học: Trong số tất cả các chức năng có các thuộc tính trên, hãy xuất ra hàm tối thiểu hóa f(0), cho phép lựa chọn đó giảm thiểu f(1), sau đó f(2), v.v.

Các giá trị ban đầu của hàm này, cho các đầu vào 0, 1, 2, ...là:

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

Bạn có thể xuất hàm này thông qua bất kỳ phương thức nào sau đây, dưới dạng hàm hoặc là một chương trình đầy đủ:

  • Lấy xlàm đầu vào, đầu ra f(x).

  • Lấy xlàm đầu vào, đầu ra các xgiá trị đầu tiên của f.

  • Đầu ra vô hạn tất cả f.

Nếu bạn muốn lấy xvà đầu ra f(x), xphải được lập chỉ mục bằng không.

Thực hiện tham khảo

Đây là mã golf - mã ngắn nhất tính bằng byte thắng. Lỗ hổng tiêu chuẩn bị cấm, như mọi khi.


dường như định nghĩa không được xác minh cho 0: f (f (0)) = f (1) = 2 nhưng 2 ^ 0 = 1
Nahuel Fouilleul

và cho 1: f (f (1)) = f (2) = 3 nhưng 2 ^ 1 = 2
Nahuel Fouilleul

1
@NahuelFouilleul yêu cầu là f (f (x)) > = 2 ^ x.
Martin Ender

1
Chúng ta có nên nộp cho OEIS không?
Jeppe Stig Nielsen

Câu trả lời:


8

JavaScript (ES7), 51 48 byte

Đã lưu 3 byte nhờ @Arnauld

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

Mất trong n và xuất ra n 'th mục trong trình tự.


JavaScript (ES7), 70 68 64 byte

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

Hàm đệ quy nhận xvà trả về các xmục đầu tiên của chuỗi dưới dạng một mảng.

Làm thế nào nó hoạt động

Mảng a được tạo theo thủ tục, mỗi lần một mục, cho đến khi đạt được độ dài mong muốn. (Một cổng của kỹ thuật vô hạn được sử dụng trong câu trả lời Python tuyệt vời của xnor có thể sẽ ngắn hơn.)

Chúng ta có thể thực hiện quan sát sau cho từng chỉ số i (0-index):

  • Nếu tôi tồn tại như một mục trong một lúc chỉ số j ( a [j] = i ), sau đó a [i] cần phải có ít nhất 2 j .

Điều này đúng bởi vì f (f (j)) cần ít nhất 2 jf (f (j)) tương đương với [a [j]] , tương ứng với một [i] .

Thông thường tùy chọn đúng là chính xác 2 j . Tuy nhiên, đối với trường hợp số ít i = 2 , 2 tồn tại trong mảng ở chỉ số j = 1 , điều đó có nghĩa là 2 j sẽ là 2 Đọ, nhưng điều này có nghĩa là chúng ta sẽ có 2 ở cả [1][2] . Để giải quyết vấn đề này, chúng tôi lấy tối đa 2 j[i-1] + 1 (nhiều hơn một mục so với mục trước), cung cấp 3 cho i = 2 .

Kỹ thuật này cũng tình cờ quyết định liệu j có tồn tại hay không nếu .indexOf()phương thức này không, phương thức của JS trả về -1 , dẫn đến lấy tối đa [i-1] + 12 -1 = 0,5 . Vì tất cả các mục trong chuỗi ít nhất là 1 , điều này sẽ luôn trả về mục trước đó cộng với một.

(Tôi đang viết lời giải thích này vào đêm khuya, vì vậy xin vui lòng cho tôi biết nếu có gì đó khó hiểu hoặc tôi đã bỏ lỡ bất cứ điều gì)


Lưu ý rằng đầu vào 272và lên cho câu trả lời không chính xác do các vấn đề tràn số nguyên. Điều này là tốt, vì nó hoạt động đến giới hạn của kiểu dữ liệu.
isaacg

Sử dụng 2**thay vì 1<<hy vọng khắc phục vấn đề.
dùng202729

Bây giờ .99giết chết giải pháp. Nhưng tại sao sử dụng +.99và không chỉ +.9? Có gì khác biệt?
dùng202729

@ user202729 Tôi cảm thấy như một thằng ngốc - đã bị bỏ lại ở đó từ phiên bản trước nơi tôi đang sử dụng Math.log2(...)và phải tính trần. Bây giờ nó không cần thiết chút nào. Cảm ơn! Tôi sẽ xem xét 2**điều này - 2**...+.99|0ban đầu tôi đang sử dụng , nhưng 1<<ngắn hơn vì tôi không cần |0. Bây giờ tôi nghĩ không có sự khác biệt ...
Sản phẩm ETH




1

Thạch , 14 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

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]

Hãy thử trực tuyến!

Đây là một sửa đổi đáng kể trong câu trả lời của người dùng202729 . Tôi đã đăng bài cải tiến này dưới dạng một bình luận, nhưng câu trả lời đã bị xóa và vì vậy các bình luận bị vô hiệu hóa.


Điều này không thành công với ngoại lệ "danh sách ngoài phạm vi" trên đầu vào 258. Tôi nghĩ vấn đề x**2là quá nhỏ.
isaacg

Chà ... Python 2 khác (thường ít byte hơn) so với Python 3.
user202729

1
Như mong đợi, một nửa số mũ lớn hơn nhiều so với bậc hai. Giải pháp có được "danh sách chỉ số ngoài phạm vi" tại x=1000. Bạn có thể muốn thử 2**x- rất lớn, nhưng codegolf là codegolf.
dùng202729

@ user202729 À, đây là sự thật. Thật không may, bây giờ nó gặp phải một vấn đề hoàn toàn khác với các đầu vào lớn hơn trong đó 2**xtạo ra phạm vi quá lớn để Python tiếp tục.
notjagan

0

Swift , 137 byte

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

Đưa đầu vào là Int (số nguyên) và in dưới dạng[Int] (mảng số nguyên).

Phiên bản ung dung

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

Tôi tò mò, điều gì sẽ xảy ra nếu bạn loại bỏ không gian trước ??
Sản xuất ETH

@ETHproductions Điều đó dẫn đến lỗi trình biên dịch, vì số nguyên không thể là chuỗi tùy chọn .
Herman L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.