Trung tâm Văn bản!


40

Trung tâm Văn bản!

Trong thử thách này, bạn sẽ tập trung vào các dòng khác nhau.

Ví dụ

Foo
barbaz

 Foo
barbaz
Hello
World

Hello
World
Programming Puzzles
&
Code Golf

Programming Puzzles
         &
     Code Golf

Thông số kỹ thuật

Mỗi dòng đầu vào sẽ luôn có ít nhất một ký tự không phải khoảng trắng, bạn có thể giả sử ký tự khoảng trắng duy nhất là khoảng trắng ( ) và dòng mới. Mỗi dòng đầu vào sẽ không có bất kỳ dấu vết và / hoặc khoảng trắng hàng đầu nào (ngoại trừ dòng mới). Không được phép lưu khoảng trắng trong đầu ra .

Bạn nên tập trung vào giữa dòng dài nhất trong đầu vào. Nếu dòng đó có độ dài bằng nhau, chương trình / chức năng của bạn sẽ thích ở giữa bên trái. Độ dài dòng tối đa là bất cứ điều gì ngôn ngữ của bạn có thể xử lý nhưng chương trình của bạn sẽ hoạt động trên các dòng có độ dài ít nhất 500.


Bảng xếp hạng

Dưới đây là một Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu ở đó bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ phiên dịch), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành một liên kết mà sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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


Đây là để mã ngắn nhất tính theo byte thắng!


Sẽ không bao giờ có nhiều hơn một không gian bên trong?
con mèo

@cat sẽ không bao giờ có bất kỳ khoảng trắng hoặc khoảng trắng hàng đầu nào trên một dòng (mong đợi cho dòng mới nếu có)
Downgoat

vâng, nhưng ý tôi là không gian bên trong , như, giữa các từ
con mèo

1
@cat oh, giữa các từ có thể có nhiều hơn một khoảng trắng. Ví dụ: foo(space)(space)(space)barmột đầu vào hoàn toàn có thể chấp nhận được
Downgoat

chúng ta có thể cho rằng sẽ luôn có nhiều hơn 1 dòng không?
GamrCorps

Câu trả lời:


15

Pyth, 19 17 byte

2 byte nhờ Jakube

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

Trình diễn

