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

Leading은 -어떻습니까? 그것들을 제거해야합니까? 예를 들어에서 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와 유사합니다. 재귀 정규 표현식을 사용하는 다른 33 바이트 버전

온라인으로 사용해보십시오!

설명

T`L`l

이 줄은 간단하며 T 문자를 A-Z( L)에서 a-z( l,)로 소문자로 변환합니다.


이 단계는 간단합니다. 기본적으로 불필요한 문자를 모두 제거하여 나중에 많은 문제를 해결합니다.

[^a-z ,-9]+

[^a-z ,-9] 다음과 다른 문자와 일치합니다.

  • a-z: 소문자 알파벳 (이전 항목으로 인해 전체 문자열이 소문자임을 기억하십시오)
  • : 우주 비행사
  • ,-9이의 문자 코드 범위 ,9될 일이있는 ,-./0123456789, 우리가 필요로 정확하게 문자

다음으로 모든 영숫자가 아닌 문자를 대시로 변환합니다 (현재는 and ,./-입니다.

\W+
-

이하지 않습니다 (안) 경기 _에 포함되어 있습니다 \w(의 부정 \W이 이전 단계에서 제거 되었기 때문에)


나는 이것이 같은 입력에 실패 할 것이라고 생각한다 a = b.
Martin Ender

나는 이것을 정말로 받아들이고 싶지만, 마틴이 말했듯이, 입력 할 때 인접한 대시를 a = b
축소

@ Flp.Tkc 늦게 답변해서 죄송합니다 (최종 결선 주). 나는 두 바이트 이상을 짜내 관리했습니다 그것을 해결. 나는 이것이 현재 이러한 경우를 올바르게 처리한다고 생각합니다
Downgoat

9

자바 스크립트 (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가 아닌 문자가 포함되어 있으므로 16 진수 덤프가 있습니다.

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의 "압축 정규식"시스템이 유용한 곳은 이와 같은 과제입니다.

설명

먼저, 모든 것을 소문자로 변환합니다. 다행히도 2 바이트 단위로이 작업을 수행하는 편리한 방법이 있습니다. 나는 여기 에 대한 팁을 썼습니다 . 그래서 우리는

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

그 후 우리는 많은 압축 대체 명령을 수행합니다. V의 압축 정규 표현식이 어떻게 작동하는지에 대한 좋은 개요는 여기 에서 소리 지르지 만 기본 아이디어는 특정 문자를 이스케이프하지 않도록 높은 비트를 설정할 수 있다는 것입니다. 또 다른 편의는 (와 같은 :%) 범위와 (와 같은 ) 플래그 /g가 자동으로 채워지는 것입니다. 그러나 결국에는 모두 vim 대체 명령으로 변환됩니다. 실제로 나머지 프로그램을 vim으로 직접 변환 할 수도 있습니다. 그것은 우리에게 이것을 줄 것입니다 :

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

자바 스크립트 (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)
})


이 함수가 명명 된 함수로 변환되면 내 대답과 정확히 같은
바이트 수를 갖습니다.

*내가 잘못했을 수도 있지만 마지막 정규 표현식에서 마지막이 필요하다고 생각하지 마십시오.
ETHproductions

내가 틀렸을 수도 있지만 예견이 필요하다고 확신하십니까?
Kritixi Lithos

@KritixiLithos lookahead는 문자열의 내부에 최소한 1을 유지하고 시작과 끝에서 모두 제거하는 데 필요합니다.
edc65

@ETHproductions 감사합니다
edc65

4

파이썬 3, 103 (100) (96) 95 바이트

Flp.Tkc 덕분에 5 바이트 절약

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

@ Flp.Tkc Indeed ..
L3viathan

죄송합니다. 실수로이를 하향 조정했습니다. 이 게시물을 편집 할 때까지 투표를 취소 할 수 없습니다
Kritixi Lithos

@KritixiLithos 완료
L3viathan


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

루비 , 61 60 61 64 53 바이트

(52 바이트의 코드에 1 바이트 -p)

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

온라인으로 사용해보십시오!

tr()– 대문자, 공백, 쉼표, 마침표 및 슬래시를 변환합니다. 일시적으로-strip나중에 공백을 사용할 수 있도록 공백으로 . 표현식
-문자 "A-Z ,-/"는 실제로 범위 연산자이므로 .문자가 변형 될 수도 있습니다 . 이 조작은 실제로 바이트를 깎아 내지는 않지만 멋지므로 그대로 유지됩니다.

gsub(/[^\w ]/){} – 허용 된 세트에없는 모든 문자를 제거하십시오.

split– 기술적으로, 우리는 정확히 그 배열을 필요로하지 않지만 split선행 및 후행 공백 (실제로 -는 변장 문자)을 제거합니다. 보너스로 이것은 여러 공간을 함께 압착합니다.

*?-– 속기 .join("-"); 이것은 이전 split작업 공백 변환을 동시에 . 문자 리터럴에 약식 표기법을 사용하여 하나 이상의 바이트를 저장 하므로 프로그램에 Ruby 1.9 이상이 필요합니다.

업데이트 1 : Ruby의 스트림 편집 모드 대신 사용 gets하면 1 바이트가 절약됩니다.
ValueInk의 제안에 따라 되돌 렸습니다 .

