By using a subset of symbols, we can represent a larger set of symbols. A fountain code is a potentially limitless sequence of symbols that encode the contents of another set of symbols. There are LT codes, Raptor codes, Online codes, etc. According to Wiki, Raptor codes are the most efficient.
I learned about fountain codes through a project that transmits arbitrary data via a stream of QR codes1.