Judul Ramah URL


28

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 , 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

Bagaimana dengan memimpin -? Apakah mereka harus disingkirkan? Misalnya dalam asdf-, apakah yang terakhir -harus dihapus?
Kritixi Lithos

Bisakah kita menggunakan fungsi bawaan untuk memeriksa apakah char itu alfanumerik seperti iniif(isalphanum(ch))...
Mukul Kumar

1
@KritixiLithos Perkecil grup-grup dari garis putus-putus yang berdekatan (a --- b -> ab), hapus semua yang mengarah / tertinggal. Saya kira ini harus membuat Anda jelas.
Mukul Kumar

Dan bagaimana dengan _garis bawah? Kode saya berfungsi kecuali jika ada garis bawah.
Kritixi Lithos

@ L3viathan Tidak masalah sekarang, saya mengubah kode saya sehingga bahkan garis bawah akan dihapus
Kritixi Lithos

Jawaban:


7

Retina, 33 31 byte

T`L`l
[^a-z ,-9]+

\W+
-
^-|-$

(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

T`L`l

Baris ini sederhana, ini dikonversi ke huruf kecil dengan T ransliterating A-Z( L) menjadi a-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]+

[^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
  • ,-9ini adalah berbagai kode char ,untuk 9yang akan terjadi ,-./0123456789, persis karakter yang kita butuhkan

Selanjutnya kita mengonversi semua karakter non alfanumerik menjadi tanda hubung (yang sekarang hanya dan ,./-.

\W+
-

Ini tidak akan (tidak) cocok dengan _yang termasuk dalam \w(negasi \W) karena telah dihapus pada tahap sebelumnya


Saya pikir ini akan gagal untuk input seperti a = b.
Martin Ender

Saya benar-benar ingin menerima ini, tetapi seperti kata martin, itu tidak mengurangi tanda garis yang berdekatan ketika Anda memasukkan a = b:(
FlipTack

@ Flp.Tkc maaf atas keterlambatan respons (Final minggu sekarang). Saya telah berhasil memeras dua byte lagi dan memperbaikinya. Saya percaya ini benar menangani kasus-kasus seperti sekarang
Downgoat

9

JavaScript (ES6), 90 82 79 75 byte

Ini 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.

s=>(s.toLowerCase().replace(/[ a-z,-9]/g,c=>S=c<'0'?s+'-':s=s?S+c:c,s=0),s)

Uji kasus


1
Sebab ,a^a,, kode ini memberi -aa-(ada tanda hubung terkemuka / tertinggal)
Kritixi Lithos

@ KritixiLithos Oh, terima kasih telah menunjukkan ini. Saya tidak memperhatikan aturan itu. Itu harus diperbaiki.
Arnauld

9

V , 41, 40, 37 , 36 byte

VuÍ[ .,\/]/-
Í0-9a-z­]
Í-«/-
Í^-ü-$

Cobalah 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:

0000000: 5675 cd5b 202e 2c5c 2f5d 2f2d 0acd 8430  Vu.[ .,\/]/-...0
0000010: 2d39 612d 7aad 5d0a cd2d ab2f 2d0a cd5e  -9a-z.]..-./-..^
0000020: 2dfc 2d24                                -.-$

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

V           " Visually select this whole line
 u          " Convert this whole line to lowercase

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:

:%s/[ .,/]/-/g
:%s/[^0-9a-z\-]//g
:%s/-\+/-
:%s/^-\|-$//g

Jika Anda berbicara vim-regex, seharusnya lebih jelas apa yang dilakukan oleh sisa program sekarang. Jadi di sini adalah sisa dari program ini:

Í               " Substitute:
 [ .,\/]        "   a space, period, comma or forward slash. (Due to a strange bug, this needs to be escaped)
        /-      "   with a dash
Í               " Remove:
 [^0-9a-z­]     "   Any character that is not a dash or alpha-numeric
Í               " Substitute:
 -«             "   One or more dashes
   /-           "   with one dash
Í               " Remove:
 ^-             "   A dash at the beginning of a line
   ü            "   OR
    -$          "   a dash at the end of a line

8

JavaScript (ES6) 91 96

1 byte menyelamatkan thx @ETHproduksi

s=>s.toLowerCase().replace(/([ .,/-])|\W|_/g,(c,d)=>d?'-':'').replace(/^-*|-*$|-(?=-)/g,'')

Uji

F=
s=>s.toLowerCase().replace(/([ .,/-])|\W|_/g,(c,d)=>d?'-':'').replace(/^-*|-*$|-(?=-)/g,'')

;[['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'],
['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'],
['0123', '0123'],
['a a1', 'a-a1'],
['2-1=1', '2-11']]
.forEach(t=>{
  var i=t[0],k=t[1],r=F(i)
  console.log(r==k?'OK':'KO',i+' -> '+r,r==k?'':k)
})


Ini memiliki bytecount yang sama persis dengan jawaban saya jika dikonversi ke fungsi bernama
Kritixi Lithos

Jangan berpikir Anda membutuhkan yang terakhir *di regex terakhir, meskipun saya mungkin salah
ETHproduksi

Saya mungkin salah, tetapi apakah Anda yakin lookahead diperlukan?
Kritixi Lithos

@KritixiLithos lookahead diperlukan untuk menjaga setidaknya 1 - di dalam string, sambil menghapus semua pada awal dan akhir
edc65

@ EHProduk benar, terima kasih
edc65

4

Python 3, 103 100 96 95 byte

5 byte disimpan berkat Flp.Tkc

import re
lambda s,y=re.sub,d='-':y('-+',d,y('[^0-9a-z-]','',y('[ .,/]',d,s.lower()))).strip(d)

@ Flp.Tkc Memang ..
L3viathan

Ups, saya tidak sengaja menurunkan ini. Saya tidak dapat membalikkan suara saya sampai Anda mengedit posting ini
Kritixi Lithos

@KritixiLithos Done
L3viathan


3

MATL , 38 byte

'-'jyvk45y' .,/'m(t8Y245hm)'-*'45YX6L)

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