업데이트 2 : (+3 바이트 전체)

  • 고정 모서리 케이스 ..--hi, $/ (→ hi) (+ 10 바이트) – 사용자 ValueInk에 의해 다시 한 번 제공
  • 맬 러스를 먹었다 -p (+1 바이트)에
  • 제거했다 squeeze 하고 gsub대신 (+2 바이트) 사용 하여 다음을 수행 할 수있었습니다.
  • strip선행 및 후행 대시를 처리하는 데 사용 (-10 바이트) .

업데이트 3 : ValueInk의 Hattrick. 우리 String#split는 동일한 구분 기호의 자동 압축 실행 습관을 활용하여 11 바이트를 절약 하므로 최종 strip/ gsub체인 전체를 버리고 split/ join콤보로 바꿀 수 있습니다. (-11 바이트)


이것은 REPL 환경에서만 문자열을 반환하고 적절한 Ruby 프로그램으로 실행되면 실패합니다. 전체 프로그램 또는 기능 / 람다 만 해당. 사실, 이전 버전은 -p플래그 와 함께 작동했을 것입니다. 그러나 이것은 확실히 작동하지 않습니다.
Value Ink

@ValueInk 물론 맞습니다. 그에 따라 솔루션을 변경했습니다. 귀하의 의견에 감사드립니다. 이것이 골프에 대한 나의 첫 번째 시도이기 때문에 내가 정말 감사하는 일종의 지침입니다.
Synoli

1
수정 해 주셔서 감사합니다. downvote를 제거했습니다. 주목해야 할 것은 -p플래그 를 사용하면 코드에 1 바이트를 암시 적으로 추가한다는 것입니다 (코드 실행을에서 ruby -e 'your code'로 변경하기 때문에 ruby -pe 'your code'). 또한 모든 선행 / 후행 대시를 제거하여 반환 해야하는 경우 -hi-와 같이 입력을 제공 하는 하나의 엣지 케이스를 발견했습니다 . ..--hi, $/hi
Value Ink

2
-2 변경하여 바이트 gsub(/[^\w ]/){}tr('^a-z ',''), 다음으로 끝나는 .split*?-대신 .strip.gsub...자동으로 중복 처리 이후 한 번에 모든 문자열의 끝을!
Value Ink

1
아무도 말하지 않았으므로 코드 골프에 오신 것을 환영합니다!
FlipTack

3

자바 스크립트 (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>

편집 : 나머지 단어를 일치시키는 데 -/,. 0-9a-z사용할 수 있도록 제외하고 모든 문자를 이미 삭제했음을 인식하여 5 바이트를 절약했습니다 \w.


도전 과제를 해결하기 위해 HTML 코드를
바이트

1
@KritixiLithos 아니요, 데모 목적으로 만 사용됩니다. 문제는 내 코드에서 적어도 하나의 영숫자를 가정 할 수 있으며 HTML 코드는 단순히 함수를 호출하기 전에 이것을 테스트합니다.
Neil

[a-z\d]될 수 [^\W_]있습니까?
edc65

@ edc65 Nice, 그러나 나는 그것이 훨씬 더 간단하다는 것을 깨달았습니다!
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

bash / Unix 도구, 56 바이트

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

대문자를 소문자로 바꾸고 필요한 특수 문자를 대시로 바꿉니다.

문자, 숫자 및 대시 이외의 문자를 삭제 (-d 옵션은 tr) 한 다음 여러 대시를 한 줄로 묶습니다 (-s 옵션은 tr).

시작 부분과 끝 부분에서 대시를 삭제하십시오.


2

파워 쉘, 85 바이트

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

이 행에서 다음 3 명 정규식을 대체, 소문자 확인하고 후행 트림 -'들


하지 않을 수 있습니다 $input당신에게 2 바이트를 저장?
briantist

2

자바 스크립트, 90 98 94 93 91 90 91 바이트

@ edc65 덕분에 1 바이트가 절약되었습니다!

최고의 세미콜론을 발견 한 @IsmaelMiguel 덕분에 1 바이트가 절약되었습니다!

실패 후 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입니다. 그리고 정규 표현식의 범위 안에 \가 필요하지 않으므로 95 일 수 있습니다. 그러나 ... 여전히 작동하지 않습니다 : 시도...title
edc65

1
헤이! 나는 그렇게 오래 되지 않았습니다 ! (65 not 64)
edc65

1
난 당신이 필요하지 않은 생각 f=과를 ;끝. 이것이 익명 함수임을 지정하십시오. 이것으로 대답의 길이는 90 바이트 여야합니다.
Ismael Miguel

1

루아, 91 바이트

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

어디에 aURL 문자열은 ?

설명:

  • 대부분은 매우 간단합니다. a:lower()소문자 함수를 반환
  • :gsub 패턴의 일치를 찾아서 문자열로 바꿉니다.
  • '[ .,/]': 대괄호는 "또는"을 의미하므로 공백, 마침표, 쉼표 및 슬래시와 일치합니다. :gsub모든 경우가 있기 때문에 탐욕 할 필요가 없습니다 .
  • '[^%w-]': ^대괄호 안에있을 때 "not"을 %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

SAS의 장황한 구문으로 인해 덜 경쟁적인 답변 중 하나 인 정규 표현식 당 9 문자 벌금이 실제로 아프지 만 훌륭한 정규 표현식 학습 연습이었습니다.

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

1

펄 6, 75

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

0

GNU Sed, 65 바이트

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

일련의 정규식 대체. \LGNU sed에서 이식 할 수없는 것을 사용 하여 입력을 소문자로합니다. 를 사용하여 파일에서 실행하십시오 sed -f.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.