Obfuscated Erlang Competition Results |
In conjunction with the 13th International Erlang User Conference, an
Erlang Obfuscated Programming Competition was held. The goal of this competition
was to write the most obfuscated Erlang program, providing a safe forum
for poor coding practices and programming styles. Through this competition,
we hope to illustrate some of the subtleties of Erlang and how they can
best be used and abused.
A report from the judges
This year's "Subject Matter Experts" were Joe Armstrong,, Ericsson, Sweden Jan Henry Nystrom, Erlang Training and Consulting, UK Richard Carlsson, IAR, Sweden A call for participation to the competition was made at
the Erlang workshop in Freiburg. The rules of the competition are available
here. That we got even fewer submissions than last
year reflects well the feeling we have that the Erlang area is
really hotting up to the point of being scorching. All were ingenious, making it
very hard to pick a winner. The judges individually gave every entry a
grade between 1 - 5 in the following categories: - Obfuscation
- Style
- Innovation
- Functionality
The previous winning entries: 2005 and 2006. Winners
First Prize:Mats Cronqvist First prize goes to Mats for a program that uses
macros to write one of the most unreadable identity functions possible.
Here is the source code:
-module(xXx).
-author('mats cronqvist').
-export([x/1]).
-define(x,x(.
-define(Xx,X.
-define(X,X)
->. ?x?X?Xx.
This is what happens when you run the program:
Second Prize: Per Gustafsson
Second prize goes to Urban Urban Boquist who wrote a small
program that can testif a value is less than zero or if it
is greater or equal to zero. Of course being one of the
leading developers of the binaries and bit strings he has
taken help of binaries for the task.
:
-module(obfuscated_per).
%% The program creates a message based on the sign of floats
%% stored in a binary. It does so in two different ways.
%% One checks the sign bit of the float. The other actually
%% checks if the float is greater or smaller than zero
-export([test/0]).
test1() ->
TestData = <<0.0/float-native,
1.0/float-native,
-4.57352069251366153375e+233/float-native>>,
io:format("Use sign bit:~p~nCompare to zero:~p~n",
[make_string1(TestData),make_string2(TestData)]),
ok.
make_string1(Bin) ->
case Bin of
<<0:64,Rest/binary>> -> %%Float Representation of 0.0
<< <<"erlang ">>/binary, (make_string1(Rest))/binary >>;
<<0:1,_:63,Rest/binary>> -> %%First bit is the sign bit
<< <<"is ">>/binary, (make_string1(Rest))/binary >>;
<<1:1,_:63,Rest/binary>> ->
<< <<"great">>/binary, (make_string1(Rest))/binary>>;
Empty -> %we are done and return the empty binary
Empty
end.
make_string2(Bin) ->
case Bin of
<<0.0/float,Rest/binary>> ->
<< <<"erlang ">>/binary, (make_string2(Rest))/binary >>;
<<F/float,Rest/binary>> when F > 0 ->
<< <<"is ">>/binary, (make_string2(Rest))/binary >>;
<<F/float,Rest/binary>> when F < 0 ->
<< <<"great">>/binary, (make_string2(Rest))/binary>>;
Empty -> %we are done and return the empty binary
Empty
end.
|