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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

.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.

Prompt

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.

Risultato

@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.

Prompt

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.

Risultato

#!/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.

Prompt

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.

Risultato

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.

Prompt

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.

Risultato

// 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.

Prompt

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.

Risultato

@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.

Prompt

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.

Risultato

@Testvoid returnsNotFoundForUnknownOrder() throws Exception { mockMvc.perform(get("/api/orders/0")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("order_not_found"));}

Prompt per il generatore di codice: 16 compiti pronti