ชื่อเรื่องที่เป็นมิตรกับ URL


28

ผู้คนในไซต์นี้ชอบที่จะตกแต่งชื่อโพสต์ของตน ...

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

อย่างไรก็ตามเมื่อชื่อเรื่องนี้จะต้องรวมอยู่ใน URL ของหน้ามันจะง่ายขึ้น:

stewies-sequence

ความท้าทาย

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่ให้สตริงที่เป็นตัวแทนของชื่อโพสต์เอาท์พุท / ส่งกลับการแปลง "เป็นมิตรกับ URL"

อัลกอริทึมคือ:

  • แปลงเป็นตัวพิมพ์เล็ก (ถ้ามี)
  • แทนที่ทุกช่องว่าง ( ), จุด ( .), เครื่องหมายจุลภาค ( ,) หรือเครื่องหมายทับ ( /) ด้วยเส้นประ ( -)
  • ลบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขยกเว้นเครื่องหมายขีดกลาง
  • ลดขนาดกลุ่มของเครื่องหมายขีดคั่นที่อยู่ติดกัน ( a---b -> a-b) ลบสิ่งที่นำหน้า / ต่อท้าย

โปรดทราบว่าอัลกอริทึมนี้เป็นการทำให้เข้าใจง่ายและอาจไม่ให้ผลลัพธ์ที่เหมือนกันกับวิธีการที่แท้จริงของเว็บไซต์


กฎระเบียบ

  • คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูล:
    • จะไม่ว่างเปล่า
    • จะมีตัวอักษรและตัวเลขอย่างน้อยหนึ่งตัว
    • จะประกอบด้วยอักขระในช่วง ASCII 32-126 เท่านั้น (สามารถพิมพ์ได้)
  • อนุญาตให้ใช้โปรแกรมหรือฟังก์ชั่นแบบเต็ม
  • บิวด์อินที่ไม่อนุญาตให้ใช้ข้อกำหนดคุณสมบัติที่แน่นอน
  • นี่คือดังนั้นทางออกที่สั้นที่สุด (เป็นไบต์) ชนะ!

กรณีทดสอบ

โพสต์ส่วนใหญ่ในเว็บไซต์นี้จะทำหน้าที่เป็นแบบทดสอบ แต่นี่เป็นรายการที่มีประโยชน์:

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

แล้วผู้นำ-ล่ะ? พวกเขาจะต้องถูกลบออก? ยกตัวอย่างเช่นในasdf-คนสุดท้าย-จะต้องถูกลบออก?
Kritixi Lithos

เราสามารถใช้ฟังก์ชั่นในตัวเพื่อตรวจสอบว่าถ่านเป็นตัวอักษรและตัวเลขเช่นนี้หรือไม่if(isalphanum(ch))...
Mukul Kumar

1
@KritixiLithos ลดขนาดกลุ่มของเครื่องหมายขีดคั่นที่อยู่ติดกัน (a --- b -> ab) ลบสิ่งที่นำหน้า / ต่อท้าย ฉันเดาว่าสิ่งนี้จะทำให้คุณชัดเจน
Mukul Kumar

และสิ่งที่เกี่ยวกับ_ขีดล่าง? รหัสของฉันทำงานได้ยกเว้นเมื่อมีขีดล่าง
Kritixi Lithos

@ L3viathan ไม่สำคัญตอนนี้ฉันเปลี่ยนรหัสของฉันเพื่อไม่ให้ขีดเส้นใต้ถูกลบออก
Kritixi Lithos

คำตอบ:


7

เรติน่า, 33 31 ไบต์

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

\W+
-
^-|-$

(โปรแกรมมีบรรทัดใหม่ต่อท้าย)

ฉันไม่แน่ใจว่าฉันสามารถบีบเพิ่มเติมจากนี้ ควรครอบคลุมทุกอย่าง มาคล้ายกับ Mama Fun Roll's อีก 33 ไบต์รุ่นโดยใช้ regexes ซ้ำ

