New contests rule

In the contests rules, you can now read this:

Cheating is forbidden, under penalty of disqualification from the CodinGame Contest. Cheating means:

Obfuscating your code as well as creating obstacles to its reading and understanding.

How can you add a rule like this wihout a proper announce ? And don’t tell me we are supposed to read all the contests rules at any contests. You know very well that near nobody read all the rules. This change was just announced on the chat once.

A few people in the top of the contests use a tool made by @Agade to be able to use the flag O3 for a C++ code. We asked for this flag on codingame for more than a year now. Codingame never did anything for it. @Agade took time to create this tool to made it available. The tool compile the code and convert it in a base85 string. So yes, it is obfuscated.

How can you decide to tag this tool as a cheat without at least telling @Agade ? What if a top 3 coder missed the message on the chat at the end of Wondev Woman ? You’ll just kick him/her ?

Now, the fun part : What is obfuscating ?

  • I make a horrible code with only one letter variables because i don’t know how to code. Allowed ?
  • I code with variables names in chinese. Allowed ? (i don’t think you can read chinese so it is an obstacle)
  • I use a minifier because my code reach the limit of 100k characters. Allowed ?
9 Likes

They explained multiple times why they didn’t add O3 flag. They made their position very clear on that point, I don’t know what you want more from them at that point.

2 Likes

I think he has a point, I am worried about

I had never noticed this before, Does this mean I can’t train a neural net, it is called machine learning for a reason… I don’t think I am capable of hand tuning the weights…

1 Like

Even if it isn’t clear, they aren’t targetting machine learning, but bots scripted to make automatic submissions either for boost another account or try variation of magical numbers in code the whole day.

1 Like

I might be wrong but, this could also be related to companies who support events like say, code for life.
They might actually sometimes want to have a look at the code of the best performers.
Obfuscating the code actually completely defeat the purpose for them.

On the other hand, I reckon that on my end, I write very “unprofessional” code for challenges in there.
For I’m just after performance and efficiency, I would never write code like that in a professional context.
Therefore, companies looking at this kind of code may get a pretty wrong picture with it…

But anyway, I can’t even tell for sure if they are interested in looking at the code in the first place…

I’m sure companies take that into account when looking at code written for a project with a limited time such as a contest :wink:

[CG]Thibaud just said that this rule does not consider the following things as cheating:

  • CGSpunk
  • A personal tool that download all your replays in the arena and compile statistics

So you can download replays and feed a Neural Network with it if you want. I’m not sure what this rule is targeting. Maybe it is just here to prevent submit bots.

You should not underestimate, companies ability to act in a very unexpected and puzzling manner :slight_smile:

After working for nearly 30 years for a bunch of various companies,
I’ve seen things you people wouldn’t believe :wink:

2 Likes

We added this rule

Cheating means:
[…]Obfuscating your code as well as creating obstacles to its reading and understanding.

to forbid this kind of code:

