Ti sembrerà sicuramente una risposta quasi "pre-cotta", ma ti garantisco che è la sacrosanta verità... Il problema sostanziale, nella programmazione, è spesso il modo in cui è costruito l'algoritmo...
E' naturale che ci siano metodi, librerie, strumenti che agevolino certi tipi di "mansioni", ma in loro assenza un algoritmo ben progettato fa sempre il suo buon lavoro...
Tu ti chiedi se un triplo For si possa fare... Io ti rispondo che sono arrivato al Triplo For, mi sono chiesto se il programma non sarebbe risultato troppo lento, ma avevo un'idea che mi sembrava ben congegnata... Quindi ho continuato e, Meraviglia delle Meraviglie......... 4 For Annidati, un mio record personale immagino... Tempo di esecuzione TOTALE, circa 0.4s per tutti i test...
Soluzione? ---> In questo caso le condizioni di uscita (break/next) dei Cicli la fanno da padrone...
Pensavo che per l'ultimo test ci sarebbe voluto ALMENO 1 minuto con una struttura simile, invece a quanto pare l'idea era buona e tutto gira alla velocità della luce :D
Quindi il succo è... Pensaci sempre quando metti un ciclo, quello è di base, soprattutto se le iterazioni da compiere sono molte... Ma non farti spaventare dal loro utilizzo, in particolar modo se, come in questo caso, ci sono molte condizioni di uscita che si possono inserire per abbattere in maniera eccezionale il numero delle interazione ;)
Buona fortuna :)
P.s. Accetta il consiglio di @Xriuk sulla Lista di Liste di caratteri, è un ottimo punto di partenza (lo stesso su cui ho lavorato io)... Una struttura di questo tipo [['auwjsience'],['jdusjemsor'],....,['usjekdocps']]