URL Dostu Başlıklar


28

Bu sitedeki insanlar yazılarını süslemeyi çok seviyor ...

Stewie's sequence: + * - / + * - /

Ancak, bu başlığın sayfa URL’sine eklenmesi gerektiğinde, basitleştirilmiştir:

stewies-sequence

Meydan okuma

Göreviniz, bir yazı başlığını temsil eden bir dize verildiğinde, "URL Dostu" dönüşümünü veren / veren bir program veya işlev oluşturmaktır.

Algoritma şudur:

  • Küçük harfe dönüştürün (varsa)
  • Her boşluk ( ), period ( .), virgül ( ,) veya eğik çizgi ( /) bir tire ( -) ile değiştirin
  • Kısa çizgiler hariç alfanümerik olmayan karakterleri kaldırın.
  • Bitişik çizgi gruplarını küçültün ( a---b -> a-b), ilerleyen / izleyenleri kaldırın.

Lütfen bu algoritmanın bir basitleştirme olduğunu ve her zaman sitenin gerçek yöntemiyle aynı sonuçları vermeyebileceğini unutmayın.


kurallar

  • Bu girişi varsayabilirsiniz:
    • Boş olmayacak.
    • En az bir alfasayısal karakter içerecektir.
    • Sadece 32-126 ASCII aralığında karakterler içerecek (yazdırılabilir)
  • Tam program veya işlevlere izin verilir.
  • Kesin görev şartname yapan bir yerleşik olduğu değil izin verdi.
  • Bu , yani en kısa çözüm (bayt cinsinden) kazanır!

Test Kılıfları

Bu sitedeki çoğu gönderi test görevi görür, ancak işte kullanışlı bir liste:

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

Daha uzun olanları ...

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

Bazı kenar kontrol örnekleri ve daha fazlasını önermekten çekinmeyin:

0123   ->   0123
a a1   ->   a-a1
2-1=1  ->   2-11

Peki ya liderler -? Kaldırılmaları gerekecek mi? Örneğin asdf-, sonuncusu -kaldırılacak mı?
Kritixi Lithos,

if(isalphanum(ch))...
Karakterin

1
@KritixiLithos Bitişik çizgi gruplarını küçültün (a --- b -> ab), ilerleyen / izleyenleri kaldırın. Sanırım bu seni netleştirmeli.
Mukul Kumar,

Peki ya _alt çizgi? Kodum alt çizgi olmadığı zamanlar dışında çalışır.
Kritixi Lithos,

@ L3viathan Şimdi önemli değil, kodumu değiştirdim, böylece alt çizgi bile kaldırılacak
Kritixi Lithos

Yanıtlar:


7

Retina, 33 31 bayt

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

\W+
-
^-|-$

(Programın yeni bir hattı var)

Bundan daha fazla sıkabileceğimden emin değilim. Bu her şeyi kapsamalıdır. Mama Fun Roll'unki gibi geldi. Özyinelemeli regexes kullanarak başka bir 33 bayt sürümü

Çevrimiçi deneyin!

açıklama

T`L`l

Bu satır basittir, T ransliterating A-Z( L) ile a-z( l, küçük harf) ile küçük harfe dönüştürülür .


Bu aşama basittir, daha sonra kendimizi daha fazla belaya sokmak için gerekli olmayan karakterlerden kurtulur.

[^a-z ,-9]+

[^a-z ,-9] NOT olmayan herhangi bir karakterle eşleşir:

  • a-z: küçük harfli alfabe (dizginin tamamının önceki öğe nedeniyle küçük harf olduğunu unutmayın)
  • : uzay karakteri
  • ,-9Bunun Char kod aralığı ,için 9olur ki ,-./0123456789, tam ihtiyacımız karakterler

