Промпты для кода: готовая задача под любой язык

Шестнадцать техзаданий, по которым генератор кода пишет решение целиком. В каждом указаны язык и версия, нужен ли фреймворк и как подробно разбирать ошибки — поправьте имена полей, нажмите «Применить» и читайте результат.

Функции и утилиты

Мелкие функции пишут заново в каждом проекте: ЧПУ-адрес из заголовка через транслитерацию, сумма в денежном формате, валидация поля формы на javascript и расчёт рабочих дней между датами с учётом праздников.

ЧПУ-адрес из заголовка

Превращает заголовок статьи в аккуратный адрес: нижний регистр, дефисы, ничего, что браузеру пришлось бы экранировать.

Промт

Напиши функцию на JavaScript, которая превращает заголовок статьи в ЧПУ-адрес: нижний регистр, пробелы — дефисами, диакритика снимается, знаки препинания выбрасываются, дефис не стоит по краям. Без зависимостей.

Результат

export function slugify(title) { // нормализация разбивает букву с диакритикой надвое, вторая половина выбрасывается — в адресе от неё остался бы только %-мусор const base = title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase() return base.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}

Формат суммы деньгами

Разделитель тысяч, две цифры после запятой и валюта — с округлением до форматирования, а не после.

Промт

Напиши функцию на Python, которая выводит Decimal как сумму в рублях: 1234.5 превращается в 1 234,50 RUB. Округляй до копеек заранее и никогда на float, и дай передать другой код валюты.

Результат

def format_money(amount: Decimal, currency: str = "RUB") -> str: # квантуем до копеек ДО форматирования: на float последняя копейка теряется value = amount.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) return locale.format_string("%.2f", value, grouping=True) + " " + currency

Проверка поля формы

Регулярка на почту и телефон плюс та самая однострочная проверка, которая ею пользуется.

Промт

Напиши регулярные выражения для проверки адреса почты и российского телефона в форме регистрации и короткую функцию-проверку к каждому. Разбери, что означает каждая часть шаблона, чтобы я мог её поправить.

Результат

const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]+$/i// на клиенте проверяем только форму адреса — существует ли он, покажет письмо с подтверждениемexport const isEmail = (value) => EMAIL_RE.test(value.trim().toLowerCase())

Рабочие дни между датами

Выходные и праздники вычтены, а на перепутанные местами даты — исключение.

Промт

Напиши функцию на PHP 8.3, которая считает рабочие дни между двумя датами: пропускай субботы, воскресенья и любую дату из массива праздников. Если конечная дата раньше начальной — выбрасывай исключение.

Результат

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));}

Данные и API

Разговор с чужим сервисом и со своей базой: запрос к API с повторными попытками при таймауте, импорт CSV с кривой кодировкой, отчётный SQL с группировкой и постраничная выдача без дублей на стыке страниц.

Запрос к API с повторами

Таймаут, повтор на 5xx и жёсткая остановка — чтобы один вялый сервис не подвесил весь запрос.

Промт

Напиши функцию на TypeScript, которая обращается к HTTP-API с таймаутом четыре секунды и тремя попытками. Повторяй только на 5xx и сетевых ошибках, на 4xx — никогда, делай паузу между попытками и бросай типизированную ошибку, когда попытки кончились.

Результат

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)}

Импорт кривого CSV

Читает прайс поставщика и складывает битые строки в отдельный файл, а не падает на первой же.

Промт

Напиши скрипт на Python с pandas, который импортирует прайс поставщика из CSV: разделитель — точка с запятой, дробная часть через запятую, цены приходят текстом, в части строк их нет вовсе. Битые строки положи в rejected.csv, дубли по 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")

Отчётный запрос

Выручка по клиентам и месяцам — по той схеме, которую вы вставили в поле данных.

Промт

Напиши запрос к PostgreSQL по схеме выше: выручка по клиентам и месяцам за последний год, по убыванию, клиенты без единого заказа в отчёт не попадают.

Результат

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

Постраничная выдача

Курсорная пагинация — та, что не повторяет записи, когда во время прокрутки добавились новые.

Промт

