Ác ma thuần khiết: Eval
a=lambda x,y:(y<0)*x or eval("a("*9**9**9+"x**.1"+",y-1)"*9**9**9)
print a(input(),9**9**9**9**9)//1
Câu lệnh bên trong eval tạo ra một chuỗi có độ dài 7 * 10 10 10 10 10 10 8.57 , bao gồm không có gì ngoài nhiều lệnh gọi đến hàm lambda, mỗi chuỗi sẽ tạo ra một chuỗi có độ dài tương tự , bật và tắt cho đến khi cuối cùng y
trở thành 0. Rõ ràng điều này có độ phức tạp tương tự như phương pháp Eschew bên dưới, nhưng thay vì dựa vào logic điều khiển if và và, nó chỉ đập các chuỗi khổng lồ lại với nhau (và kết quả thực là có nhiều ngăn xếp hơn ... có lẽ?).
y
Giá trị lớn nhất tôi có thể cung cấp và tính toán mà không cần Python ném lỗi là 2, điều này đã đủ để giảm đầu vào của max-float khi trả về 1.
Một chuỗi có độ dài 7.625.597.484.987 là quá lớn : OverflowError: cannot fit 'long' into an index-sized integer
.
Toi nên dừng lại.
Eschew Math.log
: Đi đến gốc ( 10- ) (của vấn đề), Điểm: chức năng không thể phân biệt hiệu quả với y = 1.
Nhập thư viện toán học là hạn chế số byte. Hãy loại bỏ điều đó và thay thế log(x)
hàm bằng một cái gì đó tương đương: x**.1
và có giá xấp xỉ cùng một số ký tự, nhưng không yêu cầu nhập. Cả hai hàm đều có đầu ra tuyến tính liên quan đến đầu vào, nhưng x 0,1 thậm chí còn phát triển chậm hơn . Tuy nhiên, chúng tôi không quan tâm nhiều, chúng tôi chỉ quan tâm rằng nó có cùng một kiểu tăng trưởng cơ sở đối với số lượng lớn trong khi tiêu thụ một số lượng ký tự tương đương (ví dụ: x**.9
có cùng số lượng ký tự, nhưng tăng nhanh hơn, do đó là một số giá trị sẽ thể hiện sự tăng trưởng chính xác như nhau).
Bây giờ, phải làm gì với 16 ký tự. Làm thế nào về việc ... mở rộng chức năng lambda của chúng ta để có các thuộc tính Chuỗi Ackermann? Câu trả lời này cho số lượng lớn lấy cảm hứng từ giải pháp này.
a=lambda x,y,z:(z<0)*x or y and a(x**.1,z**z,z-1)or a(x**.1,y-1,z)
print a(input(),9,9**9**9**99)//1
Các z**z
phần ở đây ngăn cản tôi chạy chức năng này với bất cứ nơi nào gần tới đầu vào sane cho y
và z
, các giá trị lớn nhất mà tôi sử dụng có thể là 9 và 3 mà tôi lấy lại giá trị là 1.0, ngay cả đối với phao Python hỗ trợ lớn nhất (lưu ý: trong khi 1.0 là số lớn hơn 6,77538853089e-05, các mức đệ quy tăng di chuyển đầu ra của hàm này gần hơn 1, trong khi vẫn lớn hơn 1, trong khi hàm trước đó di chuyển các giá trị gần hơn 0 trong khi vẫn lớn hơn 0, do đó vừa phải đệ quy trên hàm này dẫn đến nhiều hoạt động đến mức số dấu phẩy động mất tất cả các bit đáng kể).
Định cấu hình lại cuộc gọi lambda ban đầu để có các giá trị đệ quy là 0 và 2 ...
>>>1.7976931348623157e+308
1.0000000071
Nếu so sánh được thực hiện để "bù từ 0" thay vì "bù từ 1" thì hàm này trả về 7.1e-9
, chắc chắn là nhỏ hơn 6.7e-05
.
Đệ quy cơ sở của chương trình thực tế (giá trị z) là 10 10 10 10 1,97 cấp độ sâu, ngay khi y cạn kiệt, nó được đặt lại với 10 10 10 10 10 1.97 (đó là lý do tại sao giá trị ban đầu là 9 là đủ), vì vậy tôi không Thậm chí còn biết cách tính toán chính xác tổng số lần thu hồi xảy ra: Tôi đã đạt đến cuối kiến thức toán học của mình. Tương tự như vậy, tôi không biết nếu di chuyển một trong các **n
số mũ từ đầu vào ban đầu sang thứ cấp z**z
sẽ cải thiện số lần thu hồi hay không (ngược lại).
Cho phép đi chậm hơn với đệ quy thậm chí nhiều hơn
import math
a=lambda x,y:(y<0)*x or a(a(a(math.log(x+1),y-1),y-1),y-1)
print a(input(),9**9**9e9)//1
n//1
- tiết kiệm hơn 2 byte int(n)
import math
, math.
tiết kiệm hơn 1 bytefrom math import*
a(...)
tiết kiệm tổng cộng 8 byte m(m,...)
(y>0)*x
tiết kiệm một byte trêny>0and x
9**9**99
tăng byte count bởi 4 và tăng độ sâu đệ quy bằng xấp xỉ 2.8 * 10^x
nơi x
là chiều sâu cũ (hoặc độ sâu gần một GOOGOLPLEX trong kích thước: 10 10 94 ).
9**9**9e9
tăng số byte lên 5 và tăng độ sâu đệ quy bằng ... một lượng điên. Độ sâu đệ quy hiện là 10 10 10 9,93 , để tham khảo, một googolplex là 10 10 10 2 .
- khai lambda tăng đệ quy bằng cách thêm một bước:
m(m(...))
để a(a(a(...)))
chi phí 7 byte
Giá trị đầu ra mới (ở độ sâu đệ quy 9):
>>>1.7976931348623157e+308
6.77538853089e-05
Độ sâu đệ quy đã bùng nổ đến điểm mà tại đó kết quả này là theo nghĩa đen vô nghĩa trừ khi so sánh với các kết quả trước đó bằng cách sử dụng các giá trị đầu vào tương tự:
- Bản gốc được gọi
log
25 lần
- Sự cải tiến đầu tiên gọi nó là 81 lần
- Các thực tế chương trình sẽ gọi nó là 1e99 2 tương đương khoảng 10 10 2.3 lần
- Phiên bản này gọi nó là 729 lần
- Các thực tế chương trình sẽ gọi nó là (9 9 99 ) 3 hoặc hơi ít hơn 10 10 95 lần).
Lambda Khởi động, điểm số: ???
Tôi nghe nói bạn thích lambdas, vì vậy ...
from math import*
a=lambda m,x,y:y<0and x or m(m,m(m,log(x+1),y-1),y-1)
print int(a(a,input(),1e99))
Tôi thậm chí không thể chạy cái này, tôi xếp chồng lên nhau thậm chí chỉ với 99 lớp đệ quy.
Phương thức cũ (bên dưới) trả về (bỏ qua chuyển đổi thành số nguyên):
>>>1.7976931348623157e+308
0.0909072713593
Phương thức mới trả về, chỉ sử dụng 9 lớp xâm nhập (chứ không phải toàn bộ googol của chúng):
>>>1.7976931348623157e+308
0.00196323936205
Tôi nghĩ rằng điều này hoạt động có độ phức tạp tương tự như chuỗi Ackerman, chỉ nhỏ thay vì lớn.
Ngoài ra, nhờ vào ETHproductions để tiết kiệm 3 byte trong không gian mà tôi không nhận ra có thể bị xóa.
Câu trả lời cũ:
Việc cắt số nguyên của nhật ký hàm (i + 1) được lặp lại 20 25 lần (Python) bằng lambda'd lambdas.
Câu trả lời của PyRulez có thể được nén bằng cách giới thiệu lambda thứ hai và xếp chồng nó:
from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(x(x(i)))))
print int(y(y(y(y(y(input()))))))
99 100 ký tự được sử dụng.
Điều này tạo ra số lần lặp là 20 25, so với bản gốc 12. Ngoài ra, nó lưu 2 ký tự bằng cách sử dụng int()
thay vì floor()
cho phép một x()
ngăn xếp bổ sung . Nếu khoảng trắng sau lambda có thể được loại bỏ (tôi không thể kiểm tra tại thời điểm này) thì y()
có thể thêm lần thứ 5 . Khả thi!
Nếu có một cách để bỏ qua việc from math
nhập bằng cách sử dụng một tên đủ điều kiện (ví dụ x=lambda i: math.log(i+1))
:), điều đó sẽ lưu nhiều ký tự hơn và cho phép một ngăn xếp khác x()
nhưng tôi không biết liệu Python có hỗ trợ những thứ đó không (tôi nghi ngờ là không). Làm xong!
Đây thực chất là một mẹo tương tự được sử dụng trong bài đăng trên blog của XCKD với số lượng lớn , tuy nhiên, chi phí khai báo lambdas ngăn chặn ngăn xếp thứ ba:
from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(i)))
z=lambda i:y(y(y(i)))
print int(z(z(z(input()))))
Đây là lần đệ quy nhỏ nhất có thể với 3 lambdas vượt quá chiều cao ngăn xếp được tính toán của 2 lambdas (giảm bất kỳ lambda nào xuống hai cuộc gọi giảm chiều cao ngăn xếp xuống còn 18, thấp hơn so với phiên bản 2-lambda), nhưng không may cần 110 ký tự.