ลองออนไลน์!

คำอธิบาย

T`L`l

บรรทัดนี้ง่ายมันแปลงเป็นตัวพิมพ์เล็กโดยT ransliterating A-Z( L) ถึงa-z( l, ตัวพิมพ์เล็ก)


ขั้นตอนนี้ง่ายมากโดยการกำจัดตัวละครที่ไม่จำเป็นออกไปเพื่อช่วยตัวเองให้เดือดร้อนในภายหลัง

[^a-z ,-9]+

[^a-z ,-9] ตรงกับตัวละครที่ไม่ใช่:

  • a-z: ตัวอักษรตัวเล็ก (จำได้ว่าสตริงทั้งหมดเป็นตัวพิมพ์เล็กเนื่องจากรายการก่อนหน้า)
  • : space chacacter
  • ,-9นี่เป็นช่วงรหัสถ่านของ,การ9ที่เกิดขึ้นจะ,-./0123456789ว่าตัวละครที่เราต้องการ

ต่อไปเราจะแปลงตัวอักษรและตัวเลขทั้งหมดไม่ใช่ขีดกลาง (ซึ่งขณะนี้เป็นเพียงและ,./-

\W+
-

การจับคู่นี้จะไม่ (ไม่) _ที่รวมอยู่ใน\w(การปฏิเสธ\W) เนื่องจากถูกลบในขั้นตอนก่อนหน้า


a = bผมคิดว่านี่จะล้มเหลวสำหรับปัจจัยการผลิตเช่น
Martin Ender

ฉันต้องการที่จะยอมรับสิ่งนี้ แต่อย่างที่มาร์ตินพูดมันไม่ได้ทำให้ขีดคั่นที่อยู่ติดกันลดลงเมื่อคุณป้อนa = b:(
FlipTack

@ Flp.Tkc ขออภัยสำหรับการตอบกลับล่าช้า (รอบชิงชนะเลิศตอนนี้) ฉันจัดการเพื่อบีบออกอีกสองไบต์และแก้ไข ฉันเชื่อว่ากรณีนี้จัดการกรณีเช่นนี้ได้อย่างถูกต้องตอนนี้
Downgoat

9

JavaScript (ES6), 90 82 79 75 ไบต์

replace()นี่คือความพยายามที่จะทำผลงานได้มีเพียงหนึ่งเดียว รหัสนี้แยกเฉพาะตัวละครที่เราสนใจและไม่สนใจทุกอย่าง มีตรรกะเพิ่มเติมบางอย่างในการประมวลผลยัติภังค์

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

กรณีทดสอบ


1
สำหรับ,a^a,รหัสนี้จะช่วยให้-aa-(มีชั้นนำ / ยัติภังค์ท้าย)
Kritixi Lithos

@KritixiLithos โอ้ขอบคุณที่ชี้ให้เห็น ฉันไม่ได้ใส่ใจกับกฎนั้น ที่ควรได้รับการแก้ไข
Arnauld

9

V , 41, 40, 37 , 36 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียว!

ตามปกติแล้วที่นี่จะมีกลุ่มของอักขระที่ไม่สามารถพิมพ์ได้และไม่ใช่ ASCII ดังนั้นนี่คือ 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                                -.-$

มันเป็นความท้าทายเช่นนี้ที่ระบบ "Compressed regex" ของ V มีประโยชน์

คำอธิบาย

ก่อนอื่นเราจะแปลงทุกอย่างให้เป็นตัวพิมพ์เล็ก โชคดีที่มีวิธีที่สะดวกมากในการทำสองไบต์ ผมเขียนเคล็ดลับเกี่ยวกับที่นี่ ดังนั้นเราทำ

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

หลังจากนั้นเราทำการบีบอัดคำสั่งแทนที่ ภาพรวมที่ดีเกี่ยวกับวิธีการทำงานของ regex ที่บีบอัดของ V ที่นี่สามารถใช้ได้ที่นี่แต่แนวคิดพื้นฐานคือเราสามารถตั้งค่าบิตสูงเพื่อหลีกเลี่ยงการหลีกเลี่ยงอักขระบางตัว สิ่งอำนวยความสะดวกอีกอย่างหนึ่งก็คือช่วง (ชอบ:%) และธง (เหมือน/g) จะถูกเติมโดยอัตโนมัติ แต่ในท้ายที่สุดแล้วมันแปลเป็นคำสั่งแทนที่เป็นกลุ่ม ในความเป็นจริงเราสามารถแปลโปรแกรมที่เหลือให้เป็นกลุ่มได้โดยตรง ที่จะให้สิ่งนี้กับเรา:

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

หากคุณพูด vim-regex มันควรจะชัดเจนยิ่งขึ้นว่าโปรแกรมที่เหลือทำอะไร ดังนั้นนี่คือส่วนที่เหลือของโปรแกรม:

Í               " 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 ไบต์ขอบคุณ @ETHproductions

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

ทดสอบ

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


นี่เป็นจำนวนเงินเดียวกันกับคำตอบของฉันถ้ามันถูกแปลงเป็นฟังก์ชั่นที่มีชื่อ
Kritixi Lithos

อย่าคิดว่าคุณต้องการสุดท้าย*ใน regex ล่าสุดแม้ว่าฉันอาจจะผิด
ETHproductions

ฉันอาจจะเข้าใจผิด แต่คุณแน่ใจหรือไม่ว่า lookahead จำเป็น?
Kritixi Lithos

@KritixiLithos ต้องใช้ lookahead เพื่อเก็บอย่างน้อย 1 - ภายในสตริงในขณะที่ลบทั้งหมดที่จุดเริ่มต้นและสิ้นสุด
edc65

@ETHproductions ใช่แล้วขอบคุณ
edc65

4

Python 3, 103 100 96 95 ไบต์

บันทึก 5 ไบต์ด้วย Flp.Tkc

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

@ Flp.Tkc แน่นอน ..
L3viathan

โอ๊ะโอฉันลงคะแนนสิ่งนี้โดยไม่ตั้งใจ ฉันไม่สามารถย้อนกลับการลงคะแนนของฉันจนกว่าคุณจะแก้ไขโพสต์นี้
Kritixi Lithos

@KritixiLithos Done
L3viathan

4

เรติน่า 34 ไบต์

T`L`l
[^ az \ d., / -] +

\ W +
-
^ - | - $

ลองออนไลน์!

หมายเหตุบรรทัดใหม่ต่อท้าย การใช้งาน OP เป็นหลัก


ลิงก์ TIO ชี้ไปที่รหัสที่ต่างกันเล็กน้อย
Kritixi Lithos

ใช่ฉันแค่แก้ไขมัน
Mama Fun Roll

1
คุณสามารถใช้T`L`lเพื่อไปที่ตัวพิมพ์เล็กที่มีไบต์น้อยลง
Downgoat

ล้มเหลวในรูปแบบa..snd ที่คล้ายกัน
Downgoat

2
[\W]เป็นเพียง\W
Martin Ender

3

MATL , 38 ไบต์

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

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

'-'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 ไบต์

(รหัส 52 ไบต์บวกหนึ่งไบต์สำหรับ-p)

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

ลองออนไลน์!

tr()- แปลงอักขระตัวพิมพ์ใหญ่ช่องว่างเครื่องหมายจุลภาคมหัพภาคและเครื่องหมายทับ แทนที่-ด้วยช่องว่างชั่วคราวเพื่อให้ฉันสามารถใช้ในstripภายหลังได้
โปรดสังเกตว่า-อักขระใน"A-Z ,-/"นิพจน์เป็นจริงตัวดำเนินการช่วงซึ่งยังทำให้.ตัวละครภายใต้การแปลง การซ้อมรบนี้จะไม่ทำการปัดจำนวนไบต์ออกไปจริง ๆ แต่มันก็เป็นเรื่องแฟนซี

gsub(/[^\w ]/){} - ลบอักขระทั้งหมดที่ไม่อยู่ในชุดที่อนุญาต

split- ในทางเทคนิคเราไม่ต้องการอาร์เรย์นั้น แต่splitกำจัดช่องว่างนำหน้าและต่อท้าย (ซึ่งจริงๆแล้วเป็น-ตัวละครที่ปลอมตัว) เป็นโบนัสการบีบนี้จะเป็นการรวมกันของหลาย ๆ ช่องว่าง

*?-- ชวเลขสำหรับ.join("-"); สิ่งนี้ย้อนกลับทั้งการsplitดำเนินการก่อนหน้านี้และการแปลงช่องว่างในเวลาเดียวกัน อีกหนึ่งไบต์จะถูกบันทึกโดยใช้เครื่องหมายย่อสำหรับตัวอักษรตัวอักษรซึ่งทำให้โปรแกรมต้องการ Ruby 1.9 หรือใหม่กว่า

อัปเดต 1: การใช้getsแทนโหมดแก้ไขสตรีมของรูบี้จะบันทึกหนึ่งไบต์
หวนกลับไปตามข้อเสนอแนะของ ValueInk

อัปเดต 2: (โดยรวม +3 ไบต์)

  • ตัวพิมพ์ขอบคงที่..--hi, $/(→ hi) (+10 ไบต์) - ความอนุเคราะห์จาก ValueInk ผู้ใช้อีกครั้ง
  • ใช้ Malus เป็นเวลา-p (+1 ไบต์)
  • กำจัดsqueezeและใช้gsubแทน(+2 ไบต์)ซึ่งอนุญาตให้ฉัน:
  • ใช้stripในการจัดการขีดกลางชั้นนำและต่อท้าย(-10 bytes)

อัปเดต 3: Hattrick โดย ValueInk เราประหยัด 11 ไบต์ด้วยการใช้ประโยชน์จากString#splitนิสัยของการบีบอัดอัตโนมัติของตัวคั่นเดียวกันซึ่งทำให้เราสามารถทิ้งสุดท้ายstrip/ gsubลูกโซ่ทั้งหมดและแทนที่ด้วย a split/ joincombo (-11 ไบต์)


สิ่งนี้จะส่งคืนสตริงในสภาพแวดล้อม REPL และล้มเหลวหากรันเป็นโปรแกรม Ruby ที่เหมาะสมและไม่ดี โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ / lambdas เท่านั้น อันที่จริงแล้วเวอร์ชั่นเก่าของคุณจะทำงานร่วมกับการ-pตั้งค่าสถานะได้ แต่สิ่งนี้จะไม่เกิดขึ้นแน่นอน
Value Ink

@ValueInk คุณถูกต้องแน่นอน ฉันเปลี่ยนวิธีแก้ไขแล้ว ขอบคุณสำหรับความคิดเห็นของคุณ มันเป็นแนวทางที่ฉันชอบมากเพราะนี่เป็นครั้งแรกที่ฉันพยายามตีกอล์ฟ
Synoli

1
ขอบคุณสำหรับการแก้ไข; ฉันลบคะแนนโหวตของฉันแล้ว สิ่งหนึ่งที่ควรทราบคือการใช้-pค่าสถานะจะเพิ่ม 1 ไบต์ลงในโค้ดของคุณโดยปริยาย (เพราะเป็นการเปลี่ยนการเรียกใช้โค้ดจากruby -e 'your code'เป็นruby -pe 'your code') ฉันยังได้พบกรณีขอบหนึ่งที่จะช่วยให้-hi-สำหรับการป้อนข้อมูลเช่น..--hi, $/เมื่อคุณควรจะถอดชั้นนำทั้งหมด / hiท้ายขีดกลางจึงได้กลับมา
Value Ink

2
-2 bytes โดยเปลี่ยนgsub(/[^\w ]/){}เป็นtr('^a-z ',''), แล้วลงท้ายด้วย.split*?-แทนที่จะเป็น.strip.gsub...เพราะมันจะจัดการรายการที่ซ้ำกันและส่วนท้ายของสตริงโดยอัตโนมัติในครั้งเดียว!
Value Ink

1
ยินดีต้อนรับสู่ code-golf!
FlipTack

3

JavaScript (ES6), 74 69 ไบต์

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>

แก้ไข: บันทึก 5 ไบต์โดยตระหนักว่าฉันได้ลบอักขระทั้งหมดยกเว้นแล้ว-/,. 0-9a-zเพื่อให้สามารถใช้\wจับคู่คำที่เหลืออยู่ได้


ฉันคิดว่าคุณต้องรวมรหัส HTML ลงใน bytecount เพราะมันถูกใช้เพื่อแก้ปัญหา
Kritixi Lithos

1
@KritixiLithos ไม่มันมีเพื่อการสาธิตเท่านั้น คำถามบอกว่ารหัสของฉันสามารถสันนิษฐานได้ว่ามีตัวอักษรและตัวเลขอย่างน้อยหนึ่งตัวและรหัส HTML ก็แค่ทดสอบก่อนเรียกฟังก์ชัน
Neil

[a-z\d]อาจจะเป็น[^\W_]อย่างไร
edc65

@ edc65 ดี แต่ฉันก็รู้ว่ามันอาจจะง่ายกว่านี้อีก!
Neil

2

PHP, 87 ไบต์

แนวคิดของการแสดงออกปกติมาจากคำตอบที่มีอยู่

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

มันต้องการให้คุณมีเซิร์ฟเวอร์ที่ใช้งาน PHP และเข้าถึง HTTP

ชื่อจะต้องอยู่ในคีย์Tและผลลัพธ์จะถูกพิมพ์บนหน้าจอ

ตัวอย่าง: http://localhost/title.php?T=<my shiny title>


2

เครื่องมือทุบตี / Unix ขนาด 56 ไบต์

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

แทนที่ตัวพิมพ์ใหญ่ด้วยตัวพิมพ์เล็กและตัวอักษรพิเศษที่จำเป็นด้วยเครื่องหมายขีดกลาง

ลบอักขระ (-d ตัวเลือกเพื่อ tr) นอกเหนือจากตัวอักษรตัวเลขและเครื่องหมายขีดกลางแล้วบีบ (-s ตัวเลือกเพื่อ tr) เครื่องหมายขีดกลางหลาย ๆ อันในแถวเป็นเส้นประหนึ่งเส้น

ลบเครื่องหมายขีดคั่นที่จุดเริ่มต้นและจากนั้นในตอนท้าย


2

Powershell, 85 ไบต์

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

ทำให้มันเป็นตัวพิมพ์เล็กแล้ว 3 แทนที่ regex ในแถวและตัดต่อท้าย-'s


อาจไม่$inputช่วยให้คุณ 2 ไบต์?
ต้มตุ๋น

2

JavaScript, 90 98 94 93 91 90 91 ไบต์

บันทึก 1 ไบต์ขอบคุณ @ edc65!

บันทึก 1 ไบต์ด้วย @IsmaelMiguel สำหรับการระบุเซมิ - โคลอนชั้นนำ!

ได้รับ 1 ไบต์หลังจากล้มเหลว ,a-^-a,

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

สิ่งที่ฉันชอบมากที่สุดเกี่ยวกับข้อเสนอนี้คือช่วง ในครั้งแรกที่replaceเราจะนำสิ่งที่ไม่ได้เป็นตัวอักษรและตัวเลขและไม่,, -, ., /และไม่ใช่พื้นที่ เราใช้a-zสำหรับตรวจจับตัวอักษรและเราใช้,-9เพื่อตรวจจับตัวอักษรพิเศษเหล่านั้นและตัวเลขเนื่องจากรหัสตัวละครของตัวอักษร ASCII เหล่านี้เรียงกันเป็นแถว!

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


ไม่ลบเครื่องหมายขีดคั่นนำ: "-1" กลายเป็น "-1" เมื่อควรเป็น "1"
L3viathan

@ L3viathan ควรทำงานตอนนี้
Kritixi Lithos

ไม่จำเป็นต้องนับf=ดังนั้นการนับไบต์ของคุณคือ 96 ในขณะนี้ และไม่จำเป็นต้องมี \ อยู่ในช่วงใน regexp ดังนั้นจึงอาจเป็น 95 แต่ ... ยังคงไม่ทำงาน: ลอง...title
edc65

1
Hei! ฉันไม่ว่าเก่า! (65 ไม่ใช่ 64)
edc65

1
ฉันเชื่อว่าคุณไม่ต้องการf=และ;ในตอนท้าย เพียงระบุว่านี่เป็นฟังก์ชันที่ไม่ระบุตัวตน ด้วยวิธีนี้คำตอบของคุณควรมีความยาว 90 ไบต์
Ismael Miguel

1

Lua, 91 ไบต์

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

ที่ไหน aสตริง URL

คำอธิบาย:

  • ส่วนใหญ่มันค่อนข้างตรงไปตรงมา a:lower()ส่งคืนฟังก์ชันตัวพิมพ์เล็ก
  • :gsub ค้นหาการจับคู่ของรูปแบบและแทนที่ด้วยสตริง
  • '[ .,/]': วงเล็บหมายถึง "หรือ" ดังนั้นสิ่งนี้จึงจับคู่ช่องว่างช่วงเวลาเครื่องหมายจุลภาคและเครื่องหมายทับ ไม่จำเป็นต้องเป็นคนโลภเพราะ:gsubเกิดขึ้นทั้งหมด
  • '[^%w-]': ^หมายถึง "ไม่" เมื่ออยู่ในเครื่องหมายวงเล็บ%wหมายถึงตัวอักษรและตัวเลขใด ๆ ดังนั้น'[^%w-]ตรงกับสิ่งที่ไม่ตัวอักษรและตัวเลข
  • '%-+': จับคู่ขีดคั่นมากเท่าที่จะทำได้และแทนที่ด้วยเส้นประเพียงเส้นเดียว
  • match'%-?(.*)%-?': ใน Lua หากสตริงเป็นอาร์กิวเมนต์เท่านั้นของฟังก์ชันไม่จำเป็นต้องใช้วงเล็บ ต้องการตรวจสอบขีดกลางหนึ่งครั้งเท่านั้นที่จุดเริ่มต้นและจุดสิ้นสุดเนื่องจากขีดกลางมีการย่อเล็กสุดอยู่แล้ว ไม่จำเป็นต้องใช้ตัวยึดเพราะ.*ตรงกับทุกอย่างโลภ

1

C, 194 ไบต์

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

โทรด้วย:

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

1

SAS, 108

หนึ่งในคำตอบที่แข่งขันน้อยกว่าที่นี่เนื่องจากไวยากรณ์ verbose ของ SAS - โทษ 9 ตัวอักษรต่อ regex เจ็บจริงๆ - แต่มันเป็นแบบฝึกหัดการเรียนรู้ regex ที่ดี:

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

1

Pyth, 35 ไบต์

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

คำอธิบาย

    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


0

GNU Sed, 65 ไบต์

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

ชุดของการทดแทน regex ใช้ไม่ใช่พกพา\Lจาก GNU เพื่อลดขนาดอินพุตให้เล็กลง sed -fเรียกใช้จากไฟล์โดยใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.