День 20 · Контрольная точка 4: срезы, map, строки и файлы · страница 3 из 3

Контрольная точка 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 смотрят ещё и на то, каким приёмом получен результат:

В задачах 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