[D]8/6P1/4b3/2p5/4k3/p1B1p3/p1P1K3/8 b - - 0 83
It seems some engines still need alot of work in endgame fundamentals. It is very easy for a human player to recognize this is a draw due to opposite colored bishops. I find it amusing that this basic knowledge is not found it many top engines. The trick is to get to these drawish positions, no easy task.
Does your engine see this position as a draw ?
Moderators: hgm, Rebel, chrisw
-
- Posts: 1280
- Joined: Tue Aug 18, 2009 3:06 am
-
- Posts: 6442
- Joined: Tue Jan 09, 2007 12:31 am
- Location: PA USA
- Full name: Louis Zulli
Re: Does your engine see this position as a draw ?
Stockfish-1.6.3 (8 threads) does not seem to see a draw, though of course it isn't finding a win either:Robert Flesher wrote:[D]8/6P1/4b3/2p5/4k3/p1B1p3/p1P1K3/8 b - - 0 83
It seems some engines still need alot of work in endgame fundamentals. It is very easy for a human player to recognize this is a draw due to opposite colored bishops. I find it amusing that this basic knowledge is not found it many top engines. The trick is to get to these drawish positions, no easy task.
Code: Select all
Searching: 8/6P1/4b3/2p5/4k3/p1B1p3/p1P1K3/8 b - -
infinite: 1 ponder: 0 time: 0 increment: 0 moves to go: 0
2 +2.59 00:01 234 Bc4+ Kd1 Bg8
3 +2.10 00:01 583 Bc4+ Kd1 Bg8 Ke2
4 +2.30 00:01 1148 Bc4+ Kd1 Be6 Ba1 Bg8
5 +2.14 00:01 1757 Bc4+ Kd1 Be6 Ba1 Bg8 Ke2 Bc4+ Kd1
6 +2.14 00:01 3353 Bc4+ Kd1 Be6 Ba1 Bg8 Ke2 Bc4+ Kd1
7 +2.06 00:01 5218 Bc4+ Kd1 Be6 Ba1 Bg8 Ke2 Bc4+ Kd1 Be6
8 +2.02 00:01 12353 Bc4+ Kd1 Be6 Bf6 Bg8 Ke2 Bc4+ Kd1 Bf7 Ba1 Bg8 Ke2
Bc4+ Kd1 Kf5 c3
9 +2.02 00:01 22024 Bc4+ Kd1 Be6 Bf6 Bg8 Bc3 Bc4 Bf6 Bf7 Ba1 Bd5 Bf6
Bf7
10 +2.10 00:01 40078 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf5 Ke1 Kf4 Kd1
Bg8 Ke2 Ke4 Kd1 Bf7 Bc3 Bc4
11 +1.94 00:01 63743 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Bd5 Ke1 Bf7 Ke2
Bh5+ Ke1 Bf7
12 +1.94 00:01 87146 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Bd5 Ke1 Bf7 Ke2
Bh5+ Ke1 Bf7
13 +2.02 00:01 137867 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Bd5 Ke1 Bf7 Kd1
Be6 Ke2 Bg4+ Ke1
14 +2.02 00:01 185746 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Bd5 Ke1 Kf3 Bc3
Bc4 Kd1 Bg8 Ke1 Kf4 Ba1 Kg5
15 +1.98 00:01 286116 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Bd5 Ke1 Kf3 Bc3
Bg8 Ba1 Bf7 Bf6 Bc4 Ba1 Bf7
16 +1.98 00:01 456067 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Bd5 Ke1 Kf3 Bc3
Bg8 Ba1 Bf7 Kd1 Ke4 Ke1 Bg8 Ke2 Bc4+ Kd1
17 +2.02 00:01 760244 Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf3 Ke1 Bg8 Bc3
Kf4 Ba1 Bd5 Kd1 Bc4 Kc1 Kf3
18 +2.02 00:01 1135k Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf3 Ke1 Bg8 Bc3
Kf4 Ba1 Bd5 Ke2 Bc4+ Ke1 Kf5 Kd1 Bg8 Ke1 Bc4
19 +2.02 00:01 1665k Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf3 Ke1 Bg8 Bc3
Kf4 Ba1 Bd5 Ke2 Bc4+ Ke1 Bg8 Kd1 Kf3 Bf6 Kf2 Bh4+
Kf1
20 +2.02 00:01 2488k Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf3 Ke1 Bg8 Bc3
Kf4 Ba1 Bd5 Ke2 Bc4+ Ke1 Kf3 Bc3 Bg8 Bf6 Bc4 Bc3
21 +2.02 00:01 3897k Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf3 Ke1 Bg8 Bc3
Kf4 Ba1 Bd5 Ke2 Bc4+ Ke1 Bg8 Ke2 Be6 Kd1 Kf3 Bc3
Kf4 Ba1
22 +1.98 00:02 6105k Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf3 Ke1 Bg8 Bc3
Kf4 Ba1 Bd5 Ke2 Bc4+ Ke1 Bg8 Ke2 Bf7 Kd1 Kf3 Ke1
Kf4 Kd1
23 +2.02 00:02 9270k Bc4+ Kd1 Be6 Ke1 Bg8 Kd1 Bc4 Ba1 Kf3 Ke1 Bg8 Bc3
Kf4 Ba1 Bd5 Ke2 Bc4+ Ke1 Kg5 Bc3 Kg4 Bf6 Kf5 Bc3
Bg8 Ke2 Ke4 Ba1 Bc4+ Ke1 Bd5 Ke2 Kf4 Kd3 Bf7 c4
Kf3 Kc3 Be6 Kb3 e2
24 +2.10 00:03 18710k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Bg8 Kd2 Bf7 Ke2 Be6 Kd2 Bd5 Ke2 Bc4+
Kd2 Be6 Ke2 Bd5 Kd1 Bc6 Kd2 Bd5
25 +2.10 00:04 25608k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Bg8 Kd2 Be6 Ke2 c4 Kd2 Kd5 Kc3 Kc5
Kd2 Bf5 Kc3 Kd5 Kd2 Kc5
26 +2.10 00:05 37316k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Bg8 Kd2 Be6 Ke2 c4 Kd2 Kd5 Kc3 Kc5
Kd2 Bf5 Kc3 Kd5 Kd2 Kc5
27 +2.10 00:07 55713k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Bg8 Kd2 Be6 Ke2 c4 Kd2 Kd5 Kc3 Kc5
Kd2 Bf5 Kc3 Kd5 Kd2 Be4 Kc3
28 +2.06 00:11 97535k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Bg8 Kd2 Be6 Ke2 c4 Kd2 Kd5 Kc3 Kc5
Kd2 Bf5 Kc3 Kd5 Kd2 Be4 Kc3
29 +2.10 00:18 171801k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Bg8 Kd2 Be6 Ke2 c4 Kd2 Kd5 Kc3 Kc5
Kd2 Bf5 Kc3 Be4 Kd2 Kb4 Bc3+ Ka4 Ba1
30 +2.10 00:27 262551k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Bg8 Kd2 Be6 Ke2 c4 Kd2 Kd5 Kc3 Kc5
Kd2 Bf5 Kc3 Be4 Kd2 Bd5 Kc1 Kb4 Kd2 Be4 Bc3+ Kb5
Ba1 Kc5 Kc1 Kb4
31 +2.14 00:40 397796k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Be6 Kd2 Bf7 Ke2 Bc4+ Kd2 Be6 Ke2 c4
Kd2 Kd5 Kc3 Kc5 Kd2 Bf5 Kc3 Be4 Kd2 Kb4 Kc1 Bf5
Kd2 Be4
32 +2.14 01:05 654997k Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Be6 Kd2 Bf7 Ke2 Bc4+ Kd2 Be6 Ke2 c4
Kd2 Kd5 Kc3 Kc5 Kd2 Bf5 Kc3 Bh7 Kd2 Bg8 Ke3 Be6
Kd2
33 +2.14 01:47 1096M Bc4+ Kd1 Kf5 Ba1 Kg6 g8=N Bxg8 Ke2 Kf5 Kxe3 Bc4
Kd2 Ke4 Kc3 Be6 Kd2 Bf7 Ke2 Bc4+ Kd2 Be6 Ke2 c4
Kd2 Kd5 Kc3 Kc5 Kd2 Bf5 Kc3 Bh7 Kd2 Be4 Bc3 Kd5
Ba1
34 < +1.94 03:18 2054M Bc4+ Kd1 Bg8 Ke1 Kf4 Ba1 Bc4 Bc3 e2 Ba1
35 +2.02 06:03 3792M Bc4+ Kd1 Bg8 Ke1 Kf4 Ba1 Bc4 Bc3 Kg4 Ba1 Kg5 Bc3
Kf5 Kd1 Ke4 Ba1 Kf3 Ke1 Bf7 Bf6 Bd5 Bc3 Ke4 Bf6
Kf5 Bc3 Kf4 Ke2 Bf7 Bf6 Bc4+ Ke1 Ke4 Ba1 Be6 Ke2
Bg4+ Ke1 Be6
36 +2.02 10:51 6795M Bc4+ Kd1 Bg8 Ke1 Kf4 Ba1 Bc4 Kd1 Kf5 Ke1 Ke4 Kd1
Kf3 Ke1 Bf7 Bf6 Bd5 Bc3 Ke4 Bf6 Kf5 Bc3 Kf4 Ke2
Bf7 Ke1 Ke4 Ba1 Kf5 Ke2 Kf4 Bc3 Be6 Ba1 Ke4 Bf6
Bg8 Ba1 Kf4
Nodes: 7056252086
Nodes/second: 10416162
Best move: Bc4+
Ponder move: Kd1
-
- Posts: 4583
- Joined: Sun Mar 12, 2006 2:40 am
- Full name:
Re: Does your engine see this position as a draw ?
I tried to give some extra knowledge to RainbowSerpent here, but the effect will never be dramatic; conventional chess programs will always give some extra points to Black because it has one doubled pluspawn and one passed pluspawn on the sixth, so that material advantage will always count if you are not absolutely certain there is no way to make progress. In opposite coloured Bishop endgames the advantages will just be halved by Stockfish/Glaurung for the stronger side, that is enough to try to avoid these endgames if you have something better. You could write up additional rules that would maybe be enough to detect most draws but it would just be so expensive in computation time and a little bit in added complexity of the code, that most programmers rather concentrate on other things. It is more the convenience for the user here that he would get quick confirmation that it is indeed what is obvious to a clubplayer; a dead draw. Not really an elo-necessity to give 0.00.Robert Flesher wrote:[D]8/6P1/4b3/2p5/4k3/p1B1p3/p1P1K3/8 b - - 0 83
It seems some engines still need alot of work in endgame fundamentals. It is very easy for a human player to recognize this is a draw due to opposite colored bishops. I find it amusing that this basic knowledge is not found it many top engines. The trick is to get to these drawish positions, no easy task.
But it was nice to try getting some knowledge in, Stockfish already knows if it is an opposite coloured Bishops endgame easily enough, it uses this rule to halve the eval more or less. I just added a little penalty for passed pawns in that case. I think the rule could be made more efficient but I better leave that to the real programmers. I avoided creating new global variables or new entries in the position object.
New code:
Code: Select all
if (pos.opposite_colored_bishops())
{
ebonus -= Value(r * 30);
bool oppositeColoredBishopsPawns = (pos.non_pawn_material(WHITE) == BishopValueMidgame
&& pos.non_pawn_material(BLACK) == BishopValueMidgame); // Only the two Bishops
if (bit_is_set(ei.attacked_by(Them, BISHOP),qsq) || (bit_is_set(ei.attacked_by(Them, BISHOP),blockSq)
&& (square_color(qsq) == square_color(blockSq))))
{
if (oppositeColoredBishopsPawns)
ebonus -= Value(tr * 6);
else
ebonus -= Value(tr * 3);
}
} // Wrong colour Bishop penalty in opposite coloured Bishop endgame
Code: Select all
// Add the scores for this pawn to the middle game and endgame eval.
ei.value += Sign[Us] * apply_weight(make_score(mbonus, ebonus), WeightPassedPawns);
} // while
}
This code as I programmed it now will influence the placing of the Bishops so I should not make the penalty too large, I wanted the rule to be flexible.
[D]8/6P1/4b3/2p5/4k3/p1B1p3/p1P1K3/8 b - -
Engine: Rainbow Serpent 1.6.3s(dc) Build 113 (Athlon 2009 MHz, 128 MB)
by Tord Romstad, Marco Costalba, Joona Kiiski Modifications: Dann Corbit
1.00 0:00 +1.77 1...Bc4+ (136) 1
2.00 0:00 +1.65 1...Bc4+ 2.Kd1 a1R+ 3.Bxa1 (282) 2
3.00 0:00 +1.61 1...Bc4+ 2.Kd1 Kf4 3.Bf6 (787) 6
4.00 0:00 +1.57 1...Bc4+ 2.Kd1 Kf4 3.Kc1 Ke4 (2.471) 19
5.00 0:00 +1.61 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Kf5 4.g8N Bxg8 (4.126) 29
6.00 0:00 +1.53 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Kf5 4.g8N Bxg8
5.Bc3 (7.472) 52
7.00 0:00 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Bc3 Bd5
5.Ke2 Bc4+ 6.Kd1 (11.848) 84
8.00 0:00 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Bc3 Bd5
5.Ke2 Bc4+ 6.Kd1 (15.105) 96
9.00 0:00 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Bc3 Bd5
5.Ke1 Bc4 6.Kd1 a1R+ 7.Bxa1 Ke4
8.Bc3 (22.104) 140
10.00 0:00 +1.45 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Bc3 Bd5
5.Ke1 Bc4 6.Kd1 a1R+ 7.Bxa1 Ke4
8.Bc3 (40.984) 218
11.00 0:00 +1.45 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kd5 6.Ke2 Kc4 7.Be5 (71.023) 302
12.00 0:00 +1.57 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Kd1 Bc4 7.Bf6 Kf4 8.Ke1 Kg4
9.g8B Bxg8 10.Ke2 Kf5 (179.911) 499
13.00 0:00 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Bc3 Kg4 8.Bf6 Kf3 (217.419) 534
14.00 0:00 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Bc3 Kg4 8.Kd1 Kf5
9.g8Q Bxg8 10.Ke2 Ke4 (279.395) 595
15.00 0:00 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Bc3 Kg4 8.Kd1 Kf5
9.g8Q Bxg8 10.Ke2 Ke4 (345.139) 630
16.01 0:01 +1.53 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Ke4
9.Kd1 Bf7 10.Bf6 Be6 11.Bc3 Kf3
12.Ke1 Bc4 13.Be5 (980.678) 738
17.01 0:02 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Kd1 Bf7 10.Ke2 Bc4+ 11.Kd1 Kf3
12.Ke1 Bd5 13.Bf6 Bc4 (1.580.685) 777
18.01 0:02 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Kd1 Bf7 10.Ke2 Bc4+ 11.Kd1 Ke4
12.Bf6 Be6 13.Ke2 Bc4+ 14.Kd1 (1.821.359) 798
19.01 0:02 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Ke4 10.Ke1 Kf3 11.Bf6 Be6
12.Bc3 Bd5 (2.157.824) 817
20.01 0:03 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Ke4 10.Bf6 Bc4+ 11.Kd1 Kf4
12.Bc3 Bd5 13.Ke2 (2.847.194) 835
21.01 0:07 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Ke4 10.Bf6 Bc4+ 11.Kd1 Kf4
12.Bc3 Kf5 13.g8Q Bxg8 14.Ke2 Ke4 (6.658.835) 840
22.01 0:08 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Be6 10.Bf6 Ke4 11.Ke1 Bd5
12.Kd1 a1R+ 13.Bxa1 (7.466.348) 851
23.01 0:20 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Be6 10.Bf6 Bf7 11.Bc3 Bd5
12.Ke1 Kf3 13.Bf6 Kf4 14.Ke2 Be6 (17.657.489) 859
24.01 0:22 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Be6 10.Bf6 Bf7 11.Bc3 Bc4+
12.Kd1 Kf3 13.Ke1 Bd5 14.Bf6 Bc4 (19.432.513) 863
25.01 0:25 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Be6 10.Ke1 Bf7 11.Ba1 Bc4
12.Bc3 Kg5 13.Kd1 Kf5 14.g8N Bxg8 (21.798.323) 869
26.01 0:29 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Be6 10.Ke1 Bf7 11.Ba1 Bc4
12.Bc3 Kg5 13.Kd1 Kf5 14.Ke1 Kf4 (25.584.563) 877
27.01 0:33 +1.49 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Be6 10.Ke1 Bf7 11.Kd1 Kf5
12.Ke2 Ke4 13.Kd1 Bc4 14.Bf6 Kf4 (29.916.209) 886
28.01 2:59 +1.53 1...Bc4+ 2.Kd1 Kf4 3.Bf6 Be6 4.Ke1 Ke4
5.Bc3 Kf3 6.Bf6 Bc4 7.Be5 Bd5 8.Bc3 Kf4
9.Ke2 Bc4+ 10.Kd1 Kf5 11.Ke1 Kg5
12.Kd1 Kg4 13.Bf6 Kf5 14.Bc3 Ke4 (153.888.082) 858
29.01 3:23 +1.33-- 1...Bc4+ 2.Kd1 Be6 3.Bf6 Kf5 4.Bc3 Bc4
5.Ke1 Kg5 6.Ba1 Bf7 7.Bc3 Bc4 (174.075.680) 855
30.01 12:08 +1.33 1...Bc4+ 2.Kd1 Be6 3.Bf6 Kf5 4.Bc3 Bc4
5.Ke1 Kg5 6.Ba1 Bf7 7.Bc3 Kf5 8.Ke2 Kf4
9.Bf6 Bd5 10.Bc3 Bc4+ 11.Ke1 Kg3
12.Bf6 Kf3 13.Be5 Ke4 14.Bf6 Bd5 (625.935.376) 859
best move: Be6-c4 time: 15:05.578 min n/s: 859.586 nodes: 778.410.078
Eelco
Debugging is twice as hard as writing the code in the first
place. Therefore, if you write the code as cleverly as possible, you
are, by definition, not smart enough to debug it.
-- Brian W. Kernighan
place. Therefore, if you write the code as cleverly as possible, you
are, by definition, not smart enough to debug it.
-- Brian W. Kernighan