diff --git a/main/steps/wires_puzzle.cpp b/main/steps/wires_puzzle.cpp index 1d2c2da..8499c14 100644 --- a/main/steps/wires_puzzle.cpp +++ b/main/steps/wires_puzzle.cpp @@ -27,10 +27,10 @@ void wires_to_string(WireColor* wires, char* out_wires_string) { out_wires_string[i] = 'g'; break; case WireColor::blue: - out_wires_string[i] = 'u'; + out_wires_string[i] = 'b'; break; case WireColor::black: - out_wires_string[i] = 'b'; + out_wires_string[i] = 'k'; break; case WireColor::white: out_wires_string[i] = 'w'; @@ -60,10 +60,10 @@ void string_to_wires(char* wires_string, WireColor* out_wires) { case 'g': out_wires[i] = WireColor::green; break; - case 'u': + case 'b': out_wires[i] = WireColor::blue; break; - case 'b': + case 'k': out_wires[i] = WireColor::black; break; case 'w': @@ -176,37 +176,45 @@ void solve_wires(WireColor* wires, bool* out_cut) { // CUT CHECKS - // cut the second wire of all most common colors + // 1. cut the second wire of all most common colors int max_len = max(red_pos_len, yellow_pos_len, green_pos_len, blue_pos_len, black_pos_len, white_pos_len); if (max_len >= 2) { for (int i = 0; i < NUM_COLORS; i++) { if (list_pos_len[i] == max_len) { int idx = list_pos[i][1]; out_cut[idx] = true; + ESP_LOGI(TAG, "1. cutting %d", idx); } } } - // cut the first wire if it is green or white - if (wires[0] == WireColor::green || wires[0] == WireColor::white) out_cut[0] = true; - - // cut blue wires in even positions (odd indexes) - for (int i = 1; i < NUM_WIRES; i += 2) { - if (wires[i] == WireColor::blue) out_cut[i] = true; + // 2. cut the first wire if it is green or white + if (wires[0] == WireColor::green || wires[0] == WireColor::white) { + out_cut[0] = true; + ESP_LOGI(TAG, "2. cutting %d", 0); } - // cut black and yellow wires next to black and yellow wires + // 3. cut blue wires in even positions (odd indexes) + for (int i = 1; i < NUM_WIRES; i += 2) { + if (wires[i] == WireColor::blue) { + out_cut[i] = true; + ESP_LOGI(TAG, "3. cutting %d", i); + } + } + + // 4. cut black and yellow wires next to black and yellow wires for (int i = 0; i < NUM_WIRES-1; i++) { if ( (wires[i] == WireColor::yellow || wires[i] == WireColor::black) && (wires[i+1] == WireColor::yellow || wires[i+1] == WireColor::black) ) { out_cut[i] = true; - out_cut[1] = true; + out_cut[i+1] = true; + ESP_LOGI(TAG, "4. cutting %d, %d", i, i+1); } } - // cut the last green wire next to a yellow or white wire + // 5. cut the last green wire next to a yellow or white wire for (int green_idx = green_pos_len-1; green_idx >= 0; green_idx--) { int pos = green_pos[green_idx]; if ( @@ -216,23 +224,26 @@ void solve_wires(WireColor* wires, bool* out_cut) { wires[pos+1] == WireColor::white ) { out_cut[pos] = true; + ESP_LOGI(TAG, "5. cutting %d", pos); break; } } - // cut all white wires if there is a red wire in the 5th position + // 6. cut all white wires if there is a red wire in the 5th position if (wires[4] == WireColor::red) { for (int white_idx = 0; white_idx < white_pos_len; white_idx++) { out_cut[white_pos[white_idx]] = true; + ESP_LOGI(TAG, "6. cutting %d", white_pos[white_idx]); } } - // cut the first black wire if there are more white wires than green wires + // 7. cut the first black wire if there are more white wires than green wires if (white_pos_len > green_pos_len && black_pos_len > 0) { out_cut[black_pos[0]] = true; + ESP_LOGI(TAG, "7. cutting %d", black_pos[0]); } - // cut all wires in an alternating pattern of 2 colors at least 4 wires long + // 8. cut all wires in an alternating pattern of 2 colors at least 4 wires long for (int i = 0; i < NUM_WIRES-3; i++) { if ( wires[i] == wires[i+2] && @@ -243,35 +254,40 @@ void solve_wires(WireColor* wires, bool* out_cut) { out_cut[i+1] = true; out_cut[i+2] = true; out_cut[i+3] = true; + ESP_LOGI(TAG, "8. cutting %d, %d, %d, %d", i, i+1, i+2, i+3); } } - // cut any wires if their position matches the number of letters in the color's name + // 9. cut any wires if their position matches the number of letters in the color's name for (int i = 0; i < NUM_WIRES; i++) { - if (color_name_len[i] == i+1) { + if (color_name_len[wires[i]] == i+1) { out_cut[i] = true; + ESP_LOGI(TAG, "9. cutting %d", i); } } - // cut all red wires if there are no more than 2 wires of the same color + // 10. cut all red wires if there are no more than 2 wires of the same color if (max_len <= 2) { for (int i = 0; i < red_pos_len; i++) { out_cut[red_pos[i]] = true; + ESP_LOGI(TAG, "10. cutting %d", red_pos[i]); } } - // cut the last wire if it is the same color as the first wire + // 11. cut the last wire if it is the same color as the first wire if (wires[0] == wires[NUM_WIRES-1]) { out_cut[NUM_WIRES-1] = true; + ESP_LOGI(TAG, "11. cutting %d", NUM_WIRES-1); } - // cut any wire adjacent to both a yellow and blue wire + // 12. cut any wire adjacent to both a yellow and blue wire for (int i = 0; i < NUM_WIRES-2; i++) { if ( (wires[i] == WireColor::yellow && wires[i+2] == WireColor::blue) || (wires[i] == WireColor::blue && wires[i+2] == WireColor::white) ) { out_cut[i+1] = true; + ESP_LOGI(TAG, "12. cutting %d", i+1); } }