
Beat This Level, Get A Programming Job - nwinter
http://blog.codecombat.com/beat-this-level-get-a-programming-job
======
rav
Since there's just a single instance, you can find the optimal solution
manually and write a 29-line program that specifies the 29 rectangles in the
optimal solution.

The general version of this problem can be termed "the minimum dissection of a
rectilinear region" and can be solved optimally using a sweep-line and
computing the maximal independent set in a bipartite graph as described in
section 7.1 of [1].

Now if you'll excuse me, I'm gonna have some fun implementing this result in
JavaScript.

[1] Hiroshi Imai, Takao Asano: Efficient algorithms for geometric graph search
problems (1986)
[https://dl.acm.org/citation.cfm?id=14098](https://dl.acm.org/citation.cfm?id=14098)
[http://epubs.siam.org/doi/pdf/10.1137/0215033](http://epubs.siam.org/doi/pdf/10.1137/0215033)

~~~
thomasfedb
Having found the same algorithm in a (different) review paper I almost
implemented this for fun.

Sadly, JavaScript.

~~~
nwinter
Would you have played if you could choose Python or CoffeeScript, or would we
have to be epic and write a Haskell -> JavaScript transpiler to pass go?

~~~
drdaeman
> write a Haskell -> JavaScript transpiler

There are at least three of them already - UHC's JS backend, Haste and Fay.

~~~
nwinter
Oh cool, I'll check those out tonight (and a bunch of Python parsers people
have pointed me at). CodeCombat's challenge is to transform other languages
into a Mozilla AST so that we can apply our crazy transpilation stuff to it.
So anything that makes that easier brings us closer to supporting those
languages in our levels.

------
unreal37
CodeCombat is just acting like a recruiter here. Do they have any advantage
over traditional recruiters that may be more highly connected?

Beat this level, and we'll send your resume to some companies that are hiring.
And those companies will pay us a hefty commission.

~~~
nwinter
This is a good point. Traditional recruiters have different ways of knowing
how good you are at programming (often they don't). By starting with your
Gridmancer competency, we can potentially find and qualify you for
opportunities that traditional credentials couldn't. (And we're not going to
send candidates who aren't good enough to higher-skill positions.)

One weakness is that we don't have a good way of measuring how much software
development (as opposed to core programming skill) you have. In this sense, we
don't yet have an advantage over traditional recruiters.

Traditional recruiters do have better connections, for now, but we are going
really high-hustle for this initial batch of players, so it's not like we're
just sending off resumes.

~~~
jschmitz28
Is the general consensus now that core programming skills and being good at
math are the same thing? Because after taking a look at this challenge it
appears to be a math problem that requires mathematical knowledge and barely
any programming knowledge.

~~~
darylteo
Glad I'm not the only one who thought this. Exercises like these have a very
poor accuracy if it is used it to test for developers.

~~~
stcredzero
See above. Could be testing for problem solving ability and willingness to
try.

------
varelse
Only the very darkest realm would deprive its wizards of the mighty printf
spell! To what Silicon demon legion did you pledge fealty to summon this
coding abomination upon an unsuspecting land? Winter is truly coming at last.

(Otherwise pretty neat)

~~~
nwinter
I know, I know. Try this.say() for a poor man's replacement.

We haven't improved it much because we are going to make an awesome timeless
debugger, where you just hover over the variables to see their values at any
point in time as well as scrubbing forward and backward through your entire
program's execution (like jsdares does), all without any breakpoints, but
haven't quite got it yet.

~~~
morgante
Honestly, it's almost impossible to make a good solution to this without
console.log. We need some way to inspect the undocumented grids and rectangles
you've given us.

~~~
de90
Why? All you need to know is the grid width\height, and whether a grid coord
is empty. All of which is shown in the example.

~~~
karcass
My solution required marking each coord as non-empty when I dropped a rect on
it. I was able to hack something that worked (non-zero-len string stuffed into
the structure), but I'd much rather know what the structure was instead of
guessing.

p.s. 29 ha ha

------
nwinter
To those playing: if you want to be able to find your code again later, go to
the CodeCombat home page and sign up for a free account! Sorry, we derped out
and didn't put any signup form accessible from the Gridmancer level.

Also, we're sorry that we left you without good debugging tools:
[https://news.ycombinator.com/item?id=6976883](https://news.ycombinator.com/item?id=6976883)
\-- this is the #1 problem uncovered today. We will retreat in tearful shame
to our code lairs until we can blow your minds with our timeless debugger.

You are amazing players--so many good solutions here. Thanks for playing! To
those who sent in solutions and are looking for dev opportunities, we'll be in
touch this weekend to see what we can do and learn about what you're looking
for.

~~~
negamax
Submit the solution using the contact button at the bottom (didn't signed up)?

~~~
nwinter
That's fine, too--we'll have your code, but you may not (after you change
browser sessions). Well, until we reply to your email.

------
jacobbudin
I can't play using Safari 7.0.1 on OS X 10.9.1. (And by "can't play", I mean I
see the "CodeCombat requires a modern browser to play" screen.)

User agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1)
AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11

~~~
nwinter
Sorry about that. The fix is deploying right now.

------
abus
> there aren't enough programmers to meet the demand.

There aren't enough good programmers to meet the demand for low paid
programmers.

------
natebrennand
This seems pretty incredible that CodeCombat has already reached the point
where they're placing people into jobs. It's supposed to be Codecademy's goal
[1] to do that eventually but they've been around much longer.

1\. [http://bits.blogs.nytimes.com/2011/09/14/codecademy-
offers-f...](http://bits.blogs.nytimes.com/2011/09/14/codecademy-offers-free-
coding-classes-for-aspiring-entrepreneurs/)

~~~
ibdknox
There's a pretty big difference in audience in these two examples. Codecademy
is targeting people who have no, or nearly no, experience programming and
trying to turn them into programmers. CodeCombat's normal stuff appears to be
in the same vein, but this specific challenge is something only a fairly
experienced programmer is likely to solve. It's easy to place great
programmers. Not so easy to take someone, make them a good programmer, and
then get them a job.

------
foxly
SOLVED.

-29 rectangles

-O(N) worst-case complexity

-Under 200 lines

[https://gist.github.com/foxly/8168624](https://gist.github.com/foxly/8168624)
[http://imgur.com/PXcUEHz](http://imgur.com/PXcUEHz)

------
shawndrost
Shoutout to the gents at codecombat -- this is what hustle looks like.

~~~
sbuccini
These guys have been busting tail ever since the initial DDOS; I'm really
rooting for them to make it big.

~~~
nwinter
Thanks guys! Happily serving more concurrents right now at 10% CPU than during
that first big traffic spike that took us down.

------
daemonk
A better way to look at the object's structure/values would help a lot. Seems
like the first step would be to generate a list of vertices from the 2d array
of tiles.

------
acgourley
Just curious - would anyone here currently hiring consider the winning
candidates any more than they would from a (reputable) recruiter?

I'm not trying to be a cynic - I really hope this works and solves a real
problem. This is honest feedback from someone has and will continue to
evaluate talent for technical teams - proof of algorithmic ability is only one
tick mark of the dozens needed.

~~~
serickson
We're not sure ourselves; we're testing the waters with this level to find out
exactly that. And if it looks like this monetization strategy has legs, we'll
aim to expand what we can provide to companies so we can be more compelling.

We'll be interested to hear what others think about this too!

------
Danieru
The blog post talks about minimizing count(rects) but the in-game comment only
mentions having better than one rect per floor tile.

This second requirement is much simpler. One only needs to merge a single two
rects into one rect to fulfil it. I assume this is a bug?

Edit: Sorry I didn't read the original post well enough the first time. It
gives the more practical goal of 40 rects or less.

~~~
nwinter
I'll change the default code comments. We were much less ambitious before our
playtesters blew my algorithm out of the water.

------
jffry
It covers all of the little coins!

    
    
      this.addRect(0, 0, 200, 200);

~~~
nwinter
Clever! In an ideal world, we'd have logic to prevent incorrect configurations
so rectangles couldn't touch walls. There would also be ogres dying and
explosions and battle music and such related to the efficiency of your
algorithm--you know, actual gameplay mechanics, like our other levels. Didn't
have time to get those in yet, though.

------
emeraldd
It would be very nice to have a console.log/dir style function that would let
you inspect objects/arrays. (Makes debugging significantly easier).

Also, any chances of expanding beyond California?

~~~
nwinter
You are so right, I am ashamed. See also this comment:
[https://news.ycombinator.com/item?id=6976883](https://news.ycombinator.com/item?id=6976883)

We could try doing placements outside of California later, but for now we
don't have much of a network outside of the SF Bay Area. (We're quite young as
a startup.)

~~~
emeraldd
One question, why does this.addRect use the center of a rectangle to define it
rather than a vertex? It makes attempting dealing with "native" rectangles
rather awkward.

~~~
nwinter
That's how all the CodeCombat game engine works (things are positioned by
their center points), so because this challenge was taken from an algorithm
used in two places in the engine, it maintains that. I know it makes it a bit
more complicated to write the code, but it's a lot easier for us to then
snatch the winning solution to make CodeCombat faster!

------
adamredwoods
Hi. I took this challenge, asked for help in finding a job, and heard nothing
back.

I could really use help as my resume is mostly Flash/Actionscript related
work, which is not in demand, and it's difficult to convince the "filtering"
HR reps that my skills are applicable to other languages. So if this proves
that I can code, then I should be able to get a job?

------
tokipin
'this' is quirky when you make your own functions. also Starcraft II runs more
smoothly on my computer, no joke

------
kd5bjo
This was a great way for me to get back into programming after the holiday
break. Your optimal number seems off, though; I ended up with a solution in 27
rects:

[http://imgur.com/hAOLUaD](http://imgur.com/hAOLUaD)

~~~
swframe
try it again without overlapping the rects.

------
Zarathust
It was all fun and games until chrome crashed and lost the code I was writing.

------
gorhill
Why do you need 20+ screenshots of the game screen within less than a second?

~~~
nwinter
We, uh, don't! That sounds like a bug that I would love to slay. Can you give
me some more info?

~~~
gorhill
[nothing wrong, except my brain]

~~~
gorhill
> "But it should only take one screenshot every 30 seconds"

The bug is in my reporting tool I just realized. Yes, it reports only each
time the screen change. Sorry about that. About multiplayer, understood, make
sense.

~~~
nwinter
Oh, okay. I thought I had a performance improvement at hand, so I was excited!
Thanks for digging into that.

------
chrismcb
40? That doesn't even seem to be a challenge. Are you sure you want to
recommend people that can't get the optimal solution?

------
EGreg
Why can't someone make a test account first, and then replay the best answer
much more quickly with their real account?