Tôi nghĩ rằng đây là lần đầu tiên chức năng trung tâm-pad .[là hữu ích. Độ dài của dòng dài nhất được tìm thấy bằng cách sử dụng chuyển vị không cắt ( .T).

Không gian lưu trữ được loại bỏ bằng cách thêm một ký tự không phải không gian vào phía trước, tước các khoảng trắng, sau đó xóa ký tự đã thêm.


1
Chúng ta có thể cần một chiều dài tối đa trong mảng. Nó đi lên quá thường xuyên. +1
Maltysen

Các thông số kỹ thuật nói rằng "Không được phép lưu khoảng trắng trong đầu ra." Điều này dường như có khoảng trắng theo dõi trên mỗi dòng ngắn trong đầu ra, vì vậy tôi không chắc nó có giá trị.
khoai tây

@potato Cảm ơn - đã được thêm từ khi tôi trả lời.
isaacg

31

vim, 43 36 35 byte

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

Quá tốt để không đăng. Lưu ý các dòng mới; nó có ý nghĩa

Cảm ơn @Marth vì đã cứu một nhân vật!

định dạng thân thiện với vim:

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

Giải trình:

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
Chắc chắn tất cả điều này nên được thực hiện trong chế độ Chèn, phải không?
Alex A.

9
@AlexA. Không ai trong số đó được thực hiện trong chế độ chèn. ಠ_ಠ
tay nắm cửa

Nếu bạn sử dụng sor!để đảo ngược thứ tự sắp xếp, bạn có thể sử dụng col("$")để lấy độ dài của dòng đầu tiên (bây giờ là dài nhất kể từ khi thứ tự được đảo ngược) thay vì sử dụng G$, tiết kiệm tổng cộng 1 byte! chỉnh sửa : hoặc bạn có thể giữ thứ tự sắp xếp và sử dụng G:let &tw=col("$")thay thế.
Marth

@Marth Cảm ơn! Tôi đã chọn cái sau (không có lý do cụ thể).
Doorknob

Nhìn qua :h :sorttôi mới phát hiện ra rằng bạn có thể vượt qua regex để bỏ qua văn bản phù hợp trong sắp xếp, vì vậy bạn có thể sử dụng :sor /./để sắp xếp theo độ dài (+4 byte), cho phép bạn loại bỏ VGrx(-4 byte) và hoàn tác thứ hai ( -1 byte). Bạn cũng có thể sử dụng |dấu phân cách thay vì <cr>xâu chuỗi các lệnh, cho phép bạn bỏ qua :trước let(-1 byte) (lưu ý rằng bạn phải sử dụng sor!giải pháp sau đó, Gkhông phải là lệnh ex). Vì vậy :sor! /./|let &tw=col("$")|u|%ce (với một dấu <CR>) nên tiết kiệm 2 byte.
Marth

23

Toán học, 96 byte

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

Đừng hỏi tôi làm thế nào nó hoạt động, tôi chỉ loay hoay với nó cho đến khi nó tạo ra đầu ra chính xác.


27
+1 cho "Đừng hỏi tôi làm thế nào nó hoạt động, tôi chỉ loay hoay với nó cho đến khi nó tạo ra đầu ra chính xác"
con mèo

4
@cat Đó là cách tôi làm tất cả việc chơi golf của mình.
lirtosiast

11

Funciton , không cạnh tranh

Thử thách này đã làm nổi bật sự thiếu hụt của một hàm giá trị tối đa của Google (và giá trị tối thiểu) cho các chuỗi lười biếng, vì vậy ... tôi đã thêm chúng vào thư viện lõi (chúng được gọi là ⊤ và, tương ứng). Do đó, tôi không bận tâm gửi câu trả lời này như một câu trả lời được đánh gôn (nó sẽ phải bao gồm khai báo hàm is là hợp lệ), vì vậy đây chỉ là chương trình chính.

Thực thi (function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()trong bảng điều khiển trình duyệt của bạn để có được kết xuất đẹp hơn.

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

Giải trình

Tôi tin rằng đây có thể là câu trả lời đầu tiên của Funciton trên trang web này sử dụng biểu thức lambda.

  • Đầu tiên, chúng tôi sử dụng ǁđể phân tách chuỗi đầu vào tại dòng mới (ASCII 10). Điều này trả về một chuỗi lười biếng.
  • Chúng tôi chuyển chuỗi đó qua ɱ(bản đồ), cung cấp cho nó một lambda tính toán độ dài của mỗi chuỗi và sau đó chuyển chuỗi cuối cùng để có được độ dài của dòng dài nhất.
  • Chúng tôi cũng chuyển chuỗi đó qua chuỗi khác ɱ, cung cấp cho nó một lambda tính toán độ dài của mỗi chuỗi, trừ nó khỏi độ dài dòng tối đa được tính toán trước đó, chia cho 2 (thực tế là dịch chuyển sang phải 1), tạo ra nhiều khoảng trắng (ASCII 32) và sau đó nối chuỗi lên các khoảng trắng đó. (Vì lý do hình học, tôi đã khai báo một hàm gọi (chuỗi nối) với các tham số được đảo ngược.)
  • Cuối cùng, chúng tôi sử dụng ʝđể đặt tất cả các chuỗi lại với nhau, sử dụng các dòng mới (ASCII 10) làm dấu phân cách.

+1 cho mức độ tuyệt vời của nó và "Đó là 716 ký tự, tổng cộng 1,508 byte"
con mèo

9

Võng mạc , 54 52 byte

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

Các \ts có thể được thay thế bằng các tab thực tế, nhưng tôi đã sử dụng \tở đây, vì nếu không SE sẽ chuyển đổi các tab thành khoảng trắng. Lưu ý rằng có một không gian hàng đầu trên dòng thứ hai.

Hãy thử trực tuyến.

Giải trình

Ý tưởng cơ bản là khớp một dòng có ít nhất hai ký tự ngắn hơn dòng dài nhất (hoặc về mặt kỹ thuật, hai ký tự ngắn hơn bất kỳ dòng nào khác) và bao quanh nó trong hai khoảng trắng. Điều này được lặp đi lặp lại cho đến khi chúng ta không còn có thể tìm thấy một dòng như vậy, điều đó có nghĩa là tất cả các dòng nằm trong một ký tự có độ dài tối đa (trong đó một ký tự sẽ giải thích cho sự không khớp chẵn lẻ và đảm bảo rằng các dòng này được dịch chuyển sang bên trái- trung tâm).

Đối với regex thực tế:

^(.)+$

Chỉ cần khớp bất kỳ một dòng nào trong khi đẩy một lần chụp vào nhóm 1cho mỗi nhân vật.

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

Là một giao diện được khớp từ phải sang trái và di chuyển con trỏ đến đầu chuỗi, để giao diện bên trong có thể kiểm tra toàn bộ chuỗi. Lưu ý rằng do thiếu neo, giao diện có thể được áp dụng từ bất kỳ nơi nào khác, nhưng điều đó không tạo ra các kết quả khớp bổ sung. Chúng tôi biết rằng [^\t]sẽ luôn khớp với bất kỳ ký tự nào trong chuỗi, bởi vì đầu vào được đảm bảo chỉ chứa các khoảng trắng và đường dẫn liên quan đến khoảng trắng.

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

Cái nhìn này cố gắng tìm một dòng dài hơn ít nhất hai ký tự so với dòng chúng ta hiện đang khớp. [^\t]*di chuyển qua chuỗi để có thể khớp với bất kỳ dòng nào. ^đảm bảo rằng chúng tôi bắt đầu từ đầu dòng. ..sau đó khớp với hai ký tự bổ sung mà chúng tôi yêu cầu cho dòng dài hơn. Bây giờ (?<-1>.)+khớp với các ký tự riêng lẻ trong dòng đó trong khi xuất hiện từ nhóm 1(lưu ý rằng .không thể khớp với nguồn cấp dữ liệu, do đó, điều này bị ràng buộc với một dòng). Cuối cùng, (?(1)^)khẳng định rằng chúng tôi đã tìm cách làm trống toàn bộ nhóm 1. Nếu dòng ngắn hơn yêu cầu, điều này là không thể, bởi vì không có đủ ký tự trong dòng để bật từ nhóm 1 thường đủ để làm trống nó.


7

Jolf , 3 byte

Không biên dịch, cập nhật câu hỏi postdates.

Hãy thử nó ở đây! .

pci
pc  center
  i  string input

¯ \ _ () _ / ¯ Tôi nghĩ đó là một chức năng hữu ích.


1
Đây là một lỗ hổng tiêu chuẩn và mặc dù không được phép rõ ràng, hình thức xấu của nó trừ khi nó được tích hợp vào ngôn ngữ bạn tìm thấy, không phải ngôn ngữ bạn tạo.
Elias Benevedes

3
@EliasBenevedes Tôi đã thêm tính năng này trước cuộc thi. Tôi không thường xuyên cập nhật mã của mình cho đến khi nó trở nên không liên quan.
Conor O'Brien

7

JavaScript (ES6), 93 91 byte

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 byte được lưu nhờ vào @ edc65 !

Giải trình

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

Kiểm tra


.repeatchấp nhận và cắt bớt các giá trị không nguyên, vì vậy bạn không cần|0
edc65

7

CJam, 26 23 19 byte

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

Lần đầu tiên tôi sử dụng CJam! Bốn byte được lưu nhờ Martin Büttner. Hãy thử trực tuyến.

Giải trình

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
Dưới đây là một số gợi ý :)qN/_z,f{1$,m2/S*\N}
Martin Ender

6

LabVIEW, 3 hoặc 35 LabVIEW Nguyên thủy

Tìm các dòng cho đến khi không còn lại, sau đó tính toán có bao nhiêu khoảng trắng để thêm và đặt mọi thứ lại với nhau.

Ngoài ra, bạn có thể sử dụng căn chỉnh trung tâm tích hợp trên các chỉ báo chuỗi, mặc dù nó có cảm giác như gian lận.


6

Python 2, 83 81 byte

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

Cảm ơn @xnor vì đã lưu 2 ký tự

ví dụ đầu vào:

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

đầu ra ví dụ:

Programming Puzzles
         &
     Code Golf

Và kết thúc ở vị trí thứ hai với 84 byte bằng str.center () và str.rstrip (cảm ơn @JF).

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

Nó không lưu ký tự để gán lencho một biến bạn sử dụng hai lần - hòa vốn ở mức 5 ký tự (như range). Ngoài ra, bạn có thể sử dụng mapcho danh sách comp.
xnor

@Willem, bạn có thể sử dụng str.rstrip()sau khi gọi centerđể thoát khỏi không gian dấu.
JF

Bạn có thể lưu 7 byte với một chương trình đầy đủ và sử dụng len(max(a,key=len)), xem điều này .
ბიმო

5

TeaScript , 24 byte

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

Vòng lặp qua các dòng, thêm floor((max line length - line length) / 2) không gian để bắt đầu.

Bị đánh cắp

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

Dùng thử trực tuyến


5
Tại sao câu trả lời của tôi tiếp tục bị hạ cấp? Tôi nghĩ rằng đã đến lúc thay đổi tên người dùng / hình đại diện: p
Downgoat

Đã sửa lỗi kể từ 2016-07-27. : P
dùng48538

5

PowerShell, 58 67 byte

xuống tới 58 byte nhờ nhận xét của @ 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
  • Nó nhận một mảng các chuỗi như $a, các vòng lặp trên mỗi chuỗi với |%{...}.
  • gọi string.padleft()phương thức trên mỗi chuỗi, thông qua % -memberphím tắt, lấy độ dài dòng cuối cùng mong muốn làm tham số.
    • chúng ta cần array_longest_line_length/2 + current_line_length/2
    • phần cuối là current_line_length/2->$_.length/2
    • phần khác là tính toán lại độ dài dòng tối đa của mảng mỗi lần qua vòng lặp và nó cũng làm như vậy với một vòng lặp lồng nhau tạo ra một mảng có độ dài dòng, sắp xếp thứ tự, sau đó lấy cái cuối cùng.

bạn có thể sử dụng Rút ngắn tên thuộc tính và độ dài của các phần tử để có được 58 byte
mazzy

1
@mazzy thì tốt hơn! vì bạn không đăng bài dưới dạng câu trả lời, tôi đã chỉnh sửa câu trả lời của mình bằng tín dụng.
TessellatingHeckler

3

Emacs Lisp, 203 byte

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

Ung dung:

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

Trung tâm:

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

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

Đoạn mã bao gồm </xmp>thẻ vì trình xem đoạn mã muốn các thẻ của tôi được cân bằng.


2

MATL , 22 31 byte

`jtYz~]xXhc4X4H$ZuZ{Zv

Mỗi dòng là đầu vào với một dòng đuôi (nghĩa là một entertổ hợp phím). Một dòng trống (hai entertổ hợp phím) đánh dấu sự kết thúc của đầu vào.

Thí dụ

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

Giải trình

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

Ruby, 76 68 61 byte

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

Chạy mẫu:

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

Tôi cũng đã thử centercách đầu tiên, nhưng theo tôi hiểu, một mình nó sẽ phá vỡ khoảng trắng của Tra Trailing trong đầu ra không được phép quy tắc. Cảm ơn bạn về &:sizephần này - tôi cũng đã thử điều đó, nhưng tôi chắc chắn đã đập một cái gì đó xung quanh cú pháp.
manatwork

2

Haskell, 111 81 77 byte

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

Đầu vào cho chức năng f, đầu ra không được in.

Cách sử dụng: tải trong trình thông dịch ghci center.hsvà sau đó nếu bạn muốn in đầu ra của f trên một chuỗi đã choputStr$f"Programming Puzzles\n&\nCode Golf"

Chỉnh sửa: Nhờ nimi cho 34 byte, công việc tuyệt vời! : D


Hai điều nữa: Phiên bản mới nhất của Prelude bao gồm phiên bản infix của map: <$>. replicate(...)' 'có thể được thay thế bởi [1.. ...]>>" ". Tất cả trong tất cả : unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q].
nimi

À vâng tôi nhớ bạn đã đề cập đến bản đồ mới trong bản đệ trình trước tôi đã thực hiện. Làm thế nào để lừa nhân rộng hoạt động?
basile-henry

l1 >> l2tạo (chiều dài l1) bản sao của l2 và ghép chúng lại. Ví dụ: "abcd" >> [1,2]> [1,2,1,2,1,2,1,2](<- 4 bản sao 1,2 trong một danh sách). Trong trường hợp của chúng tôi, [1..n]>>" "đó là n bản sao của một không gian giống như những gì replicate.
nimi

Rất vui, cảm ơn đã giải thích! :)
basile-henry

2

R, 126 byte

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

vô dụng

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

Có lẽ có những cách tốt hơn để làm điều này, vẫn làm việc với nó.


1

Gema, 160 byte

\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

Viết chủ yếu cho sự tò mò của tôi để xem những gì có thể được thực hiện trong một ngôn ngữ mà không có cấu trúc mảng phù hợp và hướng dẫn vòng lặp thích hợp.

Chạy mẫu:

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 byte

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

sử dụng:

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

Perl 5 sẽ cho phép bạn bỏ khoảng trắng trong những thứ như for @l {, cạo 2 byte và thay đổi put " "thành put" ", cạo một byte khác. Điều đó có đúng với Perl 6 không? (Tôi không biết Perl 6.) Ngoài ra, đầu ra của bạn như được hiển thị ở đây không khớp với đầu ra cần thiết; đó có phải là một lỗi đánh máy không?
msh210

@ msh210 Perl 6 hạn chế hơn một chút với cú pháp của nó. Nó nhiều hơn bù cho nó trong các lĩnh vực khác mặc dù.
Brad Gilbert b2gills

1

Japt, 28 25

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

¡     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 byte

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

Hãy thử trực tuyến!

Ung dung:

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

Đầu ra:

Programming Puzzles
         &         
     Code Golf   


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.