J, 35 33 byte
3 :'[;.0>(,|:)&:,.&.>/_98{.;:|.y'
Ini adalah kata kerja yang mengambil input sebagai string tunggal dengan kata-kata yang dipisahkan oleh spasi. Misalnya, Anda bisa menyebutnya seperti ini:
3 :'[;.0>(,|:)&:,.&.>/_98{.;:|.y' 'programming puzzles and code golf'
Outputnya adalah matriks huruf dan spasi, yang mana interpreter menampilkan dengan baris baru sesuai kebutuhan. Setiap baris akan diisi dengan spasi sehingga mereka memiliki panjang yang sama persis.
Ada sedikit masalah dengan kode: kode tidak akan berfungsi jika input memiliki lebih dari 98 kata. Jika Anda ingin memperbolehkan input yang lebih panjang, gantilah _98
kode itu dengan _998
mengizinkan hingga 998 kata, dll.
Izinkan saya menjelaskan bagaimana ini bekerja melalui beberapa contoh.
Misalkan kita memiliki matriks huruf dan spasi yang kita bayangkan adalah output parsial untuk beberapa kata, dimulai dengan kata horizontal.
[m=: 3 3$'vwx y z'
vwx
y
z
Bagaimana kita bisa menambahkan kata baru sebelum ini, secara vertikal? Ini tidak sulit: cukup ubah kata baru menjadi matriks kolom tunggal huruf dengan kata kerja ,.
, lalu tambahkan output ke matriks kolom tunggal itu. (Kata kerja,.
mudah digunakan karena berfungsi sebagai fungsi identitas jika Anda menerapkannya pada matriks, yang kami gunakan untuk bermain golf.)
(,.'cat') , m
c
a
t
vwx
y
z
Sekarang kita tidak bisa hanya mengulangi cara menambahkan kata seperti apa adanya, karena dengan begitu kita hanya akan mendapatkan kata-kata vertikal. Tetapi jika kita memindahkan matriks output di antara setiap langkah, maka setiap kata lainnya akan horisontal.
(,.'dog') , |: (,.'cat') , m
d
o
g
catv
w
xyz
Jadi upaya pertama kita untuk solusi adalah memasukkan setiap kata ke dalam matriks satu kolom, kemudian lipat dengan menambahkan dan mentransposisi di antara mereka.
> (,|:)&.>/ ,.&.>;: 'car house dog children'
c
a
r
housed
o
g
children
Tapi ada masalah besar dengan ini. Ini menempatkan huruf pertama dari kata berikutnya sebelum berbelok ke kanan, tetapi spesifikasinya membutuhkan pengubahan sebelum meletakkan huruf pertama, jadi hasilnya harus seperti ini:
c
a
rhouse
d
o
gchildren
Cara kami mencapai ini adalah membalikkan seluruh string input, seperti pada
nerdlihc god esuoh rac
kemudian gunakan prosedur di atas untuk membangun zig-zag tetapi berputar hanya setelah huruf pertama dari setiap kata:
n
e
r
d
l
i
h
c
gode
s
u
o
h
rac
Kemudian balikkan hasilnya:
[;.0> (,|:)&.>/ ,.&.>;:|. 'car house dog children'
car
h
o
u
s
edog
c
h
i
l
d
r
e
n
Tapi sekarang kita punya masalah lain. Jika input memiliki jumlah kata ganjil, maka output akan memiliki kata vertikal pertama, sedangkan spesifikasi mengatakan bahwa kata pertama harus horisontal. Untuk memperbaikinya, solusi saya membuat daftar kata-kata persis 98 kata, menambahkan kata-kata kosong, karena itu tidak mengubah output.