function sudo_solve(bol_quiet,bol_skip_elimination){if(!bol_quiet&&isNaN(i_sudo_size)){sudo_status('No hay tablero.');return;}bol_sudo_solved=(bol_skip_elimination||sudo_eliminate(bol_quiet));for(i=0;i<i_sudo_field_no&&bol_sudo_solved;i++){if(arr_sudo_solutions[i][0].length!=1){bol_sudo_solved=false;}else if(!bol_quiet){arr_sudo_input_fields[i].value=sudo_translate_input(arr_sudo_solutions[i][0],true);}}if(!bol_sudo_solved&&!bol_quiet){alert('No se encontró solución');}else if(!bol_quiet){sudo_status('Sudoku resuelto.');}return bol_sudo_solved;}function sudo_test(){if(isNaN(i_sudo_size)){sudo_status('No hay tablero.');return;}var bol_solvable=sudo_eliminate(true);if(bol_solvable&&sudo_solve(true)){alert('Hay una solución posible.');}else if(bol_solvable){alert('Hay varias soluciones.');}else{alert('No hay solución.');}sudo_eliminate_human(true,0,0);}function sudo_eliminate(bol_quiet){return sudo_eliminate_do(arr_sudo_columns,bol_quiet)&&sudo_eliminate_do(arr_sudo_rows,bol_quiet)&&sudo_eliminate_do(arr_sudo_regions,bol_quiet);}function sudo_eliminate_do(arr_perform_in,bol_quiet){for(i=0,i_length=arr_perform_in.length;i<i_length;i++){var arr_solutions_first_occur=new Array(i_sudo_size*i_sudo_size);var arr_count=new Array(i_sudo_size*i_sudo_size);for(a=0,a_length=arr_count.length;a<a_length;a++)arr_count[a]=0;var arr_perform_in_i=arr_perform_in[i];for(a=0,a_length=arr_perform_in_i.length;a<a_length;a++){var arr_perform_in_i_a=arr_perform_in_i[a];if(!arr_sudo_solutions[arr_perform_in_i_a][1]&&arr_sudo_solutions[arr_perform_in_i_a][0].length==1){sudo_eliminate_solution(arr_perform_in_i_a,arr_sudo_solutions[arr_perform_in_i_a][0][0],bol_quiet);return sudo_eliminate_do(arr_perform_in,bol_quiet);}for(b=0,b_length=arr_sudo_solutions[arr_perform_in_i_a][0].length;b<b_length;b++){i_this_solution=arr_sudo_solutions[arr_perform_in_i_a][0][b];arr_count[i_this_solution]++;if(arr_count[i_this_solution]==1)arr_solutions_first_occur[i_this_solution]=arr_perform_in_i_a;}}for(a=0,a_length=arr_count.length;a<a_length;a++){if(arr_count[a]==0){return false;}else if(arr_count[a]==1&&!arr_sudo_solutions[arr_solutions_first_occur[a]][1]){sudo_eliminate_solution(arr_solutions_first_occur[a],a,bol_quiet);return sudo_eliminate_do(arr_perform_in,bol_quiet);}else{}}}return true;}function sudo_eliminate_solution(i_elim_index,i_number_to_remove,bol_quiet){arr_sudo_solutions[i_elim_index][0]=[i_number_to_remove];arr_sudo_solutions[i_elim_index][1]=true;!bol_quiet?arr_sudo_input_fields[i_elim_index].value=sudo_translate_input(i_number_to_remove,true):false;sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_sudo_columns[arr_sudo_index[i_elim_index][0]],arr_sudo_solutions);sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_sudo_rows[arr_sudo_index[i_elim_index][1]],arr_sudo_solutions);sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_sudo_regions[arr_sudo_index[i_elim_index][2]],arr_sudo_solutions);}function sudo_eliminate_solution_do(i_elim_index,i_number_to_remove,arr_perform_in){for(i=0,i_length=arr_perform_in.length;i<i_length;i++){i_index=arr_perform_in[i];if(i_index!=i_elim_index){arr_new_array=new Array();for(a=0,a_length=arr_sudo_solutions[i_index][0].length;a<a_length;a++){var i_this_solution=arr_sudo_solutions[i_index][0][a];i_this_solution!=i_number_to_remove?arr_new_array[arr_new_array.length]=i_this_solution:false;}arr_sudo_solutions[i_index][0]=arr_new_array;}}}function sudo_eliminate_human(bol_start_over,i_index,i_value){if(bol_start_over){arr_sudo_solutions=sudo_init_solution_array();sudo_reset_solutions();for(j=0,j_length=i_sudo_field_no;j<j_length;j++){if(arr_sudo_solutions[j][0].length==1){sudo_eliminate_solution(j,arr_sudo_solutions[j][0][0],true);}}}else{sudo_eliminate_solution(i_index,i_value,true);}}function sudo_input_change(bol_start_over,i_index,i_value){if(sudo_validate_input(i_value)||i_value==''){sudo_eliminate_human(bol_start_over,i_index,sudo_translate_input(i_value,false));sudo_update_field_info(i_index);if(i_value!=''){sudo_test_input(i_index);}}else if(i_value!=''){arr_sudo_input_fields[i_index].value=old_val;}i_sudo_field_cnt=0;for(i=0;i<i_sudo_field_no;i++){if(arr_sudo_input_fields[i].value!=''){i_sudo_field_cnt++;}}if(i_sudo_field_cnt==i_sudo_field_no&&sudo_solve(true)){sudo_timer(1);sudo_status('Felicitaciones!!! Juego resuelto correctamente.');}else if(i_sudo_field_cnt==i_sudo_field_no){sudo_status('Solución incorrecta.');}}function sudo_test_input(i_index){if(bol_sudo_test_input){if(sudo_solve(true)){arr_sudo_input_fields[i_index].style.backgroundColor='#0e0';sudo_status('Sin errores.');}else{arr_sudo_input_fields[i_index].style.backgroundColor='#f99';sudo_status('Hay errores!');}}}
