I feel like I'm only capable of the kludgiest of solutions. Took me 14 tiles to beat lvl 48 and 16 for 49. Question for those who have efficient solutions for lvl40+ levels - do you use a lot f custom tiles? I find I don't really bother often and not sure how helpful they really are.
Also what is your methodology. I find myself, especially for the more complicated later levels, trying to think of what I want to do at each step modularly and then do it. But it's really hard to simplify the solution and allow a lot of tiles to pull double duty that way.
I used to build huge solutions too. It took me a while to get the hang of optimizing them. Usually while optimizing the custom tiles that I used at first disappear. But building the solution first with some custom tiles makes it better to read and easier to grasp the essence of my own solution. Stripping the non-essentials out is very important. On the levels you're referring to (40-50) only one of my solutions uses a custom tile in the final solution. After that I use them more and more.
On the methodology - optimizing most of the lower solution is all about removing unnecessary turns. I try to use mirrors wherever possible (most of them also could be an arrow or turn) because the mirrors make it clear to me that this turn is somehow redundant.
Splitters that don't really split are very useful for local optimizations too. By this I mean a splitter (usually a left split or a right split) where one of the balls always goes into some wall. I just need a turn from one direction and a straight from another.
Optimizing the more complex levels is more interesting. I once was proud of my 36-tile solution to direct4, using 3 instances of my own direct2 and connecting them with a stripped-down-version of 'encode'. And then I thought of an entirely different approach, not even behind a computer. That quickly dropped it to 30 and after some more local optimizations it got to 27. Memory (lvl 50) & Storage (lvl 56) also are based on ideas that evolved while on my bike. Encode (lvl39) and Colorful (lvl38) are examples of quite the opposite: no way I'd find these without trying it out.
And then there's the really complex things that haven't been turned into a level (yet?). I made a "tree-based memory", where you can read/write any word (reds&blues) on any address (reds&blues). There 90% of the work was with pen&paper before I even dared to touch the computer. And I never bothered to optimize it. David made a prime generator, which wasn't optimized either, but quite cool nonetheless. By the time we get to a Turing machine, nobody cares about stars no more. A readable/debugable/explainable machine feels just better.