(Nota: esta é a minha primeira pergunta de código de golfe, mas, até onde eu sei, ninguém mais fez exatamente isso, por isso devo ser bom.)
Sua tarefa é criar um programa ou função que inclua uma sequência de caracteres s
e um número inteiro n
e retorne ou produza esse texto agrupado em várias linhas. Cada palavra deve estar totalmente em uma linha; ou seja, não há palavras divididas no meio. Cada linha não pode ter mais que n
caracteres, e você deve ajustar o máximo de palavras possível em cada linha.
Exemplo:
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat."
n = 50
output:
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Sed eget erat lectus. Morbi mi mi, fringilla
sed suscipit ullamcorper, tristique at mauris.
Morbi non commodo nibh. Pellentesque habitant
morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Sed at iaculis mauris.
Praesent a sem augue. Nulla lectus sapien, auctor
nec pharetra eu, tincidunt ac diam. Sed ligula
arcu, aliquam quis velit aliquam, dictum varius
erat.
Sua saída pode ser uma matriz de seqüências de caracteres ou uma única sequência com quebras de linha. Além disso, você pode assumir que nenhuma palavra terá mais do que n
isso; portanto, não se preocupe em lidar com casos estranhos.
Aplicam-se as regras de E / S padrão e as brechas padrão são proibidas. Espaços à direita são permitidos.
Como se trata de código-golfe , a solução de shortes em bytes vence.
Aqui está um exemplo de programa em Python que funcionaria.
fonte
n
é o comprimento máximo da linha, desculpe-me por isso não estar claro. Eu vou esclarecer. Além disso, as regras foram atualizadas para que uma divisão simples não funcione.Respostas:
Python 2 , 26 bytes
Experimente online!
Meh ... os internos são chatos ... em vez disso, tenha uma boa solução de 87 bytes aqui:
Experimente online!
Produz espaços à direita.
fonte
PHP , 8 bytes
É certo que não é a solução mais original, mas o PHP tem uma função nativa que atende perfeitamente aos seus requisitos!
wordwrap
:Use assim:
Ou Experimente online!
fonte
JavaScript (ES6),
75 7372 bytesToma entrada como
(string)(n)
.Experimente online!
Variáveis
A saída formatada é armazenada emo (em verde abaixo).
A linha atualizadavocê é definida como a concatenação de:
Precisamos inserir uma quebra de linha sempre que on ésimo caractere de você for definido (indexado 0, em vermelho abaixo).
Exemplo
Adicionando "LOREM":00eu01O02R03E04M050607080910111213141516
Adicionando "IPSUM":00eu01O02R03E04M05∙06Eu07P08S09você10M111213141516
Adicionando "DOLOR":00eu01O02R03E04M05∙06Eu07P08S09você10M11∙12D13O14eu15O16R
fonte
r+w+' '
?Perl 6 ,
4629 bytesExperimente online!
Solução baseada em Regex que recebe entrada com curry, gosta
f(n)(s)
e retorna uma lista de linhas. Cada linha, exceto a última, possui um espaço em branco à direitaExplicação:
fonte
Vim, 15 bytes / pressionamentos de tecla
Uma pergunta sobre formatação de texto? Eu sei exatamente a ferramenta para o trabalho! E ainda tem meu nome nas duas primeiras teclas: D
<C-r>
meios ctrl-r.Isso pode ser um pouco mais curto no V , mas eu prefiro responder no vanilla vim para obter respostas que realmente mostrem como o vim conciso pode ser o desafio certo. E a diferença é tão pequena de qualquer maneira.
Também pode ser o seguinte para 15 bytes:
Experimente online!
fonte
DJ:
Este programa foi criado pelo DJ, nosso gato favorito com um diamante no pescoço. [...]R ,
3627 bytesR tem isso como um built-in (
strwrap
), retornamos um vetor de linhas de divisão.Experimente online!
fonte
Haskell , 70 bytes
fonte
Python 2 , 74 bytes
Experimente online!
fonte
Java (JDK) ,
4644 bytesBasicamente, uma solução de regex pura em Java, quase certamente a mais curta que já escrevi.
Um brinde a Kevin por ajudar a reduzir ainda mais os bytes no regex!
Experimente online!
Usando um lamdba com caril, ele cria uma regex para corresponder avidamente a
n
caracteres seguidos por um espaço ou final de sequência. Em seguida, substitui esses caracteres por si mesmos, seguidos por uma nova linha.fonte
[ $]
na verdade, apenas corresponde a um espaço ou,$
se bem me lembro, ao invés do final da string. No entanto, parece funcionar, então parece que ele pode ser jogado em um único espaço por menos bytes.$0
vez de$1
.replaceAll
é tão detalhado!Mathematica, 16 bytes
Função incorporada. Pega uma string e um número inteiro como entrada e retorna uma string como saída.
fonte
Powershell,
4083 bytesCaso de teste
n=80
adicionado.Script de teste:
Saída:
fonte
if
/else
com o falso ternárioreturn
naelse
parte e uma declaração nathen
parte.C (gcc) , 68 bytes
Experimente online!
Graças ao ceilingcat , salve 2 bytes movendo global
char*l
para o parâmetrofonte
Japonês , 20 bytes
Experimente online!
Obrigado a Bubbler e Shaggy pela ajuda
Explicação:
fonte
[X,Y].join(...)
.Retina 0.8.2 , 37 bytes
Experimente online! Toma
s
en
em linhas separadas. Explicação:Converta
n
para unário.Combine os espaços não em branco e, em seguida, olhe para a frente
n
e conte-os como$#1
. Em seguida, volte e use um grupo de equilíbrio para corresponder aosn
caracteres seguidos por espaços em branco.Produza as correspondências como uma lista de linhas.
fonte
.{1,50}
e$0¶
, mas onde50
é recebido como entrada?Carvão , 19 bytes
Experimente online! Link é a versão detalhada do código. Recebe entrada de
n
es
em linhas separadas. Explicação:Entrada
n
.Mova o cursor para a esquerda um quadrado para equilibrar o movimento certo desde a primeira iteração do loop.
Divida a string em espaços e faça um loop sobre as palavras.
Calcule se a próxima palavra alcançará a borda direita.
Caso contrário, mova um quadrado para a direita.
Se ele iniciar uma nova linha.
Saída a palavra.
fonte
Vermelho ,
125, 117, 114112 bytesExperimente online!
fonte
05AB1E , 18 bytes
Experimente online.
Explicação:
fonte
Java 8, 135 bytes
Experimente online.
Explicação:
fonte
JavaScript, 40 bytes
Experimente online!
fonte
APL (Dyalog Unicode) , SBCS de 14 bytes
Função Infix; argumento da esquerda é
n
, argumento da direita én
.Experimente online!
⎕CY
c op y na biblioteca dfns⋄
entãowrap
[c] usar o envoltório [n] função[c] código dessa função
[n] notas para essa função
Versão golfada de
wrap
, 59 bytes SBCSExperimente online!
{
...}
dfn;⍺
é argumento à esquerda (largura),⍵
é argumento à direita (string)≢⍵
registro (número de caracteres) da sequência⍺≥
…:
Se a largura for maior ou igual a isso, então:⍵
retornar a string⋄
de outra forma:' '=⍵
Máscara booleana em que os espaços em branco são iguais à stringb←
armazenar emb
(para b lanks)(
…)↑
Use o seguinte número de elementos:⍺+1
um a mais que a largura⍸
i ndices onde a verdadeirag←
armazenar emg
(para g aps)⍺≥
Máscara booleana em que a largura é maior ou igual àg/⍨
filtrar os índices de gap por esse⍺,
acrescente isso à largura⊃⌽
escolha o último elemento disso (lit. escolha o primeiro dos invertidos)t←
loja emt
(para t ake)b⊃⍨
use isso para escolher um elemento da máscara de b lankst+
adicione isso at
⍵↓⍨
solte muitos caracteres da string⍺∇
recaia sobre isso com o mesmo argumento à esquerda⎕TC,
acréscimo que à lista de t erminal c ontrolo caracteres (8: HT, 10: NL, 13: CR)2↓
elimine os dois primeiros caracteres (deixando apenas 13: CR)(
…),
Anexa isso ao seguinte:t↑⍵
os primeirost
caracteres da stringfonte
Graças a @Erik the Outgolfer, uma versão para golfe:
Python 3 , 94 bytes
Experimente online!
# Python 3 , 130 bytesExperimente online!
Versão não tão golfe ...fonte
JavaScript + HTML + CSS,
11764 bytes-53 bytes, cortesia de @Neil
fonte
(n,s)=>document.body.innerHTML+=`<p style=width:${n}ch><tt>${s}</tt></p>`
para 74 bytes. Se você estiver disposto a desenterrar versões antigas do Firefox, poderá salvar outros 8 bytes com(n,s)=>document.body.innerHTML+=`<pre wrap width=${n}>${s}</pre>`
.ch
unidades. O Firefox 65 calcula50ch
como500px
; O Chromium 70 calcula50ch
como400px
elit. Sed eget erat lectus. Morbi mi mi, fringilla sed
(Segunda linha) tem mais de 50 caracteres. Estou usando o Chrome mais recente.<p>
interior do<tt>
.Gelatina , 12 bytes
Experimente online!
Infelizmente, é muito lento para trabalhar no caso de teste fornecido em menos de um minuto no TIO.
fonte
C # (.NET Core) , 162 bytes
Essa função usa um regex que corresponde ao espaço em branco mais próximo que fica perto do enésimo ou múltiplo de enésimo caractere e divide a sequência com base nele.
Experimente online!
O link TIO é um programa completo e a função possui uma palavra-chave estática para que a função possa ser chamada de main.
Regex de teste
fonte
C # (compilador interativo do Visual C #) , 78 bytes
Experimente online!
O crédito vai para @LukeStevens por ter apresentado a versão Java ... Aparentemente, o .NET faz com que você importe o
RegularExpressions
namespace para fazer uma substituição :(Aqui está minha versão original que se divide no caractere de espaço e usa o LINQ para juntá-los novamente:
C # (compilador interativo do Visual C #) , 91 bytes
Experimente online!
fonte
Dardo , 112 bytes
Experimente online!
fonte
APL (NARS), 48 caracteres, 96 bytes
teste:
fonte
C, 63 bytes
A função deste exercício b (a, n) quebraria a linha "a", como o exercício disse, de forma a não alterar seu comprimento (se vemos o resultado como uma sequência), porque alteramos alguns espaços em \ n ou nova linha em Lugar, colocar. A string de entrada "a" também não deve ter nenhum caractere \ n para a função b () (poderia ter \ n na string de entrada para bs ())
A função b (a, n) seria aceitável apenas porque a restrição deste exercício, que impõe cada palavra de "a", tem comprimento <n se isso não for verdade, essa função pode ir
para um loop infinito ... (muito errado no meu modo de ver, então eu copio também a função mais boa porque nesse caso retornaria -1 e não iria para um loop infinito; é bs (a, n) abaixo) não excluo ambas as funções estão com erros .. .
resultado de b () passado em uma função que adiciona comprimento de linha a cada linha
fonte