Wyśrodkuj tekst!


40

Wyśrodkuj tekst!

W tym wyzwaniu będziesz koncentrować różne linie.

Przykłady

Foo
barbaz

 Foo
barbaz
Hello
World

Hello
World
Programming Puzzles
&
Code Golf

Programming Puzzles
         &
     Code Golf

Dane techniczne

Każdy wiersz wejściowy zawsze będzie miał co najmniej jeden znak spacji, możesz założyć, że jedynym znakiem spacji są spacje ( ) i znaki nowej linii. Każda linia wejściowa nie będzie miała końcowych i / lub wiodących białych znaków (z wyjątkiem nowej linii). Końcowe białe znaki na wydruku nie są dozwolone.

Powinieneś znajdować się pośrodku najdłuższej linii na wejściu. Jeśli ta linia ma nawet długość, twój program / funkcja powinna preferować wyśrodkowanie w lewo. Maksymalna długość linii jest dowolna dla twojego języka, ale twój program powinien działać na liniach o długości co najmniej 500.


Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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


To jest więc wygrywa najkrótszy kod w bajtach!


Nigdy nie będzie więcej niż jedna przestrzeń wewnętrzna?
kot

@cat nigdy nie będzie żadnych wiodących białych znaków ani końcowych białych znaków na linii (spodziewaj się nowej linii, jeśli taka istnieje)
Zejdź

tak, ale mam na myśli przestrzenie wewnętrzne , na przykład między słowami
kot

1
@cat oh, między słowami może znajdować się więcej niż jedna biała spacja. Na przykład foo(space)(space)(space)barjest to całkowicie akceptowalny wkład
Downgoat

czy możemy założyć, że zawsze będzie więcej niż 1 linia?
GamrCorps

Odpowiedzi:


15

Pyth, 19 17 bajtów

2 bajty dzięki Jakube

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

Demonstracja

Myślę, że po raz pierwszy funkcja padu środkowego .[była użyteczna. Długość najdłuższej linii jest określana za pomocą transpozycji bez obcinania ( .T).

Końcowe spacje są usuwane przez dodanie spacji do przodu, usuwanie spacji, a następnie usuwanie dodanego znaku.


1
Prawdopodobnie potrzebujemy maksymalnej długości w tablicy. Zbyt często pojawia się. +1
Maltysen

W specyfikacji podano, że „końcowe białe znaki na wydruku nie są dozwolone”. Wygląda na to, że ma spacje końcowe w każdym krótkim wierszu wyniku, więc nie jestem pewien, czy to się liczy.
ziemniak

@potato Dzięki - to zostało dodane, odkąd odpowiedziałem.
isaacg

31

vim, 43 36 35 bajtów

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

Zbyt dobrze, aby nie publikować. Zwróć uwagę na końcowy znak nowej linii; to jest znaczące.

Dzięki @Marth za uratowanie postaci!

format przyjazny dla vima:

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

Wyjaśnienie:

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
Z pewnością należy to zrobić w trybie wstawiania, prawda?
Alex A.,

9
@AlexA. Nic nie dzieje się w trybie wstawiania. ಠ_ಠ
Gałka

Jeśli użyjesz sor!do odwrócenia kolejności sortowania, możesz użyć, col("$")aby uzyskać długość pierwszego wiersza (teraz najdłuższy, ponieważ kolejność jest odwrócona) zamiast używać G$, oszczędzając w sumie 1 bajt! edit : lub możesz zachować porządek sortowania i użyć G:let &tw=col("$")zamiast tego.
Marth

@Marth Thanks! Wybrałem to drugie (bez konkretnego powodu).
Klamka

Przeglądając :h :sortwłaśnie dowiedziałem się, że możesz przekazać wyrażenie regularne, aby pominąć pasujący tekst podczas sortowania, dzięki czemu możesz użyć :sor /./sortowania według długości (+4 bajtów), co pozwala usunąć VGrx(-4 bajty) i drugie cofnięcie ( -1 bajtów). Możesz także użyć |separatorów zamiast <cr>łańcucha poleceń, co pozwala pominąć :poprzedniąlet (-1 bajty) (pamiętaj, że wtedy musisz użyć sor!rozwiązania, Gnie jest to polecenie ex). Więc :sor! /./|let &tw=col("$")|u|%ce (z końcowym <CR>) powinien zaoszczędzić 2 bajty.
Marth

23

Mathematica, 96 bajtów

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

Nie pytaj mnie, jak to działało, po prostu majstrowałem przy nim, dopóki nie uzyskał prawidłowego wyniku.


27
+1 za „Nie pytaj mnie, jak to działało, po prostu majstrowałem przy nim, dopóki nie uzyskał prawidłowego wyniku”
cat

4
@cat Tak właśnie uprawiam golfa.
lirtosiast

11

Funciton , niekonkurencyjny

Wyzwanie to uwypukliło brak funkcji „wartości maksymalnej” (i wartości minimalnej) dla leniwych sekwencji, więc ... dodałem je do biblioteki podstawowej (nazywają się odpowiednio ⊤ i ⊥). Dlatego nie zadałem sobie trudu, aby podać to jako odpowiedź w golfa (aby była poprawna, musiałaby zawierać deklarację funkcji ⊤), więc oto tylko główny program.

Wykonać (function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})() w konsoli przeglądarki, aby uzyskać lepsze renderowanie.

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

