Проектная лаборатория

Собственный Shell

0 / 76этапов пройдено

Этап 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 go

2. Откройте папку в IDE

cd ./my-shell

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage jp8

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста