A Python Challenge. Better than rentacoder?

August 25th, 2008

Python programmers love a challenge, so I thought I would throw this one to the lazyweb.

I have an app that generates a large sequence of files, the nature of which is unimportant. What is important is generating a location to store them. To keep the directory structure manageable there should be no more than 100 files plus sub-directories in any given directory. For instance if there are 99 files in a directory, then there is only room for one more file or a directory -- bringing the total to 100. There is an additional requirement that the directory structures should be as flat as possible, i.e. foo/bar for the nth item is preferable over foo/bar/baz. To summarize the requirements:

  • No more than a total of 100 files plus folders in any given directory.
  • Directory structure should be as flat as possible.
  • Algorithm should be theoretically unbounded, i.e work for any length of sequence.
  • Character length of the path is unimportant.
  • Entries should be in Python (but feel free to post solutions in other languages for comparison).

Entries should be a function called make_path, which takes a single parameter, n, which is the number of the file in the sequence (starting at 0). The return value should be a path to the file, such as foo/bar/baz (where baz is a file in directory foo/bar). Feel free to add any extension to the filename, to make it clearer that the path references a file. You can't rely on the function being called in sequence, so don't keep any kind of persistent state across calls to make_path (nor any kind of file access).

Wordpress comments tend to mess up formatting with Python code, so please post your entries on Pygments.org or a similar site and a comment to let me know the url.

The winner gets the respect of his/her peers and will be owed a favor by me, because I figured it would be more fun to write this blog entry than solve it myself! ;-) All entries grant the rights for anyone to freely use and modify the code.


Charting my progress

August 10th, 2008

I spent another afternoon working on my pie chart project. I'm using PyCairo to render labels over the chart render. The tricky part was finding the position at the center of each pie segment to render the label over. There's no way of retrieving that information from Povray, so I had to do the math myself and calculate the coordinates manually. Fortunately I had a 3D math module that I was intimately familiar with, having written it just last year (its always gratifying to re-use code for a new purpose)!

I won't bore you with the gory details. Suffice to say that I generated a pretty animation so I could confirm that the label position code was working correctly. I'm not going to be generating videos with the finished product, this was just a diversion. The segments and labels don't mean anything, it's all just made up! Enjoy...


Small div bug in Firefox?

August 4th, 2008

When writing the image wrapping script, I came across a difference between Firefox and Opera. Basically, when there are small floated divs in a vertical stack, the text to the right will be aligned to the topmost div in Firefox, even if the divs underneath extend farther than the topmost div. Opera handles this situation better and places the text after the maximum extents of the floated divs. Take the following HTML:

<div style="float:left;clear:left;width:100;height:8px;background-color:#55f;" ></div>

<div style="float:left;clear:left;width:120;height:8px;background-color:#66f;" ></div>

<div style="float:left;clear:left;width:140;height:8px;background-color:#77f;" ></div>

<div style="float:left;clear:left;width:160;height:8px;background-color:#88f;" ></div>

<p>This text should not be displayed over the blue bars...</p>

Since the text is greater than 8px in height, I would expect it to push the text inside the tag farther to the right. Instead, what happens is that the div is rendered underneath the text. Here is what it looks like in Firefox 3:

And here is what it looks like in Opera:

I haven't tried it on Internet Explorer as yet, because I'm a Linux fan-boy and I can't be bothered booting in to Vista. So, dear lazyweb, is this a documented bug?

Update: Try the html yourself... divbug.html

Image wrapping script

August 3rd, 2008

After posting my latest pie chart image, it occurred to me that it would be pretty cool if the text flowed around the edge of the pie chart image rather than around a rectangle. This is not something that can be done simply with HTML / CSS, but it can be done by breaking the images up in to horizontal slices so that they extend only to the edge of the image, rather than to the absolute border.


If I googled for it, I suspect I could find tools to do this for me -- but where is the fun in that? Instead, I wrote a Python script that uses the Python Image Library to scan an image and output HTML that will allow text to wrap smoothing around the image. No additional images are produced, because the 'slicing' is done with CSS to select the part of the original image that is seen.

Here is the script: wrapimg.zip, and some examples of how to use it:

python wrapimg.py -o left.html sliceofpie.png python wrapimg.py -o right.html -d right sliceofpie.png

These two lines produced left.html and right.html.

The code is completely free, do what you will with it!

Update: I wanted to display an example in this blog-post, but Wordpress insists on re-writing my code and ruining the effect! :-( I should find a blogging system that is more techy-friendly!

More Pie?

August 2nd, 2008

sliceofpie I've been doing a little more work on my 3D pie-chart renderer. I've added beveling and tweaked colors to a point where I can render charts that -- in my opinion -- are a better quality than those produced from Apple's Numbers. Next step is to add labels over the main image. Povray does support rendering of True Type Fonts, but it is a 2D overlay that I'm looking for (not 3D text), so I plan to use PyCairo to render the labels. Once I've perfected the chart renderer I can build a polished web interface, and a web service for the render queue. All in Python, of course!

I know that 3D pie charts aren't as clear as their 2D counterparts, but I still think there is a place (and hopefully a market) for pretty charts like this. Even if it isn't a money-spinner, its still an interesting project, with some fun problems to solve!

Search for Posts
© 2008 Will McGugan.

A technoblog blog, design by Will McGugan