Вот довольно простое описание открытой книги в формате ASCII:
|\
| \
| \
| \
| \__________
| || |
| || Lorem i |
\ || psum do |
\ || lor sit |
\ || amet, |
\ || consect |
\||_________|
Обратите внимание, что текстовая часть находится только на правой странице и имеет 7 символов в ширину и 5 в высоту. Также обратите внимание, что верхний край книги имеет 5 обратных слешей и 10 подчеркиваний. 10 прибывает из ширины текста плюс 3, и 5 - половина 10.
Используя тот же формат масштабирования, мы можем изменить размер книги, чтобы текстовая область имела ширину w и высоту h , где w - любое нечетное положительное целое число, а h - любое положительное целое число.
Некоторые книги в формате W × H : 1 × 1, 1 × 2, 3 × 2
|\
|\ | \
|\ | \____ | \______
| \____ | || | | || |
| || | | || L | \ || Lor |
\ || L | \ || o | \ || em |
\||___| \||___| \||_____|
Количество подчеркиваний в верхней части всегда равно w +3, а число обратных косых черт всегда ( w +3) / 2.
Цель
Напишите программу, которая принимает имя файла и w и h в качестве аргументов командной строки, и выводит книгу с этими размерами текста в стандартный вывод, отображая содержимое файла.
Если в файле больше текста, чем уместится на одной странице, N
ключ должен напечатать следующую страницу и B
вернуться назад. Ничего не должно происходить, если B
нажать на первой странице или N
нажать на последней странице. Программа должна остановиться при Q
нажатии клавиши.
пример
Предположим, f.txt
содержит Lorem ipsum dol?
и пользователь нажал последовательность клавиш N N B N N Q
. Программа должна запустить что-то вроде этого:
>>> bookmaker f.txt 3 2
|\
| \
| \______
| || |
\ || Lor |
\ || em |
\||_____|
|\
| \
| \______
| || |
\ || ips |
\ || um |
\||_____|
|\
| \
| \______
| || |
\ || dol |
\ || ? |
\||_____|
|\
| \
| \______
| || |
\ || ips |
\ || um |
\||_____|
|\
| \
| \______
| || |
\ || dol |
\ || ? |
\||_____|
>>>
Обратите внимание, что после каждой книги стоит новая строка, а пробелы отсутствуют. Это обязательно.
Ноты
- Вы можете предположить, что файл содержит только печатные символы ASCII (шестнадцатеричные от 20 до 7E).
- Напечатайте один символ в каждом доступном месте, независимо от границ слова.
- w и h являются необязательными аргументами, которые по умолчанию равны 7 и 5 соответственно. Ваша программа будет либо ни один, ни оба. (Вы можете предположить, что входные данные всегда правильно сформированы.)
- Заполните любое пустое место на последней странице пробелами.
Q
по-прежнему необходимо выйти, если есть только одна страница.
выигрыш
Самая короткая программа в байтах после применения бонусов выигрывает.
Бонусы
- Удалите начальные пробелы, чтобы каждая строка начиналась со слова (или сегмента слова). например,
| amet, |
в первом примере станет| amet, c |
. (-30 байт) - Очистите экран ранее нарисованных книг после
N
или послеB
нажатия (иT
если вы делаете бонус после этого), чтобы книга выглядела как изменяющиеся страницы на месте. (-20 байт) Сделайте так, чтобы
T
клавиша мгновенно переключалась между текстом, рисуемым слева направо сверху вниз (по умолчанию), сверху вниз слева направо. Если вы сделали первый бонус, он должен работать для столбцов в режиме сверху вниз. (-100 байт)Так, например:
|\ | \ | \______ | || | \ || Lor | \ || em | \||_____|
становится
|\ | \ | \______ | || | \ || Lrm | \ || oe | \||_____|
\033[2J\033[;H