Prompts de código: una tarea lista para cada lenguaje
Dieciséis encargos listos para el generador de código con IA. Cada uno fija en qué lenguaje y versión escribir, si entra un framework y con qué rigor tratar los errores: cambia los nombres de tus campos y aplica.
Funciones y utilidades
Lo pequeño que se reescribe en cada proyecto: validar un campo de formulario, generar el slug de una URL a partir del titular, dar formato a un importe y contar los días hábiles entre dos fechas con festivos.
Slug de URL desde el titular
Convierte el título de un artículo en una dirección limpia: minúsculas, guiones y nada que escapar.
Escribe una función de JavaScript que convierta el titular de un artículo en un slug de URL: minúsculas, los espacios pasan a guiones, las tildes y la ñ se normalizan, la puntuación se elimina y nunca queda un guion en los extremos. Sin dependencias.
export function slugify(title) { // la normalización parte la letra acentuada en dos y la tilde se descarta — en la URL solo quedaría basura %C3 const base = title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase() return base.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}
Formatear un importe
Separador de miles, dos decimales y la moneda, con el redondeo hecho antes de formatear.
Escribe una función de Python que muestre un Decimal como importe en formato español: 1234.5 pasa a 1.234,50 EUR. Redondea a céntimos antes y nunca sobre un float, y deja pasar otro código de moneda.
def format_money(amount: Decimal, currency: str = "EUR") -> str: # cuantizar a céntimos ANTES de formatear: sobre un float se pierde el último céntimo value = amount.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) return locale.format_string("%.2f", value, grouping=True) + " " + currency
Validar un campo del formulario
Una expresión regular para el correo y el teléfono, más la comprobación de una línea que la usa.
Escribe expresiones regulares que validen un correo electrónico y un teléfono español en el formulario de registro, con una función de comprobación corta para cada una. Explícame qué hace cada parte del patrón para poder ajustarlo.
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]+$/i// en el navegador solo comprobamos la forma — si la dirección existe lo dirá el correo de confirmaciónexport const isEmail = (value) => EMAIL_RE.test(value.trim().toLowerCase())
Días hábiles entre dos fechas
Fines de semana y festivos descontados, y una excepción si las fechas llegan al revés.
Escribe una función de PHP 8.3 que cuente los días hábiles entre dos fechas: salta sábados, domingos y cualquier fecha del array de festivos. Lanza una excepción si la fecha final es anterior a la inicial.
function workingDays(DateTimeImmutable $from, DateTimeImmutable $to, array $holidays = []): int{ $period = new DatePeriod($from, new DateInterval("P1D"), $to); $isWork = fn (DateTimeImmutable $d) => (int) $d->format("N") < 6 && !in_array($d->format("Y-m-d"), $holidays, true); return count(array_filter(iterator_to_array($period), $isWork));}
Datos y API
La conversación con el servicio ajeno y con tu propia base: consumir una API REST con reintentos y timeout, importar un CSV sucio sin romper nada, escribir la consulta de un informe y paginar la salida.
Llamada a una API con reintentos
Timeout, reintento en 5xx y un final duro: que un servicio lento no cuelgue toda la petición.
Escribe una función de TypeScript que llame a una API HTTP con cuatro segundos de timeout y tres intentos como máximo. Reintenta solo en 5xx y errores de red, nunca en 4xx, espera entre intentos y lanza un error tipado cuando se agoten.
export async function fetchWithRetry(url: string, tries = 3): Promise<Response> { const res = await fetch(url, { signal: AbortSignal.timeout(4000) }) if (res.ok || res.status < 500 || tries === 1) return res await new Promise((r) => setTimeout(r, 400)) return fetchWithRetry(url, tries - 1)}
Importar un CSV sucio
Lee la tarifa de un proveedor y aparta las filas rotas en su propio fichero en vez de fallar.
Escribe un script de Python con pandas que importe la tarifa de un proveedor desde CSV: separador punto y coma, decimales con coma, los precios llegan como texto y en algunas filas faltan. Manda las filas malas a rejected.csv y quita duplicados por order_id.
orders = pd.read_csv("orders.csv", sep=";", decimal=",", on_bad_lines="warn")orders["total"] = pd.to_numeric(orders["total"], errors="coerce")bad = orders["total"].isna()orders.loc[bad].to_csv("rejected.csv", index=False)clean = orders.loc[~bad].drop_duplicates(subset="order_id")
Una consulta de informe
Ingresos por cliente y por mes, escrita contra el esquema que pegues en el campo de datos.
Escribe una consulta de PostgreSQL para el esquema de arriba: ingresos por cliente y por mes del último año, de mayor a menor, sin los clientes que nunca pidieron nada.
SELECT c.name, date_trunc('month', o.created_at) AS month, sum(o.total) AS revenueFROM orders oJOIN customers c ON c.id = o.customer_idWHERE o.created_at >= now() - interval '1 year'GROUP BY 1, 2ORDER BY revenue DESC
Salida paginada
Paginación por cursor: la que no repite filas cuando entran nuevas mientras se desplaza la lista.
Escribe una función de TypeScript con Prisma que devuelva una página de posts publicados con paginación por cursor: veinte cada vez, los más nuevos arriba, y un nextCursor que el cliente devuelve para la página siguiente.
const page = await prisma.post.findMany({ where: { published: true }, orderBy: { createdAt: "desc" }, cursor: cursorId ? { id: cursorId } : undefined, take: 20,})
Interfaz
Las partes de la pantalla que en realidad son código: un hook de React propio, una rejilla de tarjetas responsive que aguanta en el móvil y una pantalla con lista dentro de una app.
Un hook de React
Retiene lo que se escribe en el buscador para no repetir la consulta en cada tecla.
Escribe un hook de React tipado que retrase un valor 300 ms y limpie su temporizador al desmontar, más dos líneas de ejemplo de cómo lo usa un campo de búsqueda.
export function useDebounced(value: string, delay = 300) { const [out, setOut] = useState(value) useEffect(() => { const id = setTimeout(() => setOut(value), delay) return () => clearTimeout(id) }, [value, delay]) return out}
Rejilla de tarjetas flexible
Las tarjetas del catálogo pasan de cuatro columnas a una sin una sola media query.
Escribe el CSS de una rejilla de tarjetas de catálogo: tarjetas de 260px mínimo, la fila se llena entera, 16px de separación, sin media queries. Nombres de clase con BEM.
.catalog__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px;}
Pantalla con lista
Una lista de pedidos que se desplaza en Jetpack Compose, con toque en la fila y estado vacío.
Escribe una pantalla en Jetpack Compose con una lista de pedidos desplazable: cada fila muestra número, fecha e importe, al tocarla se abre el pedido y con la lista vacía aparece un aviso.
@Composablefun OrderList(orders: List<Order>) { LazyColumn { items(orders) { order -> OrderRow(order, onClick = { openOrder(order.id) }) } }}
Scripts y automatización
Código que trabaja sin ti: un script de copia de seguridad de la base cada noche, una utilidad de consola de un solo uso y una tarea programada con cron que se despierta sola.
Copia nocturna de la base
Hace el volcado, nombra el fichero por fecha y borra todo lo que pase del mes.
Escribe un script de Bash que vuelque una base PostgreSQL en /backup con la fecha en el nombre del fichero, borre los volcados de más de 30 días y pare al primer error. Sin avisos de ShellCheck.
#!/usr/bin/env bashset -euo pipefailstamp=$(date +%F)pg_dump --format=custom "$DATABASE_URL" > "/backup/db-$stamp.dump"find /backup -name "db-*.dump" -mtime +30 -delete
Una utilidad de consola
Herramienta de un solo uso: recorre una carpeta y renombra sus ficheros por regla.
Escribe una utilidad de línea de comandos en Go que recorra una carpeta y renombre las fotos por su fecha de captura. La carpeta llega como flag, sin --apply solo muestra qué cambiaría, y usa solo la biblioteca estándar.
func main() { dir := flag.String("dir", ".", "carpeta con las fotos") flag.Parse() if err := filepath.WalkDir(*dir, renameByShootDate); err != nil { log.Fatal(err) }}
Una tarea programada
Se despierta a las siete entre semana, saca las cifras de ayer y las manda por correo.
Escribe una tarea de Node.js que a las 07:00 de lunes a viernes saque las ventas de ayer de PostgreSQL, las convierta en una tabla HTML y la envíe por correo al equipo comercial. Registra los fallos y no tires el proceso.
// las siete entre semana: las cifras tienen que estar antes de la reunión diariacron.schedule("0 7 * * 1-5", async () => { const rows = await db.query(DAILY_SALES_SQL) await mailer.send({ to: "ventas@tienda.es", subject: "Ventas de ayer", html: render(rows) })})
Tests
Cubrir con tests unitarios el código que ya existe: una función con sus casos límite y un endpoint probado también cuando la entrada llega mal o directamente no llega nunca.
Tests para una función
pytest con casos parametrizados: cero, un importe negativo y None.
Escribe tests de pytest para una función format_money(amount, currency): cero, un importe grande, uno negativo, dos decimales y un TypeError cuando entra None. Con parametrize.
@pytest.mark.parametrize("amount,expected", [("0", "0,00"), ("1234.5", "1.234,50")])def test_format_money(amount, expected): assert format_money(Decimal(amount)) == expecteddef test_format_money_rejects_none(): with pytest.raises(TypeError): format_money(None)
Tests para un endpoint
Tests de JUnit para GET y POST, con el 404 y el error de validación incluidos.
Escribe tests de JUnit 5 para el endpoint REST /api/orders: 200 con cuerpo para un pedido existente, 404 con un id desconocido, 400 con un payload malformado. Comprueba los campos del JSON, no solo el estado.
@Testvoid returnsNotFoundForUnknownOrder() throws Exception { mockMvc.perform(get("/api/orders/0")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("order_not_found"));}