Found a C per-char solution, that is, no lines, splitting, lookahead, etc. It wasn't even necessary to keep match lengths for the color names because they all have unique characters, e.g. 'b' only occurs in "blue" so then you can attribute the count to that color.
int main()
{
int p1=0,p2=0, id=1,num=0, r=0,g=0,b=0, c;
while ((c = getchar()) != EOF)
if (c==',' || c==';' || c==':') num = 0; else
if (c>='0' && c<='9') num = num*10 + c-'0'; else
if (c=='d') r = MAX(r, num); else
if (c=='g') g = MAX(g, num); else
if (c=='b') b = MAX(b, num); else
if (c=='\n') {
p1 += (r<=12 && g<=13 && b<=14) * id;
p2 += r*g*b;
r=g=b=0; id++;
}
printf("%d %d\n", p1, p2);
return 0;
}
Golfed:
c,p,P,i,n,r,g,b;main(){while(~
(c=getchar()))c==44|c==58|59==
c?n=0:c>47&c<58?n=n*10+c-48:98
==c?b=b>n?b:n:c=='d'?r=r>n?r:n
:c=='g'?g=g>n?g:n:10==c?p+=++i
*(r<13&g<14&b<15),P+=r*g*b,r=g
=b=0:0;printf("%d %d\n",p,P);}