Wyjaśnienie

Wierzę, że może to być pierwsza odpowiedź Funciton na tej stronie, która używa wyrażeń lambda.

  • Po pierwsze używamy ǁ do dzielenia ciągu wejściowego na znaki nowego wiersza (ASCII 10). Zwraca to leniwą sekwencję.
  • Przekazujemy tę sekwencję ɱ (mapę), dając jej lambda, która oblicza długość każdego łańcucha, a następnie przekazujemy ostatnią sekwencję, aby uzyskać długość najdłuższej linii.
  • Mamy również przekazać tę sekwencję poprzez inny ɱ, nadając mu lambda, który oblicza długość każdej struny, odejmuje się od długości linii maksymalnego obliczonego wcześniej, podziałów, które przez 2 (faktycznie shift-prawy 1), generuje że wiele spacji (ASCII 32) a następnie łączy ciąg w te spacje. (Z powodów geometrycznych zadeklarowałem funkcję, która wywołuje (konkatenacja łańcucha) z odwróconymi parametrami.)
  • Na koniec używamy ʝdo ponownego złożenia wszystkich ciągów znaków, używając znaku nowej linii (ASCII 10) jako separatora.


9

Retina , 54 52 bajty

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

\tS można zastąpić rzeczywistych kart, ale Użyłem \ttutaj, bo inaczej SE konwersji spacje. Zauważ, że w drugim wierszu znajduje się wiodące miejsce.

Wypróbuj online.

Wyjaśnienie

Podstawową ideą jest dopasowanie linii, która jest co najmniej o dwa znaki krótsza niż najdłuższa linia (lub technicznie, dwa znaki krótsze niż jakakolwiek inna linia) i otoczenie jej dwoma spacjami. Powtarzane jest to do momentu, gdy nie możemy już znaleźć takiej linii, co oznacza, że ​​wszystkie linie znajdują się w obrębie jednego znaku maksymalnej długości (gdzie jeden znak ma uwzględniać niedopasowania parzystości, i gwarantuje, że linie te zostaną przesunięte w lewo - Centrum).

Co do rzeczywistego wyrażenia regularnego:

^(.)+$

Po prostu dopasowuje jedną linię, jednocześnie pchając jedną grupę 1do grupy dla każdej postaci.

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

Jest wyglądem, który jest dopasowywany od prawej do lewej i przesuwa kursor na początek ciągu, dzięki czemu lookahead wewnątrz może sprawdzić cały ciąg. Zauważ, że z powodu braku kotwicy, lookahead można zastosować z dowolnego miejsca, ale to nie tworzy dodatkowych dopasowań. Wiemy, że [^\t]zawsze będzie pasować do dowolnego znaku w ciągu, ponieważ na wejściu można zagwarantować, że będą zawierały tylko spacje i linie znaków, jeśli chodzi o białe znaki.

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

