J, 54 ไบต์
[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]
ลองออนไลน์! (โปรดทราบว่าเอาต์พุตบน TIO มีการขึ้นบรรทัดใหม่และช่องว่างสามช่อง แต่นั่นไม่ใช่จากการเรียกใช้ฟังก์ชัน - อาจเป็นสิ่งที่ล่าม J ทำโดยอัตโนมัติ)
ฉันคิดว่าความคิดทั่วไปสำหรับการแก้ปัญหานี้ถูกต้อง แต่มีสิ่งเล็ก ๆ น้อย ๆ ที่ฉันอาจทำย่อยได้อย่างดีที่สุดที่เพิ่มไปยังจำนวน bytecount
รุ่นก่อนหน้า
55 ไบต์
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]
56 ไบต์
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]
คำอธิบาย
สิ่งนี้จะถูกแบ่งออกเป็นสองสามฟังก์ชั่น นอกจากนี้ฉันไม่ได้อธิบายอย่างละเอียดในส่วนหลังดังนั้นโปรดแจ้งให้เราทราบหากคุณต้องการคำอธิบายที่ดีกว่าสำหรับบางส่วนและฉันสามารถแก้ไขได้
dup =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
dup
ทำซ้ำอักขระแต่ละตัวหลาย ๆ ครั้งตามดัชนี (บวกหนึ่งตัว) ในสตริง
space
แทรกช่องว่างระหว่างตัวละครแต่ละตัว
pad
เพิ่มอักขระด้วยจำนวนช่องว่างที่เหมาะสม
trans
สลับเมทริกซ์ที่ได้
ตัวอย่างการโทร:
trans pad space dup 'abc'
c
b
a c
b
c
การทำซ้ำ
>:@i.@# <@#"0 ]
>:@i.@# Indices of each character plus one
# Length of the string
i. Range [0,length)
>: Add one
<@#"0 ] Duplicate each character as many times as it index (plus one)
"0 For each
# ] Copy the character
>:@i.@# as many times as it index
< Box the result
ผลลัพธ์จะถูกบรรจุเพื่อป้องกัน J จากการใส่ส่วนท้ายด้วยช่องว่าง (เนื่องจากความยาวไม่เท่ากัน)
ตัวอย่างการโทร:
dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘
ช่องว่าง
(,' '&,)/&.>
&.> For each boxed element
(,' '&,)/ Insert spaces between each
ตัวอย่างการโทร:
space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘
เบาะ
|.@i.@# (>@],~' '#~[)"_1 ]
(>@],~' '#~[) Pad the right arg with spaces given by the left arg
|.@i.@# Indices in reverse order
i. # Range [0,length)
|. Reverse
โดยทั่วไปให้วางองค์ประกอบแรกที่มีความยาว - 1 ช่องว่างส่วนที่สองที่มีความยาว - 2 ฯลฯ นอกจากนี้ยังลบมวย
ตัวอย่างการโทร:
pad space dup 'abc'
a
b b
c c c
ไขว้
นี่เป็นเพียงฟังก์ชั่นในตัว|:
ที่ใช้ขนย้ายของเมทริกซ์