kirby urner schrieb: >> I doubt if it is a good choice to use a dictionary here, as this is not >> an ordered data >> structure and interchanging the layers of the cube will certainly make >> the cube >> imperfect. > > Yes, I think you're right. I was trying to advertise dictionary > syntax, but not appropriately in this case. My earlier draft was > nested tuples, and I could have stuck with that, but thought it too > boring. > > A more complete module would also have audit code that actually summed > all the rows, columns and diagonals, and spit out 315 every time. > > I've written most of this auditing code, but decided the bare data > would be better. > I did a similar thing, deciding to use a flat list. If one used the flat list *and* the (given) nested one(s) one could make the code even more compact.
My solution goes like this: from operator import __and__ magic5 = [ [[25, 16, 80, 104, 90], [115, 98, 4, 1, 97], [42, 111, 85, 2, 75], [66, 72, 27, 102, 48], [67, 18, 119, 106, 5]], [[91, 77, 71, 6, 70], [52, 64, 117, 69, 13], [30, 118, 21, 123, 23], [26, 39, 92, 44, 114], [116, 17, 14, 73, 95]], [[47, 61, 45, 76, 86], [107, 43, 38, 33, 94], [89, 68, 63, 58, 37], [32, 93, 88, 83, 19], [40, 50, 81, 65, 79]], [[31, 53, 112, 109, 10], [12, 82, 34, 87, 100], [103, 3, 105, 8, 96], [113, 57, 9, 62, 74], [56, 120, 55, 49, 35]], [[121, 108, 7, 20, 59], [29, 28, 122, 125, 11], [51, 15, 41, 124, 84], [78, 54, 99, 24, 60], [36, 110, 46, 22, 101]] ] def flatten(lol): flat = [] for l in lol: flat.extend(l) return flat ## This approach - using slices - operates best with a flat list def msq(s): return reduce(__and__, ( [sum(s[i:i+5])==315 for i in range(0,25,5)] + [sum(s[i:25:5])==315 for i in range(5)] + [sum(s[0:25:6])==315, sum(s[4:21:4])==315])) def magic(cube): sq=flatten([flatten(sq) for sq in cube]) return reduce(__and__, ( [msq(sq[i:i+25]) for i in range(0,125,25)] + [msq(sq[i:125:5]) for i in range(5)] + [msq(flatten([sq[i+j:i+j+5] for i in range(0,125,25)])) for j in range(0,21,5)] + [sum(s)==315 for s in [sq[0:125:31],sq[20:105:21],sq[4:121:29],sq[24:101:19]]])) print magic(magic5) # I wonder how it will look like with a 3-dimensional list Regards, Gregor _______________________________________________ Edu-sig mailing list Edu-sig@python.org http://mail.python.org/mailman/listinfo/edu-sig