Ten lookahead próbuje znaleźć linię, która jest co najmniej o dwa znaki dłuższa niż ta, którą aktualnie dopasowujemy. [^\t]*przesuwa się po ciągu, aby móc dopasować dowolny wiersz. ^zapewnia, że ​​zaczynamy od początku linii. ..następnie dopasowuje dwa dodatkowe znaki, których potrzebujemy dla dłuższej linii. Teraz (?<-1>.)+dopasowuje pojedyncze znaki w tej linii podczas wyskakiwania z grupy 1(zwróć uwagę, że .nie można dopasować linii, więc jest to ograniczone do jednej linii). Wreszcie (?(1)^)twierdzi, że udało nam się opróżnić całą grupę 1. Jeśli linia jest krótsza niż wymagana, nie jest to możliwe, ponieważ w linii nie ma wystarczającej liczby znaków, aby wyskoczyć z grupy 1 wystarczająco często, aby ją opróżnić.


7

Jolf , 3 bajty

Pytanie niekonkurencyjne, aktualizacja po datach.

Wypróbuj tutaj! .

pci
pc  center
  i  string input

¯ \ _ (ツ) _ / ¯ Myślałem, że będzie to przydatna funkcja.


1
Jest to standardowa luka i choć nie jest wyraźnie zabroniona, jej zła forma, chyba że jest wbudowana w język, który można znaleźć, a nie w ten, który tworzysz.
Elias Benevedes,

3
@EliasBenevedes Dodałem tę funkcję przed zawodami. Często nie aktualizuję mojego kodu, dopóki nie zostanie ponownie utworzony.
Conor O'Brien,

7

JavaScript (ES6), 93 91 bajtów

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 bajty zapisane dzięki @ edc65 !

Wyjaśnienie

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

Test


.repeatakceptuje i obcina wartości niecałkowite, więc nie potrzebujesz|0
edc65

7

CJam, 26 23 19 bajtów

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

Pierwszy raz korzystam z CJam! Cztery bajty zapisane dzięki Martinowi Büttnerowi. Wypróbuj online.

Wyjaśnienie

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
Oto kilka sugestii :)qN/_z,f{1$,m2/S*\N}
Martin Ender

6

LabVIEW, 3 lub 35 LabVIEW Prymitywy

Znajduje wiersze, dopóki nie zostaną żadne, a następnie oblicza liczbę spacji do dodania i łączy wszystko.

Alternatywnie możesz użyć wbudowanego wyrównania środkowego na wskaźnikach strunowych, ale to trochę przypomina oszustwo.


6

Python 2, 83 81 bajtów

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

Dzięki @xnor za zapisanie 2 znaków

przykładowe dane wejściowe:

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

przykładowe dane wyjściowe:

Programming Puzzles
         &
     Code Golf

I kończąc na drugim miejscu z 84 bajtami przy użyciu str.center () i str.rstrip (dzięki @JF).

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

Nie zapisuje znaków do przypisania lendo zmiennej, której używasz dwa razy - to łamie nawet przy 5 znakach (jak range). Możesz także użyć mapdo komp. Listy.
xnor

@Willem, możesz użyć str.rstrip()po wywołaniu, centeraby pozbyć się końcowego miejsca.
JF,

Możesz zapisać 7 bajtów z pełnym programem i używając len(max(a,key=len)), zobacz to .
ბიმო

5

TeaScript , 24 bajty

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

Pętle przez linie, dodaje floor((max line length - line length) / 2)spacje na początku.

Bez golfa

