Проектная лаборатория
Собственный Shell
Этап 34 · Дополнение имён файлов
Частичное дополнение
Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.
На этом этапе вы обработаете частичное дополнение с помощью наибольшего общего префикса.
Наибольший общий префикс
Наибольший общий префикс (LCP) — самая длинная строка, общая для начала всех совпавших имён. Например:
- У
xyz_foo,xyz_foo_bar,xyz_foo_bar_bazобщий префикс —xyz_foo. - У
readme.txt,report.txtобщий префикс —re. - У
app.py,data.jsonобщего префикса нет (пустой LCP).
Если совпадений несколько:
- Если их общий префикс длиннее текущего ввода, дополните ввод до LCP.
- Иначе вызовите звуковой сигнал при первом нажатии Tab, а при следующих нажатиях выведите совпадения (как на предыдущих этапах).
Например, если в текущем каталоге есть следующие элементы:
xyz_foo/xyz_foo_bar/xyz_foo_bar_baz/
Пользователь может постепенно дополнять ввод с помощью LCP:
$ ls xyz_<TAB>
# Completes to LCP: xyz_foo (shared by all three entries)
$ ls xyz_foo
# User types "_"
$ ls xyz_foo_<TAB>
# Completes to LCP: xyz_foo_bar (shared by xyz_foo_bar/ and xyz_foo_bar_baz/)
$ ls xyz_foo_bar
# User types "_"
$ ls xyz_foo_bar_<TAB>
# Only one match remains, completes with trailing /
$ ls xyz_foo_bar_baz/Обратите внимание: завершающая / появляется только при окончательном дополнении, когда остаётся ровно одно совпадение.
Та же логика применяется к файлам. Если есть readme.txt и report.txt:
$ cat r<TAB>
# Completes to LCP: re (shared by both files)
$ cat re
# User types "a"
$ cat rea<TAB>
# Only one match remains, completes with trailing space
$ cat readme.txt
# ^Если у элементов нет дополнительного общего префикса (например, foo и foobar/):
$ ls foo<TAB>
# LCP is "foo" which is already typed, bell rings
$ ls foo<TAB>
# Lists matches
foo foobar/
$ ls fooПроверки
Тестирующая система создаст вложенные элементы и запустит вашу программу следующим образом:
$ ./your_program.shЗатем она проверит последовательное дополнение по Tab:
$ ls xyz_<TAB>
$ ls xyz_foo_<TAB>
$ ls xyz_foo_bar_<TAB>
$ ls xyz_foo_bar_baz/Тестирующая система проверит, что:
- Каждое нажатие Tab дополняет ввод до наибольшего общего префикса оставшихся совпадений.
- Между нажатиями Tab пользователь может вводить дополнительные символы, сужая набор совпадений.
- Завершающий символ (пробел или косая черта) появляется только при единственном оставшемся совпадении.
Примечания
- LCP вычисляется по именам элементов без завершающих символов.
/или пробел добавляется только при единственном оставшемся совпадении. - Даже если LCP совпадает с полным именем элемента (например,
fooпри наличииfooиfoobar/), не добавляйте завершающий символ, пока совпадений несколько.
Проверка в вашей IDE
Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.
Настройка проекта и IDE
1. Создайте проект один раз
node '/opt/graphlms/tools/project-lab/cli.mjs' init shell ./my-shell --language go2. Откройте папку в IDE
cd ./my-shellРеализуйте требования этапа в созданном проекте.
Запустите из папки проекта
node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage jp8Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.
Результат проверки
go / ЛОКАЛЬНОПодключение к локальной проверке…
Здесь появится результат
Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.