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