aoc2024

advent of code 2024 version unix - retour accueil

git clone git://bebou.netlib.re/aoc2024
Log | Files | Refs |

6.solve (2876B)


      1 #! /bin/sh
      2 
      3 < 6.input awk '
      4 function printboard() {
      5 	for(i=0;i<size;i++) {
      6 		for(j=0;j<size;j++) printf f[i,j]
      7 		printf "\n"
      8 	}
      9 	printf "\n"
     10 }
     11 {
     12 	split($0,a,"")
     13 	size=length(a)
     14 	for(i=0;i<size;i++){
     15 		if(a[i+1]~ /[><^v]/ ) { startr=NR-1;startc=i }
     16 		f[NR-1,i]=a[i+1]
     17 	}
     18 }
     19 END {
     20 	curr=startr;curc=startc;
     21 	#print f[curr,curc]
     22 	#print size
     23 	#f[15,62]="#"
     24 	do {
     25 		#printboard()
     26 		if (f[curr,curc]=="^") {
     27 			if (f[curr-1,curc]=="#") {
     28 				f[curr,curc]=">"
     29 			} else {
     30 				f[curr,curc]="X"
     31 				curr=curr-1
     32 				f[curr,curc]="^"
     33 			}
     34 		} else if (f[curr,curc]==">") {
     35 			if (f[curr,curc+1]=="#") {
     36 				f[curr,curc]="v"
     37 			} else {
     38 				f[curr,curc]="X"
     39 				curc=curc+1
     40 				f[curr,curc]=">"
     41 			}
     42 		} else if (f[curr,curc]=="v") {
     43 			if (f[curr+1,curc]=="#") {
     44 				f[curr,curc]="<"
     45 			} else {
     46 				f[curr,curc]="X"
     47 				curr=curr+1
     48 				f[curr,curc]="v"
     49 			}
     50 		} else {
     51 			if (f[curr,curc-1]=="#") {
     52 				f[curr,curc]="^"
     53 			} else {
     54 				f[curr,curc]="X"
     55 				curc=curc-1
     56 				f[curr,curc]="<"
     57 			}
     58 		}
     59 	} while ( 0<curr && 0<curc && curr<size && curc<size )
     60 	f[curr,curc]="X"
     61 	f[startr,startc]="^"
     62 	printboard()
     63 }
     64 ' | sed '$d' > res
     65 grep -o "[X^]" res | wc -l
     66 
     67 < res awk '
     68 function printboard() {
     69 	for(i=0;i<size;i++) {
     70 		for(j=0;j<size;j++) printf fcopy[i,j]
     71 		printf "\n"
     72 	}
     73 	printf "\n"
     74 }
     75 {
     76 	split($0,a,"")
     77 	size=length(a)
     78 	for(i=0;i<size;i++){
     79 		if(a[i+1] ~ /[><^v]/ ) { startr=NR-1;startc=i }
     80 		f[NR-1,i]=a[i+1]
     81 	}
     82 }
     83 END {
     84 	#print f[curr,curc]
     85 	#print size
     86 	for(p=0;p<size;p++) {
     87 		for(l=0;l<size;l++) {
     88 			if (f[p,l] !~ /X/) continue
     89 			curr=startr;curc=startc;
     90 			delete fcopy
     91 			for(w=0;w<size;w++) {
     92 				for(x=0;x<size;x++) fcopy[w,x]=f[w,x]
     93 			}
     94 			block=p","l
     95 			print "putting block in"p","l
     96 			fcopy[p,l]="#"
     97 			count=0
     98 			do {
     99 				if (count++>500000) { print "block at "p","l;break;}
    100 				if (fcopy[curr,curc]=="^") {
    101 					if (fcopy[curr-1,curc]=="^") { print "block at "p","l ; break; }
    102 					if (fcopy[curr-1,curc]=="#") fcopy[curr,curc]=">"
    103 					else {
    104 						fcopy[curr,curc]="^"
    105 						curr=curr-1
    106 						fcopy[curr,curc]="^"
    107 					}
    108 				} else if (fcopy[curr,curc]==">") {
    109 					if (fcopy[curr,curc+1]==">") { print "block at "p","l ; break; }
    110 					if (fcopy[curr,curc+1]=="#") fcopy[curr,curc]="v"
    111 					else {
    112 						fcopy[curr,curc]=">"
    113 						curc=curc+1
    114 						fcopy[curr,curc]=">"
    115 					}
    116 				} else if (fcopy[curr,curc]=="v") {
    117 					if (fcopy[curr+1,curc]=="v") { print "block at "p","l ; break; }
    118 					if (fcopy[curr+1,curc]=="#") fcopy[curr,curc]="<"
    119 					else {
    120 						fcopy[curr,curc]="v"
    121 						curr=curr+1
    122 						fcopy[curr,curc]="v"
    123 					}
    124 				} else {
    125 					if (fcopy[curr,curc-1]=="<") { print "block at "p","l ; break; }
    126 					if (fcopy[curr,curc-1]=="#") fcopy[curr,curc]="^"
    127 					else {
    128 						fcopy[curr,curc]="<"
    129 						curc=curc-1
    130 						fcopy[curr,curc]="<"
    131 					}
    132 				}
    133 			 }while ( 0<curr && 0<curc && curr<size && curc<size )
    134 		}
    135 	}
    136 }
    137 ' | grep "block at" | wc -l