f=_=>do{try{-~f()}catch(e){}}
- 2 byte được lưu nhờ Neil.
Hãy thử ở đây hoặc sử dụng Đoạn trích bên dưới để kiểm tra evalthay vì do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Nó không thực sự đáng để đăng bài này như một giải pháp riêng biệt vì về cơ bản, nó giống hệt nhau.
Ox`try\{-~rp()}¯t®(e)\{}
Kiểm tra nó
Giải trình
Bản thân JavaScript không có giới hạn đệ quy mỗi se, thay vào đó giới hạn được áp dụng bởi trình thông dịch (tức là trình duyệt) - điều tốt là chúng tôi xác định ngôn ngữ theo vòng thông dịch viên của họ ở đây! Trong số các yếu tố khác, giới hạn có thể thay đổi tùy theo trình duyệt và bộ nhớ khả dụng, bị ảnh hưởng bởi các hoạt động được thực hiện. Đoạn trích sau minh họa điểm cuối cùng đó, sử dụng 5 phiên bản khác nhau của giải pháp này mà tôi đã trải qua. Như bạn có thể thấy từ 2 thử nghiệm gần đây nhất, trong Chrome, ít nhất, ngay cả thứ tự hoạt động cũng có thể tạo ra sự khác biệt.
console.log((f=(i=0)=>eval(`try{f(i+1)}catch(e){i}`))())
console.log((f=i=>eval(`try{f(-~i)}catch(e){i}`))())
console.log((f=(i=0)=>eval(`try{f(++i)}catch(e){i}`))())
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
console.log((f=_=>eval(`try{f()+1}catch(e){0}`))())
console.log((f=_=>eval(`try{1+f()}catch(e){0}`))())
Do đó, do đó chúng tôi không có sự thuận tiện của hằng số hoặc phương pháp để làm việc. Thay vào đó, chúng ta sẽ tạo ra một chức năng tự gọi liên tục trước đó, cuối cùng, xuất hiện. Ở dạng đơn giản nhất đó là:
f=_=>f()
Nhưng điều đó không giúp ích nhiều cho chúng tôi cho thử thách này vì nó chỉ gây ra lỗi tràn mà không có dấu hiệu cho thấy fbản thân đã gọi bao nhiêu lần . Chúng ta có thể tránh được những lỗi bằng cách trying lời kêu gọi fliên tục và catching khi nó không thành công:
f=_=>{try{f()}catch(e){}}
Không có lỗi, nhưng vẫn không có giá trị trả về bao nhiêu lần hàm quản lý tự gọi trước khi thất bại, vì catchthực tế không làm gì cả. Hãy thử đánh giá try / catchtuyên bố:
f=_=>eval(`try{f()}catch(e){}`)
Bây giờ chúng tôi đã có một giá trị được trả về (và, bởi vì đây là mã golf, đã tiết kiệm cho chúng tôi một vài byte so với sử dụng thực tế return). Tuy nhiên, giá trị được trả lại là undefinedvì catchkhông làm gì cả. May mắn cho chúng tôi -~undefined==1và -~n==n+1do đó, bằng cách bật một -~cuộc gọi trước f, về cơ bản chúng tôi đã nhận được -~-~ ... -~-~undefined, với một -~cuộc gọi khác được chuẩn bị trước cho mỗi cuộc gọi, cho chúng tôi số lần fđược gọi.
f=_=>eval(`try{-~f()}catch(e){}`)