#include<algorithm>
#include<fstream>
using namespace std;
constexpr char en85[]{"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"};
char de85[256];
const string Base85_Binary{"e??420s#R700000000000suY$0RR91C|p1Q00000KmY&$00000000000000000000Kma%Z0sue&000000RR911poj50000000000002M$00000002M$00000S#1CS00000S#1CS00000001BW000000RR911^@s6Fa`kt00000Fa}`&00000Fa}`&0000000000000000000000000001BW000008dcGSRZv(VKoJcV0000000{vA00{vA00IC2j{pDw4gdfE7y|%5k<e?8OBwrZ#ah<mg*02^c8;+YLrAR8lgjz+e_jGd<!bi&p*Z|gP)vrEP9f-Tqu}Hp<)I?<#{BaOLT&I^<Wp?5c7n5G$E*(xHVj?H9-}Znql!5$?bC{#O(2W2>8Ef+FPx{>SzBe&gG7Y^z87M)>shwaA>?vI>qBUm<Wd)^08_>#FsuM<@c;nQSpWbINd*8H0{{SS)*zFtp_g_lo^`+%Mlb@yS%498#6ABaeO91qYmjU%QP&Phm>-pEym?|u$ZmK8x1hiStq#=uzpO_9AfF|0_xZN7mg)V7aE<!|GZX?NgHXwdw9oq`DDnm%cvs`ng`f2eM48E>w42w1_IJH)e4DKKLw37Mv#*2w#a2Q(V|yA`Xm3A&%)l%Dx2;ZAXp}myw~a!JBCW6`*=b@mZ#-s<lG}@0=xT4;aQheLF`zSXuO1Pjd{hE=3w_Z^deO3lmYWYRwVSzjcP`uL2Bzjvs&3w})EDe-w8g_ZR~%|tR3uP@v%G3@^Vp^GN*#*DO6;uFv4IUl9;B2q$F!cmU3>Dvxx!M;jf)aZz!vC4Gw&_#8{`Ev$oEtt=k7fU)dgaf^7K<<-UUkl=l&h%*F8yJmZnhdS{QRDg<dn*@c88+BOmOY+Kp8Y3Map42~o(hWIkG+m#p`9ka9s*U9rs#GTcPTy58RW$QSQepl$9sT(&R|hj%MnqW{(8K_;L-RlgGv<V4!`Yd8#Ql6BBQBHa|bV#cE-NBBJmmA==+S1U?wF0Tq-W&}l2Ih<v^k$82s00Fk1I7D!+_DlLmZ3pyfl?Hm<JROzj0F%`=Js24Y8<b-C7u8Ey`v?t>^X!aOZ&!GE$n0gXpXDLiE&IF(p}=2$O7riG=he>HsSd6nb2ZpH9V5e+4#NUu*#dL`j>g(=6U$JSqkAe;m*8W?seFqAQtt2nub9QN{G}zVQa!h1{ubBWde6-tKEEX3f};Ds_%%m(olC~X+l9fBb_qvB7d%qxFYGvhB)ySl-6mc(7piVk$L1C!6?LsM-bGx4Kq?Vi_N7++Lr^j7Z_T!9&^TX>Z$b`iEN&!BV-<L@n8GLUb!cz~W!|L_8-Oq@pzqOi$e1(>YDtB+GC~#8K0iz=>(65ZrqrH$=W}MUQ$4`Q|7);{HDvlt$Z@j8tqRxF<8I1Il2>Re3>i>Qq-%<LE8t2h-nQrru+euZ4nU49CP<?4caPIK7bZiVj?5N%wlX6u%?{-g{*6CZj<*!3@8Z;5%bifG+G1RRp*A%_5goJw*!j=g30Kl=4$d=;r8v}<3F$o+ZcV~?yT5Xw87D)hWr2H`0#iBz0fslH3?7a|zM)PyFb}5=<jqqb91)CWNol;3p}CEx_b4Wp>g1Y4DQY=g=091dzGxgHww)>iz{pz+<(Y7?aR`K~NB7eB<-~EHPz>^f?VX3~LtUZTp)fAs;0x0G&Bnh$8R^5Tnq4&JqUhtnY5YFz72BvQIIyX;tD-6P9OCr3BhC{9%enoXD3^yq(4X%%&&LtK$3_;YUv?qx^N}P0dBy>`o-5=FVaYVxATn)qyGSArjM>;C!Ju9WFXdhLL1O3$F!e+!0GmehmaMNjXceH$D$&r{3%#fPy_N~Sw3vyu<ms04ImT(P8xhhp+A!%##E>LBA%Drj%Ls?QKN)ZJTET{UZ5p=<_?>gUDcqRbZfq7xY1wcqeq}Z{D1xyb`#f;xu0%X^x49;b&4J+&u~$Ma_*>MFeRn$iLp>AAfKC||;C6Gz?vNx^@JTxYRFR%q>aUmW3Du3=;T!NlY7P$LmGeci$bSDO#_4gfS7-~I`5pXOd>fZ!0r{YyO~x3#_6Vgl5n2S$z5J2?2r|}_k>tp)!s@)MtaFPKvl{Ks2iC{XH6lLnBNKb$a_03sv;96Sq;z%LW<~SzuvVw?zPYQTB%4Fyb{;|R;)fA=F5aCBJ}kbFsDtX#veW5zk}S_y`gj9)#yc^P-!deJ7ADXbSs~pT*()B?n@Va$(W|Q~V&x@uT=#4v5Da7IUW}Y!#5Q!DJjuSG5{yC-D!NfZ41F1sL^Eo4P3bt=O5q9iXi#QL=RNJ}s7tLFPq!BX`*Dcv8X2hk$DaS8$b`WdT3Vt61mq$M3eVK-+BEU(521X5NOMdaYbc5R1v5{iS8&_Hj<>^QtAUfTI^Zp7*D$qnwc<-^fXTlCa(^}=Jc%(jsow9j45ePA#y9rrBwB1;-A3p4+5Cj3@}HkjX_{t<Bb+*0N9$DWnMldVa$yCSQcVU&VOP=VM$7i(KR)?bqiL&r8C5|eU!xC9ib$&V%j>i|YGG{s^eCzW0>JX>@Y&`CRr5}&GC$2oHF{lE_^>9<L(6V5h6fdHog0^04i6IXu2sgxl70Fb@|(nqo(SiaywnF^l`mQ-#XATtYq9LGEg)!w;v?z}ia14AfJg4@$(T!>_UzJxUE7?vF^=Hx==#S)q%&|%R}ax+6x0okzr`g(*K)m$A}!IVy<w_HunpyRsB@`HueE;cKy%PkNsC?>b;i`6k_8*G>yp49xEnZ3N_l)7%gTPktQ|Fp4taFB7HH38aT#?FlI${WXgI<C1EJVRRAHJ(OO0&GoonC{kem$5YEVeVL3_|Zg0$L!I#CfaNeodE%4*)A#d+b+N|`huyr?H)=MQ9X3{gb<ErdJloLbJ`^x5Bl5N{?X94?3E2Pe}>hUIczO}srDmoamd&rjjh&Y?EB)7dsK0to&2r3^z?&$!1H3RAtCEs+ueRzQ5UKx$B5Pt<yn(eiKqM<=vzEplv~F_VHm0gOLSm;EU>n)UcDOG^`_R+2~enGc`SV>OH*fiL)GypF3V2!DNM6Lm|i?LEGq%X2K2Mud{%K(sQYzp7Njy0BmL&XDa4W?{Y+CosfZEIkCoeP_--$GXE1Wdb|htW9ViZ%$*_@+NDfCXqB8vEtgKS0;=cQC>`cfNv(NZH~e36ND_?Yh__*{d9@8uPL`P2h1dEBAu&atOAhhR94^XvDz&FZ;Xj9r0UQkS?e0Ew)ZNt%R12=HP?50OivG&<Y|<73#6Qr)lFt5%s$x1NE}syXtY#=T+CEq#f@{x7h-rPPo?6W1yEtba^gzmnN{PWYGYhd6Ej2u#i)V#Cn)ZUd5qx<_&)2C`ub6X#}+4@>i8xqK1Kw5E8)zCUpnIL5pZ$Su7BgLA&%D8{!8HyoaS*=u%ZniK%zn<QIW_dIIbq<uEs^KAdB+Nab-RPdM{%6)(T*+YOqlIX3dSyqYxRBfM(9D&MF7$odyVH2T7jb`r-)7cD}G^REUY|LJMB5wo(q#{l{w$bBbOxM?Fg!nNu*43})TMwEB;}U9SB#*>_~#hL>(>mhVu6@=C=<KpJ-et81uZb}qQ%m=2B4PS{{AW^E5y2D7V-_xCAk`!1ej-;SyT*MN8~9<&(43;2pvtnp3-bjHb&AiA}>mK&mYV`dB{eKGC*0^vM8dPCi})>e9)AKa}>=p|@oNSa-Bp=DVvK(|;G-Z(1S;S;Lp<Ym!+_6#)l$d1p8z_N~$>arb3F~$zi1lx{10=SX0Srr+Hb+ksi{*S;r#fNpT&k_uh=KRY|ut5MgK9-GZErU#R6)4Y0NBr!R?UAnu-bctUdr;$D#|)s5m~EGGvEYA;WM_y_v>v^m^#TP;4WRDavJ5kNCXt7T8{G;m%b63PoD|DoO>boB*$eVQ?NrDnapPnY0W<+<_%*9m%a{+Bx9Sn$m$_Am`~ShSeBOI#)1h0V`pwxck<Q;9{S#{fD@$!R?kRE2{=deeBB0_-6P>Efsqs7b0x={zf-_U`SMSeLuI;AoZi8F=0Ez{0i%=pp^ECA)vlf|IUZFT=cx7|O$(K2ib$qh}+;I|&@mJ*I>TA~!I1Yf`g2enn<rjVhKP`c+t7;Cy88Z6ooxFA3bO|+#6W|_i@BqAgLU@X~+b+6?EWD;HLMQc(9Fj?sngkA@vChDuaS^Z<-Us1C@byQ#+zbEedp5erV~OStc<`F<w&@KMR2SxMzK2wunXnZ>OJmtfAbpkeLhc$a6%q13(J()t2MIEQtFzHW<26>!Vmbk<x|tDJ1h(KPG4hmj5>KsCdd#itArx9H8n+TSHeT0WA1ixk>XmR8!ve6nHI>XDg_Jje!$r^JWRLRkzuG7sn#yv}w[...]iLi)1!WqeCjVC=8CyN#Vr#JU1S2hN6F|ig88$dQ${2>RsU$q$-{Ob#i2h$gaKJ2F5i6Fc-)tYJ<4gUUYy{q&Tip+O~F$NfTT0rE$r6*=1t;qI~lYB4xPlaVz)iar9wPVB~`39)XVZEMvjFojsPIS$*&mvXqpU&I|M;Bb~H&5MMG3yUYfj95tIj8}aVmNt^vTt4xpvCEYH`ijw>Uk#<@m=2^sYNS1mw=3TaySI{l?&9-D@Xc02X)7~|%F!4J`Ii#u^Xmk`FF9cQ>9KXIdZQ84~5Qi8-oGNL+@@QJMMM54VU|J->WHBIT{3hml=Y%;w=iZL@Hg@DFPHE`mjW0^Mq7j6)Y$+3|J?djiKcsQKkR%3>H|e<2N$=Q!Twnm0wSUHAb+sp`>gwShBr&-1m{qw%HmAR={vK+(*i*mvseI)kI8?1=(%K0?+BcX+6CAq$`kMvCB;lX7y-YmGQ!lQpmS%6#r+vXaW5F1!tPgek#;97aaQUqtkcPm6d~cu1q#U+gtuA?wR0>!`XcB>Hq7FcnUPThogQCH&&b)H6B)a&l3{0Zl<Yz#1=3A-Fo@NanO5QT_%o;8NZPME^qL=t|<Z*s2*^tc05WE;WGllM}PL-o~owzMBK?r6w@Pfl&CFP#sysIDnHWqPOeDK`ByS$q?Zq<x?Ds4<^ZYfXbpJ*#~LJ@D8I3OD)23mRnW=B#k-tXP(4fxLDR9*xB{GzF|%0<$u)3g9$ijveqjwlCZV_&@h%ci=P3pYX}>=oDkf^$ivXsvy_SkDb$MM|>Rsi)%fnf@DyfR$Ka|91*XMclg(TRA8CPKc;1O3<#05u@`zt77ovo{pl)LKaPaYcs#c{fv*7uE$8&H;)Z?jhtsI2iHZRr8#0KOg`Xp=3xVYI;ri3<tq_CW|NbXUHySZye8M=vX)o&)Bx8QF@po*2!gMX?v>IzG8%PhrzL{r>ooS0SXa6c+FXFN`7BE`M^(T6tgv&SdM|*PbYhd-E)k8u<sc&uiQh~Go#-J5YdKJE+2cb^`Z09aLXmIj6HKWz`w+$JSS>DK`7y-}^_0MWK**c5gB&A`YcN(nhdQp1Ad<I2YX|H9IK+X{B>5#6A{Ms9g25Q;4rlR9t=xG&A1FXTOst{~80uh(`>)S{l#~rQGZ<D5+b~+gINCsKuhs+$uYmQ(v>aWu4@wVmW`CNt<`C$4$Zf&V@BThXUR6ki_5-K3&Cb)MeXVz}6xhoFQ&C^PQli3^E><yHtqd2t7$1Or7{)56gwBqoM)Z$?jB-yCA6?uYBo%~JRCP&l6=u4w?3WKIt(<GdfHq>ewZts%8Y9+t;GT*sZ9z_{noz17yMNs&S4^{&WT^mZN~7oKT^=>o$xGbqdGa2+pDhHlw4lkTHEbbvhX4QobP50f7XSbN4gdfE7y|$RaDDy%u8^TX6TMS5owNdC${YZw2LJ%g0RR9F0000O0{{RF)HPN3(ySE8#o?IA)wc%1>?tG*2{B(?NvHVKVAzcM-;cM5YWS!GP?En(sJTAQ6wsXJMD}8qP`4P}z1KP?1^YlaF4kSTGWN)*nwGRS3}_dkH2(SpZtXPr;<^VH8Q1#C0dlPHT_1&gg014cxFe2bqi8n_Gn4Iiw~vkA$^2Fj40m2{a;44G4NecD-nDyM9$@r7{ZWsDu$PDLT>E8FtHj`o-nW~_qehB~Z73velzeNtwRDpJ#DO2rxEn5O4qHJ*K~kc+LV!1>dAFeVkpf(krq?sV?=ya`i>}ZeZt6NkaJE)15eu$h-zIWZ!|rM=36$#t<^)w7PMAxmjN0f#tI=wkGCsM_oLhbVor4XO8^m?sel_a#O=~FCX6TjZ7I)MN+oMI0+(<FnGS~iaL4|0Fa0_4xm0w+U4HOEs&a@&WY_pp%Ushf{Rs2d-IzA5CBL3PQYqki1gDK>+h9$EhC<svxCfgEc554;~8@Cmckj@*CDUPKaz>X)CUOg#l7EFMcl74&{k@cM~Wc%7DRpYmtr3TpMAhHnR5T7SZ8Xju3qe|R8%6d#+!q%T7;=I9G!5Nb{HKT-q00000RZv(V00000RZv(V4Hgaxj3w4*B2_z+s0RQ5%>e)a00{vANd*90yZ`_I"};
string decode_85(const string &base85_string){string out;size_t str_ptr{0};while(str_ptr<base85_string.size()){unsigned int acc{0};for(int i=0;i<5;++i){unsigned char ch=base85_string[str_ptr++];int de{de85[ch]};acc=acc*85+de;}string sub;for(int i=0;i<4;++i){int val=acc%256;acc/=256;sub+=static_cast<char>(val);}reverse(sub.begin(),sub.end());out+=sub;}return out;}
int main(){for(int i=0;i<85;i++){int ch{en85[i]};de85[ch]=i;}const string Program_Binary{decode_85(Base85_Binary)};ofstream Program_File("Binary",ios::binary | ios::trunc);
Program_File.write(Program_Binary.c_str(),Program_Binary.size());
Program_File.close();
system("chmod a+x Binary");system("./Binary");};