Напиши функцию на TypeScript и Prisma, которая отдаёт страницу опубликованных постов курсорной пагинацией: по двадцать, новые сверху, и nextCursor, который клиент присылает за следующей страницей.

Результат

const page = await prisma.post.findMany({ where: { published: true }, orderBy: { createdAt: "desc" }, cursor: cursorId ? { id: cursorId } : undefined, take: 20,})

Интерфейс

Части экрана, которые на самом деле код: кастомный хук на React со своей логикой, адаптивная сетка карточек, не рассыпающаяся на телефоне, и экран со списком и подгрузкой по прокрутке.

Хук для React

Придерживает ввод в поиске, чтобы список не перезапрашивался на каждую букву.

Промт

Напиши типизированный хук для React, который откладывает значение на 300 мс и снимает таймер при размонтировании, и две строки с примером — как им пользуется поле поиска.

Результат

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}

Резиновая сетка карточек

Карточки каталога перестраиваются с четырёх колонок в одну без единого медиазапроса.

Промт

Напиши CSS для сетки карточек каталога: карточка не уже 260px, ряд заполняется целиком, отступы 16px, без медиазапросов. Имена классов по БЭМ.

Результат

.catalog__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px;}

Экран со списком

Прокручиваемый список заказов на Jetpack Compose — с нажатием по строке и заглушкой на пустом списке.

Промт

Напиши экран на Jetpack Compose с прокручиваемым списком заказов: в строке номер, дата и сумма, нажатие открывает заказ, а при пустом списке показывается заглушка.

Результат

@Composablefun OrderList(orders: List<Order>) { LazyColumn { items(orders) { order -> OrderRow(order, onClick = { openOrder(order.id) }) } }}

Скрипты и автоматизация

Скрипт для автоматизации рутины работает без вас: ночной бэкап базы данных по расписанию с ротацией копий, утилита командной строки с аргументами и флагами и задача, просыпающаяся по таймеру.

Ночной бэкап базы

Снимает дамп, называет файл датой и удаляет всё, что старше месяца.

Промт

Напиши bash-скрипт, который снимает дамп базы PostgreSQL в /backup с датой в имени файла, удаляет дампы старше 30 дней и останавливается на первой же ошибке. Без замечаний 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

Утилита для командной строки

Разовый инструмент: обходит папку и переименовывает файлы в ней по правилу.

Промт

Напиши утилиту командной строки на Go, которая обходит папку и переименовывает снимки по дате съёмки. Папку принимай флагом, без --apply только показывай, что изменится, и обойдись стандартной библиотекой.

Результат

func main() { dir := flag.String("dir", ".", "папка со снимками") flag.Parse() if err := filepath.WalkDir(*dir, renameByShootDate); err != nil { log.Fatal(err) }}

Задача по расписанию

Просыпается в семь по будням, забирает вчерашние цифры и отправляет их письмом.

Промт

Напиши задачу на Node.js, которая в 07:00 по будням забирает вчерашние продажи из PostgreSQL, собирает из них HTML-таблицу и отправляет письмом отделу продаж. Ошибки пиши в лог и не роняй процесс.

Результат

// семь утра по будням: цифры нужны до планёрки, а не послеcron.schedule("0 7 * * 1-5", async () => { const rows = await db.query(DAILY_SALES_SQL) await mailer.send({ to: "sales@shop.ru", subject: "Продажи за вчера", html: render(rows) })})

Тесты

Писать юнит-тесты для уже готового кода мешает не лень, а края, до которых руками не доходят: проверки функции с граничными случаями и тесты для API-эндпоинта вместе с кодами ответов.

Тесты на функцию

pytest с параметризацией: ноль, отрицательная сумма и None.

Промт

Напиши тесты pytest для функции format_money(amount, currency): ноль, большая сумма, отрицательная, две цифры после запятой и TypeError на None. Через 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)

Тесты на эндпоинт

JUnit на GET и POST, включая 404 и ошибку валидации.

Промт

Напиши тесты JUnit 5 для REST-эндпоинта /api/orders: 200 с телом для существующего заказа, 404 на неизвестный id, 400 на кривой payload. Проверяй поля JSON, а не только статус.

Результат

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

Промпты для генератора кода: 16 готовых задач | iBro