จัดศูนย์กลางข้อความ!


40

จัดศูนย์กลางข้อความ!

ในการท้าทายนี้คุณจะต้องอยู่ตรงกลางเส้นต่าง ๆ

ตัวอย่าง

Foo
barbaz

 Foo
barbaz
Hello
World

Hello
World
Programming Puzzles
&
Code Golf

Programming Puzzles
         &
     Code Golf

ข้อมูลจำเพาะ

แต่ละบรรทัดอินพุตจะมีอักขระที่ไม่ใช่ช่องว่างอย่างน้อยหนึ่งตัวเสมอคุณอาจถือว่าอักขระช่องว่างเท่านั้นคือช่องว่าง ( ) และบรรทัดใหม่ แต่ละบรรทัดอินพุตจะไม่มีการต่อท้ายและ / หรือช่องว่างนำหน้า (ยกเว้นสำหรับการขึ้นบรรทัดใหม่) ไม่อนุญาตให้ใช้ช่องว่างต่อท้ายในเอาต์พุต

คุณควรอยู่กึ่งกลางระหว่างบรรทัดที่ยาวที่สุดในอินพุต หากบรรทัดนั้นยาวแม้กระทั่งโปรแกรม / ฟังก์ชั่นของคุณควรอยู่กึ่งกลางทางด้านซ้าย ความยาวบรรทัดสูงสุดเป็นสิ่งที่ภาษาของคุณสามารถจัดการได้ แต่โปรแกรมของคุณควรทำงานกับบรรทัดที่มีความยาวอย่างน้อย 500 บรรทัด


ลีดเดอร์บอร์ด

นี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต 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

ใช่ แต่ฉันหมายถึงพื้นที่ภายในเช่นระหว่างคำ
cat

1
@cat โอ้ระหว่างคำอาจมีช่องว่างมากกว่าหนึ่งช่อง ตัวอย่างเช่นfoo(space)(space)(space)barอินพุตที่ยอมรับได้อย่างสมบูรณ์
Downgoat

เราคิดได้ไหมว่าจะมีมากกว่า 1 บรรทัดเสมอ?
GamrCorps

คำตอบ:


15

Pyth, 19 17 ไบต์

2 ไบต์ขอบคุณ Jakube

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

สาธิต

