```file:schema.ts
import { z } from "zod";

export const signupSchema = z.object({
  email: z.string().email("Please enter a valid email address"),
  password: z
    .string()
    .min(8, "Password must be at least 8 characters long")
    .regex(/[A-Za-z]/, "Password must contain at least one letter")
    .regex(/\d/, "Password must contain at least one digit"),
  age: z
    .number()
    .int("Age must be a whole number")
    .min(13, "You must be at least 13 years old")
    .max(120, "Age must be 120 or less"),
});

export type Signup = z.infer<typeof signupSchema>;

export type ValidationResult =
  | { success: true; data: Signup }
  | { success: false; errors: Record<string, string> };

export function validateSignup(input: unknown): ValidationResult {
  const result = signupSchema.safeParse(input);

  if (result.success) {
    return { success: true, data: result.data };
  }

  const errors: Record<string, string> = {};
  for (const issue of result.error.issues) {
    const key = issue.path.length > 0 ? issue.path.join(".") : "form";
    if (!(key in errors)) {
      errors[key] = issue.message;
    }
  }

  return { success: false, errors };
}
```