URLフレンドリーなタイトル


28

このサイトの人々は、投稿タイトルを飾るのが大好きです...

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

ただし、このタイトルをページURLに含める必要がある場合、簡略化されます。

stewies-sequence

チャレンジ

あなたの仕事は、投稿のタイトルを表す文字列が与えられると、その「URLフレンドリー」変換を出力/返すプログラムまたは関数を作成することです。

アルゴリズムは次のとおりです。

  • 小文字に変換(該当する場合)
  • すべてのスペース()、ピリオド(.)、コンマ(,)またはスラッシュ(/)をダッシュ​​(-)に置き換えます
  • ダッシュ以外の英数字以外の文字を削除します。
  • 隣接するダッシュのグループを縮小し(a---b -> a-b)、先頭または末尾にあるダッシュを削除します。

このアルゴリズムは簡略化であり、サイトの実際の方法と同じ結果を常に生成するとは限らないことに注意してください。


ルール

  • 次の入力を想定できます。
    • 空になりません。
    • 少なくとも1つの英数字が含まれます。
    • 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

リーディング-sはどうですか?それらを削除する必要がありますか?たとえば、でasdf-、最後-を削除する必要がありますか?
Kritixi Lithos

我々は、組み込みの機能文字が英数字であるかどうかを確認するために使用することができ、このようなif(isalphanum(ch))...
Mukulクマール

1
@KritixiLithos 隣接するダッシュのグループを縮小し(a --- b-> ab)、先頭/末尾にあるものをすべて削除します。これで明らかになるはずです。
ムクルクマール

そして、何についての_アンダースコア?私のコードは、アンダースコアがある場合を除いて機能します。
Kritixi Lithos

L3viathan @ DOESは問題で今、私もアンダースコアが削除されますので、自分のコードを変更していない
KritixiのLithos

回答:


7

網膜、33 31バイト

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

\W+
-
^-|-$

(プログラムの末尾には改行があります)

これをもっと絞り込めるかどうかはわかりません。これですべてがカバーされるはずです。ママファンロールに似て来ました。再帰的正規表現を使用した別の33バイトバージョン

オンラインでお試しください!

説明

T`L`l

このラインは、それがによって小文字に変換し、簡単であるT ransliterating A-ZL)にa-zl小文字)。


この段階は単純で、基本的には不要なキャラクターをすべて取り除き、後で多くのトラブルを回避します

[^a-z ,-9]+

[^a-z ,-9] 次以外の文字に一致します。

  • a-z:小文字のアルファベット(前の項目のために文字列全体が小文字であることを忘れないでください)
  • :スペースチャクター
  • ,-9これは、の文字コード範囲である,9ことを起こるこれ,-./0123456789は、我々が必要とする正確な文字

次に、英数字以外の文字をすべてダッシュに変換します(現在はand だけ,./-です)。

\W+
-

前の段階で削除されたため、これは(の否定)に_含まれる\w(一致しない)一致しません。\W


これはのような入力では失敗すると思いますa = b
マーティンエンダー

