Orang-orang di situs ini sangat suka memperindah judul posting mereka ...
Stewie's sequence: + * - / + * - /
Namun, ketika judul ini perlu dimasukkan dalam URL halaman, itu disederhanakan:
stewies-sequence
Tantangan
Tugas Anda adalah membuat program atau fungsi yang, mengingat string yang mewakili judul tulisan, menampilkan / mengembalikan konversi "Ramah URL" -nya.
Algoritma adalah:
- Konversikan ke huruf kecil (jika ada)
- Ganti setiap spasi (
), titik (
.
), koma (,
) atau garis miring (/
) dengan tanda hubung (-
) - Hapus karakter non-alfanumerik, kecuali tanda hubung.
- Perkecil grup dengan garis putus-putus yang berdekatan (
a---b -> a-b
), hapus semua yang mengarah / tertinggal.
Harap perhatikan bahwa algoritma ini adalah penyederhanaan, dan mungkin tidak selalu menghasilkan hasil yang sama dengan metode nyata situs.
Aturan
- Anda dapat mengasumsikan input itu:
- Tidak akan kosong
- Akan mengandung setidaknya satu karakter alfanumerik.
- Hanya akan berisi karakter dalam rentang ASCII 32-126 (dapat dicetak)
- Program atau fungsi lengkap diizinkan.
- Sebuah builtin yang melakukan spesifikasi tugas yang sebenarnya adalah tidak diizinkan.
- Ini adalah kode-golf , jadi solusi terpendek (dalam byte) menang!
Uji Kasus
Sebagian besar posting di situs ini akan berfungsi sebagai tes, tetapi berikut daftar praktisnya:
Loading... Forever -> loading-forever
N(e(s(t))) a string -> nest-a-string
"Hello, World!" -> hello-world
URL-Friendly titles -> url-friendly-titles
C.U.S.R.S -> c-u-s-r-s
1+2+3+4+...+n = -1/12? -> 1234-n-1-12
How can I use cmp(a,b) -> how-can-i-use-cmpa-b
Beberapa lagi ...
Export The $PATH Variable, Line-By-Line -> export-the-path-variable-line-by-line
Do n and n^3 have the same set of digits? -> do-n-and-n3-have-the-same-set-of-digits
Quine Anagrams! (Cops' Thread) -> quine-anagrams-cops-thread
The Golfer Adventure - Chapter 1 -> the-golfer-adventure-chapter-1
Bootloader golf: Brainf*** -> bootloader-golf-brainf
Dan beberapa sampel pengecekan tepi (jangan ragu untuk menyarankan lebih):
0123 -> 0123
a a1 -> a-a1
2-1=1 -> 2-11
-
? Apakah mereka harus disingkirkan? Misalnya dalamasdf-
, apakah yang terakhir-
harus dihapus?if(isalphanum(ch))...
_
garis bawah? Kode saya berfungsi kecuali jika ada garis bawah.Jawaban:
Retina,
3331 byte(Program ini memiliki baris tambahan)
Saya tidak yakin bisa memeras lebih banyak dari ini. Ini harus mencakup semuanya. Mirip dengan Mama Fun Roll's. Versi 33 byte lainnya menggunakan regex rekursif
Cobalah online!
Penjelasan
Baris ini sederhana, ini dikonversi ke huruf kecil dengan T ransliterating
A-Z
(L
) menjadia-z
(l
, huruf kecil).Tahap ini sederhana, pada dasarnya menghilangkan semua karakter yang tidak dibutuhkan untuk menyelamatkan diri kita dari banyak masalah di kemudian hari
[^a-z ,-9]
Cocok dengan karakter apa pun yang BUKAN:a-z
: huruf kecil (ingat seluruh string huruf kecil karena item sebelumnya): chacacter luar angkasa
,-9
ini adalah berbagai kode char,
untuk9
yang akan terjadi,-./0123456789
, persis karakter yang kita butuhkanSelanjutnya kita mengonversi semua karakter non alfanumerik menjadi tanda hubung (yang sekarang hanya
dan
,./-
.Ini tidak akan (tidak) cocok dengan
_
yang termasuk dalam\w
(negasi\W
) karena telah dihapus pada tahap sebelumnyasumber
a = b
.a = b
:(JavaScript (ES6),
90827975 byteIni merupakan upaya untuk melakukan pekerjaan dengan satu
replace()
. Kode ini hanya mengekstrak karakter yang kami tertarik dan mengabaikan yang lainnya. Ada beberapa logika tambahan untuk memproses tanda hubung.Uji kasus
Tampilkan cuplikan kode
sumber
,a^a,
, kode ini memberi-aa-
(ada tanda hubung terkemuka / tertinggal)V ,
41, 40, 37, 36 byteCobalah online! atau Periksa semua test case sekaligus!
Seperti biasa, di sini ini berisi banyak karakter yang tidak dapat dicetak dan non-ASCII, jadi di sini ada hexdump:
Ini tantangan seperti ini di mana sistem "Compressed regex" V berguna.
Penjelasan
Hal pertama yang pertama, kami akan mengonversi semuanya menjadi huruf kecil. Untungnya ada cara yang sangat mudah untuk melakukan ini dalam dua byte. Saya menulis tip tentang itu di sini . Jadi kita lakukan
Setelah itu kami melakukan banyak perintah pengganti terkompresi. Gambaran yang bagus tentang bagaimana regex terkompresi V dapat bekerja di sini , tetapi ide dasarnya adalah kita dapat mengatur bit-tinggi untuk menghindari keharusan keluar dari karakter tertentu. Kenyamanan lain adalah rentang (seperti
:%
) dan bendera (seperti/g
) diisi secara otomatis. Tetapi pada akhirnya, itu semua diterjemahkan menjadi perintah pengganti vim. Bahkan, kami bahkan bisa langsung menerjemahkan sisa program ke vim. Itu akan memberi kita ini:Jika Anda berbicara vim-regex, seharusnya lebih jelas apa yang dilakukan oleh sisa program sekarang. Jadi di sini adalah sisa dari program ini:
sumber
JavaScript (ES6) 91
961 byte menyelamatkan thx @ETHproduksi
Uji
sumber
*
di regex terakhir, meskipun saya mungkin salahPython 3,
1031009695 byte5 byte disimpan berkat Flp.Tkc
sumber
Retina, 34 byte
Cobalah online!
Perhatikan baris baru yang tertinggal. Intinya implementasi OP.
sumber
T`L`l
untuk pergi ke huruf kecil dengan lebih sedikit bytea..
snd serupa[\W]
hanya\W
MATL , 38 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Ruby ,
6160616453 byte(52 byte kode plus satu byte untuk
-p
)Cobalah online!
Pembaruan 1:
Menggunakangets
alih-alih mode edit aliran Ruby menghemat satu byte.Dikembalikan sesuai saran ValueInk .
Pembaruan 2: (keseluruhan +3 byte)
..--hi, $/
(→hi
) (+10 byte) - sekali lagi milik ValueInk pengguna-p
(+1 byte)squeeze
dan gunakangsub
sebagai gantinya (+2 byte) , yang memungkinkan saya untuk:strip
untuk menangani strip depan dan belakang (-10 byte) .Pembaruan 3: Hattrick oleh ValueInk. Kami menghemat 11 byte dengan memanfaatkan
String#split
kebiasaan menjalankan pemerasan otomatis pada separator yang sama, yang memungkinkan kami untuk membuang seluruh finalstrip
/gsub
rantai dan menggantinya dengan asplit
/join
combo. (-11 byte)sumber
-p
bendera, tetapi ini jelas tidak akan berhasil.-p
flag secara implisit menambahkan 1 byte ke kode Anda (karena itu mengubah eksekusi kode Anda dariruby -e 'your code'
menjadiruby -pe 'your code'
). Saya juga telah menemukan satu kasus tepi di mana ia memberi-hi-
input seperti..--hi, $/
ketika Anda harus menghapus semua tanda hubung utama / belakang dan dengan demikian akan kembalihi
.gsub(/[^\w ]/){}
menjaditr('^a-z ','')
, dan kemudian diakhiri dengan.split*?-
alih - alih.strip.gsub...
karena secara otomatis menangani duplikat dan ujung-ujung string, semuanya dalam sekali jalan!JavaScript (ES6),
7469 byteSunting: Disimpan 5 byte dengan menyadari bahwa saya telah menghapus semua karakter kecuali
-/,. 0-9a-z
agar saya dapat\w
mencocokkan dengan kata-kata yang tersisa.sumber
[a-z\d]
bisa jadi[^\W_]
?PHP, 87 byte
Ide ekspresi reguler berasal dari jawaban yang ada.
Anda harus memiliki server yang menjalankan PHP, dan akses melalui HTTP.
Judul harus ada di tombol
T
, dan hasilnya akan dicetak di layar.Contoh:
http://localhost/title.php?T=<my shiny title>
sumber
alat bash / Unix, 56 byte
Ganti huruf besar dengan huruf kecil, dan karakter khusus yang diperlukan dengan tanda hubung.
Hapus (-d opsi untuk tr) karakter selain huruf, angka, dan tanda hubung, lalu peras (opsi -s untuk tr) beberapa tanda hubung dalam satu baris ke dalam tanda hubung tunggal.
Hapus tanda hubung di awal, dan kemudian di akhir.
sumber
Powershell, 85 Bytes
membuat huruf kecil, kemudian 3 Menggantikan regex berturut-turut, dan trim setiap membuntuti
-
'ssumber
$input
menghemat 2 byte?JavaScript,
90989493919091 byte1 byte disimpan berkat @ edc65!
1 byte disimpan berkat @IsmaelMiguel karena menemukan titik koma!
1 byte diperoleh setelah gagal untuk
,a-^-a,
Hal yang paling saya sukai tentang pengiriman khusus ini adalah rentangnya. Pada bagian pertama
replace
, kita menghapus segala sesuatu yang tidak alfanumerik dan bukan,
,-
,.
,/
dan tidak spasi. Kami menggunakana-z
untuk mendeteksi huruf-huruf, dan kami menggunakan,-9
untuk mendeteksi karakter dan angka khusus karena kode karakter ASCII literal ini semuanya berbaris!Tampilkan cuplikan kode
sumber
f=
sehingga jumlah byte Anda adalah 96 sekarang. Dan tidak perlu \ di dalam rentang di regexp, jadi itu bisa menjadi 95. Tapi ... masih tidak berfungsi: coba...title
f=
dan;
pada akhirnya. Cukup tentukan bahwa ini adalah fungsi anonim. Dengan ini, jawaban Anda harus sepanjang 90 byte.Lua, 91 byte
Dimana
a
string URL.Penjelasan:
a:lower()
mengembalikan fungsi huruf kecil:gsub
menemukan kecocokan pola dan menggantinya dengan string.'[ .,/]'
: Tanda kurung berarti "atau", jadi ini cocok dengan spasi, titik, koma, dan garis miring. Tidak perlu serakah karena:gsub
tidak semua kejadian.'[^%w-]'
:^
berarti "tidak" ketika di dalam kurung,%w
berarti apa pun alfanumerik. Jadi'[^%w-]
cocok dengan yang tidak alfanumerik atau tanda hubung.'%-+'
: Cocokkan tanda hubung sebanyak yang Anda bisa dan ganti dengan hanya satu tanda hubung.match'%-?(.*)%-?'
: Dalam Lua, jika string adalah satu-satunya argumen fungsi, tidak ada tanda kurung yang diperlukan. Hanya perlu memeriksa satu tanda hubung pada awal dan akhir karena tanda hubung telah diminimalkan. Tidak perlu karakter jangkar karena.*
cocok dengan semuanya, serakah.sumber
C, 194 byte
Telepon dengan:
sumber
SAS, 108
Salah satu jawaban yang kurang kompetitif di sini karena sintaksis verba SAS - hukuman 9 karakter per regex benar-benar menyakitkan - tetapi itu adalah latihan pembelajaran regex yang baik:
sumber
Pyth, 35 byte
Penjelasan
sumber
Perl 6, 75
sumber
GNU Sed, 65 byte
Serangkaian pergantian regex. Menggunakan non-portable
\L
dari GNU sed untuk mengurangi input. Jalankan dari file menggunakansed -f
.sumber