Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Sepenuhnya dibenarkan berarti selaras di sebelah kiri dan kanan, dan dicapai dengan meningkatkan jarak antara kata-kata sampai setiap baris cocok.
Terkait:
- Ratakan teks dengan menambahkan spasi
- Sejajarkan teks dengan blok
- Dan dengan cara ini dapat dianggap sebagai langkah selanjutnya dalam Pemrosesan Teks # 1: Tanda hubung (yang tampaknya belum pernah diposting).
Memasukkan
Anda dapat mengambil input dalam format apa pun yang Anda suka. Anda akan diberikan:
- Lebar target (dalam karakter), dalam kisaran 5-100 (inklusif);
- Blok teks yang berisi kata-kata yang mungkin ditulis dalam tanda penghubung. Ini bisa berupa string yang dipisahkan spasi, array kata, atau array array fragmen kata (atau representasi data lain yang Anda inginkan).
Input tipikal mungkin:
Width: 25
Text: There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.
Di mana tanda hubung menunjukkan poin hyphenation yang mungkin, dan spasi menunjukkan batas kata. Kemungkinan representasi alternatif dari teks:
[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]
Keluaran
Teks input dengan spasi ditambahkan di antara kata-kata, baris baru pada lebar kolom, dan titik tanda hubung dipilih untuk sepenuhnya membenarkannya dengan lebar kolom. Untuk fungsi, array string (satu untuk setiap baris) dapat dikembalikan alih-alih menggunakan pemisahan baris baru.
Output yang mungkin untuk input di atas mungkin:
There's no business like
show business, no bus-
iness I know.
Perhatikan bahwa semua tanda hubung telah dihapus kecuali yang ada di "bus-iness" terakhir, yang disimpan untuk menunjukkan bahwa kata tersebut membungkus ke baris berikutnya, dan dipilih untuk memastikan baris kedua berisi teks sebanyak mungkin.
Aturan
Dalam setiap baris, jumlah spasi di antara kata-kata tidak dapat berbeda lebih dari 1, tetapi di mana Anda memasukkan spasi tambahan terserah Anda:
hello hi foo bar <-- not permitted (1,1,5) hello hi foo bar <-- not permitted (2,1,4) hello hi foo bar <-- OK (2,2,3) hello hi foo bar <-- OK (2,3,2) hello hi foo bar <-- OK (3,2,2)
Tidak ada garis yang dapat dimulai atau diakhiri dengan spasi (kecuali baris terakhir, yang dapat diakhiri dengan spasi).
Baris terakhir harus dibenarkan, berisi spasi tunggal antara setiap kata. Ini dapat diikuti oleh spasi putih / baris baru yang sewenang-wenang jika diinginkan, tetapi ini tidak diperlukan.
Kata-kata akan terdiri dari AZ, az, 0-9 dan tanda baca sederhana (
.,'()&
)Anda dapat mengasumsikan bahwa tidak ada fragmen kata yang akan lebih panjang dari lebar target, dan akan selalu memungkinkan untuk mengisi baris sesuai dengan aturan (yaitu akan ada setidaknya 2 fragmen kata pada setiap baris, atau 1 fragmen kata yang mengisi baris sempurna)
Anda harus memilih titik tanda hubung yang memaksimalkan jumlah karakter kata pada baris sebelumnya (yaitu kata-kata harus dikonsumsi dengan rakus oleh baris), misalnya:
This is an input stri-ng with hyph-en-at-ion poi-nts. This is an input stri- <-- not permitted ng with hyphenation points. This is an input string with hyph- <-- not permitted enation points. This is an input string with hyphen- <-- OK ation points.
Kode terpendek dalam byte menang
Contohnya
Width: 20
Text: The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.
The quick brown fox
jumps over the lazy
dog.
Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).
Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Width: 80
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles & Code Golf is a question and answer site for programming
puzzle enthusiasts and code golfers. It's built and run by you as part of the
Stack Exchange network of Q&A sites. With your help, we're working together to
build a library of programming puzzles and their solutions.
Width: 20
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles
& Code Golf is a
question and answer
site for programming
puzzle enthusiasts
and code golfers.
It's built and run
by you as part of
the Stack Exchange
network of Q&A
sites. With your
help, we're working
together to build a
library of program-
ming puzzles and
their solutions.
Width: 5
Text: a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z
a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss t
u vv
ww x
yy z
Width: 10
Text: It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!
It's the
black be-
ast of
Araghhhhh-
hhhhhhhhh-
hhh!
sumber
anybod-y
dengan lebar 7, dapatkah kita memilih untuk menampilkan salah satuanybody
atauanybod-\ny
?Jawaban:
JavaScript (ES6), 218 byte
Membawa argumen dalam sintaks currying (
f(width)(text)
) dan input teks dalam format array ganda yang dijelaskan dalam tantangan. String dikonversi ke format itu via.split` `.map(a=>a.split`-`))
. Juga, baris baru adalah baris baru literal di dalam string template.Tidak bermain golf dan mengatur ulang
Idenya di sini adalah untuk melangkah melalui setiap bagian dari seluruh string dan membangun setiap baris satu bagian pada satu waktu. Setelah satu baris selesai, itu menambah jarak kata dari kiri ke kanan sampai semua spasi tambahan ditempatkan.
Cuplikan Tes
sumber
GNU sed
-r
, 621 bytesMengambil input sebagai dua baris: Lebar sebagai angka unary pertama dan string kedua.
Saya yakin ini bisa bermain golf lebih banyak tetapi saya sudah membuang terlalu banyak waktu ke dalamnya.
Cobalah online!
Penjelasan
Program ini bekerja dalam dua fase: 1. Membagi, dan 2. Membenarkan. Untuk di bawah ini, anggaplah input kami adalah:
Mendirikan
Pertama kita membaca input, memindahkan baris pertama (lebar sebagai angka unary) ke ruang penahanan (
x
), kemudian menambahkan baris berikutnya (N
) dan kemudian salinan lebar dari ruang penahanan (G
) ke ruang pola. SejakN
meninggalkan kita dengan yang\n
kita ganti!@
, yang akan kita gunakan sebagai kursor di Tahap 1.Sekarang isi ruang pegang adalah
1111111111111
(dan tidak akan berubah untuk selanjutnya) dan ruang pola adalah (dalam formatl
perintah "cetak jelas" ):Fase 1
Dalam Fase 1,
@
kursor utama memajukan satu karakter pada satu waktu, dan untuk setiap karakter a1
dihapus dari "penghitung" di akhir ruang pola. Dengan kata lain,@foo\n111$
,f@oo\n11$
,fo@o\n1$
, dllThe
!
trails kursor di belakang@
kursor, menandai tempat kita bisa pecah jika counter mencapai 0 di tengah-tengah baris. Beberapa putaran akan terlihat seperti ini:Di sini ada pola yang kami kenali: spasi segera diikuti oleh
@
kursor. Karena penghitung lebih besar dari 0, kami memajukan penanda istirahat, lalu terus memajukan kursor utama:Berikut pola lain:,
-@
dan kami masih memiliki 7 di penghitung, jadi kami memajukan kursor break lagi dan terus maju:Berikut pola yang berbeda: Tanda hubung segera sebelum kursor istirahat dan lainnya sebelum kursor utama. Kami menghapus tanda hubung pertama, memajukan kursor istirahat, dan, karena kami menghapus karakter, tambahkan 1 ke penghitung.
Kami terus memajukan kursor utama:
Mirip dengan sebelumnya, tapi kali ini kursor utama mendahului spasi daripada mengikuti tanda hubung. Kami menghapus tanda hubung, tetapi karena kami juga memajukan kursor utama kami tidak menambah tidak ada penurunan penghitung.
Akhirnya, penghitung kami telah mencapai nol. Karena karakter setelah kursor utama adalah spasi, kami menyisipkan baris baru dan meletakkan kedua kursor segera setelahnya. Lalu kami mengisi penghitung (
G
) dan mulai lagi.Fase 1 berlanjut, memajukan kursor dan mencocokkan berbagai pola, hingga
@
kursor mencapai akhir string.Pada akhir Fase 1, ruang pola kami terlihat seperti ini:
Atau:
Fase 2
Dalam Fase 2 kita menggunakan
%
sebagai kursor dan menggunakan penghitung dengan cara yang sama, dimulai seperti ini:Pertama, kita menghitung karakter pada baris pertama dengan memajukan kursor dan menghapus 1s dari penghitung, setelah itu kita miliki;
Karena penghitung adalah 0, kami tidak melakukan hal lain pada baris ini. Baris kedua juga memiliki jumlah karakter yang sama dengan penghitung, jadi mari kita lewati ke baris ketiga:
Penghitung lebih besar dari 0, jadi kami memindahkan kursor kembali ke awal baris. Kemudian kita menemukan run spasi pertama dan menambahkan spasi, mengurangi counter.
Penghitung lebih besar dari 0; karena kursor sudah berada dalam menjalankan spasi terakhir (satu-satunya) pada baris, kami memindahkannya kembali ke awal baris dan melakukannya lagi:
Sekarang penghitungnya adalah 0, jadi kami memindahkan kursor ke awal baris berikutnya. Kami mengulangi ini untuk setiap baris kecuali yang terakhir. Itulah akhir dari fase 2 dan akhir dari program! Hasil akhirnya adalah:
sumber
gsed (GNU sed) 4.4
saya dapatkangsed: -e expression #1, char 16: ":" lacks a label
. Bisakah Anda menambahkan catatan tentang cara tepatnya Anda memintanya? (Saya menggunakanprintf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
)-r
bendera, itulah sebabnya tautan TiO di atas menuju ke halaman bash.!
(meskipun karena saya ketinggalan!
dari daftar kemungkinan karakter khusus, saya tidak akan tahan terhadap hal itu).JavaScript (ES6), 147 byte
Mengambil input sebagai
(width)(text)
.Cobalah online!
Berkomentar
sumber
APL (Dyalog Unicode) ,
129 123 121 118 111 109 107 104 10095 byte SBCSCobalah online!
sumber
Stax ,
5150 byteJalankan dan debug itu
sumber
Python 2 , 343 byte
Cobalah online!
sumber
print'\n'.join(L[:-1])
alih - alihfor e in L[:-1]:print e