私は本当にこれを受け入れたいのですが、マーティンが言ったように、あなたが入力したときに隣接するダッシュを縮小しません: a = b(
FlipTack

@ Flp.Tkc返信が遅くなってすみません(今は最終週)。私は2つの以上のバイトを絞り出すことができたし、それを修正します。私は、これは正しく今、このようなケースを処理信じる
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ああ、これを指摘してくれてありがとう。私はそのルールに注意を払いませんでした。修正する必要があります。
アーナルド

9

V41、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                                -.-$

Vの「Compressed regex」システムが役立つのは、このような課題です。

説明

まず最初に、すべてを小文字に変換します。幸いなことに、これを2バイトで行う非常に便利な方法があります。ここでそれに関するヒントを書きました。だから

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

その後、圧縮された代替コマンドの束を行います。Vの圧縮された正規表現がどのように機能するかについての素晴らしい概要はここにありますが、基本的な考え方は、特定の文字をエスケープする必要がないように高ビットを設定できるということです。もう1つの便利な点は、範囲(など:%)とフラグ(など/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

JavaScript(ES6)91 96

1バイト保存 @thh @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を

あなたが最後に必要と考えてはいけない*、私は間違っているかもしれないが、最後の正規表現で
ETHproductions

間違っているかもしれませんが、先読みが必要ですか?
Kritixi Lithos

文字列の中、開始時と終了時に全てを除去しながら-先読み@KritixiLithos少なくとも1を維持する必要がある
edc65

右@ETHproductions、感謝
edc65

4

Python 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

4

網膜、34バイト

T`L`l
[^ az \ d。、/-] +

\ W +
-
^-|-$

オンラインでお試しください!

末尾の改行に注意してください。基本的にOPの実装。


わずかに異なるコードにTIOリンクポイント
KritixiのLithos

ええ、私はそれを直しました。
ママファンロール

1
あなたは使用することができますT`L`l少ないバイトを小文字に行くために
Downgoat

で失敗a..SND似て
Downgoat

2
[\W]ちょうど\W
マーティンエンダー

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操作空白変換の両方が同時に逆になります。文字リテラルの省略表記を使用することにより、もう1バイト節約されます。これにより、プログラムはRuby 1.9以降を必要とします。

更新1: Rubyのストリーム編集モードの代わりに使用getsすると、1バイト節約されます。ValueInkの提案
に従って元に戻しました

更新2:( 全体で+3バイト)

  • 修正されたエッジケース..--hi, $/(→ hi(+10バイト) –ユーザーValueInkの好意により再び
  • (+1バイト)のマルスを受けました-p
  • 処分したsqueezeと使用gsubの代わりに(2バイト)、これは私にすることができ:
  • strip先頭および末尾のダッシュ(-10バイト)を処理するために使用します

更新3: ValueInkによるHattrick。String#split同じセパレーターの自動スクイーズ実行の習慣を活用することで11バイトを節約します。これにより、最終strip/ gsubチェーン全体を捨ててsplit/ joinコンボに置き換えることができます。(-11バイト)


これは、REPL環境でのみ文字列を返し、適切なRubyプログラムとして実行すると失敗し、それは良くありません。完全なプログラムまたは関数/ラムダのみ。実際、古いバージョンでは-pフラグが機能していましたが、これは間違いなく機能しませんでした。
バリューインク

@ValueInkあなたはもちろん正しいです。それに応じてソリューションを変更しました。コメントありがとうございます; これはまさにゴルフの最初の試みなので、私はとても感謝しています。
Synoli 16

1
修正していただきありがとうございます。私は下票を削除しました。-pフラグを使用すると、コードに暗黙的に1バイトが追加されることに注意してください(コードの実行がからruby -e 'your code'に変更されるためruby -pe 'your code')。また、すべての先頭/末尾のダッシュを削除してリターンする必要がある場合-hi-など..--hi, $/、入力に使用できるエッジケースも1つ見つかりましたhi
値インク

2
に変更gsub(/[^\w ]/){}することで-2バイトtr('^a-z ','')になり、その後、自動的に重複文字列の終わりをすべて一度に処理するため、.split*?-代わりにで終わります!.strip.gsub...
バリューインク

1
誰も言っていないので、code-golfへようこそ!
FlipTack 16

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>

編集:残りの単語を一致さ-/,. 0-9a-zせるために使用できるのを除いて、すべての文字を既に削除したことを認識して5バイトを保存しました\w


私はあなたが、挑戦を解決するために使用されているので、:バイトにHTMLコードを含めるために持っていると思う
KritixiのLithos

1
@KritixiLithosいいえ、デモ目的でのみ存在します。質問では、私のコードは少なくとも1つの英数字を想定でき、HTMLコードは関数を呼び出す前にこれをテストするだけです。
ニール

[a-z\d]かもしれない[^\W_]
edc65 16

@ edc65素敵ですが、それからもっと簡単にできることに気付きました!
ニール

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/-$//

大文字を小文字に、必要な特殊文字をダッシュ​​に置き換えます。

文字、数字、ダッシュ以外の文字を削除(trの-dオプション)してから、行の複数のダッシュを1つのダッシュに絞り込みます(trの-sオプション)。

最初にダッシュを削除してから、最後にダッシュを削除します。


2

Powershell、85バイト

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

小文字にし、3つの正規表現を連続して置換し、末尾の-'


$input2バイト節約できませんか?
briantist

2

JavaScript、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」になります。
L3viathan 16

今L3viathan万一の仕事@
KritixiのLithos

カウントf=する必要がないので、バイトカウントは現在96です。正規表現の範囲内に\が必要ないため、95になります。しかし、まだ機能していない:try...title
edc65

1
ヘイ!私はしませんよという古いです!(64ではなく65)
edc65

1
私はあなたが必要としないと考えているf=;終わり。これが匿名関数であることを指定してください。これにより、回答は90バイトの長さになります。
イスマエルミゲル

1

Lua、91バイト

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

aURL文字列はどこにありますか。

説明:

  • そのほとんどは非常に簡単です。a:lower()小文字の関数を返します
  • :gsub パターンの一致を見つけ、それを文字列で置き換えます。
  • '[ .,/]':大括弧は「または」を意味するため、スペース、ピリオド、コンマ、およびスラッシュに一致します。:gsubすべての出来事を行うので、貪欲である必要はありません。
  • '[^%w-]'^括弧内に「ない」%wことを意味し、英数字を意味します。したがって、英数字でもダッシュでもない'[^%w-]ものに一致します。
  • '%-+':できるだけ多くのダッシュを一致させ、ダッシュを1つだけに置き換えます。
  • match'%-?(.*)%-?':Luaでは、文字列が関数の唯一の引数である場合、括弧は必要ありません。ダッシュは既に最小化されているため、開始と終了でダッシュを1つだけチェックする必要があります。.*貪欲なすべてに一致するため、アンカー文字は不要です。

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の冗長な構文のため、ここで競争力の低い答えの1つ-正規表現ごとに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

Perl 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

一連の正規表現の置換。\L入力を小文字化するためにGNU sedからの移植性のないものを使用します。を使用してファイルから実行しますsed -f

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.