Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Entièrement justifié signifie qu'il est aligné à gauche et à droite, et est obtenu en augmentant l'espacement entre les mots jusqu'à ce que chaque ligne s'adapte.
En relation:
- Justifier un texte en ajoutant des espaces
- Aligner le texte sur un bloc
- Et d'une certaine manière, cela peut être considéré comme la prochaine étape du traitement de texte n ° 1: la césure (qui semble n'avoir jamais été publiée).
Contribution
Vous pouvez saisir des informations dans le format de votre choix. Vous recevrez:
- Une largeur cible (en caractères), comprise entre 5 et 100 (inclus);
- Un bloc de texte contenant éventuellement des mots coupés. Cela peut être une chaîne séparée par des espaces, un tableau de mots ou un tableau de tableaux de fragments de mots (ou toute autre représentation de données que vous désirez).
Une entrée typique peut être:
Width: 25
Text: There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.
Où les tirets indiquent les points de césure possibles et les espaces les limites des mots. Une représentation alternative possible du texte:
[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]
Sortie
Le texte d'entrée avec des espaces ajoutés entre les mots, les sauts de ligne à la largeur de la colonne et les points de césure choisis pour le justifier pleinement à la largeur de la colonne. Pour les fonctions, un tableau de chaînes (une pour chaque ligne) peut être renvoyé au lieu d'utiliser la séparation de nouvelle ligne.
Une sortie possible pour l'entrée ci-dessus peut être:
There's no business like
show business, no bus-
iness I know.
Notez que tous les tirets ont été supprimés à l'exception de celui dans le dernier "bus-iness", qui est conservé pour montrer que le mot passe à la ligne suivante, et a été choisi pour s'assurer que la deuxième ligne contient autant de texte que possible.
Règles
À l'intérieur de chaque ligne, le nombre d'espaces entre les mots ne peut pas varier de plus de 1, mais l'endroit où vous insérez les espaces supplémentaires dépend de vous:
hello hi foo bar <-- not permitted (1,1,5) hello hi foo bar <-- not permitted (2,1,4) hello hi foo bar <-- OK (2,2,3) hello hi foo bar <-- OK (2,3,2) hello hi foo bar <-- OK (3,2,2)
Aucune ligne ne peut commencer ou se terminer par des espaces (sauf la dernière ligne, qui peut se terminer par des espaces).
La dernière ligne doit être justifiée à gauche, contenant des espaces simples entre chaque mot. Il peut être suivi d'espaces arbitraires / d'une nouvelle ligne si vous le souhaitez, mais ce n'est pas obligatoire.
Les mots seront constitués de AZ, az, 0-9 et d'une simple ponctuation (
.,'()&
)Vous pouvez supposer qu'aucun fragment de mot ne sera plus long que la largeur cible, et il sera toujours possible de remplir les lignes selon les règles (c'est-à-dire qu'il y aura au moins 2 fragments de mot sur chaque ligne, ou 1 fragment de mot qui remplit la ligne à la perfection)
Vous devez choisir des points de césure qui maximisent le nombre de caractères des mots sur les lignes précédentes (c'est-à-dire que les mots doivent être consommés avec gourmandise par les lignes), par exemple:
This is an input stri-ng with hyph-en-at-ion poi-nts. This is an input stri- <-- not permitted ng with hyphenation points. This is an input string with hyph- <-- not permitted enation points. This is an input string with hyphen- <-- OK ation points.
Le code le plus court en octets gagne
Exemples
Width: 20
Text: The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.
The quick brown fox
jumps over the lazy
dog.
Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).
Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Width: 80
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles & Code Golf is a question and answer site for programming
puzzle enthusiasts and code golfers. It's built and run by you as part of the
Stack Exchange network of Q&A sites. With your help, we're working together to
build a library of programming puzzles and their solutions.
Width: 20
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles
& Code Golf is a
question and answer
site for programming
puzzle enthusiasts
and code golfers.
It's built and run
by you as part of
the Stack Exchange
network of Q&A
sites. With your
help, we're working
together to build a
library of program-
ming puzzles and
their solutions.
Width: 5
Text: a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z
a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss t
u vv
ww x
yy z
Width: 10
Text: It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!
It's the
black be-
ast of
Araghhhhh-
hhhhhhhhh-
hhh!
la source
anybod-y
avec une largeur 7, pouvons-nous choisir de sortir soitanybody
ouanybod-\ny
?Réponses:
JavaScript (ES6), 218 octets
Prend des arguments dans currying syntax (
f(width)(text)
) et l'entrée de texte est au format double tableau décrit dans le défi. Les chaînes sont converties dans ce format via.split` `.map(a=>a.split`-`))
. De plus, les sauts de ligne sont des sauts de ligne littéraux dans les chaînes de modèle.Non golfé et réorganisé
L'idée ici était de parcourir chaque partie de la chaîne entière et de construire chaque ligne une partie à la fois. Une fois la ligne terminée, elle augmente l'espacement des mots de gauche à droite jusqu'à ce que tous les espaces supplémentaires soient placés.
Extrait de test
la source
GNU sed
-r
, 621 octetsPrend la saisie sur deux lignes: la largeur sous forme de nombre unaire en premier et la chaîne en second.
Je suis certain que cela pourrait être joué beaucoup plus, mais j'ai déjà jeté trop de temps dessus.
Essayez-le en ligne!
Explication
Le programme fonctionne en deux phases: 1. Diviser et 2. Justifier. Pour ce qui suit, supposons que notre entrée soit:
Installer
Nous lisons d'abord l'entrée, en déplaçant la première ligne (la largeur sous la forme d'un nombre unaire) vers l'espace d'attente (
x
), puis en ajoutant la ligne suivante (N
), puis une copie de la largeur de l'espace d'attente (G
) à l'espace de motif. Depuis queN
nous avons laissé un leader,\n
nous le remplaçons par!@
, que nous utiliserons comme curseurs dans la phase 1.Maintenant, le contenu de l'espace d'attente est
1111111111111
(et ne changera plus désormais) et l'espace du motif est (au format de la commande "imprimer sans ambiguïté" de sedl
):La phase 1
Dans la phase 1, le
@
curseur principal avance d'un caractère à la fois et pour chaque caractère, a1
est supprimé du "compteur" à la fin de l'espace de motif. En d' autres termes,@foo\n111$
,f@oo\n11$
,fo@o\n1$
, etc.Le
!
curseur suit derrière le@
curseur, marquant les endroits que nous pourrions casser si le compteur atteint 0 au milieu de la ligne. Quelques tours ressembleraient à ceci:Ici, il y a un motif que nous reconnaissons: un espace immédiatement suivi par le
@
curseur. Puisque le compteur est supérieur à 0, nous avançons le marqueur de rupture, puis continuons à avancer le curseur principal:Voici un autre schéma:,
-@
et nous avons encore 7 dans le compteur, nous avançons à nouveau le curseur de pause et continuons d'avancer:Voici un modèle différent: un trait d'union précédant immédiatement le curseur de rupture et un autre précédant le curseur principal. Nous supprimons le premier tiret, avançons le curseur de rupture et, puisque nous avons supprimé un caractère, ajoutons 1 au compteur.
Nous continuons à avancer le curseur principal:
Similaire à avant, mais cette fois le curseur principal précède un espace plutôt que de suivre un trait d'union. Nous supprimons le trait d'union, mais comme nous avançons également le curseur principal, nous n'augmentons ni ne décrémentons le compteur.
Enfin, notre compteur a atteint zéro. Puisque le caractère après le curseur principal est un espace, nous insérons une nouvelle ligne et mettons les deux curseurs immédiatement après. Ensuite, nous réapprovisionnons le compteur (
G
) et recommençons.La phase 1 continue, faisant avancer les curseurs et faisant correspondre différents motifs, jusqu'à ce que le
@
curseur atteigne la fin de la chaîne.À la fin de la phase 1, notre espace de modèle ressemble à ceci:
Ou:
Phase 2
Dans la phase 2, nous utilisons
%
comme curseur et utilisons le compteur de la même manière, en commençant comme ceci:Tout d'abord, nous comptons les caractères sur la première ligne en avançant le curseur et en supprimant 1s du compteur, après quoi nous avons;
Puisque le compteur est 0, nous ne faisons rien d'autre sur cette ligne. La deuxième ligne a également le même nombre de caractères que le compteur, alors passons à la troisième ligne:
Le compteur est supérieur à 0, nous replaçons donc le curseur au début de la ligne. Ensuite, nous trouvons la première série d'espaces et ajoutons un espace, décrémentant le compteur.
Le compteur est supérieur à 0; puisque le curseur est déjà dans la dernière (seule) série d'espaces sur la ligne, nous le replaçons au début de la ligne et le faisons à nouveau:
Maintenant, le compteur est 0, nous déplaçons donc le curseur au début de la ligne suivante. Nous répétons cela pour chaque ligne sauf la dernière. C'est la fin de la phase 2 et la fin du programme! Le résultat final est:
la source
gsed (GNU sed) 4.4
j'obtiensgsed: -e expression #1, char 16: ":" lacks a label
. Pouvez-vous ajouter une note sur la façon exacte dont vous l'invoquez? (J'utiliseprintf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
)-r
drapeau, c'est pourquoi le lien TiO ci-dessus va à la page bash.!
(bien que puisque j'ai raté!
la liste des caractères spéciaux possibles, je ne lui en voudra pas).JavaScript (ES6), 147 octets
Prend l'entrée comme
(width)(text)
.Essayez-le en ligne!
Commenté
la source
APL (Dyalog Unicode) ,
129 123 121 118 111 109 107 104 10095 octets SBCSEssayez-le en ligne!
la source
Stax ,
5150 octetsExécuter et déboguer
la source
Python 2 , 343 octets
Essayez-le en ligne!
la source
print'\n'.join(L[:-1])
au lieu defor e in L[:-1]:print e