ฉันคิดว่านี่เป็นครั้งแรกที่ฟังค์ชั่น center-pad ของ.[มีประโยชน์ พบความยาวของบรรทัดที่ยาวที่สุดโดยใช้ทรานสเรนเทอร์ไม่ตัดทอน ( .T)

ช่องว่างต่อท้ายจะถูกลบออกโดยการเพิ่มอักขระที่ไม่ใช่ช่องว่างด้านหน้าการเว้นช่องว่างแล้วลบอักขระที่เพิ่มเข้ามา


1
เราอาจต้องการความยาวสูงสุดในอาร์เรย์ มันเกิดขึ้นบ่อยเกินไป +1
Maltysen

ข้อมูลจำเพาะระบุว่า "ไม่อนุญาตให้ใช้ช่องว่างต่อท้ายในเอาต์พุต" ดูเหมือนว่าจะมีช่องว่างต่อท้ายในแต่ละบรรทัดสั้น ๆ ในผลลัพธ์ดังนั้นฉันจึงไม่แน่ใจว่าจะนับ
มันฝรั่ง

@potato Thanks - เพิ่มเข้ามาตั้งแต่ฉันตอบ
isaacg

31

เป็นกลุ่ม43 36 35 ไบต์

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

ดีเกินไปที่จะไม่โพสต์ หมายเหตุบรรทัดใหม่ต่อท้าย; มันมีความสำคัญ

ขอบคุณ@Marth ที่ช่วยรักษาตัวละครไว้!

รูปแบบที่เป็นมิตร:

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
แน่นอนว่าทั้งหมดนี้ควรทำในโหมดแทรกใช่ไหม
Alex A.

9
@AlexA ไม่มีการดำเนินการใด ๆ ในโหมดแทรก ಠ_ಠ
Doorknob

หากคุณใช้sor!เพื่อกลับลำดับการจัดเรียงคุณสามารถใช้col("$")เพื่อรับความยาวของบรรทัดแรก (ตอนนี้ยาวที่สุดนับตั้งแต่คำสั่งซื้อถูกย้อนกลับ) แทนที่จะใช้G$ช่วยประหยัดจำนวน 1 ไบต์! แก้ไข : หรือคุณสามารถเรียงลำดับและใช้G:let &tw=col("$")แทนได้
Marth

@Marth ขอบคุณ! ฉันเลือกอย่างหลัง (โดยไม่มีเหตุผลเฉพาะ)
Doorknob

มองผ่าน:h :sortฉันเพิ่งค้นพบว่าคุณสามารถส่ง regex เพื่อข้ามข้อความที่ตรงกันในการเรียงลำดับดังนั้นคุณสามารถใช้:sor /./เพื่อเรียงลำดับความยาว (+4 ไบต์) ซึ่งช่วยให้คุณลบVGrx(-4 ไบต์) และยกเลิกที่สอง ( -1 ไบต์) คุณยังสามารถใช้|ตัวคั่นแทน<cr>การโยงคำสั่งซึ่งให้คุณข้าม:ก่อนหน้าlet(-1 ไบต์) (โปรดทราบว่าคุณต้องใช้sor!วิธีแก้ปัญหานั้นGไม่ใช่คำสั่ง ex) ดังนั้น:sor! /./|let &tw=col("$")|u|%ce (ด้วยการลาก<CR>) ควรบันทึก 2 ไบต์
Marth

23

Mathematica, 96 ไบต์

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

อย่าถามฉันว่ามันทำงานอย่างไรฉันเพิ่งเล่นไปกับมันจนกว่ามันจะสร้างผลลัพธ์ที่ถูกต้อง


27
+1 สำหรับ "อย่าถามฉันว่ามันทำงานอย่างไรฉันเพิ่งเล่นกับมันจนกว่ามันจะสร้างผลลัพธ์ที่ถูกต้อง"
cat

4
@cat นั่นคือวิธีที่ฉันทำกอล์ฟทั้งหมด
lirtosiast

11

Funcitonไม่ใช่การแข่งขัน

ความท้าทายนี้เน้นให้เห็นถึงการขาดฟังก์ชั่น“ ค่าสูงสุด” (และค่าต่ำสุด) สำหรับลำดับที่ขี้เกียจดังนั้น ... ฉันเพิ่มพวกเขาไปยังห้องสมุดหลัก (พวกเขาเรียกว่า⊤และ⊥ตามลำดับ) ดังนั้นฉันไม่รำคาญที่จะส่งสิ่งนี้เป็นคำตอบgolfed (มันจะต้องมีการประกาศ⊤ฟังก์ชั่นที่จะถูกต้อง) ดังนั้นนี่เป็นเพียงโปรแกรมหลัก

ดำเนินการ(function(){$('pre,code').css({lineHeight:5/4,fontFamily:'DejaVu Sans Mono'});})()ในคอนโซลเบราว์เซอร์ของคุณเพื่อรับการแสดงผลที่ดีขึ้น

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

คำอธิบาย

ฉันเชื่อว่านี่อาจเป็นคำตอบแรกของ Funciton ในเว็บไซต์นี้ที่ใช้การแสดงออกแลมบ์ดา

  • อันดับแรกเราใช้ǁเพื่อแยกสตริงอินพุตที่บรรทัดใหม่ (ASCII 10) สิ่งนี้จะส่งคืนลำดับที่ขี้เกียจ
  • เราส่งลำดับนั้นผ่านɱ(แผนที่) โดยให้แลมบ์ดาที่คำนวณความยาวของแต่ละสายแล้วส่งลำดับสุดท้ายผ่านเพื่อรับความยาวของเส้นที่ยาวที่สุด
  • นอกจากนี้เรายังส่งผ่านลำดับนั้นผ่านอีกอันɱโดยให้แลมบ์ดาที่คำนวณความยาวของแต่ละสตริงลบออกจากความยาวบรรทัดสูงสุดที่คำนวณไว้ก่อนหน้านี้หารด้วย 2 (จริง ๆ แล้วเลื่อนไปทางขวา 1) สร้างช่องว่างจำนวนมาก (ASCII 32) จากนั้นเชื่อมสตริงเข้ากับช่องว่างเหล่านั้น (สำหรับเหตุผลทางเรขาคณิตฉันประกาศฟังก์ชั่นที่โทร(สตริงเชื่อมต่อ) ที่มีพารามิเตอร์ย้อนกลับ)
  • สุดท้ายเราใช้ʝเพื่อรวมสตริงทั้งหมดเข้าด้วยกันโดยใช้ newlines (ASCII 10) เป็นตัวคั่น

+1 ว่ามันยอดเยี่ยมแค่ไหนและ"นั่นคือ 716 ตัวอักษรรวม 1,508 ไบต์"
cat

9

เรติน่า54 54ไบต์

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

\ts สามารถแทนที่ด้วยแท็บจริง แต่ผมเคยใช้\tที่นี่เพราะมิฉะนั้น SE จะแปลงแท็บไปที่ช่องว่าง โปรดทราบว่ามีช่องว่างนำในบรรทัดที่สอง

ลองออนไลน์

คำอธิบาย

แนวคิดพื้นฐานคือเพื่อให้ตรงกับเส้นซึ่งเป็นเวลาอย่างน้อยสองตัวละครสั้นกว่าสายที่ยาวที่สุด (หรือในทางเทคนิคตัวละครสองตัวสั้นกว่าใด ๆสายอื่น ๆ ) และล้อมรอบมันในสองช่องว่าง สิ่งนี้ทำซ้ำจนกว่าเราจะไม่สามารถหาบรรทัดดังกล่าวได้อีกต่อไปซึ่งหมายความว่าทุกบรรทัดอยู่ในหนึ่งอักขระที่มีความยาวสูงสุด (โดยที่ตัวละครตัวหนึ่งจะต้องคำนึงถึงความไม่ตรงกันของพาริตีและรับประกันว่าบรรทัดเหล่านี้จะเลื่อนไปทางซ้าย ศูนย์).

สำหรับ regex จริง:

^(.)+$

เพียงแค่จับคู่หนึ่งบรรทัดใด ๆ ในขณะที่ผลักดันการจับภาพหนึ่งไปยังกลุ่ม1สำหรับตัวละครแต่ละตัว

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

เป็น lookbehind ซึ่งจับคู่จากขวาไปซ้ายและย้ายเคอร์เซอร์ไปที่จุดเริ่มต้นของสตริงเพื่อให้ lookahead ภายในสามารถตรวจสอบสตริงทั้งหมดได้ โปรดทราบว่าเนื่องจากไม่มีจุดยึดจึงสามารถใช้ lookahead ได้จากที่อื่น แต่ไม่ได้สร้างการจับคู่เพิ่มเติม เรารู้ว่า[^\t]จะจับคู่อักขระใด ๆในสตริงเสมอเนื่องจากอินพุตรับประกันว่าจะมีช่องว่างและ linefeeds เท่าที่เกี่ยวข้องกับช่องว่าง

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

lookahead นี้พยายามค้นหาบรรทัดที่มีอักขระอย่างน้อยสองตัวที่ยาวกว่าอักขระที่เรากำลังจับคู่อยู่ในขณะนี้ [^\t]*เลื่อนผ่านสตริงเพื่อให้สามารถจับคู่กับบรรทัดใดก็ได้ ^รับรองว่าเราเริ่มต้นจากจุดเริ่มต้นของบรรทัด ..จากนั้นตรงกับอักขระเพิ่มเติมสองตัวที่เราต้องการสำหรับบรรทัดที่ยาวกว่า ตอนนี้(?<-1>.)+จับคู่อักขระแต่ละตัวในบรรทัดนั้นในขณะที่ popping จากกลุ่ม1(โปรดทราบว่า.ไม่สามารถจับคู่ linefeed ได้ดังนั้นสิ่งนี้จึงถูก จำกัด ไว้ที่หนึ่งบรรทัด) สุดท้ายอ้างว่าเรามีการจัดการที่จะว่างเปล่าทั้งกลุ่ม(?(1)^) 1หากบรรทัดสั้นกว่าที่ต้องการจะเป็นไปไม่ได้เนื่องจากไม่มีอักขระในบรรทัดที่จะปรากฏขึ้นจากกลุ่ม 1 บ่อยพอที่จะล้างข้อมูล


7

Jolf , 3 ไบต์

ไม่ใช่การอัปเดตอัปเดตคำถามวันที่

ลองที่นี่! .

pci
pc  center
  i  string input

¯ \ _ (ツ) _ / ¯ฉันคิดว่ามันเป็นฟังก์ชั่นที่มีประโยชน์


1
นี่เป็นช่องโหว่มาตรฐานและแม้ว่าจะไม่ได้รับอนุญาตอย่างชัดเจน แต่ก็เป็นรูปแบบที่ไม่ดีเว้นแต่เป็นภาษาที่คุณค้นหาไม่ใช่ที่คุณสร้างขึ้น
อีเลียสเบเนเฟเดส

3
@EliasBenevedes ฉันได้เพิ่มคุณสมบัติก่อนการแข่งขัน ฉันมักจะไม่อัปเดตรหัสของฉันจนกว่ามันจะกลายเป็น relavent
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! บันทึกสี่ไบต์ด้วย Martin Büttner ลองออนไลน์

คำอธิบาย

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

Centered:

               (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

Ruby, 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วิธีก่อน แต่ตามที่ฉันเข้าใจว่าเพียงอย่างเดียวจะทำลายกฎ“ Trailing whitespace ในเอาต์พุตไม่ได้รับอนุญาต” ขอบคุณสำหรับ&: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 เอาต์พุตจะไม่ถูกพิมพ์

Usage: load in interpreter ghci center.hsแล้วถ้าคุณต้องการพิมพ์ผลลัพธ์ของ f บนสตริงที่กำหนดputStr$f"Programming Puzzles\n&\nCode Golf"

แก้ไข: ขอบคุณnimiสำหรับ 34 bytes ทำได้ดีมาก! : D


สองสิ่งที่มากขึ้น: รุ่นล่าสุดของโหมโรงรวมถึงรุ่นของมัด:map จะถูกแทนที่ด้วย ทั้งหมดในทั้งหมด: . <$>replicate(...)' '[1.. ...]>>" "unlines[([1..div(maximum(l<$>q)-l w)2]>>" ")++w|w<-q]
nimi

อ่าใช่ฉันจำได้ว่าคุณพูดถึงแผนที่มัดใหม่ในการส่งก่อนหน้านี้ที่ฉันทำ เคล็ดลับการทำซ้ำทำงานอย่างไร
basile-henry

l1 >> l2ทำสำเนา (ความยาว l1) ของ l2 และต่อกัน เช่น"abcd" >> [1,2]-> [1,2,1,2,1,2,1,2](<- 4 สำเนา 1,2 ในรายการเดียว) ในกรณีของเรามัน[1..n]>>" "คือ n สำเนาของพื้นที่ซึ่งเหมือนกับสิ่งที่replicateทำ
nimi

ดีมากขอบคุณสำหรับคำอธิบาย! :)
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="")}

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

Gema, 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 bytes

$/=(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 ค่อนข้างเข้มงวดกับไวยากรณ์ของมันมากขึ้น มันมากกว่าทำให้มันในพื้นที่อื่น ๆ แม้ว่า
Brad Gilbert 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),"
";}

ลองออนไลน์!

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   

-1

05AB1E , 2 ไบต์

.c

Builtins ftw ¯ \ _ (ツ) _ / ¯

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

.c   # Centralize the (implicit) multi-line input-string with preference to the left
     # (output the result implicitly)

(การตั้งค่าทางด้านขวาจะอยู่ที่เมืองหลวง.Cแทน: ดูความแตกต่าง )


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.