Центр Текст!


40

Центр Текст!

В этом вызове вы будете центрировать различные линии.

Примеры

Foo
barbaz

 Foo
barbaz
Hello
World

Hello
World
Programming Puzzles
&
Code Golf

Programming Puzzles
         &
     Code Golf

Характеристики

Каждая строка ввода всегда будет содержать хотя бы один непробельный символ, вы можете предположить, что единственным пробельным символом являются пробелы ( ) и символы новой строки. Каждая строка ввода не будет иметь пробелы в конце и / или в начале (кроме новой строки). Конечный пробел в выводе не допускается.

Вы должны быть в центре самой длинной строки на входе. Если эта строка четная, ваша программа / функция должна предпочесть центрирование слева. Максимальная длина строки - это то, что ваш язык может обрабатывать, но ваша программа должна работать не менее чем на 500 строк.


Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

# Language Name, N bytes

где Nразмер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:

# Perl, 43 + 2 (-p flag) = 45 bytes

Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


Это поэтому выигрывает самый короткий код в байтах!


Там никогда не будет более одного внутреннего пространства?
кот

@cat никогда не будет ни одного начального или конечного пробела в строке (ожидайте появления новой строки, если она есть)
Downgoat

да, но я имею в виду внутренние пробелы между словами
кот

1
@ cat О, между словами может быть несколько пробелов. Например, foo(space)(space)(space)barвполне приемлемый вход
Downgoat

Можно ли предположить, что всегда будет более 1 строки?
GamrCorps

Ответы:


15

Pyth, 19 17 байт

2 байта благодаря Якубе