'-'jyv       % Take input line. Append and prepend a dash. Gives a char column vector
k            % Convert to lowercase
45y' .,/'m(  % Replace any of ' .,/' by a dash, using assignment indexing
t8Y245hm)    % Keep only alphanumeric chars or dashes, using reference indexing
'-*'45YX     % Replace each run of dashes by a single dash, using a regular expression
6L)          % Remove first and last chars, which are always dashes. Implicitly display

3

Ruby , 61 60 61 64 53 byte

(52 byte kode plus satu byte untuk -p)

$_=$_.tr("A-Z ,-/","a-z ").gsub(/[^\w ]/){}.split*?-

Cobalah online!

tr(... )- mengonversi karakter huruf besar, spasi, koma, titik, dan garis miring. Ganti sementara -dengan spasi putih sehingga saya bisa menggunakan stripnanti.
Perhatikan bahwa -karakter dalam "A-Z ,-/"ekspresi sebenarnya adalah operator jangkauan, yang juga membuat .karakter dapat berubah. Manuver ini tidak akan benar-benar mengurangi byte tetapi sangat bagus sehingga bisa bertahan.

gsub(/[^\w ]/){} - hapus semua karakter yang tidak ada dalam set yang diizinkan.

split- secara teknis, kita tidak benar-benar membutuhkan array itu tetapi splitmenghilangkan spasi spasi awal dan akhir (yang sebenarnya adalah -karakter yang menyamar). Sebagai bonus, ini diperas bersama berjalan dari beberapa ruang.

*?- - Singkatan untuk .join("-") ; ini membalikkan splitoperasi sebelumnya dan transformasi spasi putih pada saat yang sama. Satu byte lagi disimpan dengan menggunakan notasi singkatan untuk literal karakter , yang membuat program membutuhkan Ruby 1.9 atau lebih baru.

