Two other ideas, concerning using minecarts to store information:
one idea that looked very attractive was _stacking_ minecarts: if you drop a minecart on top of another minecart, the second minecart will sit in the tile above and will patiently wait for the cart below to vacate its position before it falls down. If you drop additional minecarts on top of the second minecart, it will end up in the same location, and in theory, it should be possible to stack an arbitrary number of carts in one tile like this. With weight-dependent plates and different-weight carts, you can actually store binary information like this, not just "yup, there's a minecart here", or "this tile contains n minecarts" (would be unary information, pretty wasteful). E.g., carts of four different weights can be "read out" by two pressure plates, holding two bits of information per cart.
In practice, however, i haven't had any success with this idea. Perhaps i'm delusional again, but it seems that carts take longer to fall into larger minecart stacks, which promises to shoot reading speed to hell (it's likely to be quite glacial anyway, you'll have to drag out the carts one after the other and employ some kind of reading machinery to tell which cart represents which bit of your stored information).
I tried to keep the reading speed in check by pulling four carts at once out of storage, but that puts them too close to each other, so they're unreasonably difficult to get back into the stack. In my test, the leading cart was eventually caught by the second before it finished falling from the feeding hole into the stack and got wedged in place, never falling down at all and blocking the entire machine.
It may be possible to get this scheme to work, but i don't have much hope. It promises to be completely useless for actual data storage outside of archiving anyway, but it _might_ be possible to use it as storage medium for "graphical" information - when you only cycle one cart per 110 steps, the drop might still work, and the processing machinery per stack is fairly small, while storing, say, twenty or so carts could still be practical; notably, increasing the stack doesn't require more buildings, just more minecarts.
While the stacking approach shows little promise and seems to have added practical difficulties, another doctrine for using cart weight for data storage shows more promise - just using a cart's weight, as readable by pressure plates, as information. Minecarts come in the following weight brackets (only looking at empty carts for now, giving examples for every bracket but not listing every possible material):
0-50 - wood
50-100 - blood thorn (also included in wood)
100-150 - aluminium
250-300 - pewter (all types), zinc, tin
300-350 - bronze, brass, nickel silver, iron, steel
350-400 - copper, nickel
400-450 - silver
450-500 - lead
550-600 - electrum
750-800 - gold, rose gold
850+ - platinum
Aluminium, platinum and electrum are notable, because they're uncommon materials which are the only examples in their weight brackets. Blood thorn is similarly unique, but _also_ activates 0-50 pressure plates, making it less than practical for data processing.
Discounting blood thorn (not easy to procure and difficult to test for), that gives ten different weights. Three minecarts can come in 1000 possible combinations of weights, which'd be almost ten bits in binary. Restricting the weight spread to eight possibilities would mean three bits stored per minecart, which'd be easy enough to translate into binary. Properly reading those different weights takes a bit of effort, but if you adress memory cells independently and run them through a shared reading array, the cost should be pretty low compared to fully binary memory storage. I built a test rig to see how well reading these things works, and while tricky, it's doable.
Each "kilo" consists of three carts, sitting on the same 3x1-sized roller pushing north and held back by a door. Once the door opens, the carts leave to the north and file through two rollers (each activated by the first cart that passes it, going north); the first roller redirects carts two and three to the west, the second roller gets activated when cart two passes it and pushes cart three off to the west again. The first cart ends up in the top, the second in the middle and the third in the bottom reading row. I built one pressure plate for every possible weight (since there are only three carts per position in this thingy, i even only built three plates each in the top and middle row), so that's the output here. It'd need to be fed into a latch for further data processing, possibly after converting it to binary.
Starting on the same roller makes the exit of carts from the holding cell difficult, they start out almost on top of each other and can collide in the three-way splitter. The leftmost cell gave the most trouble. I eventually used a medium-speed roller for it and added a few rollers to ensure sufficient speed/movement inside the splitter. The carts are sorted into the cell they came from upon return, once again by roller switches run by the same lever that adressed the releasing door. The door must shut by the time the carts return and the switching rollers in the return branch must be operative when the carts pass it; that suggests either a longer delay for the roller logic or some fancy timing work.
"Writing" to this kind of memory would clearly be rather difficult, you'd need minecart magazines holding the required-weight carts and would need to pull out the desired carts in the proper order (and file the former memory contents back into the magazines). There wouldn't be much you could do directly with the memory, just reading, writing, and reordering the carts. The main attraction is that the memory itself could be quite compact, taking only four tiles, one roller, one door and three carts to hold ~10 bits of information.
EDIT - reading eight different cart weights to give a clean three-bit output is remarkably easy, come to think of it; it takes no more than four pressure plates, directly linked to the bit states.
Let's say we have weight groups one through eight, each heavier than the one before. So we'd set up our pressure plates like this:
Pressure plate A - highest bit: activates for weight groups five through eight
Pressure plate B - middle bit: activates for weight groups three through six
Pressure plate c - lowest bit: activates for weight groups two and three
Pressure plate C - lowest bit: activates for weight groups six and seven
Cart 1 activates no pressure plates - binary value 000
Cart 2 activates pressure plate c - binary value 001
Cart 3 activates plates B and c - binary value 011
Cart 4 activates plate B - binary value 010
Cart 5 activates plates A and B - binary value 110
Cart 6 activates plates A, B and C - binary value 111
Cart 7 activates plates A and C - binary value 101
Cart 8 activates plate A - binary value 100
Plates A and B are only linked to one bit each and are thus naturally unambiguous, c and C are both linked to the same bit, but cannot be active at the same time since their activation ranges do not overlap. At worst, you'll need to make sure there's enough cooldown time for pressure plates to reset between readings.
Evidently, any number of different-weight carts can be clearly distinguished using no more than half the cart number in pressure plates, rounded up. This is not likely to be particularly useful at 16 minecarts, though, since that would still mean eight plates to generate four bits of data, not to mention balancing cart weights by coming up with adequate cargo loadouts for six additional weight groups, although that might be easier than expected by loading carts with water or magma.
I'm seriously considering ironing out the bugs on this one and implementing it for main data storage; 96 minecarts could be held in 32 memory stores, each holding 9 bits of information, just over a byte. In theory, you'd still need to have up to 768 carts available to be able to store every possible memory state, although some states should be much less likely, so you might get away with, say, 100 carts of minimum weight (wood) to stand for bin000, if that's your basic "empty" state of memory, while other types wouldn't need to be nearly as abundant. Compared to bitwise data storage, this could save a lot of space and machinery, but would be quite a bit slower to respond and limited in the operations that could be done on stored data directly.