Prompts de código: uma tarefa pronta para cada linguagem
Dezesseis tarefas para entregar ao gerador de código do jeito que estão. Cada uma já diz em que linguagem e versão escrever, se entra framework e com que rigor tratar os erros: troque os nomes dos seus campos, toque em «Aplicar» e leia o resultado.
Funções e utilitários
As coisinhas reescritas em todo projeto: gerar um slug a partir do título, formatar um valor em reais no JavaScript, validar um campo do formulário e calcular dias úteis entre duas datas sem contar feriado.
Slug de URL a partir do título
Transforma o título da matéria num endereço limpo: minúsculas, hifens, nada para escapar.
Escreva uma função JavaScript que transforme o título de uma matéria em slug de URL: minúsculas, espaços viram hifens, acentos e cedilha são removidos, pontuação sai fora e nunca sobra hífen nas pontas. Sem dependências.
export function slugify(title) { // a normalização separa a letra do acento e o acento é descartado — no endereço sobraria apenas lixo %C3 const base = title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase() return base.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}
Formatar um valor em dinheiro
Separador de milhar, duas casas decimais e a moeda, com o arredondamento feito antes da formatação.
Escreva uma função Python que mostre um Decimal como valor no formato brasileiro: 1234.5 vira 1.234,50 BRL. Arredonde para centavos antes e nunca no float, e deixe passar outro código de moeda.
def format_money(amount: Decimal, currency: str = "BRL") -> str: # quantizar em centavos ANTES de formatar: no float o último centavo some value = amount.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) return locale.format_string("%.2f", value, grouping=True) + " " + currency
Validar um campo do formulário
Uma expressão regular para e-mail e telefone, mais a checagem de uma linha que usa ela.
Escreva expressões regulares que validem um e-mail e um telefone celular brasileiro no formulário de cadastro, cada uma com uma função curta de checagem. Explique cada parte do padrão para eu conseguir ajustar.
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]+$/i// no navegador conferimos só o formato — se o endereço existe quem diz é o e-mail de confirmaçãoexport const isEmail = (value) => EMAIL_RE.test(value.trim().toLowerCase())
Dias úteis entre duas datas
Fins de semana e feriados descontados, e uma exceção quando as datas chegam trocadas.
Escreva uma função PHP 8.3 que conte os dias úteis entre duas datas: pule sábados, domingos e qualquer data do array de feriados. Lance uma exceção se a data final for anterior à 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));}
Dados e APIs
A conversa com o serviço alheio e com o banco da casa: consumir uma API com novas tentativas quando dá timeout, importar um CSV torto, escrever a consulta de um relatório e paginar uma listagem grande.
Chamada de API com novas tentativas
Timeout, nova tentativa no 5xx e uma parada firme: um serviço lento não pode travar a requisição inteira.
Escreva uma função TypeScript que chame uma API HTTP com quatro segundos de timeout e no máximo três tentativas. Repita só em 5xx e erros de rede, nunca em 4xx, espere entre as tentativas e lance um erro tipado quando elas acabarem.
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 um CSV torto
Lê a tabela de preços do fornecedor e joga as linhas quebradas num arquivo separado em vez de parar.
Escreva um script Python com pandas que importe a tabela de preços de um fornecedor em CSV: separador ponto e vírgula, decimal com vírgula, os preços chegam como texto e em algumas linhas nem vêm. Mande as linhas ruins para rejected.csv e tire duplicatas 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")
Uma consulta de relatório
Receita por cliente e por mês, escrita em cima do esquema que você cola no campo de dados.
Escreva uma consulta PostgreSQL para o esquema acima: receita por cliente e por mês no último ano, do maior para o menor, sem os clientes que nunca compraram.
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
Listagem paginada
Paginação por cursor: aquela que não repete linhas quando chegam novas durante a rolagem.
Escreva uma função TypeScript com Prisma que devolva uma página de posts publicados com paginação por cursor: vinte por vez, os mais novos primeiro, e um nextCursor que o cliente manda de volta para a próxima página.
const page = await prisma.post.findMany({ where: { published: true }, orderBy: { createdAt: "desc" }, cursor: cursorId ? { id: cursorId } : undefined, take: 20,})
Interface
As partes da tela que no fundo são código: um hook personalizado em React, um grid de cards responsivo que aguenta o celular e uma tela de listagem com carregamento e estado vazio.
Um hook de React
Segura o que se digita na busca para a lista não ser refeita a cada tecla.
Escreva um hook React tipado que atrase um valor em 300 ms e limpe o temporizador ao desmontar, mais duas linhas mostrando como um campo de busca usa ele.
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}
Uma grade de cards elástica
Os cards do catálogo vão de quatro colunas para uma sem uma única media query.
Escreva o CSS de uma grade de cards do catálogo: cards de no mínimo 260px, a linha preenchida por inteiro, 16px de espaço, sem media queries. Nomes de classe em BEM.
.catalog__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px;}
Uma tela de lista
Uma lista de pedidos que rola em Jetpack Compose, com toque na linha e estado vazio.
Escreva uma tela em Jetpack Compose com uma lista de pedidos rolável: cada linha mostra número, data e valor, o toque abre o pedido e com a lista vazia aparece um aviso.
@Composablefun OrderList(orders: List<Order>) { LazyColumn { items(orders) { order -> OrderRow(order, onClick = { openOrder(order.id) }) } }}
Scripts e automação
Código que trabalha sem você: um script de automação para o backup do banco de dados, uma ferramenta de linha de comando de uso único e uma tarefa agendada no cron que acorda de madrugada.
Backup do banco de madrugada
Tira o dump, dá ao arquivo o nome da data e apaga tudo que passar de um mês.
Escreva um script Bash que faça o dump de um banco PostgreSQL em /backup com a data no nome do arquivo, apague dumps com mais de 30 dias e pare no primeiro erro. Sem avisos do 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
Uma ferramenta de linha de comando
Um utilitário de uso único: percorre uma pasta e renomeia os arquivos por regra.
Escreva uma ferramenta de linha de comando em Go que percorra uma pasta e renomeie as fotos pela data em que foram tiradas. A pasta chega como flag, sem --apply só mostre o que mudaria, e use apenas a biblioteca padrão.
func main() { dir := flag.String("dir", ".", "pasta com as fotos") flag.Parse() if err := filepath.WalkDir(*dir, renameByShootDate); err != nil { log.Fatal(err) }}
Uma tarefa agendada
Acorda às sete nos dias úteis, pega os números de ontem e manda por e-mail.
Escreva uma tarefa Node.js que às 07:00 de segunda a sexta busque as vendas de ontem no PostgreSQL, monte uma tabela HTML e mande por e-mail para o time comercial. Registre as falhas em log e não derrube o processo.
// sete da manhã nos dias úteis: os números precisam chegar antes da reunião diáriacron.schedule("0 7 * * 1-5", async () => { const rows = await db.query(DAILY_SALES_SQL) await mailer.send({ to: "vendas@loja.com.br", subject: "Vendas de ontem", html: render(rows) })})
Testes
Escrever testes unitários para o código que já existe: uma função coberta caso a caso e um endpoint da API testado também com entrada errada, incluindo as bordas que a gente pula calado.
Testes para uma função
pytest com casos parametrizados: zero, um valor negativo e None.
Escreva testes pytest para uma função format_money(amount, currency): zero, um valor grande, um negativo, duas casas decimais e um TypeError quando chega None. Com 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)
Testes para um endpoint
Testes JUnit em GET e POST, incluindo o 404 e o erro de validação.
Escreva testes JUnit 5 para o endpoint REST /api/orders: 200 com corpo para um pedido existente, 404 para um id desconhecido, 400 para um payload malformado. Verifique os campos do JSON, não só o status.
@Testvoid returnsNotFoundForUnknownOrder() throws Exception { mockMvc.perform(get("/api/orders/0")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("order_not_found"));}