Pembaruan 1: Menggunakan getsalih-alih mode edit aliran Ruby menghemat satu byte.
Dikembalikan sesuai saran ValueInk .

Pembaruan 2: (keseluruhan +3 byte)

  • Memperbaiki kasing tepi ..--hi, $/ (→ hi) (+10 byte) - sekali lagi milik ValueInk pengguna
  • Mengambil malus untuk -p (+1 byte)
  • Singkirkan squeeze dan gunakan gsubsebagai gantinya (+2 byte) , yang memungkinkan saya untuk:
  • Menggunakan strip untuk menangani strip depan dan belakang (-10 byte) .

Pembaruan 3: Hattrick oleh ValueInk. Kami menghemat 11 byte dengan memanfaatkan String#splitkebiasaan menjalankan pemerasan otomatis pada separator yang sama, yang memungkinkan kami untuk membuang seluruh final strip/ gsubrantai dan menggantinya dengan a split/ joincombo. (-11 byte)


Ini hanya mengembalikan string dalam lingkungan REPL dan gagal jika dijalankan sebagai program Ruby yang tepat, dan itu tidak baik. Program lengkap atau fungsi / lambdas saja. Sebenarnya, versi lama Anda akan bekerja dengan -pbendera, tetapi ini jelas tidak akan berhasil.
Nilai Tinta

@ ValueInk Anda tentu saja benar. Saya telah mengubah solusi saya sesuai dengan itu. Terima kasih atas komentar Anda; ini adalah jenis bimbingan yang sangat saya hargai karena ini adalah upaya pertama saya bermain golf.
Synoli

