f=_=>do{try{-~f()}catch(e){}}
- 2 byte salvati grazie a Neil.
Provalo qui o usa lo snippet qui sotto per testarlo evalinvece di do.
console.log((f=_=>eval(`try{-~f()}catch(e){}`))())
Porta Japt , 24 byte
Non vale davvero la pena pubblicarlo come soluzione separata in quanto sostanzialmente identico.
Ox`try\{-~rp()}¯t®(e)\{}
Provalo
Spiegazione
JavaScript stesso non ha un limite di ricorsione di per sé, piuttosto il limite è imposto dall'interprete (cioè dal browser) - buona cosa definiamo le lingue dal loro interprete qui intorno! Tra gli altri fattori, il limite può variare in base al browser e alla memoria disponibile, influenzata dalle operazioni eseguite. Il seguente frammento illustra l'ultimo punto, utilizzando le 5 diverse versioni di questa soluzione che ho esaminato. Come puoi vedere dagli ultimi 2 test, almeno in Chrome, anche l'ordine delle operazioni può fare la differenza.
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}`))())
Detto questo, non abbiamo quindi la comodità di una costante o di un metodo con cui lavorare. Invece, creeremo una funzione che si chiama continuamente prima, eventualmente, di rompersi. Nella sua forma più semplice che è:
f=_=>f()
Ma non ci è molto utile per questa sfida in quanto genera solo un errore di overflow senza alcuna indicazione di quante volte si è fchiamato. Possiamo evitare l'errore trying di chiamare fcontinuamente e catching quando fallisce:
f=_=>{try{f()}catch(e){}}
Nessun errore, ma ancora nessun valore di ritorno di quante volte la funzione è riuscita a chiamare se stessa prima di fallire, perché in catchrealtà non sta facendo nulla. Proviamo a valutare l' try / catchaffermazione:
f=_=>eval(`try{f()}catch(e){}`)
Ora abbiamo un valore che viene restituito (e, poiché si tratta di codice golf, ci siamo risparmiati qualche byte usando un valore reale return). Il valore restituito, tuttavia, è undefined, ancora una volta perché catchnon sta facendo nulla. Fortunatamente per noi -~undefined==1e -~n==n+1così, facendo scoppiare un -~davanti alla chiamata f, abbiamo essenzialmente -~-~ ... -~-~undefined, con un altro -~anteposto ad ogni chiamata, dandoci il numero di volte che è fstato chiamato.
f=_=>eval(`try{-~f()}catch(e){}`)