V.ztr+1.[l.T.zNd6

демонстрация

Я думаю, что это первый раз, когда функция центральной панели .[была полезна. Длина самой длинной строки определяется с использованием неусеченной функции transpose ( .T).

Конечные пробелы удаляются путем добавления непробельного символа впереди, удаления пробелов, а затем удаления добавленного символа.


1
Возможно, нам нужна максимальная длина в массиве. Это приходит слишком часто. +1
Maltysen

В спецификациях говорится, что «Конечный пробел в выводе не допускается». Похоже, что на каждой короткой строке выходных данных есть пробелы, поэтому я не уверен, что это считается.
картофель

@potato Спасибо - это было добавлено, так как я ответил.
Исаак

31

vim, 43 36 35 байт

VGrx:sor
G:let &tw=col("$")
uu:%ce

Слишком хорошо, чтобы не публиковать. Обратите внимание на завершающий символ новой строки; это важно.

Спасибо @Marth за сохранение персонажа!

vim-friendly формат:

VGrx:sor<cr>G:let &tw=col("$")<cr>uu:%ce<cr>

Объяснение:

VGrx                   replace every character with an "x"
:sor<cr>               sort (since all chars are now same, sorts by line length)
G                      go to the very last line
:let &tw=col("$")<cr>  set &tw to column number of last char on this line
                         "let &tw" is equivalent to "set tw"
                         tw is short for textwidth, used in :center
uu                     undo the sort, and the replacing-with-x too
:%ce<cr>               center over entire file (%), using textwidth set earlier

1
Конечно, все это должно быть сделано в режиме вставки, верно?
Алекс А.

9
@AlexA. Ничего из этого не делается в режиме вставки. ಠ_ಠ
Дверная ручка

Если вы используете, sor!чтобы изменить порядок сортировки, вы можете использовать, col("$")чтобы получить длину первой строки (теперь самую длинную с тех пор, как порядок изменился), вместо того, чтобы использовать G$, сохраняя всего 1 байт! edit : или вы можете сохранить порядок сортировки и использовать G:let &tw=col("$")вместо него.
Март

@ Mart Спасибо! Я выбрал последнее (без особой причины).
Дверная ручка

Просматривая, :h :sortя только что обнаружил, что вы можете передать регулярное выражение, чтобы пропустить соответствующий текст в сортировке, так что вы можете использовать :sor /./сортировку по длине (+4 байта), что позволяет вам удалить VGrx(-4 байта) и вторую отмену ( -1 байт). Вы также можете использовать |разделители вместо <cr>цепочки команд, что позволяет пропустить значение :before let(-1 байт) (обратите внимание, что тогда вы должны использовать sor!решение, Gэто не команда ex). Так :sor! /./|let &tw=col("$")|u|%ce (с трейлингом <CR>) следует сохранить 2 байта.
Март

23

Mathematica, 96 байт

StringRiffle[#~StringPadLeft~Floor[Max@(l=StringLength)@a/2+l@#/2]&/@(a=#~StringSplit~"
"),"
"]&

Не спрашивайте меня, как это работает, я просто возился с ним, пока он не дал правильный результат.


27
+1 за «Не спрашивайте меня, как это работает, я просто возился с ним, пока он не выдал правильный вывод»
кошка

4
@cat Вот так я и играю в гольф.
lirtosiast

11

Funciton , неконкурентоспособный

Эта проблема высветила острое отсутствие функции «максимального значения» (и минимального значения) для ленивых последовательностей, так что ... я добавил их в базовую библиотеку (они называются ⊤ и ⊥ соответственно). Поэтому я не удосужился представить его в виде гольф- ответа (он должен был бы включать объявление функции to, чтобы быть действительным), так что вот только основная программа.

Выполните (function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()в консоли браузера, чтобы получить более приятный рендеринг.

   ╓───╖         ╔════╗  ┌───╖  ╔═══╗
 ┌─╢ ‡ ╟─┐       ║ 10 ╟──┤ ǁ ╟──╢   ║
 │ ╙───╜ │       ╚════╝  ╘═╤═╝  ╚═══╝
 │ ┌───╖ │  ┌──────────────┴──────────────────┐
 └─┤ ‼ ╟─┘┌─┴─╖ ┌───╖ ┌───╖ ┌───╖ ┌───╖       │     │
   ╘═╤═╝  │ ɱ ╟─┤ ⊤ ╟─┤ + ╟─┤ ~ ╟─┤ ℓ ╟───┐ ┌─┴─╖ ┌─┴─╖ ╔════╗
     │    ╘═╤═╝ ╘═══╝ ╘═╤═╝ ╘═══╝ ╘═══╝   │ │ ɱ ╟─┤ ʝ ╟─╢ 10 ║
    ┌───╖ ╔═╧═╕ ╔═══╗ ┌─┴──╖ ┌───╖ ╔════╗ │ ╘═╤═╝ ╘═══╝ ╚════╝
  ┌─┤ ℓ ╟─╢   ├─╢ 1 ║ │ >> ╟─┤ … ╟─╢ 32 ║ │   │
  │ ╘═══╝ ╚═╤═╛ ╚═╤═╝ ╘═╤══╝ ╘═╤═╝ ╚════╝ │ ╔═╧═╕ ╔═══╗
  └─────────┘     └─────┘      │   ┌───╖  ├─╢   ├─╢ 0 ║
                               └───┤ ‡ ╟──┘ ╚═╤═╛ ╚═══╝
                                   ╘═╤═╝      │
                                     └────────┘

объяснение

Я считаю, что это может быть первый ответ Funciton на этом сайте, который использует лямбда-выражения.

  • Во-первых, мы используем ǁдля разделения входной строки на новые строки (ASCII 10). Это возвращает ленивую последовательность.
  • Мы пропускаем эту последовательность через ɱ(map), давая ей лямбду, которая вычисляет длину каждой строки, а затем пропускаем последнюю последовательность, чтобы получить длину самой длинной строки.
  • Мы также пропускаем эту последовательность через другую ɱ, давая ей лямбду, которая вычисляет длину каждой строки, вычитает ее из максимальной длины строки, вычисленной ранее, делит ее на 2 (фактически shift-right 1), генерирует столько пробелов (ASCII 32) а затем объединяет строку в эти пространства. (По геометрическим причинам я объявил функцию, которая вызывает (сцепление строк) с обращенными параметрами.)
  • Наконец, мы используем, ʝчтобы собрать все строки вместе, используя переводы строки (ASCII 10) в качестве разделителя.


9

Сетчатка , 54 52 байта

+m`^(.)+$(?<=(?=[^\t]*^..(?<-1>.)+(?(1)^))[^\t]*)
 $0 

Символы \ts можно заменить реальными вкладками, но я \tздесь использовал , потому что в противном случае SE преобразует вкладки в пробелы. Обратите внимание, что во второй строке есть пробел.

Попробуйте онлайн.

объяснение

Основная идея состоит в том, чтобы соответствовать строке, которая по крайней мере на два символа короче самой длинной строки (или технически, на два символа короче любой другой строки), и заключать ее в два пробела. Это повторяется до тех пор, пока мы больше не сможем найти такую ​​строку, что означает, что все строки находятся в пределах одного символа максимальной длины (где один символ должен учитывать несоответствия четности, и гарантирует, что эти строки будут сдвинуты влево). центр).

Что касается фактического регулярного выражения:

^(.)+$

Просто соответствует любой одной строке, нажимая один захват на группу 1для каждого персонажа.

(?<=...[^\t]*)

Это вид сзади, который сопоставляется справа налево и перемещает курсор в начало строки, так что заглядывающий взгляд внутрь может проверить всю строку. Обратите внимание, что из-за отсутствия привязки, просмотр может быть применен из любого места, но это не создает дополнительных совпадений. Мы знаем, что [^\t]он всегда будет соответствовать любому символу в строке, потому что входные данные гарантированно будут содержать только пробелы и переводы строк, если это касается пробелов.

(?=[^\t]*^..(?<-1>.)+(?(1)^))

Этот поисковый запрос пытается найти строку, которая как минимум на два символа длиннее той, которую мы в настоящее время сопоставляем. [^\t]*перемещается по строке, чтобы иметь возможность соответствовать любой строке. ^гарантирует, что мы начинаем с начала строки. ..затем совпадает с двумя дополнительными символами, которые требуются для более длинной строки. Теперь (?<-1>.)+сопоставляет отдельные символы в этой строке при извлечении из группы 1(обратите внимание, что .не может совпадать с переводом строки, поэтому он ограничен одной строкой). Наконец, (?(1)^)утверждает, что нам удалось очистить всю группу 1. Если строка короче требуемой, это невозможно, поскольку в строке недостаточно символов, чтобы выскочить из группы 1 достаточно часто, чтобы очистить ее.


7

Джольф , 3 байта

Неконкурентоспособный вопрос об обновлениях постдат.

Попробуй это здесь! ,

pci
pc  center
  i  string input

¯ \ _ (ツ) _ / ¯ Я думал, что это будет полезная функция.


1
Это стандартная лазейка, и хотя она явно не запрещена, она имеет плохую форму, если не встроена в язык, который вы найдете, а не в язык, который вы создаете.
Элиас Беневедес

3
@EliasBenevedes Я добавил эту функцию перед конкурсом. Я не часто обновляю свой код, пока он не станет релевантным.
Конор О'Брайен

7

JavaScript (ES6), 93 91 байт

s=>(m=l=s.split`
`).map(x=>(v=x.length/2)<m?v:m=v).map((x,i)=>" ".repeat(m-x)+l[i]).join`
`

2 байта сохранены благодаря @ edc65 !

объяснение

s=>(
  m=                // m = max line length (divided by 2)
    l=s.split`
`)                  // l = array of lines
.map(x=>            // for each line
  (v=x.length/2)    // v = current line length / 2
    <m?v:m=v        // set m to the max line length and return v
)
.map((x,i)=>        // for each line length / 2
  " ".repeat(m-x)   // add spaces before
    +l[i]           // add line text
)
.join`
`                   // return lines as a newline-separated string

Тест


.repeatпринимает и |0
усекает

7

CJam, 26 23 19 байтов

qN/_z,f{1$,m2/S*\N}

Я впервые использую CJam! Четыре байта сохранены благодаря Мартину Бюттнеру. Попробуйте онлайн.

объяснение

qN/    e# Read input and split each line
_z,    e# Transpose a copy and get its length to find the longest line
f{     e# For each line...
  1$,- e# Subtract its length from the longest length
  2/   e# Divide by two to get just the spaces to add to the left
  S*\  e# Add a string with that many spaces to the beginning
  N    e# Add a newline to go on to the next line
}

1
Вот несколько предложений :)qN/_z,f{1$,m2/S*\N}
Мартин Эндер

6

LabVIEW, 3 или 35 примитивов LabVIEW

Находит строки до тех пор, пока не останется ни одной, затем вычисляет, сколько пробелов добавить, и складывает все вместе.

В качестве альтернативы вы можете использовать встроенное выравнивание по центру на строковых индикаторах, хотя это все равно что обманывать.


6

Python 2, 83 81 байт

def f(s):
 t=s.split('\n')
 for y in t:print(max(len(f)for f in t)-len(y))/2*' '+y  

Спасибо @xnor за сохранение 2 символов

Пример ввода:

f("""Programming Puzzles
&
Code Golf""")

пример вывода:

Programming Puzzles
         &
     Code Golf

И заканчивая на втором месте 84 байтами, используя str.center () и str.rstrip (спасибо @JF).

def f(s):
 t=s.split('\n')
 for y in t:print y.center(max(len(f)for f in t)).rstrip()

Он не сохраняет символы для присвоения lenпеременной, которую вы используете дважды - это даже на 5 символов (например range). Также вы можете использовать mapдля списка комп.
xnor

@ Виллем, ты можешь использовать str.rstrip()после звонка, centerчтобы избавиться от пробела.
JF

Вы можете сохранить 7 байт с полной программой и используя len(max(a,key=len)), смотрите это .
ბიმო

5

TeaScript , 24 байта

£p.R((aßln)¯-ln)/2)+l,§)

Перебирает строки, добавляет floor((max line length - line length) / 2)пробелы в начало.

Ungolfed

£   p.R((aß  ln)¯  -ln)/2)+l,§   )
xl(#p.R((am(#ln)X()-ln)/2)+l,`\n`)

xl(#    // Loops through newlines
    p.R(   // Repeats spaces
      (
       am(#ln)    // Map all line lengths
              X() // Get largest line length
       -ln)       // Subtract current line length
      /2)  // Divide by two
      +l,  // Add current line text
`\n`)

Попробуйте онлайн


5
Почему мои ответы продолжают падать? Я думаю, что пришло время изменить имя пользователя / аватара: p
Downgoat

Исправлено по состоянию на 2016-07-27. : P
user48538

5

PowerShell, 58 67 байт

до 58 байт благодаря комментариям @ mazzy:

param($a)$a|%{$_|% *ft(($a|% le*|sort)[-1]/2+$_.length/2)}


# It takes an array of strings as input
PS C:\Temp> .\center.ps1 'aaa','bb','c'
aaa
bb
 c


# Or here, read from a file
PS C:\Temp> .\center.ps1 (gc t.txt)
info0:info1:info2:info3
      info0:info1
          ttt
          tt
           t
  • Он принимает массив строк как $a, перебирает каждую строку с помощью |%{...}.
  • вызывает string.padleft()метод для каждой строки через % -memberярлык, который принимает желаемую конечную длину строки в качестве параметра.
    • нам нужно array_longest_line_length/2 + current_line_length/2
    • Конечная часть current_line_length/2->$_.length/2
    • другая часть пересчитывает максимальную длину строки массива каждый раз в цикле, и это делается с помощью вложенного цикла, создающего массив длин строк, который сортируется, а затем занимает последнюю.

Вы можете использовать укорочение имена свойств и длину элементов , чтобы получить 58 байт
Mazzy

1
@ Маззи, это лучше! поскольку вы не писали в качестве ответа, я отредактировал его в своем ответе с благодарностью.
TessellatingHeckler

3

Emacs Lisp, 203 байта

(let((f 0)(l 0))(dolist(s(split-string(buffer-string)"\n"))(set'l(string-width s))(when(> l f)(set'f l)))(let((fill-column f))(goto-char(point-min))(while(<(point)(point-max))(center-line)(next-line)))))

Ungolfed:

(let ((f 0) (l 0))
  (dolist (s (split-string(buffer-string) "\n"))
    (set 'l (string-width s))
    (when (> l f)
      (set 'f l)))
    (let ((fill-column f))
      (goto-char (point-min))
      (while (< (point) (point-max))
        (center-line)
        (next-line)))))

Сосредоточенный:

               (let ((f 0) (l 0))
 (dolist (s (split-string(buffer-string) "\n"))
           (set 'l (string-width s))
                 (when (> l f)
                  (set 'f l)))
             (let ((fill-column f))
            (goto-char (point-min))
         (while (< (point) (point-max))
                 (center-line)
                (next-line)))))

3

HTML, 40 байт

<xmp style=float:left;text-align:center>

Snippet включает </xmp>тег, потому что программа просмотра фрагмента кода хочет, чтобы мои теги были сбалансированы.


2

MATL , 22 31 байт

`jtYz~]xXhc4X4H$ZuZ{Zv

Каждая строка вводится с завершающей строкой (то есть enterнажатием клавиши). Пустая строка (два enterнажатия клавиш) обозначает конец ввода.

пример

>> matl `jtYz~]xXhc4X4H$ZuZ{Zv
> foo
> barbaz
> 
 foo
barbaz

объяснение

`          % do...
  j        % input one string
  tYz~     % is it not empty?
]          % ...while
x          % delete last input (empty string)
Xh         % concatenate all inputs into a cell array
c          % convert to char (2D array). This fills with spaces to the right
4X4H$Zu    % center justify
Z{         % convert to cell array of strings
Zv         % remove trailing blanks of each string

2

Рубин, 76 68 61 байт

->t{(s=t.split$/).map{|l|l.center(s.map(&:size).max).rstrip}}

Образец прогона:

2.1.5 :001 > puts ->t{(s=t.split$/).map{|l|l.center(s.map(&:size).max).rstrip}}["Programming Puzzles\n&\nCode Golf"]
Programming Puzzles
         &
     Code Golf

53 байта:->t{(s=t.split$/).map{|l|l.center s.map(&:size).max}}
daniero

Я также centerсначала попробовал способ, но, как я понимаю, это само по себе нарушило бы правило «Конечный пробел в выводе не разрешен». Спасибо за &:sizeучастие - я тоже это попробовал, но я определенно что-то ударил по синтаксису.
Манатворк

2

Haskell, 111 81 77 байт

l=length
f s|q<-lines s=unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q]

Вход в функцию f, вывод не печатается.

Использование: загрузить в интерпретатор, ghci center.hsа затем, если вы хотите напечатать вывод f на заданной строкеputStr$f"Programming Puzzles\n&\nCode Golf"

Редактировать: Спасибо Ними за 34 байта, отличная работа! : D


Еще две вещи: последняя версия Prelude включает в себя версию инфикс map: <$>. replicate(...)' 'можно заменить на [1.. ...]>>" ". В общем и целом: unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q].
nimi

Ах да, я помню, как вы упомянули новый инфикс карты в предыдущей публикации, которую я сделал. Как работает повторяющийся трюк?
Базили-Генри

l1 >> l2делает (длина l1) копии l2 и объединяет их. Например "abcd" >> [1,2]-> [1,2,1,2,1,2,1,2](<- 4 копии по 1,2 в одном списке). В нашем случае это [1..n]>>" "n копий пробела, который совпадает с тем, что replicateделает.
nimi

Хорошо, спасибо за объяснение! :)
Базили-Генри

2

R, 126 байт

код

for(z in 1){l=scan(,"");m=sapply(l,nchar);t=max(m[m==max(m)]);for(i in 1:length(m))cat(rep(" ",(t-m[i])/2),l[i],"\n", sep="")}

ungolfed

for(z in 1){                          # any way to get rid of this?
  l=scan(,"")
  m <- sapply(l,nchar)
  t <- max(m[m==max(m)])
  for(i in 1:length(m)){
    cat(rep(" ",(t-m[i])/2),l[i],"\n", sep="")
  }
}

Вероятно, есть лучшие способы сделать это, все еще работая над этим.


1

Гема, 160 байт

\L<T>=@push{i;$0}@set{m;@cmpn{@length{$0};${m;};$m;$m;@length{$0}}}
?=
\Z=@repeat{@sub{@line;1};@set{o;@right{@div{@add{$m;@length{$i}};2};$i}\n${o;}}@pop{i}}$o

Написано в основном для моего любопытства, чтобы увидеть, что можно сделать на языке без правильной структуры массива и правильной инструкции цикла.

Образец прогона:

bash-4.3$ gema '\L<T>=@push{i;$0}@set{m;@cmpn{@length{$0};${m;};$m;$m;@length{$0}}};?=;\Z=@repeat{@sub{@line;1};@set{o;@right{@div{@add{$m;@length{$i}};2};$i}\n${o;}}@pop{i}}$o' <<< $'Programming Puzzles\n&\nCode Golf'
Programming Puzzles
         &
     Code Golf

1

Perl 6 , 61 байт

$/=(my@l=lines)».chars.max;for @l {put ' 'x($/-.chars)/2~$_} # 61 bytes

использование:

$ perl6 -e '$/=(my@l=lines)».chars.max;for @l {put " "x($/-.chars)/2~$_}' <<< \
'Programming Puzzles
&
Code Golf'
Programming Puzzles
         &
     Code Golf

Perl 5 позволит вам отбросить пробелы в таких вещах, как for @l {бритье на 2 байта, и перейти put " "на put" "бритье еще на один байт. Это правда для Perl 6? (Я не знаю Perl 6.) Кроме того, ваш вывод, показанный здесь, не соответствует требуемому выводу; это опечатка?
msh210

@ msh210 Perl 6 немного более строг с синтаксисом. Это более чем компенсирует это в других областях, хотя.
Брэд Гилберт b2gills

1

Джапт, 28 25

¡V=VwXl}R;¡Sp½*(V-Xl¹+X}R

Попробуйте онлайн!

Как это работает

¡     V=VwXl}R;¡     Sp½*(V-Xl¹ +X}R
UmXYZ{V=VwXl}R;UmXYZ{Sp½*(V-Xl) +X}R

           // Implicit: U = input string, V = 0
UmXYZ{  }  // Map each item X in U through this function,
         R // splitting U at newlines beforehand:
  V=VwXl   //  Set V to max(X, Y.length).
           // V is now set to the length of the longest line.

UmXYZ{  }  // Map each item X in U with this function,
         R // again splitting U at newlines beforehand:
 ½*(V-Xl)  //  Take V minus X.length, and multiply by 1/2.
Sp         //  Repeat a space that many times.
        +X //  Concatenate X to the end.

0

PHP , 98 байт

function($s){foreach($a=explode("
",$s)as$l)echo str_pad($l,max(array_map(strlen,$a)),' ',2),"
";}

Попробуйте онлайн!

Ungolfed:

function str_center( $s ) {
    $a = explode( PHP_EOL, $s );
    $m = max( array_map( 'strlen', $a ) );
    foreach( $a as $l ) {
        echo str_pad( $l, $m, ' ', STR_PAD_BOTH ), PHP_EOL;
    }
}

Выход:

Programming Puzzles
         &         
     Code Golf   


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.