Designing the self-assembly of arbitrary shapes using minimal complexity building blocks