£   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`)

Wypróbuj online


5
Dlaczego moje odpowiedzi wciąż się obniżają? Myślę, że czas zmienić nazwę użytkownika / awatara: p
Downgoat

Naprawiono na dzień 2016-07-27. : P
user48538

5

PowerShell, 58 67 bajtów

do 58 bajtów dzięki komentarzom @ 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
  • Pobiera tablicę ciągów, ponieważ $apętle nad każdym ciągiem z |%{...}.
  • wywołuje string.padleft()metodę na każdym łańcuchu za pomocą % -memberskrótu, który przyjmuje żądaną końcową długość linii jako parametr.
    • potrzebujemy array_longest_line_length/2 + current_line_length/2
    • końcowa część to current_line_length/2->$_.length/2
    • druga część ponownie oblicza maksymalną długość linii tablicy za każdym razem przez pętlę, i robi to z zagnieżdżoną pętlą tworzącą tablicę długości linii, sortuje to, a następnie przyjmuje ostatnią.


1
@mazzy to jest lepsze! ponieważ nie opublikowałeś jako odpowiedzi, zredagowałem to w mojej odpowiedzi.
TessellatingHeckler

3

Emacs Lisp, 203 bajty

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

Nie golfowany:

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

Wyśrodkowany:

               (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 bajtów

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

Snippet zawiera </xmp>tag, ponieważ przeglądarka fragmentów kodu chce, aby moje tagi były zrównoważone.


2

MATL , 22 31 bajtów

`jtYz~]xXhc4X4H$ZuZ{Zv

Każda linia jest wprowadzana za pomocą linii końcowej (tj enter naciśnięcia klawisza). Pusty wiersz (dwa enternaciśnięcia klawiszy) oznacza koniec wprowadzania.

Przykład

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

Wyjaśnienie

`          % 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

Rubinowy, 76 68 61 bajtów

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

Przykładowy przebieg:

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 bajty:->t{(s=t.split$/).map{|l|l.center s.map(&:size).max}}
daniero

Próbowałem też w centerpierwszej kolejności, ale jak rozumiem, samo to złamałoby zasadę „Końcowe białe znaki w wydruku nie są dozwolone”. Dziękuję za tę &:sizeczęść - też tego spróbowałem, ale z pewnością zmieniłem coś wokół składni.
manatwork

2

Haskell, 111 81 77 bajtów

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

Wejście do funkcji f, wydruk nie jest drukowany.

Zastosowanie: załaduj do interpretera, ghci center.hsa następnie, jeśli chcesz wydrukować wynik f na danym ciąguputStr$f"Programming Puzzles\n&\nCode Golf"

Edit: Dzięki Nimi dla 34 bajtów, świetną robotę! :RE


Dwie rzeczy: najnowsza wersja Preludium zawiera wersję Infix z map: <$>. replicate(...)' 'można zastąpić [1.. ...]>>" ". W sumie: unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q].
nimi

Ach tak, pamiętam, że wspominałeś o nowej poprawce do mapy w poprzednim zgłoszeniu. Jak działa sztuczka replikacji?
basile-henry,

l1 >> l2tworzy (długość l1) kopie l2 i łączy je. Np. "abcd" >> [1,2]-> [1,2,1,2,1,2,1,2](<- 4 kopie 1,2 na jednej liście). W naszym przypadku jest [1..n]>>" "to n kopii przestrzeni, która jest taka sama jak to, co replicaterobi.
nimi

Fajnie, dziękuję za wyjaśnienie! :)
basile-henry

2

R, 126 bajtów

kod

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

bez golfa

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

Prawdopodobnie istnieją lepsze sposoby, aby to zrobić, wciąż nad tym pracując.


1

Gema, 160 bajtów

\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

Napisane głównie dla mojej ciekawości, aby zobaczyć, co można zrobić w języku bez odpowiedniej struktury tablic i właściwej instrukcji pętli.

Przykładowy przebieg:

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 bajtów

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

stosowanie:

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

Perl 5 pozwala upuszczać spacje w rzeczach takich jak for @l {golenie 2 bajtów i przechodzenie put " "do put" "golenia kolejnego bajtu. Czy to prawda dla Perla 6? (Nie znam Perla 6). Również twój wynik pokazany tutaj nie pasuje do wymaganego wyniku; czy to literówka?
msh210,

@ msh210 Perl 6 jest nieco bardziej restrykcyjny pod względem składni. To jednak więcej niż nadrabia w innych obszarach.
Brad Gilbert b2gills,

1

Japt, 28 25

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

Wypróbuj online!

Jak to działa

¡     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 bajtów

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

Wypróbuj online!

Nie golfowany:

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;
    }
}

Wynik:

Programming Puzzles
         &         
     Code Golf   


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.