Centralize o texto!
Neste desafio, você estará centralizando várias linhas.
Exemplos
Foo
barbaz
Foo
barbaz
Hello
World
Hello
World
Programming Puzzles
&
Code Golf
Programming Puzzles
&
Code Golf
Especificações
Cada linha de entrada sempre terá pelo menos um caractere que não seja um espaço em branco; você pode assumir que o único caractere de espaço em branco são espaços ( ) e novas linhas. Cada linha de entrada não terá nenhum espaço em branco à direita e / ou à esquerda (exceto a nova linha). O espaço em branco à direita na saída não é permitido.
Você deve estar centralizado na linha mais longa da entrada. Se essa linha tiver um comprimento uniforme, seu programa / função deve preferir centralizar para a esquerda. O comprimento máximo da linha é o que seu idioma pode suportar, mas seu programa deve funcionar em linhas de pelo menos 500.
Entre os melhores
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Este é o código-golfe, pelo que o código mais curto em bytes vence!
fonte
foo(space)(space)(space)bar
é uma entrada perfeitamente aceitávelRespostas:
Pitão,
1917 bytes2 bytes graças a Jakube
Demonstração
Penso que esta é a primeira vez que a função central
.[
é útil. O comprimento da linha mais longa é encontrado usando transpose sem truncamento (.T
).Os espaços à direita são removidos adicionando um caractere não-espaço à frente, removendo os espaços e removendo o caractere adicionado.
fonte
vim,
433635 bytesBom demais para não postar. Observe a nova linha à direita; é significativo.
Obrigado a @Marth por salvar um personagem!
formato amigável ao vim:
Explicação:
fonte
sor!
inverter a ordem de classificação, poderácol("$")
obter o comprimento da primeira linha (agora a mais longa desde que a ordem seja revertida) em vez de usarG$
, economizando um total geral de 1 byte! edit : ou você pode manter a ordem de classificação e usá-laG:let &tw=col("$")
.:h :sort
descobri que você pode passar uma regex para pular o texto correspondente na classificação, para que você possa:sor /./
classificar em tamanho (+4 bytes), o que permite remover osVGrx
(-4 bytes) e o segundo desfazer ( -1 bytes). Você também pode usar|
separadores em vez de<cr>
encadear os comandos, o que permite ignorar o:
anteslet
(-1 bytes) (observe que você precisa usar asor!
solução,G
não é um comando ex). Portanto:sor! /./|let &tw=col("$")|u|%ce
(com um final<CR>
) deve salvar 2 bytes.Mathematica, 96 bytes
Não me pergunte como funcionou, eu apenas brinquei com ele até que produzisse a saída correta.
fonte
Função não competitiva
Esse desafio destacou a grande falta de uma função de "valor máximo" (e valor mínimo) para sequências preguiçosas, então ... eu as adicionei à biblioteca principal (elas são chamadas ⊤ e ⊥, respectivamente). Portanto, não me preocupei em enviar isso como uma resposta em golf (teria que incluir a declaração da função to para ser válida), então aqui está apenas o programa principal.
Execute
(function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()
no console do navegador para obter uma renderização melhor.Explicação
Acredito que esta seja a primeira resposta do Funciton neste site que usa expressões lambda.
ǁ
para dividir a sequência de entrada nas novas linhas (ASCII 10). Isso retorna uma sequência lenta.ɱ
(map), fornecendo uma lambda que calcula o comprimento de cada string e, em seguida, passamos a sequência final⊤
para obter o comprimento da linha mais longa.ɱ
, dando-lhe um lambda que calcula o comprimento de cada cadeia, subtrai o comprimento de linha máximo calculado anteriormente, as clivagens que por 2 (na verdade, deslocar-direita 1), gera que muitos espaços (ASCII 32) e concatena a sequência nesses espaços. (Por razões geométricas, declarei uma‡
função que chama‼
(string concatenada) com os parâmetros revertidos.)ʝ
para reunir todas as seqüências de caracteres, usando novas linhas (ASCII 10) como separador.fonte
Retina ,
5452 bytesOs
\t
s podem ser substituídos por guias reais, mas eu usei\t
aqui, porque, caso contrário, o SE converterá as guias em espaços. Observe que há um espaço à esquerda na segunda linha.Experimente online.
Explicação
A idéia básica é combinar uma linha que seja pelo menos dois caracteres mais curta que a linha mais longa (ou tecnicamente, dois caracteres mais curta que qualquer outra linha) e envolvê-la em dois espaços. Isso é repetido até que não possamos mais encontrar essa linha, o que significa que todas as linhas estão dentro de um caractere de comprimento máximo (onde o único caractere é responsável por diferenças de paridade e garante que essas linhas sejam deslocadas para a esquerda). Centro).
Quanto ao regex real:
Apenas corresponde a qualquer linha enquanto empurra uma captura no grupo
1
para cada personagem.É um lookbehind que corresponde da direita para a esquerda e move o cursor para o início da string, para que a cabeça de impressão interna possa verificar a string inteira. Observe que, devido à falta de uma âncora, a cabeça de impressão pode ser aplicada de qualquer outro lugar, mas isso não cria correspondências adicionais. Sabemos que
[^\t]
sempre corresponderá a qualquer caractere na string, porque é garantido que a entrada contenha apenas espaços e feeds de linha no que diz respeito a espaço em branco.Este lookahead tenta encontrar uma linha que tenha pelo menos dois caracteres a mais do que a que estamos correspondendo no momento.
[^\t]*
move-se pela string para poder corresponder a qualquer linha.^
garante que estamos começando do início da linha...
depois corresponde aos dois caracteres adicionais necessários para a linha mais longa. Agora(?<-1>.)+
corresponde a caracteres individuais nessa linha enquanto estiver saltando do grupo1
(observe que.
não pode corresponder a um avanço de linha, portanto, isso é restrito a uma linha). Por fim,(?(1)^)
afirma que conseguimos esvaziar o grupo inteiro1
. Se a linha for menor que o necessário, isso não será possível, porque não há caracteres suficientes na linha para sair do grupo 1 com frequência suficiente para esvaziá-la.fonte
Jolf , 3 bytes
Não competitiva, atualize a pergunta de pós-datas.
Experimente aqui! .
¯ \ _ (ツ) _ / ¯ Eu pensei que seria uma função útil.
fonte
JavaScript (ES6),
9391 bytes2 bytes salvos graças ao @ edc65 !
Explicação
Teste
Mostrar snippet de código
fonte
.repeat
aceita e valores trunca não inteiros, assim você não precisa|0
CJam,
262319 bytesMinha primeira vez usando CJam! Quatro bytes salvos graças a Martin Büttner. Experimente online.
Explicação
fonte
qN/_z,f{1$,m2/S*\N}
LabVIEW, 3 ou 35 Primitivas do LabVIEW
Localiza as linhas até não sobrar nenhuma, calcula quantos espaços adicionar e reúne tudo.
Como alternativa, você pode usar o alinhamento central embutido nos indicadores de corda, mas parece que é trapaça.
fonte
Python 2,
8381 bytesObrigado a @xnor por salvar 2 caracteres
exemplo de entrada:
saída de exemplo:
E terminando em segundo lugar com 84 bytes usando str.center () e str.rstrip (obrigado @JF).
fonte
len
a uma variável que você usa duas vezes - que é igual a 5 caracteres (comorange
). Além disso, você pode usarmap
para a lista comp.str.rstrip()
depois de ligarcenter
para se livrar do espaço à direita.len(max(a,key=len))
, veja isso .TeaScript , 24 bytes
Loops através de linhas, adiciona
floor((max line length - line length) / 2)
espaços ao início.Ungolfed
Experimente online
fonte
PowerShell, 58
67bytesaté 58 bytes, graças aos comentários de @ mazzy:
$a
, passa por cada sequência com|%{...}
.string.padleft()
método em cada string, via% -member
atalho, que leva o comprimento desejado da linha final como parâmetro.array_longest_line_length/2 + current_line_length/2
current_line_length/2
->$_.length/2
fonte
Emacs Lisp, 203 bytes
Ungolfed:
Centrado:
fonte
HTML, 40 bytes
Mostrar snippet de código
O trecho inclui a
</xmp>
tag porque o visualizador de trechos de código deseja que minhas tags sejam equilibradas.fonte
MATL , 22
31bytesCada linha é inserida com uma linha à direita (ou seja, um enterpressionamento de tecla). Uma linha vazia (duas enterteclas) marca o final da entrada.
Exemplo
Explicação
fonte
Ruby,
766861 bytesExemplo de execução:
fonte
->t{(s=t.split$/).map{|l|l.center s.map(&:size).max}}
center
caminho primeiro, mas, pelo que entendi, isso por si só quebraria a regra "Não é permitido espaço em branco à direita na saída". Obrigado pela&:size
parte - eu também tentei isso também, mas certamente tratei de algo em torno da sintaxe.Haskell,
1118177 bytesEntrada para a função f, a saída não é impressa.
Uso: carregar no intérprete
ghci center.hs
e, em seguida, se você desejar imprimir a saída de f em uma determinada sequênciaputStr$f"Programming Puzzles\n&\nCode Golf"
Edit: Obrigado a nimi por 34 bytes, ótimo trabalho! : D
fonte
map
:<$>
.replicate(...)' '
pode ser substituído por[1.. ...]>>" "
. Todos em todos:unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q]
.l1 >> l2
faz (comprimento l1) cópias de l2 e concatena-as. Por exemplo"abcd" >> [1,2]
->[1,2,1,2,1,2,1,2]
(<- 4 cópias de 1,2 em uma única lista). No nosso caso,[1..n]>>" "
são n cópias de um espaço igual ao quereplicate
faz.R, 126 bytes
código
destroçado
Provavelmente, existem maneiras melhores de fazer isso, ainda trabalhando nisso.
fonte
Gema, 160 bytes
Escrito principalmente para minha curiosidade de ver o que pode ser feito em uma linguagem sem estrutura de matriz adequada e instrução de loop adequada.
Exemplo de execução:
fonte
Perl 6 , 61 bytes
uso:
fonte
for @l {
raspar 2 bytes e mudarput " "
paraput" "
, barbear outro byte. Isso é verdade para o Perl 6? (Eu não conheço o Perl 6.) Além disso, sua saída, conforme exibida aqui, não corresponde à saída necessária; isso é um erro de digitação?Japt,
2825Experimente online!
Como funciona
fonte
PHP , 98 bytes
Experimente online!
Ungolfed:
Saída:
fonte
05AB1E , 2 bytes
Built-in ftw ¯ \ _ (ツ) _ / ¯
Experimente online ou verifique todos os casos de teste .
Explicação:
(A preferência à direita seria com capital
.C
: veja as diferenças .)fonte
Japt , 1 byte
Experimente ou execute todos os casos de teste
fonte