Voici une représentation ASCII assez simple d'un livre ouvert:
|\
| \
| \
| \
| \__________
| || |
| || Lorem i |
\ || psum do |
\ || lor sit |
\ || amet, |
\ || consect |
\||_________|
Notez que la partie texte est uniquement sur la page de droite et fait 7 caractères de large par 5 de haut. Notez également que le bord supérieur du livre comporte 5 barres obliques inverses et 10 traits de soulignement. Le 10 vient de la largeur du texte plus 3 et le 5 est la moitié de 10.
En utilisant le même format de mise à l'échelle, nous pouvons redimensionner le livre pour avoir une zone de texte w caractères large et h haut, où w est tout entier positif impair et h est tout entier positif.
Certains livres w × h : 1 × 1, 1 × 2, 3 × 2
|\
|\ | \
|\ | \____ | \______
| \____ | || | | || |
| || | | || L | \ || Lor |
\ || L | \ || o | \ || em |
\||___| \||___| \||_____|
Le nombre de traits de soulignement en haut est toujours w +3 et le nombre de barres obliques inverses est toujours ( w +3) / 2.
Objectif
Écrivez un programme qui prend un nom de fichier et w et h comme arguments de ligne de commande, et sort un livre avec ces dimensions de texte vers stdout, affichant le contenu du fichier.
Lorsque le fichier contient plus de texte que ne peut en contenir une page, la N
clé doit imprimer la page suivante et B
revenir en arrière d'une page. Rien ne devrait se produire si vous B
appuyez sur la première page ou N
sur la dernière page. Le programme devrait s'arrêter lorsque la Q
touche est enfoncée.
Exemple
Supposons que f.txt
contient Lorem ipsum dol?
et que l'utilisateur ait appuyé sur la séquence de touches N N B N N Q
. Le programme devrait exécuter quelque chose comme ceci:
>>> bookmaker f.txt 3 2
|\
| \
| \______
| || |
\ || Lor |
\ || em |
\||_____|
|\
| \
| \______
| || |
\ || ips |
\ || um |
\||_____|
|\
| \
| \______
| || |
\ || dol |
\ || ? |
\||_____|
|\
| \
| \______
| || |
\ || ips |
\ || um |
\||_____|
|\
| \
| \______
| || |
\ || dol |
\ || ? |
\||_____|
>>>
Notez qu'il y a une nouvelle ligne après chaque livre et aucun espace de fin. Ceci est nécessaire.
Remarques
- Vous pouvez supposer que le fichier contient uniquement des caractères ASCII imprimables (hex 20 à 7E).
- Imprimez un caractère à chaque emplacement disponible, quelles que soient les limites des mots.
- w et h sont des arguments facultatifs par défaut à 7 et 5 respectivement. Votre programme ne recevra ni l'un ni l'autre ni les deux. (Vous pouvez supposer que l'entrée est toujours bien formée.)
- Remplissez tout espace de texte vide sur la dernière page avec des espaces.
Q
devrait toujours être requis pour quitter s'il n'y a qu'une seule page.
Gagnant
Le programme le plus court en octets après application des bonus gagne.
Bonus
- Supprimez les espaces de début pour que chaque ligne commence par un mot (ou segment de mot). par exemple
| amet, |
dans le premier exemple deviendrait| amet, c |
. (-30 octets) - Effacer l'écran des livres préalablement dessinés après
N
ouB
est pressé (etT
si vous faites le bonus après) de sorte que les regards du livre comme ses pages l' évolution en place. (-20 octets) Faites en sorte que la
T
touche bascule instantanément entre le texte en cours de dessin de gauche à droite de haut en bas (par défaut), de haut en bas de gauche à droite. Si vous avez fait le premier bonus, cela devrait fonctionner pour les colonnes en mode de haut en bas. (-100 octets)Ainsi, par exemple:
|\ | \ | \______ | || | \ || Lor | \ || em | \||_____|
devient
|\ | \ | \______ | || | \ || Lrm | \ || oe | \||_____|
\033[2J\033[;H