PyCon Jp 2012 の「Top of Pythonista」で2位になりました!

PyCon JP 2012内で開催されたTop of Pythonista決定戦にて、なんと2位になってしまいましたw
単純に「スコア効率(単位面積当たりのスコア)の高い順に左上から配置」するだけで、もろもろ洗練されてなくてすっげー重いコードなんですが、まあ実装した者勝ちということでw

てなわけで恥ずかしいですがコードを

# -*- coding: utf-8 -*-

import json
import random
import sys

def arrange(area, item):
    for i in range(len(area)):
        for j in range(len(area[0])):
            if area[i][j] == 0:
                judged = judge(area, item,i, j)
                if judged[0]:
                    put(area, item, i, j)
                    return {'id': item['id'], 'x': j, 'y': i}
                elif judged[1]:
                    continue
                else:
                    print('break!')
                    break
    return None

def judge(area, item, i, j):
    if not (len(area) > (i+item['height']) \
            and len(area[0]) > (j+item['width'])):
        return (False, False)

    for y in range(i, i+item['height']):
        for x in range(j, j+item['width']):
            if area[y][x] == 1:
                return (False, True)
    return (True, False)

def put(area, item, i, j):
    for y in range(i, i+item['height']):
        for x in range(j, j+item['width']):
            area[y][x] = 1

def efficiency(item):
    return 1.0 * item['score'] / (item['height'] * item['width'])

ifname = sys.argv[1]
ofname = sys.argv[2]
width = int(sys.argv[3])
height = int(sys.argv[4])

items = json.load(open(ifname))
items = sorted(items, key=lambda x: -efficiency(x))

area = [[0 for j in range(width)] for i in range(height)]
result = []
for item in items:
    matchItem = arrange(area, item)
    if matchItem:
        result.append(matchItem)

json.dump(result, open(ofname, 'w'))
The Zen of Python, by Tim Peters

...中略...
Flat is better than nested.
...後略...


ごめんなさいネストしまくりですorz