class Map2D:
def __init__(self, width, height, val):
self._internalMap = [[val]*height for width in range(height)]
def fromArray2D(self, array2D):
self.internalMap = array2D
def at(self, x, y):
return self._internalMap[x][y]
def putAt(self, x, y, val):
self._internalMap[x][y] = val
return self
def putMap2DAt(self, x, y, another):
for ix in range(x, x+another.width()):
for iy in range(y, y+another.height()):
self.putAt(ix, iy, another.at(ix-x, iy-y))
return self
def width(self):
return len(self._internalMap[0])
def height(self):
return len(self._internalMap)
def printPureMap2D(map2d):
for y in range(map2d.height()):
row = []
for x in range(map2d.width()):
row.extend(map2d.at(x, y))
print ''.join(row)
canvas = Map2D(20, 20, ' ')
stars = Map2D(5, 5, '*')
canvas.putMap2DAt(0, 0, stars).putAt(5+3, 0, 'x').putMap2DAt(10, 0, stars)
canvas.putMap2DAt(5, 5, stars)
canvas.putMap2DAt(0, 10, stars).putMap2DAt(10, 10, stars)
printPureMap2D(canvas)
Y2xhc3MgTWFwMkQ6CiAgICBkZWYgX19pbml0X18oc2VsZiwgd2lkdGgsIGhlaWdodCwgdmFsKToKICAgICAgICBzZWxmLl9pbnRlcm5hbE1hcCA9IFtbdmFsXSpoZWlnaHQgZm9yIHdpZHRoIGluIHJhbmdlKGhlaWdodCldCiAgICBkZWYgZnJvbUFycmF5MkQoc2VsZiwgYXJyYXkyRCk6CiAgICAJc2VsZi5pbnRlcm5hbE1hcCA9IGFycmF5MkQKICAgIGRlZiBhdChzZWxmLCB4LCB5KToKICAgICAgICByZXR1cm4gc2VsZi5faW50ZXJuYWxNYXBbeF1beV0KICAgIGRlZiBwdXRBdChzZWxmLCB4LCB5LCB2YWwpOgogICAgICAgIHNlbGYuX2ludGVybmFsTWFwW3hdW3ldID0gdmFsCiAgICAgICAgcmV0dXJuIHNlbGYKICAgIGRlZiBwdXRNYXAyREF0KHNlbGYsIHgsIHksIGFub3RoZXIpOgogICAgCWZvciBpeCBpbiByYW5nZSh4LCB4K2Fub3RoZXIud2lkdGgoKSk6CiAgICAJCWZvciBpeSBpbiByYW5nZSh5LCB5K2Fub3RoZXIuaGVpZ2h0KCkpOgogICAgCQkJc2VsZi5wdXRBdChpeCwgaXksIGFub3RoZXIuYXQoaXgteCwgaXkteSkpCiAgICAJcmV0dXJuIHNlbGYKICAgIGRlZiB3aWR0aChzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2ludGVybmFsTWFwWzBdKQogICAgZGVmIGhlaWdodChzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2ludGVybmFsTWFwKQoKZGVmIHByaW50UHVyZU1hcDJEKG1hcDJkKToKCWZvciB5IGluIHJhbmdlKG1hcDJkLmhlaWdodCgpKToKCQlyb3cgPSBbXQoJCWZvciB4IGluIHJhbmdlKG1hcDJkLndpZHRoKCkpOgoJCQlyb3cuZXh0ZW5kKG1hcDJkLmF0KHgsIHkpKQoJCXByaW50ICcnLmpvaW4ocm93KQoKY2FudmFzID0gTWFwMkQoMjAsIDIwLCAnICcpCnN0YXJzID0gTWFwMkQoNSwgNSwgJyonKQoKY2FudmFzLnB1dE1hcDJEQXQoMCwgMCwgc3RhcnMpLnB1dEF0KDUrMywgMCwgJ3gnKS5wdXRNYXAyREF0KDEwLCAwLCBzdGFycykKY2FudmFzLnB1dE1hcDJEQXQoNSwgNSwgc3RhcnMpCmNhbnZhcy5wdXRNYXAyREF0KDAsIDEwLCBzdGFycykucHV0TWFwMkRBdCgxMCwgMTAsIHN0YXJzKQoKcHJpbnRQdXJlTWFwMkQoY2FudmFzKQ==