Daha sonra, tüm alfanümerik olmayan karakterleri kısa çizgilere dönüştürelim (şimdi ve sadece ,./-.

\W+
-

Bu , önceki aşamada kaldırıldığı için (olumsuzlama ) _dahil edilen (değil) eşleşme\w\W


Bunun gibi girdiler için başarısız olacağını düşünüyorum a = b.
Martin Ender

Bunu gerçekten kabul etmek istiyorum, ancak a = b
Martin’in

@ Flp.Tkc geç cevap verdiğim için üzgünüm (Şu anda final haftası). İki bayt daha sıkmayı ve düzeltmeyi başardım . Bunun doğru şekilde ele
alındığına

9

JavaScript (ES6), 90 82 79 75 bayt

Bu, işi bir tekli yapma denemesidir replace(). Bu kod yalnızca ilgilendiğimiz karakterleri ayıklar ve diğer her şeyi yok sayar. Tireleri işlemek için ek bir mantık var.

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

Test durumları


1
Çünkü ,a^a,, bu kod -aa-(öncü / izleyen tireler vardır)
Kritixi Lithos 10:16

@KritixiLithos Oh, bunu gösterdiğiniz için teşekkürler. Bu kurala dikkat etmedim. Bu düzeltilmeli.
Arnauld,

9

V , 41, 40, 37 , 36 bayt

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

Çevrimiçi deneyin! veya Tüm test durumlarını bir kerede kontrol edin!

Her zamanki gibi, burada bu, bir sürü yazdırılamaz ve ASCII olmayan karakter içeriyor, işte burada bir 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                                -.-$

V'nin "Sıkıştırılmış regex" sisteminin kullanışlı olduğu bu gibi zorluklar.

açıklama

İlk önce, her şeyi küçük harfe dönüştüreceğiz. Neyse ki bunu iki baytta yapmanın gerçekten uygun bir yolu var. Bu konuda bir ipucu yazdı buraya . Öyleyse yapıyoruz

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

Bundan sonra bir grup sıkıştırılmış yerine koyma komutu yaparız. V'nin sıkıştırılmış regex'inin nasıl çalıştığına dair güzel bir genel bakış burada çok fena olabilir , ancak temel fikir, bazı karakterlerden kaçmak zorunda kalmamak için en yüksek değeri ayarlayabilmemizdir. Diğer bir kolaylık da aralıklar (benzeri :%) ve bayrakların (benzeri /g) otomatik olarak doldurulmasıdır. Fakat sonuçta bunların tümü vim yerine koyma komutlarına çevrilir. Aslında, programın geri kalanını doğrudan vim'e çevirebiliriz. Bu bize şunu verirdi:

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

Eğer vim-regex konuşuyorsanız, programın geri kalanının şimdi ne yaptığı daha açık olmalıdır. Yani burada programın geri kalanı:

Í               " 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 kaydedildi thx @ETHproductions

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

Ölçek

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)
})


Bu, adlandırılmış bir işleve dönüştürülürse, cevabımla tamamen aynı bayt sayısına sahiptir
Kritixi Lithos


Yanılıyor olabilirim, ama bakış açısının gerekli olduğundan emin misin?
Kritixi Lithos 10:16

Dize içinde, başlangıç ve bitiş tüm kaldırılırken - lookahead @KritixiLithos en az 1 tutmak için gereklidir
edc65

@ETHproductions hak, teşekkürler
edc65 10:16

4

Python 3, 103 100 96 95 bayt

Flp.Tkc sayesinde 5 bayt kaydedildi

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

@ Flp.Tkc Gerçekten ..
L3viathan

Hata! Yanlışlıkla bunu reddetmiştim. Bu
yazıyı

@KritixiLithos Bitti
L3viathan


3

MATL , 38 bayt

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

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

'-'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 bayt

(52 bayt kod artı bir bayt -p)

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

Çevrimiçi deneyin!

tr()- büyük harf karakterleri, boşluk, virgül, nokta ve eğri çizgiyi dönüştür Daha sonra -kullanabilmem için geçici olarak boşlukla değiştirin strip.
İfadedeki -karakterin "A-Z ,-/"aslında bir aralık işleci olduğunu unutmayın; bu da .karakteri dönüşüme tabi tutar. Bu manevra aslında baytları tıraş etmeyecek ancak kalması için süslü.

gsub(/[^\w ]/){} - izin verilen sette olmayan tüm karakterleri kaldırın.

split- teknik olarak, bu diziye tam olarak ihtiyacımız yok, ancak splitönde gelen ve sondaki boşlukları (aslında -gizlenmiş karakterler olan) ortadan kaldırıyoruz . Bir bonus olarak, bu, birden fazla alanın bir araya getirilmesini sağlar.

