File tree Expand file tree Collapse file tree 4 files changed +118
-16
lines changed Expand file tree Collapse file tree 4 files changed +118
-16
lines changed Original file line number Diff line number Diff line change 1+ 2333133121414131402
Original file line number Diff line number Diff line change 1+ package  main
2+ 
3+ import  (
4+ 	"bufio" 
5+ 	"fmt" 
6+ 	"os" 
7+ 
8+ 	"github.com/fxnn/adventofcode2024/util" 
9+ )
10+ 
11+ const  FREE  =  - 1 
12+ 
13+ func  calculateDiskBlocks (diskMap  string ) []int  {
14+ 	var  diskBlocks  =  []int {}
15+ 
16+ 	var  freeSpace  =  false 
17+ 	var  fileId  =  0 
18+ 	for  _ , b  :=  range  diskMap  {
19+ 		var  blockCount  =  util .Atoi (string (b ))
20+ 		var  blockUsage  int 
21+ 		if  freeSpace  {
22+ 			blockUsage  =  FREE 
23+ 		} else  {
24+ 			blockUsage  =  fileId 
25+ 			fileId ++ 
26+ 		}
27+ 		diskBlocks  =  append (diskBlocks , util .Times (blockCount , blockUsage )... )
28+ 		freeSpace  =  ! freeSpace 
29+ 	}
30+ 
31+ 	return  diskBlocks 
32+ }
33+ 
34+ func  printDiskBlocks (diskBlocks  []int ) {
35+ 	for  _ , b  :=  range  diskBlocks  {
36+ 		if  b  ==  FREE  {
37+ 			fmt .Print ("." )
38+ 		} else  {
39+ 			fmt .Printf ("%d" , b )
40+ 		}
41+ 	}
42+ }
43+ 
44+ func  compact (in  []int ) []int  {
45+ 	var  out  =  make ([]int , len (in ))
46+ 	var  j  =  len (out ) -  1 
47+ 	for  i  :=  range  in  {
48+ 		for  j  >=  0  &&  in [j ] ==  FREE  {
49+ 			j -- 
50+ 		}
51+ 		if  i  >  j  {
52+ 			out [i ] =  FREE 
53+ 		} else  if  in [i ] ==  FREE  {
54+ 			out [i ] =  in [j ]
55+ 			j -- 
56+ 		} else  {
57+ 			out [i ] =  in [i ]
58+ 		}
59+ 	}
60+ 	return  out 
61+ }
62+ 
63+ func  checksum (diskBlocks  []int ) int  {
64+ 	var  checksum  =  0 
65+ 	for  i , b  :=  range  diskBlocks  {
66+ 		if  b  !=  FREE  {
67+ 			checksum  +=  i  *  b 
68+ 		}
69+ 	}
70+ 	return  checksum 
71+ }
72+ 
73+ func  main () {
74+ 	scanner  :=  bufio .NewScanner (os .Stdin )
75+ 	scanner .Split (bufio .ScanLines )
76+ 
77+ 	scanner .Scan ()
78+ 	var  diskMap  =  scanner .Text ()
79+ 
80+ 	var  diskBlocks  =  calculateDiskBlocks (diskMap )
81+ 	printDiskBlocks (diskBlocks )
82+ 	fmt .Println ()
83+ 
84+ 	diskBlocks  =  compact (diskBlocks )
85+ 	printDiskBlocks (diskBlocks )
86+ 	fmt .Println ()
87+ 
88+ 	var  checksum  =  checksum (diskBlocks )
89+ 	fmt .Printf ("checksum: %d\n " , checksum )
90+ }
Original file line number Diff line number Diff line change 1+ package  util
2+ 
3+ import  "fmt" 
4+ 
5+ func  Times [T  any ](size  int , value  T ) []T  {
6+ 	a  :=  make ([]T , size )
7+   for  i  :=  range  a  {
8+ 		a [i ] =  value 
9+ 	}
10+ 	return  a 
11+ }
12+ 
13+ // RemoveElement removes element with given index from slice 
14+ func  RemoveElement (slice  []int , index  int ) ([]int , error ) {
15+ 	if  index  <  0  ||  index  >=  len (slice ) {
16+ 		return  nil , fmt .Errorf ("index out of range" )
17+ 	}
18+ 
19+ 	// Create a new slice and copy the elements before the index 
20+ 	newSlice  :=  make ([]int , 0 , len (slice )- 1 )
21+ 	newSlice  =  append (newSlice , slice [:index ]... )
22+ 
23+ 	// Append the elements after the index 
24+ 	newSlice  =  append (newSlice , slice [index + 1 :]... )
25+ 
26+ 	return  newSlice , nil 
27+ }
Original file line number Diff line number Diff line change @@ -52,19 +52,3 @@ func Sign(x int) int {
5252	}
5353	return  - 1 
5454}
55- 
56- // RemoveElement removes element with given index from slice 
57- func  RemoveElement (slice  []int , index  int ) ([]int , error ) {
58- 	if  index  <  0  ||  index  >=  len (slice ) {
59- 		return  nil , fmt .Errorf ("index out of range" )
60- 	}
61- 
62- 	// Create a new slice and copy the elements before the index 
63- 	newSlice  :=  make ([]int , 0 , len (slice )- 1 )
64- 	newSlice  =  append (newSlice , slice [:index ]... )
65- 
66- 	// Append the elements after the index 
67- 	newSlice  =  append (newSlice , slice [index + 1 :]... )
68- 
69- 	return  newSlice , nil 
70- }
    
 
   
 
     
   
   
          
     
  
    
     
 
    
      
     
 
     
    You can’t perform that action at this time.
  
 
    
  
     
    
      
        
     
 
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments