f=_=>do{try{-~f()}catch(e){}}
- Neil sayesinde 2 bayt kurtardı.
Burada deneyin veya evalyerine test etmek için aşağıdaki Snippet'i kullanın do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Japt bağlantı noktası, 24 bayt
Bunu, aslında özdeş olduğu için ayrı bir çözüm olarak göndermeye değmez.
Ox`try\{-~rp()}¯t®(e)\{}
Dene
açıklama
JavaScript'in kendisinde bir özyineleme sınırı yoktur, bunun yerine sınır, yorumlayıcı (yani tarayıcı) tarafından uygulanır - dilleri tercümanları tarafından burada tanımladığımız iyi bir şey! Diğer faktörlerin yanı sıra, sınır, gerçekleştirilen işlemlerden etkilenen tarayıcıya ve kullanılabilir belleğe göre değişebilir. Aşağıdaki Snippet, bu çözümün 5 farklı sürümünü kullandığım son noktayı göstermektedir. Son 2 testten görebileceğiniz gibi, Chrome'da en azından işlemlerin sırası bile fark yaratabilir.
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}`))())
Bu nedenle, çalışmak için bir sabit veya yöntem kolaylığına sahip değiliz. Bunun yerine, nihayetinde toparlanmadan önce kendini sürekli çağıran bir işlev yaratacağız. En basit haliyle:
f=_=>f()
Ancak bu meydan okuma için bize pek fazla faydası yoktur çünkü yalnızca kaç kez fkendini çağırdığına dair hiçbir belirti olmadan bir taşma hatası atar . Biz hatayı önleyebilirsiniz trying çağrıya fsürekli ve catchbaşarısız olduğunda ing:
f=_=>{try{f()}catch(e){}}
Hata yok, ancak işlev başarısız olmadan önce kaç kez kendini çağırmayı başardığının dönüş değeri yok, çünkü catchaslında hiçbir şey yapmıyor. İfadeyi değerlendirmeyi deneyelim try / catch:
f=_=>eval(`try{f()}catch(e){}`)
Şimdi döndürülen bir değere sahibiz (ve bu kod golf olduğundan, gerçek bir kullanarak kendimizi birkaç bayt kurtardık return). Geri döndürülen değer undefinedyine de , çünkü catchhiçbir şey yapmıyor. Neyse ki bizim için -~undefined==1ve -~n==n+1böylece, -~çağrının önüne bir haşhaş ile f, aslında -~-~ ... -~-~undefined, -~her çağrı ile başa bir başkasıyla , kaç kez fçağrıldığını vererek aldık .
f=_=>eval(`try{-~f()}catch(e){}`)