La cosa principale è quello di passare attraverso tutti i possibili valori. Non cercare di interrompere quando trovi la prima risposta, inizia semplicemente con una migliore risposta pari a zero, quindi prova tutte le combinazioni e mantieni l'aggiornamento migliore. La cosa secondaria è cercare di ridurre il set di "tutte le combinazioni".
Una cosa che si può fare è limitare il ciclo interno a valori inferiori o uguali a a (dal b == b a). Ciò mette il valore più grande della tua equazione sempre in a e riduce sostanzialmente il numero di valori che devi testare.

for a in range.to_a.reverse do
for b in (100..a).to_a.reverse do
La prossima cosa che puoi fare è uscire dal ciclo interno ogni volta che il prodotto è inferiore al miglior valore corrente.
c = a*b
next if c < best
Avanti, se avete intenzione di passare attraverso di loro tutti in ogni caso non c'è alcun beneficio per passare attraverso di loro in senso inverso. Iniziando in cima alla gamma ci vuole un po 'prima di trovare un numero palindromico e di conseguenza ci vuole un po' per ridurre il set di ricerca. Se inizi in basso, inizi ad aumentare rapidamente il limite inferiore.
for a in range.to_a do
for b in (100..a).to_a do
I miei test mostrano comunque che si provano alcune coppie 405K. Che ne dici di pensare al problema in un modo diverso. Qual è il più grande prodotto possibile di due numeri a 3 cifre?999 * 999 = 998001 e il più piccolo è 100 * 100 = 10000. Che ne dici se pensiamo di aver infranto la prima risposta ma di applicarla a un intervallo diverso, da 998001 a 10000 (o 999 * 999 a 100 * 100).
for c in (10000...998001).to_a.reverse do
si arriva a un palindromo dopo soli 202 test ... il problema è che non è un prodotto di due numeri a 3 cifre. Quindi ora dobbiamo verificare se il palindrome che abbiamo trovato è un prodotto di 2 numeri a 3 cifre. Non appena troviamo un valore nell'intervallo che è un palindromo e un prodotto di due numeri a 3 cifre, abbiamo finito. I miei test mostrano che troviamo il palindromo più alto che soddisfa il requisito dopo meno di 93K test. Ma dal momento che abbiamo il sovraccarico di controllare che tutti i palindromi a quel punto fossero prodotti da due numeri a 3 cifre, potrebbe non essere più efficiente della soluzione precedente.
Quindi, torniamo al miglioramento originale.
for a in range.to_a.reverse do
for b in (100..a).to_a.reverse do
Stiamo looping righe poi colonne e cercando di essere efficiente rilevando un punto in cui possiamo andare alla riga successiva in quanto qualsiasi trys aggiuntivi sulla riga corrente non potevano essere migliore di nostro attuale migliore. Cosa succede se, invece di scendere le file, attraversiamo le diagonali?

Dal momento che i prodotti diventano più piccoli diagonale dalla diagonale si può fermare, non appena si trova un numero palindome. Questa è una soluzione davvero efficiente ma con un'implementazione più complessa. Si scopre che questo metodo trova il palindromo più alto dopo poco più di 2200 tris.
Non dimenticate c'è un forum Project Euler, dove vengono discusse le soluzioni. Ecco la discussione del problema 004 - http://forum.projecteuler.net/viewtopic.php?f=50&t=1145&p=20642&hilit=Problem+004#p20642 –
@ b1_ C'è un forum per ogni problema, ma non si ottiene accesso a loro finché non avrai risolto il problema. – signine
@signine, quelli sono forum diversi, il link punta a un forum aperto. – st0le