From e6c410630fceff84f92773f6750dca289b6b9e35 Mon Sep 17 00:00:00 2001 From: sgf Date: Mon, 20 Dec 2021 22:51:05 +0300 Subject: [PATCH] refactor(go/day3-2): Group common code. --- day3/main.go | 58 ++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/day3/main.go b/day3/main.go index 59afa6c..90fce4d 100644 --- a/day3/main.go +++ b/day3/main.go @@ -67,12 +67,12 @@ func RunF1(input string) { if err != nil { return } defer h0.Close() - bc, nums, err := parseDiag(h0) + bc, _, err := parseDiag(h0) if err != nil { fmt.Printf("Error: %v\n", err) return } - fmt.Printf("bc=%v, nums=%v\n", bc, nums) + fmt.Printf("bc=%v\n", bc) gamma, epsilon := f1(bc) //findSimilar(gamma, nums) //fmt.Printf("%0b\n", (^t<<27)>>27) @@ -91,7 +91,7 @@ func groupByBit (bit uint32, nums []uint32) (bc BitGroup) { bc.ones = make([]uint32, 0) bc.zeros = make([]uint32, 0) var mask uint32 = 1<= 0 && len(nums) > 1; i-- { //fmt.Printf("Grouping numbers %0b\n", nums) bg := groupByBit(uint32(i), nums) - if len(bg.ones) >= len(bg.zeros) { - nums = bg.ones - } else { - nums = bg.zeros - } + nums = choose(bg) //fmt.Printf("Groups by bit 2^%d are 1=%0b(%d) and 0=%0b(%d)\n", i, bg.ones, len(bg.ones), bg.zeros, len(bg.zeros)) } + if len(nums) == 1 { - oxygen = nums[0] - fmt.Printf("Found number %d (%0b)\n", nums[0], nums[0]) - } else { - panic("Impossible, more than one oxygen number left") + //fmt.Printf("Found number %d (%0b)\n", nums[0], nums[0]) + return nums[0] } + panic("Impossible, more than one number left.") +} - nums = allNums - for i := maxBit - 1; i >= 0 && len(nums) > 1; i-- { - fmt.Printf("Grouping numbers %0b\n", nums) - bg := groupByBit(uint32(i), nums) - if len(bg.ones) >= len(bg.zeros) { - nums = bg.zeros - } else { - nums = bg.ones +func f2 (maxBit int, nums []uint32) (oxygen uint32, co2 uint32) { + mostCommon := func (gr BitGroup) []uint32 { + if len(gr.ones) >= len(gr.zeros) { + return gr.ones } - fmt.Printf("Groups by bit 2^%d are 1=%0b(%d) and 0=%0b(%d)\n", - i, bg.ones, len(bg.ones), bg.zeros, len(bg.zeros)) + return gr.zeros } - fmt.Printf("Left %0b\n", nums) - if len(nums) == 1 { - co2 = nums[0] - fmt.Printf("Found number %d (%0b)\n", nums[0], nums[0]) - } else { - panic("Impossible, more than one co2 number left") + oxygen = findNumber(maxBit, nums, mostCommon) + + leastCommon := func (gr BitGroup) []uint32 { + if len(gr.ones) >= len(gr.zeros) { + return gr.zeros + } + return gr.ones } + co2 = findNumber(maxBit, nums, leastCommon) return } @@ -156,8 +148,8 @@ func RunF2(input string) { fmt.Printf("Error: %v\n", err) return } - fmt.Printf("bc=%v, nums=%v (%d)\n", bc, nums, len(nums)) + //fmt.Printf("bc=%v, nums=%v (%d)\n", bc, nums, len(nums)) oxygen, co2 := f2(len(bc), nums) - fmt.Printf("Answer1: %d (%d, %d)\n", oxygen * co2, oxygen, co2) + fmt.Printf("Answer2: %d (%d, %d)\n", oxygen * co2, oxygen, co2) } -- 2.20.1