Contexte
En typographie, les rivières constituent des lacunes visuelles dans un bloc de texte, dues à un alignement fortuit des espaces. Celles-ci sont particulièrement gênantes puisque votre cerveau semble les capter plus facilement en vision périphérique, ce qui distrait constamment vos yeux.
A titre d'exemple, prenons le bloc de texte suivant, lignes brisées de telle sorte que la largeur de ligne ne dépasse pas 82 caractères :
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do eismod tempor incididunt ut labore et dolore
maga aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
est laborum.
Il y a une rivière qui s'étend sur six lignes dans la partie inférieure droite, que j'ai soulignée dans le bloc suivant:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum. Lorem█ipsum dolor sit amet,
consectetur adipisicing elit, sed do eismod tempor█incididunt ut labore et dolore
maga aliqua. Ut enim ad minim veniam, quis nostrud█exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat. Duis aute█irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla█pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui█officia deserunt mollit anim id
est laborum.
Nous pouvons atténuer cela en choisissant une largeur de colonne légèrement différente. Par exemple, si nous mettons en page le même texte en utilisant des lignes ne dépassant pas 78 caractères , il n'y a pas de rivière plus longue que deux lignes:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt
in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor
sit amet, consectetur adipisicing elit, sed do eismod tempor incididunt ut
labore et dolore maga aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
Notez que pour les besoins de cette question, nous ne considérons que les polices à espacement fixe, telles que les rivières ne sont que des colonnes verticales d'espaces. La longueur d'une rivière est le nombre de lignes qu'elle couvre.
De plus: si vous êtes intéressé par la détection des rivières dans les polices proportionnelles, il existe des publications intéressantes sur le réseau.
Le défi
Vous recevez une chaîne de caractères ASCII imprimables (points de code 0x20 à 0x7E) - c’est-à-dire une seule ligne. Imprimez ce texte avec une largeur de trait comprise entre 70 et 90 caractères (inclus), de manière à minimiser la longueur maximale de tout cours d'eau dans le texte. S'il existe plusieurs largeurs de texte avec la même longueur maximale (minimale) de rivière, choisissez la largeur la plus étroite. L'exemple ci-dessus avec 78 caractères est la sortie correcte pour ce texte.
Pour rompre les lignes, vous devez remplacer les espaces (0x20) par des sauts de ligne, de sorte que les lignes résultantes contiennent autant de caractères que possible, mais pas plus que la largeur de texte choisie. Notez que le saut de ligne résultant ne fait pas partie de ce décompte. Par exemple, dans le dernier bloc ci-dessus, Lorem[...]tempor
contient 78 caractères, ce qui correspond également à la largeur du texte.
Vous pouvez supposer que l'entrée ne contiendra pas d'espaces consécutifs et ne comportera pas d'espaces de début ou de fin. Vous pouvez également supposer qu'aucun mot (sous-chaîne consécutive de non-espaces) ne contiendra plus de 70 caractères.
Vous pouvez écrire un programme ou une fonction en prenant une entrée via STDIN, un argument de ligne de commande ou une fonction et en imprimant le résultat sur STDOUT.
C'est le code de golf, donc la réponse la plus courte (en octets) gagne.
la source
Réponses:
CJam,
116 106 99 84 7772 octetsPrend l'entrée d'une seule ligne et imprime la sortie correcte vers STDOUT.
UPDATE : Amélioré beaucoup et supprimé les boucles redondantes en effectuant tous les calculs dans la boucle de tri elle-même. Également corrigé un bug dans le calcul de la longueur de la rivière.
Explication bientôt (après avoir joué au golf encore plus loin)
Essayez-le ici
la source
ea~
placeX
. Enregistre deux octets.Ruby
162 160 158 152 160157 ( démo )La version non-golfée:
la source
%r{...}
me permet d'utiliser l'interpolation de chaîne. Je viens d'essayer21.times
, mais cela a d'autres implications sur la route et je n'ai pas réussi à trouver une solution plus courte.APL (105)
Explication:
(K⊂⍨' '=K←' ',⍵)
: Ajouter un espace devant⍵
, puis diviser⍵
les espaces. Chaque mot conserve l'espace avec lequel il commence.∘{
...}¨70+⍳21
: avec cette valeur, pour chaque nombre compris dans la plage[71, 91]
: ((En raison de la façon dont les mots sont séparés, chaque "ligne" se termine par un espace supplémentaire au début, qui sera supprimé ultérieurement. La plage est décalée de un pour compenser l'espace supplémentaire.)×⍴⍺:
: s'il reste des mots,z←⍵>+\≢¨⍺
: obtenez la longueur de chaque mot et calculez le total de la longueur par mot. Marquez avec1
tous les mots qui peuvent être utilisés pour remplir la ligne suivante et stockez-les dansz
.(⊂z/⍺),⍵∇⍨⍺⍨~z
: prenez ces mots, puis traitez ce qui reste de la liste.⋄⍺
: sinon, retourne⍺
(qui est maintenant vide).G←
: stocke la liste des listes de lignes dansG
(une pour chaque longueur de ligne possible).V←{
...}¨G
: pour chaque possibilité, calculez la longueur du plus long fleuve et stockez-la dansV
:+\↑≢¨¨⍵
: récupère la longueur de chaque mot (encore) et crée une matrice à partir des longueurs. Calculez le total cumulé pour chaque ligne sur les lignes de la matrice. (Ainsi, l'espace supplémentaire au début de chaque ligne est ignoré.)2≠⌿
: pour chaque colonne de la matrice, voir si la longueur actuelle de la ligne à ce point ne correspond pas à la ligne suivante. Si c'est le cas, il n'y a pas de rivière là-bas.⊂⍨¨↓⍉
: divise chaque colonne de la matrice par elle-même (sur le1
s). Cela donne une liste de listes, où pour chaque rivière il y aura une liste[1, 0, 0, ...]
, en fonction de la longueur de la rivière. S'il n'y a pas de rivière, la liste sera[1]
.⌈/≢¨
: obtenir la longueur de chaque rivière et en obtenir la valeur maximale.⊃G/⍨V=⌊/V
: deG
, sélectionnez le premier élément pour lequel la longueur de la plus longue rivière est égale au minimum pour tous les éléments.{1↓∊⍵,3⊃⎕TC}¨
: pour chaque ligne, associez tous les mots, supprimez le premier élément (l'espace supplémentaire du début) et ajoutez une nouvelle ligne à la fin.∊
: joindre toutes les lignes ensemble.la source
Bash + coreutils,
236157 octetsÉdité avec une approche différente - un peu plus courte qu'avant:
Lit la chaîne d'entrée à partir de la ligne de commande.
Avec 3 types imbriqués, je frémis de penser à la complexité du temps énorme pour cela, mais cela complète l'exemple en moins de 10 secondes sur ma machine.
la source
Python, 314 octets
Un grand merci à SP3000, grc et FryAmTheEggman:
la source
JavaScript (ES6) 194
202Solution itérative, peut-être plus courte si rendue récursive
A expliqué
Testez dans la console FireFox / FireBug.
Sortie
la source
Python 3, 329 octets
Version non-golfée:
la source