===== Project Euler - Problem 151 ===== From [[http://projecteuler.net/index.php?section=problems&id=151|here]] Una stamperia esegue 16 lavorazioni (jobs) ogni settimana ed ogni lavorazione richiede un foglio speciale di formato A5. Ogni lunedi mattina, il caporeparto apre una nuova busta, la quale contiene un foglio speciale di formato A1. Procede quindi a dimezzarlo, ottenendo due fogli di formato A2. Quindi taglia uno di questi a metà ottenendo due fogli di formato A3 e via dicendo, finchè ottiene il foglio di formato A5 che è necessario per la prima lavorazione della settimana. Tutti i fogli non utilizzati sono riposti di nuovo nella busta. {{ http://projecteuler.net/project/images/p_151.gif }} All'inizio di ognuna delle lavorazioni seguenti, prende un foglio a caso dalla busta. Se è di formato A5 lo utilizza. Se è di formato maggiore, ripete il procedimento di dimezzamento finchè ottiene il foglio di formato A5 e tutti i rimanenti fogli sono riposti ancora nella busta. **Escludendo la prima e l'ultima lavorazione di ogni settimana, trovare la probabilità (durante la settimana) che il caporeparto trovi un singolo foglio nella busta** Dare la risposta arrotondata a sei posizioni decimali usando il formato x.xxxxxx. **Risposta: puoi trovarla da solo eseguendo il codice forth!** ;-) ---- Una soluzione in **gforth** (in 87 millisecondi): #! /usr/bin/gforth : p151 { a5 a4 a3 a2 -- F: res } 0.0e { F: res } a5 a4 a3 a2 + + + { W: left } 1 left = a5 1 <> and if 1.0e to res then a5 0 > if a5 1- a4 a3 a2 recurse a5 s>d d>f f* res f+ to res then a4 0 > if a5 1+ a4 1- a3 a2 recurse a4 s>d d>f f* res f+ to res then a3 0 > if a5 1+ a4 1+ a3 1- a2 recurse a3 s>d d>f f* res f+ to res then a2 0 > if a5 1+ a4 1+ a3 1+ a2 1- recurse a2 s>d d>f f* res f+ to res then left 0 > if res left s>d d>f f/ to res then res ; 1 1 1 1 p151 ." The answer is " 6 set-precision f. cr bye