Контрольная точка 4
Восемь задач по блоку 4: срезы и общий массив, map, строки и руны, файлы. По ним видно, какие темы осели. Блок 5 — структуры — строится поверх срезов и map: строка выгрузки станет одним значением, а срез таких значений — таблицей, и незасчитанная задача показывает, что повторить до него.
Задачи
Условие — в TASK.txt папки задачи, числа у каждого стажёра свои.
| № | Папка | Что сделать | Где перечитать |
|---|---|---|---|
| 1 | kt1 |
отчёт по файлу orders.csv: итоги по артикулу в map, сортированная печать, битые строки в поток ошибок, код возврата |
дни 18 и 19; памятка, «map» и «Строки и файлы» |
| 2 | kt2 |
свой тест на готовую функцию разбора строки | дни 14 и 19; памятка, «Тесты в блоке 4» |
| 3 | kt3 |
починить программу, где два рейса делят один массив | день 17; памятка, «Срезы изнутри» |
| 4 | kt4 |
починить nil-map и проверку наличия ключа | день 18; памятка, «map» |
| 5 | kt5 |
прайс, выровненный по буквам, а не по байтам | день 19; памятка, «Строки и руны» |
| 6 | kt6 |
таблица трассировки append и подсреза |
день 17; правила — course page 20 2 |
| 7 | kt7 |
что лежит в stock: подсрез и append — программа этого не печатает |
день 17; памятка, «Срезы изнутри» |
| 8 | kt8 |
len и байтовая позиция в русской строке — программа их не печатает |
день 19; памятка, «Строки и руны» |
stagiaire@lab:~$ cd ~/gocourse/day20/kt1
stagiaire@lab:~/gocourse/day20/kt1$ cat TASK.txt
Контрольная точка 4. Задача 1 — отчёт по выгрузке заказов.
Программа читает файл orders.csv из текущего каталога (имя фиксированное,
ввода с клавиатуры нет) и печатает итоги по каждому артикулу.Дальше в TASK.txt — формат строки, битые строки, отчёт, код возврата, главное требование задачи, примеры с вашими числами и как задача проверяется.
Как сдаётся
Всё проверяет course check 20. Отдельно сдаются только ответы на задачи 7 и 8 — числа через пробел вместо слова ЧИСЛА; отправить заново можно. В обеих задачах спрашивается то, чего программа не печатает: ответ получается разбором, а не запуском.
stagiaire@lab:~/gocourse/day20/kt8$ course answer day20.kt8 5 4
Принято: day20.kt8 = 5 4Вместо 5 4 — свои числа.
Программы с вводом (задачи 3–5) проверка запускает на наборе вводов. Первые случаи — примеры из TASK.txt, на них при расхождении видно и то, что было нужно. Остальные скрыты: видно только ввод и то, что напечатала программа.
✘ Задача 3 — рейсы больше не делят один массив
Условие: cat ~/gocourse/day20/kt3/TASK.txt — нарисуйте, куда пишет второй append.
следующий уровень подсказки: course hint 20 kt3
случай 1 из 7, ввод: 5 7 3
строка 1, программа напечатала: «Рейс 1, 37 кг: 5 7 3 22»
а нужно: «Рейс 1, 28 кг: 5 7 3 13»Нужный ответ на скрытом вводе решаете вы по правилам из TASK.txt. Проверка останавливается на первом неверном случае — после починки может всплыть следующий.
Задача 1 читает файл по имени, поэтому её случаи — это разные orders.csv. Проверка собирает программу, кладёт каждый файл в отдельный каталог и запускает программу там. Обычный вывод, поток ошибок и код возврата сверяются отдельно, и проверка называет, что именно не совпало. Строки скрытого файла показываются с номерами:
✘ Задача 1 — отчёт по orders.csv: итоги в map, битые строки, код возврата
Условие: cat ~/gocourse/day20/kt1/TASK.txt — обычный вывод, поток ошибок и код сверяются отдельно.
следующий уровень подсказки: course hint 20 kt1
случай 3 из 15, файл orders.csv:
строка 1: SCR-40;Саморез 4х40;44;740
строка 2: SCR-40;Саморез 4х40;45;740
обычный вывод (stdout):
строка 1, программа напечатала: «Заказов нет»Способ, а не только вывод. Задачи 1, 3 и 4 смотрят ещё и на то, каким приёмом получен результат:
- в задаче 1 итоги копятся в
map: в неё пишут по артикулу и из неё читают. Артикулы в скрытых файлах не те, что в примерах, и идут не по порядку — зашитый список артикулов и печать «по списку» не проходят; - в задаче 3 среди изменённых строк есть копия среза, а проверка в своей копии программы печатает первый рейс ещё раз в конце
main. Если рейсы по-прежнему делят массив, повтор это покажет, в каком бы порядке ни стояла печать; - в задаче 4
mapсоздана, наличие ключа читается вторым результатом, правка — не больше трёх строк. Переписанная заново программа — не починка.
В задачах 3 и 4 файл должен быть отформатирован gofmt: две строки, склеенные через ;, он разводит обратно. В задаче 5 способ подсчёта букв не проверяется — годятся и utf8.RuneCountInString, и []rune, и ширина с точностью Printf, если строки прайса верные.
✘ Задача 4 — nil-map и проверка наличия ключа починены
Условие: cat ~/gocourse/day20/kt4/TASK.txt — сначала go run . на примере, прочитайте, где паника.
следующий уровень подсказки: course hint 20 kt4
в main.go изменено строк: 25, можно не больше 3. Что поменяли: diff ~/.course/orig/day20/kt4/main.go ~/gocourse/day20/kt4/main.goВ задачах 3 и 4 строки блока import в размер правки не входят: пакет, который нужен для починки, добавляйте.
Ваш тест (задача 2) проверяется подменой. Сначала go test запускается на вашей работе — он обязан пройти. Потом проверка берёт копию каталога и по очереди подменяет в ней parseLine шестью заведомо неверными реализациями: на каждой тест обязан упасть. Каждая подмена ошибается ровно в одном из шести обязательных случаев, перечисленных в TASK.txt.
✘ Задача 2 — свой тест на parseLine ловит три подмены
Тест проходит на подмене 3 из 3 — значит, одного из обязательных случаев в нём нет. Сверьте тест со списком случаев в TASK.txt.
следующий уровень подсказки: course hint 20 kt2Последняя подмена — другая запись той же логики: на ней тест обязан пройти. Тест, который вместо результата вызова разглядывает текст parse.go, на ней падает:
✘ Задача 2 — свой тест на parseLine ловит три подмены
Тест падает на другой записи той же логики: он проверяет не поведение функции, а её текст или окружение. Сравнивайте результат вызова с ожидаемым.
следующий уровень подсказки: course hint 20 kt2Файлы parse.go и limits.go менять не нужно — проверка сверяет их с оригиналом.
Таблица в kt6 сверяется целиком: одна неверная клетка — задача не засчитана, и какая именно, проверка не говорит. Новых правил контрольная не вводит: все правила курса собраны на второй странице, course page 20 2. Для этой задачи главные — правила про колонки среза, общий массив и append.
kt6/main.go, kt7/main.go и kt8/main.go менять не нужно: номера строк в таблице и ответы считаются по тем файлам, какие положил стенд, — проверка сверяет их с оригиналом. Отладочная печать — в копии в scratch.
Ритуал перед коммитом
Четыре пункта дня в контрольную точку не входят, но на порог дня влияют:
| Пункт | Что проверяет | Как закрыть |
|---|---|---|
t_gotest |
в журнале есть go test |
прогон теста в kt2 |
t_vet |
в журнале есть go vet |
go vet . в папке задачи перед коммитом |
git |
в ~/gocourse/day20 не меньше шести коммитов с изменениями в задачах и нет незакоммиченных файлов задач |
коммит после каждой задачи |
errors |
в ~/errors.md не меньше сорока разборов |
памятка, «Попробуйте сейчас» |
Порядок для каждой задачи тот же, что весь блок: прогон на примерах, gofmt -l ., go vet ., git diff, git add ., git commit.
Коммиты
Работа дня должна лежать в репозитории ~/gocourse/day20: не меньше шести коммитов, в которых меняются файлы задач, и ни одного незакоммиченного файла в папках задач. Задачи 7 и 8 сдаются ответом и файлов не меняют. Пустой коммит (git commit --allow-empty) и коммит, где изменён только черновик scratch, не считаются.
✘ Работа дня лежит в репозитории ~/gocourse/day20 (коммитов с изменениями: 6, нужно от 7)Порог и пересдача
Задача засчитана целиком или не засчитана. Порог — 6 задач из 8. Итог по точке на пустом стенде:
--- контрольная точка 4 ---
Задач сдано: 0 из 8. Порог — 6. Пересдача — доделайте задачи и повторите course check 20.День закрывается при трёх условиях: сдано 9 пунктов из 12 — ритуал и задачи вместе; точка взята; сданы контрольные вопросы. Без точки день не закроется при любом числе пунктов:
Контрольная точка не взята: 5 из 8 при пороге 6.
День не закрыт: пункты контрольной обязательны.Когда пункты и точка сданы, проверка отправит к course quiz 20; после вопросов — ещё раз course check 20.
Пересдача — повторный course check 20, попыток сколько угодно. Между проверками — не меньше 15 секунд, каждая попытка пишется в ~/.course/checks. Свой прогон — примеры из TASK.txt и go test . — быстрее паузы.
Подсказки и время
course hint 20 kt3 работает и на контрольной. Третий уровень на контрольной не даёт ни ответа, ни готового кода: он описывает способ — что нарисовать, какие вводы сделать, как проверить себя. Он попадает в отчёт. Застряли — по порядку: перечитать TASK.txt; прогнать примеры или сделать свой файл на спорный случай; памятка; двадцать минут своей отладки; только потом первый уровень подсказки.
На контрольную заложите около трёх часов. Первые десять минут прочитайте все восемь TASK.txt. Начните с задач, в которых уверены. Просидели над одной задачей полчаса без движения — отложите её и берите следующую, вернётесь потом. course check 20 — после каждой решённой задачи, и коммит.
Что может пойти не так
| Что видите | Что это значит | Что делать |
|---|---|---|
в kt1 нет файлов .go |
main.go не создан или лежит в другой папке |
~/gocourse/day20/kt1/main.go |
итоги не копятся в map |
итоги копятся в срезах или переменных | итоги по артикулу — в map с ключом-артикулом |
в map пишут, но из неё ничего не читают |
отчёт печатается из своего списка, а не из map |
slices.Sorted(maps.Keys(m)) и итог по ключу |
| на скрытом файле строки отчёта в другом порядке | печать идёт из for range по map или по порядку ввода |
slices.Sorted(maps.Keys(m)) |
случай 7 из 15: файл orders.csv пустой |
на пустом файле программа печатает не то | «Заказов нет» и код 0 |
лишняя строка пустая строка с номером за концом файла |
перевод строки в конце файла не убран до Split |
strings.TrimSuffix(string(data), "\n") до Split, как в дне 19 |
случай 8 из 15: файла orders.csv нет |
ошибка открытия не напечатана или код не тот | «ошибка:» и err в поток ошибок, os.Exit(1) |
программа завершилась с кодом 0, а нужен 1 |
битые строки были, а код возврата не выставлен | запомнить, что были ошибки, и os.Exit(1) после отчёта |
файл parse.go изменён, а менять его в этой задаче не нужно |
правили функцию вместо теста | cp ~/.course/orig/day20/kt2/parse.go ~/gocourse/day20/kt2/parse.go |
Тест проходит на подмене 2 из 6 |
одного из обязательных случаев в тесте нет | сверить тест со списком в TASK.txt |
Тест падает на другой записи той же логики |
тест читает текст parse.go |
вызывать parseLine и сравнивать результат |
среди изменённых строк нет копии среза |
правка не делает копию: переставлены строки или изменена ёмкость common |
копия среза перед append |
рейсы по-прежнему делят один массив: проверка напечатала первый рейс ещё раз |
вывод совпал только из-за порядка печати | копия среза перед append |
main.go не отформатирован |
строки склеены через ; или отступы сбиты |
gofmt -w main.go, потом размер правки ещё раз |
в main.go изменено строк: 25, можно не больше 3 |
программа переписана | cp оригинала и точечная правка |
map по-прежнему не создана |
осталось var stock map[string]int |
make(map[string]int) |
наличие артикула проверяется не вторым результатом чтения из map |
признак «есть» получен из значения | значение, ok := stock[sku] |
знак � в строке прайса |
строка обрезана по байтам | обрезать []rune |
В таблице осталось знаков ?: 36 |
таблица не заполнена | заменить каждый ? |
файл main.go изменён, а менять его в этой задаче не нужно |
в kt6, kt7 или kt8 добавлена отладочная печать |
cp оригинала, опыты — в scratch |
программа работала дольше 5 секунд и была остановлена |
программа ждёт ввода с клавиатуры или зациклилась | в задаче 1 ввода нет — только файл |
Материал дня закончен. Задания — course lab 20, дополнительное чтение — course extra 20