Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Totalmente justificado significa que ele está alinhado à esquerda e à direita e é alcançado aumentando o espaçamento entre as palavras até que cada linha se ajuste.
Palavras-chave:
- Justifique um texto adicionando espaços
- Alinhar o texto a um bloco
- E de certa forma isso pode ser considerado o próximo passo no Processamento de texto nº 1: Hifenização (que parece nunca ter sido publicado).
Entrada
Você pode receber entradas em qualquer formato que desejar. Você receberá:
- Uma largura de destino (em caracteres), no intervalo de 5 a 100 (inclusive);
- Um bloco de texto contendo palavras possivelmente hifenizadas. Pode ser uma cadeia de caracteres separada por espaço, uma matriz de palavras ou uma matriz de matrizes de fragmentos de palavras (ou qualquer outra representação de dados que você desejar).
Uma entrada típica pode ser:
Width: 25
Text: There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.
Onde os hífens indicam possíveis pontos de hifenização e os espaços indicam limites de palavras. Uma possível representação alternativa do texto:
[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]
Saída
O texto de entrada com espaços adicionados entre palavras, novas linhas na largura da coluna e pontos de hifenização escolhidos para justificá-lo totalmente à largura da coluna. Para funções, uma matriz de seqüências de caracteres (uma para cada linha) pode ser retornada em vez de usar a separação de nova linha.
Uma saída possível para a entrada acima pode ser:
There's no business like
show business, no bus-
iness I know.
Observe que todos os hífens foram removidos, exceto aquele no "bus-iness" final, que é mantido para mostrar que a palavra passa para a próxima linha e foi escolhido para garantir que a segunda linha contenha o máximo de texto possível.
Regras
Dentro de cada linha, o número de espaços entre as palavras não pode variar em mais de 1, mas onde você insere os espaços extras depende de você:
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)
Nenhuma linha pode começar ou terminar com espaços (exceto a última linha, que pode terminar com espaços).
A última linha deve ser justificada à esquerda, contendo espaços únicos entre cada palavra. Pode ser seguido por espaço em branco arbitrário / uma nova linha, se desejado, mas isso não é necessário.
As palavras consistirão em AZ, az, 0-9 e pontuação simples (
.,'()&
)Você pode assumir que nenhum fragmento de palavra será maior que a largura do alvo e sempre será possível preencher linhas de acordo com as regras (ou seja, haverá pelo menos 2 fragmentos de palavra em cada linha ou 1 fragmento de palavra que preenche a linha perfeitamente)
Você deve escolher pontos de hifenização que maximizem o número de caracteres de palavras nas linhas anteriores (ou seja, as palavras devem ser consumidas avidamente pelas linhas), por exemplo:
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.
O menor código em bytes ganha
Exemplos
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!
fonte
anybod-y
com a largura 7, podemos escolher a saídaanybody
ouanybod-\ny
?Respostas:
JavaScript (ES6), 218 bytes
Leva argumentos na sintaxe de currying (
f(width)(text)
) e a entrada de texto está no formato de matriz dupla descrito no desafio. Strings são convertidas para esse formato via.split` `.map(a=>a.split`-`))
. Além disso, as novas linhas são literalmente novas dentro das seqüências de caracteres do modelo.Sem golfe e reorganizado
A idéia aqui era percorrer cada parte de toda a cadeia e construir cada linha, uma parte de cada vez. Quando uma linha é concluída, aumenta o espaçamento da palavra da esquerda para a direita até que todos os espaços extras sejam colocados.
Snippet de teste
fonte
GNU sed
-r
, 621 bytesAceita entrada como duas linhas: a largura como um número unário primeiro e a sequência de caracteres segundo.
Estou certo de que isso poderia ser jogado muito mais, mas eu já joguei muito tempo nele.
Experimente online!
Explicação
O programa funciona em duas fases: 1. Dividir e 2. Justificar. Para o abaixo, suponha que nossa entrada seja:
Configuração
Primeiro, lemos a entrada, movendo a primeira linha (a largura como um número unário) para o espaço de espera (
x
), depois anexando a próxima linha (N
) e, em seguida, uma cópia da largura do espaço de espera (G
) para o espaço do padrão. Desde queN
nos deixou uma liderança\n
, substituí-la por!@
, que usaremos como cursores na Fase 1.Agora, o conteúdo do espaço de espera é
1111111111111
(e não será alterado a partir de agora) e o espaço do padrão é (no formato dol
comando "imprimir sem ambiguidade" do sed ):Fase 1
Na Fase 1, o
@
cursor principal avança um caractere de cada vez e, para cada caractere, a1
é removida do "contador" no final do espaço do padrão. Em outras palavras,@foo\n111$
,f@oo\n11$
,fo@o\n1$
, etc.O
!
cursor segue atrás do@
cursor, marcando os lugares que poderíamos quebrar se o contador atingir 0 no meio da linha. Algumas rodadas ficariam assim:Aqui há um padrão que reconhecemos: um espaço imediatamente seguido pelo
@
cursor. Como o contador é maior que 0, avançamos o marcador de quebra e continuamos avançando no cursor principal:Aqui está outro padrão:,
-@
e ainda temos 7 no contador, então avançamos o cursor de quebra novamente e continuamos avançando:Aqui está um padrão diferente: um hífen imediatamente anterior ao cursor de quebra e outro precedendo o cursor principal. Removemos o primeiro hífen, avançamos o cursor de quebra e, como removemos um caractere, adicionamos 1 ao contador.
Continuamos avançando no cursor principal:
Semelhante a antes, mas desta vez o cursor principal precede um espaço em vez de seguir um hífen. Removemos o hífen, mas como também avançamos o cursor principal, não incrementamos nem diminuímos o contador.
Finalmente, nosso contador chegou a zero. Como o caractere após o cursor principal é um espaço, inserimos uma nova linha e colocamos os dois cursores imediatamente após. Depois reabastecemos o contador (
G
) e começamos novamente.A fase 1 continua, avançando os cursores e combinando vários padrões, até que o
@
cursor chegue ao final da string.No final da Fase 1, nosso espaço padrão se parece com o seguinte:
Ou:
Fase 2
Na fase 2, usamos
%
como cursor e usamos o contador de maneira semelhante, começando assim:Primeiro, contamos os caracteres na primeira linha avançando o cursor e removendo 1s do contador, após o que temos;
Como o contador é 0, não fazemos mais nada nessa linha. A segunda linha também tem o mesmo número de caracteres que o contador, então vamos pular para a terceira linha:
O contador é maior que 0, então movemos o cursor de volta para o início da linha. Em seguida, encontramos a primeira sequência de espaços e adicionamos um espaço, diminuindo o contador.
O contador é maior que 0; Como o cursor já está na última (única) sequência de espaços na linha, nós o movemos de volta para o início da linha e fazemos novamente:
Agora, o contador é 0, então movemos o cursor para o início da próxima linha. Repetimos isso para todas as linhas, exceto a última. Esse é o final da fase 2 e o final do programa! O resultado final é:
fonte
gsed (GNU sed) 4.4
eu recebogsed: -e expression #1, char 16: ":" lacks a label
. Você pode adicionar uma observação sobre exatamente como a está invocando? (Estou usandoprintf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
)-r
sinalização, e é por isso que o link do TiO acima vai para a página do bash.!
(embora desde que eu errei!
na lista de possíveis caracteres especiais, eu não vai segurar isso contra isso).JavaScript (ES6), 147 bytes
Toma entrada como
(width)(text)
.Experimente online!
Comentado
fonte
APL (Dyalog Unicode) ,
129 123 121 118 111 109 107 104 10095 bytes SBCSExperimente online!
fonte
Stax ,
5150 bytesExecute e depure
fonte
Python 2 , 343 bytes
Experimente online!
fonte
print'\n'.join(L[:-1])
vez defor e in L[:-1]:print e