*?-- için steno .join("-"); bu hem önceki splitişlemi hem de beyaz boşluk dönüşümünü aynı anda tersine çevirir . Programın Ruby 1.9 veya daha yeni bir sürüm gerektirmesini sağlayan karakter hazırlayıcıları için kısaltılmış gösterim kullanılarak bir bayt daha kaydedilir .

Güncelleme 1: Ruby'nin akış düzenleme modunu kullanmak getsbir bayttan tasarruf sağlar.
ValueInk'in önerisine göre geri döndü .

Güncelleme 2: (Genel olarak +3 bayt)

  • Sabit kenar durum ..--hi, $/(→ hi) (+10 bytes) - bir kez daha kullanıcı ValueInk izniyle
  • (1 bayt) için malus aldı-p
  • Kurtulduk squeezeve kullanılan gsubyerine (2 bayt) , hangi bana izin:
  • stripBaştaki ve sondaki çizgi (-10 bayt) işlemek için kullanın .

Güncelleme 3: ValueInk tarafından Hattrick. String#splitAynı ayırıcıdaki otomatik sıkma pistlerinden yararlanma alışkanlığından yararlanarak 11 byte tasarruf sağlarız , bu da tüm final strip/ gsubzinciri kesip a split/ joincombo ile değiştirmemizi sağlar . (-11 bayt)


Bu yalnızca diziyi bir REPL ortamında döndürür ve uygun bir Ruby programı olarak çalıştırılırsa başarısız olur ve bu iyi olmaz. Sadece tam programlar veya fonksiyonlar / lambdalar. Aslında, eski sürümünüz -pbayrakla çalışırdı , ama bu kesinlikle olmayacak.
Value Ink

@ValueInk Elbette haklısın. Çözümümü buna göre değiştirdim. Yorumun için teşekkürler; Bu benim ilk golf denemem olduğu için çok takdir ettiğim bir rehber.
Synoli,

1
Düzeltmeyi yaptığınız için teşekkür ederiz; Oyumu kaldırdım. Unutulmaması gereken bir şey, -pbayrak kullanmanın kodunuza 1 bayt eklemesidir (çünkü kod yürütmenizi 'den' ruby -e 'your code'ye değiştirir ruby -pe 'your code'). Ayrıca, tüm ana / sondaki çizgileri kaldırmanız ve böylece geri dönmeniz gerektiği -hi-gibi girdi için verilmiş bir kenar çantası buldum . ..--hi, $/hi
Değerli Mürekkep

2
-2 değiştirerek bayt gsub(/[^\w ]/){}için tr('^a-z ','')ve sonra ile sona .split*?-yerine .strip.gsub...otomatik çiftleri kolları yana ve tek seferde tüm dize uçlarını!
Value Ink

1
Kimse söylemediğinden, kod golfüne hoş geldiniz!
FlipTack

3

JavaScript (ES6), 74 69 bayt

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>

Düzenleme: Kalan sözcükleri eşleştirmek için -/,. 0-9a-zkullanabilmem dışında tüm karakterleri zaten sildiğimi fark ederek 5 bayt kaydedildi \w.


Bence sorunu çözmek için kullanıldığından HTML kodunu bayt sayısına dahil etmeniz gerektiğini düşünüyorum
Kritixi Lithos 11:16

1
@KritixiLithos Hayır, sadece tanıtım amaçlıdır. Soru, kodumun en az bir alfanümerik karakter alabileceğini ve HTML kodunun işlevi çağırmadan önce bunu test ettiğini söylüyor.
Neil

[a-z\d]olabilir [^\W_]mi?
edc65

@ edc65 Güzel, ama o zaman daha da basit olabileceğini anladım!
Neil

2

PHP, 87 bayt

Düzenli ifadeler fikri, mevcut cevaplardan gelir.

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

PHP çalıştıran bir sunucunuzun olmasını ve HTTP üzerinden erişmenizi gerektirir.

Başlık anahtarda olmalıdır Tve sonuç ekranda yazdırılacaktır.

