### re: Daily Challenge #29 - Xs and Os VIEW POST

re: Is it allowed to modify someone else’s solution? I think you made it a bit more complicated than necessary. Anyone please correct me if I’m wrong: ...

I wrote this too fast without even thinking too much, so once again, I appreciate your comment. Anyway, I know that inlining helps, but speed wasn't on my priority list for this challenge. :)

Here are my results:

My code: ~1140 nsec

Thumbs up for faster code.

P.S.
I suspected that `strlen` might be the culprit, and I was right.

If I change the code like this, I get results similar to yours, around 500 nsec more/less

``````static bool count_xo(const char* d, size_t l){
// null pointer
if(!d) return true;
// no data
if(!l) return true;
// res counters
unsigned xc = 0, oc = 0;
// mid point
unsigned mp = l / 2, rm = l % 2;
// check for 88 (X) and 79 (O)
// O(N/2)
for(unsigned i = 0, j = l - 1; i < mp; i++, j--){
// X counter
xc += check_x(d[i]) + check_x(d[j]);
// O counter
oc += check_o(d[i]) + check_o(d[j]);
}
// remainder
if(rm){
// X counter
xc += check_x(d[mp + 1]);
// O counter
oc += check_o(d[mp + 1]);
}

// res
return xc == oc;
}

``````

Nice. I didn’t inline for speed, but for compactness, so that people don’t say C is too complicated, so verbose, etc. :-)

C is my baby, just started embedded C on SBCs, mostly arm 32bit. And people will always say that 🤣👍

code of conduct - report abuse