Some of you have used this kind of code since The Accountant contest. We can’t run anti-cheat on it, so we added this rule to make it clearer and not to have to deal with this kind of code anymore.

PS: We’re sorry for not informing you of it earlier. A notification will ensure every participant knows about it.

11 Likes

Okay, is encoding + compressing arrays also considered obfuscating code?

Example from my code:

data = b"...." #Encoded and compressed numpy array

decompressed    = bz2.decompress(base64.a85decode(data))
syn0            = np.frombuffer(decompressed, dtype='float32')
2 Likes

I have the same question as Icebox’s. I’ve encoded and compressed arrays (or lists of arrays) especially for neural networks that I have pre-trained. Like Icebox’s code, I think it is reasonably clear what I am doing when you look at the code. (Also, of course, increasing the code file size would eliminate some of the need for these tricks.)

I think there is quite a difference between submitting compiled binary code and easily decompressed data in code. You both should be fine IMHO.

@Magus - just for curiosity - using @Agade code is better then
'#pragma GCC optimize “O3,omit-frame-pointer,inline” ’
or
'#pragma GCC optimize “Ofast,omit-frame-pointer,inline,unroll-loops” ’
?
Code is faster?

Yes if you use the STL.
If you don’t use the STL, there’s no difference. But this is the only point of using the flag O3: to be able to code like in the normal world.