Örnek: http://localhost/title.php?T=<my shiny title>


2

bash / Unix araçları, 56 bayt

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

Büyük harfleri küçük harflerle ve gereken özel karakterleri kısa çizgilerle değiştirin.

Harfler, rakamlar ve kısa çizgiler dışındaki karakterleri (-d seçeneği tr) silin ve ardından bir satırdaki birden çok satırı tek bir çizgi halinde sıkın (-s seçeneği tr).

Önce çizgileri, sonra sonunda çizgileri silin.


2

Powershell, 85 Bayt

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

üst üste daha sonra 3 normal ifade yerine geçer, küçük harf yapmak ve bir arka Döşeme -'s


olmayabilir $inputsize 2 bayt kaydetmek?
Britanyalı

2

JavaScript, 90 98 94 93 91 90 91 bayt

@ Edc65 sayesinde 1 bayt kurtarıldı!

Önde gelen yarı-kolonu tespit etmek için @ IsmaelMiguel sayesinde 1 bayt kurtarıldı!

Başarısız olduktan sonra 1 bayt kazanıldı ,a-^-a,

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

Bu belirli gönderim hakkında en çok sevdiğim şey aralıklar. Birincisinde replace, biz alfanümerik ve bir değil bir şey kaldırmak ,, -, ., /ve bir alan. Biz kullanan a-zharfleri tespit etmek için, kullandığımız ,-9bu özel karakterleri algılamak ve bu ASCII değişmezleri tüm çizgi yukarı karakter kodları beri sayıları!

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


Baştaki çizgileri kaldırmaz: "-1", "1" olduğunda "-1" olur.
L3viathan

@ L3viathan Şimdi çalışmalı
Kritixi Lithos

Saymaya gerek yok, f=bu yüzden bayt sayınız şu an 96. Deneyin: Ve bir aralığın içinde \ gerek Hala çalışmıyorsa ... 95. olmak Ama olabilir regexp içinde, bu yüzden...title
edc65

1
Hei! Ben o kadar yaşlı değilim ! (65, 64 değil)
edc65

1
Sonunda f=ve ihtiyacın olmadığına inanıyorum ;. Sadece bunun adsız bir işlev olduğunu belirtin. Bununla cevabınız 90 bayt uzunluğunda olmalı.
Ismael Miguel,

1

Lua, 91 bayt

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

aURL dizesi nerede ?

Açıklama:

  • Çoğu oldukça ileri düz. a:lower()küçük harf işlevini döndürür
  • :gsub Desenin eşleşmesini bulur ve dizeyle değiştirir.
  • '[ .,/]': Köşeli parantezler "veya" anlamına gelir, bu nedenle boşluk, nokta, virgül ve eğik çizgiyle eşleşir. Açgözlü olmanıza gerek yok çünkü :gsubher şey var.
  • '[^%w-]': ^köşeli parantez içindeki "değil" %wanlamına gelir , alfasayısal olan herhangi bir şey anlamına gelir. Yani alfanümerik olmayan bir çizgi veya çizgi ile '[^%w-]eşleşir .
  • '%-+': Mümkün olduğu kadar fazla çizgi ile eşleştirin ve sadece bir çizgi ile değiştirin.
  • match'%-?(.*)%-?': Lua'da, bir dize işlevin tek argümanı ise, parantez gerekmez. Çizgiler zaten simge durumuna küçültülmüş olduğundan yalnızca başlangıçta ve sonunda bir çizgiyi denetlemesi gerekir. Bağlantı karakterlerine gerek yok çünkü .*her şey eşleşiyor, açgözlü.

1

C, 194 bayt

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);}

İle ara:

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

1

SAS, 108

Buradaki daha az rekabetçi cevaplardan biri, SAS'ın ayrıntılı sözdizimi nedeniyle - regex başına 9 karakter cezası gerçekten acıtıyor - ama iyi bir regex öğrenme alıştırmasıydı:

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

1

Pyth, 35 bayt

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

açıklama

    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 bayt

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

Bir dizi regex ikamesi. \LGiriş küçük harf yapmak için GNU sed'den taşınabilir olmayan kullanır . Kullanarak bir dosyadan çalıştırın sed -f.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.