344 tokens in C for part 1 by dbasden
Download solution
#include<stdio.h>
chargrid[40960]
intreplanted_grid[40960]
inti,j,width
longinttotal
intarea[1024],perimeter[1024]
staticvoidreplant(intpos,intfrom,intto){
if(grid[pos]!=from)return
replanted_grid[pos]=to
grid[pos]+=32
replant(pos-144,from,to)replant(pos-1,from,to)
replant(pos+144,from,to)replant(pos+1,from,to)
}
staticintreplant_everything(){
intnext_colour=1
for(i=145i<40815++i){
intch=grid[i]
if(ch>='A'&&ch<='Z')replant(i,ch,next_colour++)
}
returnnext_colour
}
intmain(){
char*p=&(grid[1])
while(scanf("%s%n",(char*)(p+=144),&width)==1)
intmax_ch=replant_everything()
for(i=144+1i<40960-144-1++i){
intch=replanted_grid[i]
if(replanted_grid[i]){
area[ch]++
perimeter[ch]+=(replanted_grid[i-144]!=ch)+(replanted_grid[i-1]!=ch)+(replanted_grid[i+144]!=ch)+(replanted_grid[i+1]!=ch)
}
}
for(intch=1ch<max_chch++)if(area[ch])total+=area[ch]*perimeter[ch]
printf("%ld\n",total)
}