1
Terima kasih telah melakukan perbaikan; Saya telah menghapus downvote saya. Satu hal yang perlu diperhatikan adalah bahwa menggunakan -pflag secara implisit menambahkan 1 byte ke kode Anda (karena itu mengubah eksekusi kode Anda dari ruby -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 kembali hi.
Nilai Tinta

2
-2 byte dengan mengubah gsub(/[^\w ]/){}menjadi tr('^a-z ',''), dan kemudian diakhiri dengan .split*?-alih - alih .strip.gsub...karena secara otomatis menangani duplikat dan ujung-ujung string, semuanya dalam sekali jalan!
Nilai Tinta

1
Karena tidak ada yang mengatakannya, selamat datang di golf kode!
FlipTack

3

JavaScript (ES6), 74 69 byte

f=
s=>s.toLowerCase().replace(/[^-/,. a-z\d]/g,``).match(/\w+/g).join`-`
<input oninput=o.textContent=/[a-z\d]/i.test(this.value)?f(this.value):``><pre id=o>

Sunting: Disimpan 5 byte dengan menyadari bahwa saya telah menghapus semua karakter kecuali -/,. 0-9a-zagar saya dapat \wmencocokkan dengan kata-kata yang tersisa.


Saya pikir Anda harus memasukkan kode HTML ke dalam bytecount karena sedang digunakan untuk menyelesaikan tantangan
Kritixi Lithos

1
@KritixiLithos Tidak, itu hanya ada untuk tujuan demonstrasi. Pertanyaannya mengatakan bahwa kode saya dapat mengasumsikan setidaknya satu karakter alfanumerik, dan kode HTML hanya menguji ini sebelum memanggil fungsi.
Neil

[a-z\d]bisa jadi [^\W_]?
edc65

@ edc65 Bagus, tetapi saya kemudian menyadari bahwa itu bisa lebih sederhana!
Neil

2

PHP, 87 byte

Ide ekspresi reguler berasal dari jawaban yang ada.

<?=trim(preg_replace(['@[^ a-z,-9]@','@[ ,-/]+@'],['','-'],strtolower($_GET[T])),'-');

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>


2

alat bash / Unix, 56 byte

tr A-Z\ .,/ a-z-|tr -cds a-z0-9- -|sed s/^-//|sed s/-$//

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.


2

Powershell, 85 Bytes

($args[0].ToLower()-replace'[ .,/]','-'-replace'[^a-z,-9]'-replace'-+','-').Trim('-')

membuat huruf kecil, kemudian 3 Menggantikan regex berturut-turut, dan trim setiap membuntuti -'s


mungkin tidak $inputmenghemat 2 byte?
briantis

2

JavaScript, 90 98 94 93 91 90 91 byte

1 byte disimpan berkat @ edc65!

1 byte disimpan berkat @IsmaelMiguel karena menemukan titik koma!

1 byte diperoleh setelah gagal untuk ,a-^-a,

f=s=>s.toLowerCase().replace(/[^ a-z,-9]/g,"").replace(/[ ,-/]+/g,"-").replace(/^-|-$/g,"")

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 menggunakan a-zuntuk mendeteksi huruf-huruf, dan kami menggunakan ,-9untuk mendeteksi karakter dan angka khusus karena kode karakter ASCII literal ini semuanya berbaris!

, = 44
- = 45
. = 46
/ = 47
0 = 48
...
9 = 57


Tidak menghapus tanda hubung utama: "-1" menjadi "-1", padahal seharusnya menjadi "1".
L3viathan

@ L3viathan Harusnya bekerja sekarang
Kritixi Lithos

Tidak perlu menghitung 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
edc65

1
Hai! Saya tidak bahwa tua! (65 bukan 64)
edc65

1
Saya percaya Anda tidak membutuhkan f=dan ;pada akhirnya. Cukup tentukan bahwa ini adalah fungsi anonim. Dengan ini, jawaban Anda harus sepanjang 90 byte.
Ismael Miguel

1

Lua, 91 byte

a=a:lower():gsub( '[ .,/]', '-' ):gsub( '[^%w-]', '' ):gsub( '%-+', '-' ):match'%-?(.*)%-?'

Dimana a string URL.

Penjelasan:

  • Sebagian besar cukup lurus ke depan. 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, %wberarti 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.

1

C, 194 byte

i,j;f(char*s,char*d){if(*s>47&*s<58|*s>96&*s<123)d[i++]=*s;if(*s>64&*s<91)d[i++]=*s+32;if(i-j&&*s>43&*s<48|*s==32&&*(s+1)&&*(s+1)>47|(*(s+1)<44&&*(s+1)^32)){d[i++]=45;j=i;}*++s?f(s,d):(d[i]=0);}

Telepon dengan:

int main()
{
    char *in="Loading... Forever";
    char out[128];
    f(in,out);
    puts(out);
}

1

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:

t=prxchange('s/^-|-$//',-1,prxchange('s/-+/-/',-1,compress(translate(lowcase(t),'----',' .,/'),'-','adk')));

1

Pyth, 35 byte

:r::rQ0"[-.,/]"d"[^\w ]"k6"[ -]+"\-

Penjelasan

    rQ0                              Convert letters to lower case
   :   "[-.,/]"d                     Replace all -.,/ with spaces
  :             "[^\w ]"k            Remove all remaining symbols
 r                       6           Remove leading and trailing spaces
:                         "[ -]+"\-  Turn runs of spaces and dashes to one dash

1

Perl 6, 75

{lc .subst(/<[\ .,/]>/,"-"):g.subst(/<[\W]-[\-]>/,""):g.subst(/\-+/,"-"):g}

0

GNU Sed, 65 byte

s/.*/\L\0/
s@[ .,/]@-@g
s/[^-a-z0-9]//g
s/-\+/-/g
s/^-\|-$//g

Serangkaian pergantian regex. Menggunakan non-portable \Ldari GNU sed untuk mengurangi input. Jalankan dari file menggunakan sed -f.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.