Ось досить просте зображення 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