Центруйте текст!


40

Центруйте текст!

У цьому виклику ви будете орієнтувати різні лінії.

Приклади

Foo
barbaz

 Foo
barbaz
Hello
World

Hello
World
Programming Puzzles
&
Code Golf

Programming Puzzles
         &
     Code Golf

Технічні умови

Кожен рядок вводу завжди матиме щонайменше один непробільний символ, ви можете вважати, що єдиним символом пробілу є пробіли ( ) та нові рядки. Кожен рядок вводу не матиме пробілів та / або провідних пробілів (за винятком нового рядка). Скользящий прогалини в виході НЕ допускається.

Ви повинні зосереджуватися серед найдовших рядків у вводі. Якщо ця лінія рівна за довжиною, ваша програма / функція повинна віддавати перевагу центру вліво. Максимальна довжина рядка не залежить від вашої мови, але програма повинна функціонувати на лініях довжиною не менше 500.


Таблиця лідерів

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

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# 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, цілком прийнятний вклад
Пуховик

чи можна припустити, що завжди буде більше 1 рядка?
GamrCorps

Відповіді:


15

Піт, 19 17 байт

2 байти завдяки Якубе

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

Демонстрація

Я думаю, що це вперше .[корисна функція центральної колодки . Довжина найдовшого рядка знаходимо за допомогою транспонування без обрізання ( .T).

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


1
Нам, мабуть, потрібна максимальна довжина в масиві. Це надходить дуже часто. +1
Мальтісен

Технічні характеристики говорять про те, що "Недоступне пробіл у висновку заборонено". Схоже, пробіл пробілів у кожному короткому рядку у висновку, тож я не впевнений, що він зараховується.
картопля

@potato Спасибі - це було додано з моменту відповіді.
isaacg

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 байт! редагувати : або ви можете зберегти порядок сортування та використовувати G:let &tw=col("$")натомість.
Marth

@Marth Дякую! Я вибрав останнє (без особливих причин).
Дверна ручка

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

23

Математика, 96 байт

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

Не запитуйте мене, як це працювало, я просто поспілкувався з ним, поки він не створив правильний результат.


27
+1 за "Не запитуйте мене, як це працювало, я просто поспілкувався з ним, поки він не дав правильний вихід"
кіт

4
@cat Ось так я роблю все своє гольф.
lirtosiast

11

Функціонал , неконкурентний

Цей виклик підкреслив болісну відсутність функції "максимального значення" (і мінімального значення) для лінивих послідовностей, тому ... Я додав їх до основної бібліотеки (вони називаються ⊤ і ⊥ відповідно). Тому я не намагався подати це як відповідь на гольф (він повинен містити декларацію ⊤, щоб бути дійсною), ось ось лише основна програма.

Виконайте (function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()в консолі браузера, щоб отримати приємніше візуалізацію.

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

Пояснення

Я вважаю, що це може бути перша відповідь Funciton на цьому веб-сайті, яка використовує лямбда-вирази.

  • Спочатку ми використовуємо ǁдля розділення вхідного рядка на нові рядки (ASCII 10). Це повертає ледачу послідовність.
  • Ми передаємо цю послідовність через ɱ(карту), надаючи їй лямбда, яка обчислює довжину кожного рядка, а потім передаємо остаточну послідовність, щоб отримати довжину найдовшого рядка.
  • Ми також передаємо цю послідовність через іншу ɱ, надаючи їй лямбда, яка обчислює довжину кожного рядка, віднімає її від максимальної довжини рядка, обчисленої раніше, ділить її на 2 (фактично зсув вправо 1), генерує стільки пробілів (ASCII 32) а потім з'єднує рядок у ці пробіли. (З геометричних міркувань я оголосив функцію, яка викликає (рядок об'єднується) з перевернутими параметрами.)
  • Нарешті, ми використовуємо ʝдля з'єднання всіх рядків разом, використовуючи нові рядки (ASCII 10) як роздільник.

+1 про те, як це приголомшливо, і "Це 716 символів, загалом 1508 байт"
кіт

9

Сітківка , 54 52 байти

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

\tS можна замінити з фактичними вкладки, але я використав \tтут, тому що в іншому випадку SE перетворює символи табуляції в пропуски. Зауважте, що на другому рядку є провідний пробіл.

Спробуйте в Інтернеті.

Пояснення

Основна ідея полягає в тому, щоб відповідати рядку, який принаймні на два символи коротший за найдовший (або технічно два символи коротший, ніж будь-який інший рядок), і оточити його в двох проміжках. Це повторюється до тих пір, поки ми не зможемо знайти такий рядок, а це означає, що всі рядки знаходяться в межах одного символу максимальної довжини (коли один символ повинен враховувати невідповідність парності, і гарантує, що ці рядки зміщені вліво - центр).

Що стосується власне регулярного вираження:

^(.)+$

Просто відповідає будь-якому одному рядку, одночасно натискаючи по одному захопу на групу 1для кожного символу.

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

Це огляд, який узгоджується справа наліво і переміщує курсор на початок рядка, так що lookahead всередині може перевіряти весь рядок. Зауважте, що через відсутність якоря, пошук може бути застосований з будь-якого місця, але це не створює додаткових збігів. Ми знаємо, що [^\t]завжди буде відповідати будь-якому символу в рядку, тому що вхід гарантовано містить лише пробіли та стрічкові стрічки, що стосується пробілів.

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

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


7

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

Не конкуруючи, оновіть питання щодо публікацій.

Спробуйте тут! .

pci
pc  center
  i  string input

¯ \ _ (ツ) _ / ¯ Я думав, що це буде корисною функцією.


1
Це стандартна лазівка, і хоча вона прямо не заборонена, вона є поганою формою, якщо вона не вбудована у мову, яку ви знайдете, а не ту, яку ви створюєте.
Elias Benevedes

3
@EliasBenevedes Я додав цю функцію перед змаганням. Я не часто оновлюю свій код, доки він не стане релевантним.
Conor O'Brien

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
edc65

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

@Willem, ви можете скористатися 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)пробіли на початку.

Безумовно

£   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

Виправлено станом на 27.07.2016. : 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
@mazzy, що краще! оскільки ви не опублікували як відповідь, я змінив це у своїй відповіді з кредитом.
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)))))

Безголовки:

(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>

Фрагмент включає </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"

Редагувати: Завдяки nimi за 34 байти, чудова робота! : D


Ще дві речі: остання версія Prelude включає в себе версію Інфікси map: <$>. replicate(...)' 'можна замінити на [1.. ...]>>" ". Загалом і цілому: unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q].
німі

Так, я пам'ятаю, що ви згадували про нову інфіксацію карти у попередній поданій мною заяві. Як працює трюк-реплік?
Базиль-Генрі

l1 >> l2робить (довжина l1) копії l2 і з'єднує їх. Напр. "abcd" >> [1,2]-> [1,2,1,2,1,2,1,2](<- 4 копії, 1,2 в одному списку). У нашому випадку це [1..n]>>" "n копій пробілу, що є тим самим, що replicateі те, що робить.
німі

Приємно, дякую за пояснення! :)
basile-henry

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="")}

неозорий

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

Japt, 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),"
";}

Спробуйте в Інтернеті!

Безголовки:

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.