If you want to determine whether or not it's a clone, the obvious thing to do is look at the code, rather than arguing about the credibility of various people involved. I don't take a position one way or the other, but there are some very unusual things in Ippolit's code regardless. For example, this is line 6173 of IPP_ENG.c (just one line!):
Code: Select all
score -= 20 * (((((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) <= (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3))))))))) ? (((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) : (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3))))))))) + 10 * (((((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) <= (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3))))))))) ? (((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) : (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))))));
No one writes their code like this by hand, obviously. There are several reasons stuff like this could show up in your code:
- You are a crazy savant, and this is just how you do things
- This code is machine-generated, possibly as part of a machine-learning framework
- You have intentionally obfuscated your code before releasing it
- The code is decompiled or reverse engineered
I think the first two possibilities are very unlikely in this case. The third one seems plausible. Maybe the authors want to release their code, while still keeping some secrets about the methods they're using to generate parts of their code. To test this theory, I looked through the code for RobboLito to try and find the equivalent code. Although it's hard to be completely sure, I think this is it:
Code: Select all
value -=
20 * MINIMUM (FAR_ (A8, POSITION.black_king_square),
FAR_ (H1,
POSITION.black_king_square)) +
10 * MINIMUM (NEAR_ (A8, POSITION.black_king_square),
NEAR_ (H1, POSITION.black_king_square));
Of course this is much simpler, and I think that the end result after macros are expanded is identical. I think now the possibilities can be narrowed down further. Either the authors obfuscated their work at first, then thought better of it, or their initial efforts at disassembly/reverse engineering were relatively crude, and after more time and effort they were able to abstract away a lot of the complexity. Given the other differences between Robbolito and Ippolit, I lean strongly toward the latter possibility.
I'd like to note one more thing: although I consider this evidence that Ippolit is the result of disassembly or reverse engineering of another code, that's not evidence that the authors stole anything. I'm not a lawyer, but I think it is possible to do this work entirely legitimately, without stealing code from anyone and without breaking any laws. In fact, it might be considered evidence that they didn't directly steal code for anything, because if you have the source code there's no need to disassemble anything.