_CG_SaiksyApo had concerns about compressing executable parts. You don’t need to worry about compressing data unless, of course, your data is used to generate code later on.

Let’s say you write Python code on-the-fly and execute it (I don’t know why you would do that but let’s assume you’re doing it). Usually you would store the Python source code in a string, write it down to a file, and execute it. In that case, if the Python source code is compressed, it is unreadable and you may use it to execute hidden lines of code -> please don’t.

Apart from this crazy example, I’m pretty sure compressing data is totally legit here at Codingame.

We should not being forbidden to obfuscate our source code to keep a free software.

I think that forbid that is not the good solution to avoid cheating. If it is easy to cheat to a game, game rules should be adapted, or codingame should not take result score as reliable.

In an environment sponsored by many private companies, prohibiting code obfuscating is not an ethical solution.

1 Like

obfuscation is used mostly in proprietary software though.

I don’t know what are you referring to as “free” software, but usually that means that a user can freely modify the software to suit one’s needs. Obfuscating obviously not helping here.

Better safe than sorry!

Well, I must confess that I was looking into that tool to be able to compile rust code in release mode instead of in debug mode as (I assume) codingame does. The performance difference is abysmal.
I mean, it’s just a command-line argument that can actually make rust much more competitive, with performance allegedly comparable to C/C++. And debug mode is not how you are supposed to compile programs when performance matters.

5 Likes

As the resident Perl maniac… somehow (guess we’ll just have to wait until we get a better Perl maniac. Maybe it is because you don’t have a poorly coloured bike shed–the mascot of the Perl language)…

I’m well aware of the concept of obfuscating code… and there is a difference between messy code… and pieces of beautiful artwork that serve to marvel as much as they serve to make one vomit.

One is more inclined to merely stride through the gates of mordor than they are to accidentally make obfuscated code.

It has been stated there is a difference between poorly organised/designed code… and obfuscated code.

If anybody wants… I can try to track down some resources on proper code obfuscating–mostly making use of Perl… but only if you ask. As well–a lot of it is really really beautiful vomit inducing. Like… the things I’ve seen done. The beautiful beautiful terrible things I’ve seen done.