```ts
export function tileRenders(requests: [number, string][], freshFor: number, size: number): [number, string][] {
    if (freshFor <= 0 || !Number.isInteger(freshFor)) throw new Error('Invalid freshFor');
    if (size <= 0 || !Number.isInteger(size)) throw new Error('Invalid size');

    const cache: { [tile: string]: number } = {};
    const renders: [number, string][] = [];

    for (const [tick, tile] of requests) {
        if (!(tick in cache)) {
            // Remove the oldest tile from the cache
            let oldestTile = null;
            let oldestTick = Infinity;

            for (const t in cache) {
                if (cache[t] < oldestTick || (cache[t] === oldestTick && t < oldestTile)) {
                    oldestTile = t;
                    oldestTick = cache[t];
                }
            }

            if (Object.keys(cache).length >= size && oldestTile !== null) {
                delete cache[oldestTile];
            }
        }

        renders.push([tick, tile]);
        cache[tile] = tick + freshFor;
    }

    return renders;
}
```