Prompt di codice: un compito pronto per ogni linguaggio
Scrivere codice con l'intelligenza artificiale funziona se la richiesta è precisa. Sedici compiti dicono già linguaggio e versione, se entra in gioco un framework e quanto gestire gli errori: cambia i nomi dei tuoi campi, premi Applica e leggi il risultato.
Funzioni e utilità
Le piccole cose che si riscrivono in ogni progetto: generare uno slug da un titolo, formattare un importo in euro, validare il campo di un modulo e calcolare i giorni lavorativi tra due date.
Slug URL dal titolo
Trasforma il titolo di un articolo in un indirizzo pulito: minuscole, trattini, niente da codificare.
Scrivi una funzione JavaScript che trasforma il titolo di un articolo in uno slug URL: minuscole, gli spazi diventano trattini, gli accenti vengono rimossi, la punteggiatura sparisce e non resta mai un trattino agli estremi. Senza dipendenze.
export function slugify(title) { // la normalizzazione separa la lettera dal suo accento e l'accento viene scartato — nell'URL resterebbe solo spazzatura %C3 const base = title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase() return base.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}
Formattare un importo
Separatore delle migliaia, due decimali e la valuta, con l'arrotondamento fatto prima della formattazione.
Scrivi una funzione Python che stampa un Decimal come importo in formato italiano: 1234.5 diventa 1.234,50 EUR. Arrotonda prima ai centesimi e mai su un float, e lascia passare un altro codice valuta.
def format_money(amount: Decimal, currency: str = "EUR") -> str: # quantizziamo ai centesimi PRIMA di formattare: su un float l'ultimo centesimo sparisce value = amount.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) return locale.format_string("%.2f", value, grouping=True) + " " + currency
Validare un campo del modulo
Un'espressione regolare per email e telefono, più il controllo di una riga che la usa davvero.
Scrivi espressioni regolari che validano un indirizzo email e un numero di telefono italiano nel modulo di registrazione, con una breve funzione di controllo per ciascuna. Spiegami ogni parte del pattern così posso adattarlo.
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]+$/i// nel browser controlliamo solo la forma — se l'indirizzo esista lo dirà la mail di confermaexport const isEmail = (value) => EMAIL_RE.test(value.trim().toLowerCase())
Giorni lavorativi fra due date
Weekend e festività tolti, e un'eccezione se le date arrivano invertite.
Scrivi una funzione PHP 8.3 che conta i giorni lavorativi fra due date: salta sabati, domeniche e ogni data presente nell'array delle festività. Solleva un'eccezione se la data finale precede quella iniziale.
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));}
Dati e API
Il dialogo con il servizio altrui e con il proprio database: una chiamata a un'API REST con retry, l'import di un CSV con encoding sbagliato, una query di report e un elenco paginato.
Chiamata API con retry
Timeout, retry sui 5xx e uno stop netto: un servizio lento non deve bloccare tutta la richiesta.
Scrivi una funzione TypeScript che chiama una API HTTP con quattro secondi di timeout e al massimo tre tentativi. Riprova solo sui 5xx e sugli errori di rete, mai sui 4xx, aspetta fra un tentativo e l'altro e solleva un errore tipizzato quando finiscono.
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)}
Importare un CSV storto
Legge il listino di un fornitore e mette le righe rotte in un file a parte invece di fermarsi.
Scrivi uno script Python con pandas che importa il listino di un fornitore da CSV: separatore punto e virgola, decimali con la virgola, i prezzi arrivano come testo e in alcune righe mancano. Manda le righe sbagliate in rejected.csv e togli i duplicati per 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 query di report
Fatturato per cliente e per mese, scritta sullo schema che incolli nel campo dati.
Scrivi una query PostgreSQL per lo schema qui sopra: fatturato per cliente e per mese nell'ultimo anno, dal più grande al più piccolo, senza i clienti che non hanno mai ordinato.
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
Elenco paginato
Paginazione a cursore: quella che non ripete le righe quando ne arrivano di nuove mentre scorri.
Scrivi una funzione TypeScript con Prisma che restituisce una pagina di post pubblicati con paginazione a cursore: venti alla volta, i più recenti in cima, più un nextCursor che il client rimanda per la pagina successiva.
const page = await prisma.post.findMany({ where: { published: true }, orderBy: { createdAt: "desc" }, cursor: cursorId ? { id: cursorId } : undefined, take: 20,})
Interfaccia
I pezzi di schermata che in realtà sono codice: un hook React personalizzato, una griglia di card responsive in CSS grid che tiene anche sul telefono e una lista dentro una app mobile.
Un hook React
Trattiene quello che si digita nella ricerca per non rilanciare la lista a ogni tasto.
Scrivi un hook React tipizzato che ritarda un valore di 300 ms e pulisce il timer allo smontaggio, più due righe che mostrano come lo usa un campo di ricerca.
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}
Una griglia di card elastica
Le card del catalogo passano da quattro colonne a una senza una sola media query.
Scrivi il CSS di una griglia di card del catalogo: card larghe almeno 260px, la riga si riempie tutta, 16px di spazio, niente media query. Nomi delle classi in BEM.
.catalog__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px;}
Una schermata con lista
Una lista di ordini scorrevole in Jetpack Compose, con tocco sulla riga e stato vuoto.
Scrivi una schermata Jetpack Compose con una lista di ordini scorrevole: ogni riga mostra numero, data e importo, il tocco apre l'ordine e con la lista vuota compare un avviso.
@Composablefun OrderList(orders: List<Order>) { LazyColumn { items(orders) { order -> OrderRow(order, onClick = { openOrder(order.id) }) } }}
Script e automazione
Codice che lavora senza di te: uno script di automazione in Python, il backup del database ogni notte, uno strumento da riga di comando usa e getta e un job con cron che parte da solo.
Backup notturno del database
Fa il dump, dà al file il nome della data e cancella tutto quello che supera il mese.
Scrivi uno script Bash che fa il dump di un database PostgreSQL in /backup con la data nel nome del file, cancella i dump più vecchi di 30 giorni e si ferma al primo errore. Senza segnalazioni di 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
Uno strumento da riga di comando
Un attrezzo usa e getta: percorre una cartella e rinomina i file secondo una regola.
Scrivi uno strumento da riga di comando in Go che percorre una cartella e rinomina le foto con la data di scatto. La cartella arriva come flag, senza --apply mostra solo cosa cambierebbe, e usa solo la libreria standard.
func main() { dir := flag.String("dir", ".", "cartella con le foto") flag.Parse() if err := filepath.WalkDir(*dir, renameByShootDate); err != nil { log.Fatal(err) }}
Un job pianificato
Si sveglia alle sette nei giorni feriali, prende i numeri di ieri e li spedisce via mail.
Scrivi un job Node.js che alle 07:00 dal lunedì al venerdì prende le vendite di ieri da PostgreSQL, le trasforma in una tabella HTML e la manda via mail al reparto vendite. Logga gli errori e non far cadere il processo.
// le sette nei giorni feriali: i numeri servono prima della riunione del mattinocron.schedule("0 7 * * 1-5", async () => { const rows = await db.query(DAILY_SALES_SQL) await mailer.send({ to: "vendite@negozio.it", subject: "Vendite di ieri", html: render(rows) })})
Test
Scrivere test unitari su codice già fatto, con i casi limite che a mano si saltano sempre, e un test per un endpoint che deve rispondere anche quando i dati in arrivo sono storti.
Test per una funzione
pytest con casi parametrizzati: zero, un importo negativo e None.
Scrivi test pytest per una funzione format_money(amount, currency): zero, un importo grande, uno negativo, due decimali e un TypeError quando arriva 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)
Test per un endpoint
Test JUnit su GET e POST, compresi il 404 e l'errore di validazione.
Scrivi test JUnit 5 per l'endpoint REST /api/orders: 200 con corpo per un ordine esistente, 404 per un id sconosciuto, 400 per un payload malformato. Controlla i campi JSON, non solo lo stato.
@Testvoid returnsNotFoundForUnknownOrder() throws Exception { mockMvc.perform(get("/api/orders/0")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("order_not_found"));}