Super interesting question that has had me thinking for a few days. I too am kind of new to Grasshopper, and more specific, new to programming. So I think that you need to refine your question, both to us and to yourself. what do you mean by “Waste”? and what are your constraints? So any shape will have an area, let’s say in square inches. It will take that many square inches of tile to fill in that space.
If you lay a horizontal course of tile and end up with an 1/8 of tile left over can you start the next course with that left over piece? Can you cut all of your tiles in half? in quarters? in eights? I think that the smaller the tile pieces the easier they will fill in.
If you can make your grout joints super big, well you use less tile, so make the grout joint the entire wall (goofy but based on your question it is one answer). It is kind of a rabbit hole, that question (Alice in wonder landish). My limited experience makes me believe that you may need to really think about what you mean by waste. Do you mean how can I buy the fewest tiles? Or do you mean how can I throw the least away? I am not sure those two are the same. What are your criteria? as many full tiles as possible? Grout lines between 1/16" and 3/16" or? Every course stats with a full tile? etc.
I messed around with it a little bit, deployed Galapagos on it moving tiles around with a fixed grout line and set Galapagos to minimize the area of the tiles used and the results was “pick any thing”.
Challenge one = figuring out how to use grasshopper, components, data trees etc.
Challenge two= thinking about your solution from a programming perspective.
I don’t know if any of this helps…