Monday Mini-Golf: Serangkaian tantangan kode-golf pendek , diposting (mudah-mudahan!) Setiap hari Senin.
Banyak aplikasi web (terutama media sosial) secara otomatis memotong teks yang panjang sehingga sesuai dengan pemformatan aplikasi. Dalam tantangan ini, kita akan membuat algoritma untuk secara otomatis memangkas satu bagian teks ke panjang tertentu.
Tantangan
Tujuan dari tantangan ini adalah untuk menulis program atau fungsi yang menggunakan dua argumen:
- T , teks untuk dipotong.
- L , panjang maksimum untuk kembali.
Dan mengembalikan T , terpotong dengan logika berikut:
- Jika panjang T kurang dari atau sama dengan L , pemotongan tidak diperlukan. Kembalikan string asli.
- Potong T untuk panjang L -2. Jika ini tidak mengandung spasi atau tanda hubung, kembalikan T terpotong tepat ke L-3 karakter, diikuti oleh elipsis
...
. - Jika tidak, potong ujung hasil hingga ruang terakhir atau tanda hubung. Tambahkan elipsis
...
dan kembalikan hasilnya.
Detail
- T dan L dapat diambil dalam urutan dan format apa pun.
- Anda dapat berasumsi bahwa 3 < L <2 31 .
- Anda tidak boleh menggunakan Ellipsis Horizontal U + 2026
…
; Anda harus menggunakan tiga periode. - Input tidak akan mulai dengan spasi atau tanda hubung.
- Input tidak akan berisi spasi kosong selain spasi biasa. (Tidak ada tab, baris baru, dll.)
Kasus uji
Input:
"This is some very long text." 25
"This-is-some-long-hyphen-separated-text." 33
"Programming Puzzles & Code Golf is a question and answer site for programming puzzle enthusiasts and code golfers." 55
"abcdefghijklmnopqrstuvwxyz" 20
"a b c" 4
"Very long." 100
Output:
"This is some very long..."
"This-is-some-long-hyphen..."
"Programming Puzzles & Code Golf is a question and..."
"abcdefghijklmnopq..."
"a..."
"Very long."
(Perhatikan bahwa kutipan hanya untuk menentukan bahwa ini adalah string; tidak perlu dimasukkan.)
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek yang valid dalam byte menang. Tiebreaker pergi ke pengiriman yang mencapai jumlah byte terakhirnya terlebih dahulu. Pemenang akan dipilih Senin depan, 5 Oktober. Semoga beruntung!
Sunting: Selamat kepada pemenang Anda, @Jakube dengan Pyth lagi, dengan 25 byte!
Jawaban:
Pyth, 25 byte
Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
sumber
Perl,
695952 byte51 kode byte + 1 byte baris perintah. Mengasumsikan input numerik diizinkan untuk diberikan dengan parameter -i.
Pemakaian:
sumber
Python 2,
7873 byteFormat input mengikuti contoh input.
sumber
JavaScript (ES6),
123786761 byteSaya tidak berharap dapat mengurangi ini begitu banyak, tetapi ternyata sambatan / ganti kombo mampu menutupi setiap kasus di mana pemotongan diperlukan.
Argumen pertama adalah string, kedua adalah panjangnya. Terima kasih khusus kepada edc65 untuk optimasi pemeriksaan panjang!
Berikut kode aslinya (123 byte):
sumber
.length
memeriksa panjang(T,L)=>T[L]?T.slice(0,L-2).replace(/([ -][^ -]*|.)$/,'...'):T
skor senar 61[ -][^ -]
dengan\s\S
untuk menyimpan 5 byte lebihTI-BASIC, 87 byte
TI-BASIC tidak memiliki banyak perintah manipulasi string, jadi kita perlu menemukan indeks terakhir secara manual: jika string tidak mengandung string untuk dicari,
inString(
mengembalikan 0. Kami mencari tanda hubung dan spasi mulai dari setiap posisi mulai 1 untukL
, dan mencatat jumlah terbesar kurang dari atau sama denganL-3
. Jika angkaI
itu masih 0, kita gunakanL-3
sebagai indeks akhir sebagai gantinya.Karena keterbatasan kalkulator, indeks string yang dapat dialamatkan terbesar adalah 9999; oleh karena itu, ini akan gagal untuk string yang lebih besar.
Saya mengandalkan perilaku kalkulator untuk secara otomatis menginisialisasi variabel
I
ke 0, jadi hapusI
atau hapus memori kalkulator Anda sebelum menjalankan.sumber
C # .NET,
187169 byteHmm ...
sumber
Python 2, 105 byte
Dipanggil dengan
sumber
Groovy, 95 byte
Cukup mudah, mungkin bisa bermain golf lebih lanjut
sumber
CJam, 34 byte
Cobalah online: Chrome | Firefox
sumber
T-SQL, 145 byte
pemakaian:
exec a("This is some very long text.", 25) exec a("This-is-some-long-hyphen-separated-text.", 33)
sumber
rs , 116
Setidaknya lebih pendek dari C # ...
Demo langsung dan uji kasus.
sumber
Ceylon
386333252230222216171153131111Asli Tidak Disatukan:
Ini adalah 386 byte / karakter. Beberapa fitur menarik di sini:
The
x[y:z]
sintaks sintaksis gula untukx.measure(y, z)
, dan mengembalikan subrange darix
mulaiy
dengan panjangz
- untuk string, ini adalah substring. (Ada jugax[y..z]
sintaksis, yang merupakan rentang dari indeks y ke z, keduanya inklusif, serta bentang setengah terbukax[...z]
danx[y...]
.)List.lastIndexWhere
mengambil predikat (yaitu fungsi mengambil elemen daftar dan mengembalikan boolean, yaitu di sini aCallable<Boolean, [Character]>
), dan memberikan indeks elemen daftar terakhir tempat predikat terpenuhi (atau nol, jika tidak pernah terpenuhi). Karena string adalah daftar, ini juga berfungsi untuk string.Hasil dari ini,
spaceIndex
adalah tipeInteger|Null
, atauInteger?
untuk pendek - yaitu dapat berupa Integer ataunull
(satu-satunya nilai tipeNull
). (Nama ituspaceIndex
berasal dari ketika saya tidak menyadari bahwa-
itu juga istimewa - saya kirabreakIndex
akan lebih baik.)Dengan
exists spaceIndex
kita dapat memeriksa apakahspaceIndex
itu nol, dan kemudian melakukan sesuatu yang berbeda. (Di dalam ini jika-blok kompiler tahu bahwa itu bukan nol ... tanpa itu akan mengeluh jika saya digunakanspaceIndex
untuk mengakses string.)Alih-alih fungsi lokal
spacePredicate
kami juga dapat menggunakan fungsi anonimIni membawa kita ke 333 karakter:
Optimalisasi selanjutnya adalah menggunakan nama variabel dan fungsi yang lebih pendek, yang menurunkan kita sebesar 81 byte menjadi 252:
Fungsi predikat sebenarnya tidak perlu tipe argumennya dideklarasikan, yang dapat disimpulkan oleh kompiler. Sama untuk jenis
i
(di mana kita masih harus menulisvalue
untuk menandainya sebagai deklarasi). Sekarang deklarasi itu cukup pendek untuk muat pada satu baris, membawa kita ke 230:Alih-alih
e == ' ' || e == '-'
kita juga dapat menulise in [' ', '-']
(ataue in {' ', '-'}
, ini adalah konstruktor yang dapat diubah bukan yang tuple). Thein
Operator peta dengan metode Category.contains, yang membawa kita ke gagasan bahwa kita dapat melewati bahwa tuple inicontains
metode langsung (itu adalah callable mengambil objek apapun, sehingga juga menerima karakter), tanpa(e) => ...
boilerplate (222 bytes):Sebenarnya, kategori lain yang mengandung dua karakter yang sama adalah string dua karakter
" -"
. (Selain itu juga mengandung substringnya, tapi tidak ada salahnya di sini). 216 byte.Saya kira kita mendapatkan yang terbaik dari baris ini, mari kita beralih ke yang lain ... dua pernyataan pengembalian terakhir memiliki beberapa kesamaan yang dapat kita eksploitasi - mereka hanya berbeda dalam
i
vsl-3
, dan menggunakani
tepat ketika itu bukan nol, jika tidakl-3
. Untungnya inilah yangelse
dibuat untuk operator!(Kurung tampaknya diperlukan di sini, karena
else
memiliki prioritas lebih rendah daripada[:]
.) Ini adalah 171 karakter. Sekarangi
digunakan hanya sekali, jadi kita bisa inline itu, membawa kita ke 153 karakter:Kami juga dapat mengganti
if-return-return
kombinasi ini dengan kombinasi operatorthen
danelse
dalam satureturn
. (then
pengembalian adalah operan kedua ketika yang pertama benar, jika tidak nol, yang kemudian memungkinkanelse
untuk mengembalikan operan kedua.`) 131 byte (meskipun beberapa penghematan adalah ruang putih yang akan kita singkirkan):Fungsi yang berisi hanya satu pengembalian dengan ekspresi alternatifnya dapat ditulis dengan notasi "panah gemuk", memberikan 123:
Menghapus spasi kosong yang tidak dibutuhkan memberi kita 111 byte terakhir:
String t(String s,Integer l)=>s.size<l then s else s[0:(s[0:l-2].lastIndexWhere(" -".contains)else l-3)]+"...";
Sebagai tambahan, berikut adalah fungsi yang mencetak contoh-contoh dari pertanyaan (menggunakan nama
t
yang digunakan setelah langkah kedua):sumber
POSIX shell + sed GNU, 65 byte
Ini adalah pekerjaan untuk sed! Tapi saya perlu shell untuk mendapatkan batas panjang (mungkin Perl akan lebih baik). Bagian sed mengembang ke urutan yang cukup sederhana, dengan lompatan bersyarat ketika kita selesai:
sumber
Mathematica 192 byte
Disebut sebagai
sumber
> <>, 74 byte
Solusi ini membutuhkan string yang akan dipotong dan
L
sudah ada di tumpukan, dalam urutan itu.Ada 7 byte terbuang yang disebabkan oleh masalah penyelarasan, masih mencoba untuk golf keluar.
sumber
C # (157):
Berdasarkan jawaban Salah Alami , tetapi lebih pendek. Kelas string berasal dari
IEnumerable<char>
, jadi alih-alihT.Contains(" ")||T.Contains("-")
, saya gunakan" -".Any(x=>T.Contains(x))
.Larutan:
Tidak Disatukan:
Memperbarui:
Disimpan 6 byte berkat komentar dari SLuck49, menggunakan
Any(T.Contains)
bukanAny(x=>T.Contains(x))
.sumber
.Any(x=>T.Contains(x))
Anda dapat langsung menggunakan metode ini alih-alih lambda ingin.Any(T.Contains)
menyimpan 6 byteGS2 , 29 byte
Program ini membutuhkan input standar. Baris pertama adalah string, dan yang kedua adalah angka panjang target.
Kode GS2 terkadang agak sulit dibaca. :) Inilah beberapa komentar.
sumber
Groovy, 56 byte
Menyalin jawaban Kleyguerth pertama, maka nama variabel yang sama ...
Potong string ke bawah dengan 2 karakter, maka sebagian besar pekerjaan dilakukan oleh regex, ganti tanda hubung atau spasi diikuti oleh sejumlah karakter apa pun yang bukan tanda hubung atau spasi di ujung string dengan tanda "." ATAU ganti karakter apa pun di akhir string jika semua karakter sebelumnya bukan tanda hubung atau spasi dengan tanda ".". Lebih sulit untuk dimasukkan ke dalam kata-kata daripada untuk menulis ...
Sunting: Sebenarnya, cukup hapus bagian string yang cocok dengan regex dan tambahkan "..." di akhir:
sumber
Jelly , 29 byte
Cobalah online!
Program lengkap.
sumber
Bersihkan , 89 byte
Cobalah online!
Sebagai fungsi
$ :: Int String -> String
sumber
C # (Visual C # Interactive Compiler) , 117 byte
Didasarkan pada @ Abba's, yang didasarkan pada jawaban @Salah Alami. Alih-alih menggunakan
Contains
danSubstring
panggilan yang tidak perlu , ia menggunakan IndexOf untuk memeriksa apakah ada tanda hubung atau spasi dalam string terpotong.Cobalah online!
sumber