Add new operations over a set of classes without modifying those classes — an AreaVisitor and a PerimeterVisitor can both operate on CircleShape/SquareShape without either shape knowing about area or perimeter math.
Implement `CircleShape.accept`/`SquareShape.accept` (call the matching visitCircle/visitSquare on the visitor) and AreaVisitor/PerimeterVisitor.
solve(shapes, visitorType) builds each shape from { type: 'circle', radius } | { type: 'square', side }, visits it, and returns the results (round circle results to 2 decimals).
Sample tests