feat(day_3): part B done in a realistic way

This commit is contained in:
2025-12-03 21:03:11 +01:00
parent 8c57f72d0b
commit 0bd3379269
2 changed files with 45 additions and 22 deletions

View File

@@ -6,4 +6,4 @@
| :-: | :-------------- | :----: | :----: | | :-: | :-------------- | :----: | :----: |
| 1 | Secret Entrance | ⭐ | ⭐ | | 1 | Secret Entrance | ⭐ | ⭐ |
| 2 | Gift Shop | ⭐ | ⭐ | | 2 | Gift Shop | ⭐ | ⭐ |
| 3 | Lobby | ⭐ | | | 3 | Lobby | ⭐ | |

View File

@@ -48,14 +48,39 @@ export function find_largest_joltage_sum_unlimited(
let total_joltage = 0; let total_joltage = 0;
battey_bank_list.forEach((bank) => { battey_bank_list.forEach((bank) => {
let max_binomial_bank = 0; if (bank.length === 0) {
return;
}
let bank_joltage_str = "";
for (let limit = LIMIT - 1; limit >= 0; limit--) {
// [>] Find biggest number
let biggest_battery_index = 0;
let biggest_battery = bank[biggest_battery_index];
for (let b_index = 0; b_index < bank.length - limit; b_index++) {
if (bank[b_index] > biggest_battery) {
biggest_battery_index = b_index;
biggest_battery = bank[b_index];
}
}
// [>] Slice array
bank = bank.splice(biggest_battery_index + 1);
bank_joltage_str += biggest_battery.toString();
}
total_joltage += parseInt(bank_joltage_str);
});
for (let nc = 0; nc <= Math.pow(2, bank.length); nc += 1) { return total_joltage;
}
// NOTE: this was fun but REALLY inefficient
function find_largest_bank_joltage(bank: BatteryBank, limit: number): number {
let max_unlimited_bank = 0;
for (let nc = 0; nc <= BigInt(Math.pow(2, bank.length)); nc += 1) {
// NOTE: this only works with possitibe numbers, for negative: (nc >>> 0).toString(2) // NOTE: this only works with possitibe numbers, for negative: (nc >>> 0).toString(2)
const binary_nc = nc.toString(2).padStart(bank.length, "0").split(""); const binary_nc = nc.toString(2).padStart(bank.length, "0").split("");
// PERF: REAL dirt over here // PERF: REAL dirt over here
if ( if (
binary_nc.reduce((sum, n) => sum + (n === "1" ? 1 : 0), 0) !== LIMIT binary_nc.reduce((sum, n) => sum + (n === "1" ? 1 : 0), 0) !== limit
) { ) {
continue; continue;
} }
@@ -65,14 +90,12 @@ export function find_largest_joltage_sum_unlimited(
return result; return result;
}, "")); }, ""));
if (summatory > max_binomial_bank) { if (summatory > max_unlimited_bank) {
max_binomial_bank = summatory; max_unlimited_bank = summatory;
} }
} }
total_joltage += max_binomial_bank;
});
return total_joltage; return max_unlimited_bank;
} }
export async function read_battery_joltage_list( export async function read_battery_joltage_list(