オプション文字列を並べ替える


8

バックグラウンド

Cには、コマンドライン引数の解析に役立つ関数がありますgetopt

Getoptは、引数カウント(argc)、引数リスト(argv)、およびプログラムがとるべきオプションを表す文字列(optstring)を取ります。

オプション文字列(optstring)は、1つのコロン(引数が必要なオプションの場合)、2つのコロン(オプションの引数のあるオプションの場合)、または0のコロン(引数のないオプションの場合)が後に続く一連のオプション文字です。

例:会社の新しいウィジェットに次のオプション文字列を使用できます。

"v::x:hy:S:G::dns:f::"

しかし、それは恐ろしく見えます!オプションはすべて混在しています!このオプション文字列は、並べ替えた方がはるかによく見えます。

"f::G::v::S:s:x:y:dhn"

仕様書

  • 入力は正規表現に一致する文字列になります ([A-Za-z]:{0,2})+

  • 入力は文字列または文字のリストとして受け取る必要があります。

  • 以下に詳述する方法でソートされた文字列を出力する必要があります。

  • 空の入力を処理する必要はありません。

  • 同じタイプのオプションを繰り返し使用して入力を処理する必要はありません("aa"は無効ですが、"aa:a::"有効です)。

ソート方法

ソートされたオプション文字列で:

  • 2つのコロンが後に続く文字が最初に来て、アルファベット順にソートされ、それぞれの小文字の前に大文字が続きます(つまり、「Bab」ではなく「aBb」)。

  • 次に、1つのコロンが付いた文字がアルファベット順にソートされ、それぞれの小文字の前に大文字が続きます。

  • 最後は、コロンのない文字で、アルファベット順にソートされ、それぞれの小文字の前に大文字が続きます。

ルール

得点

これはなので、各言語でのバイト単位の最短の回答が優先されます。

# "input" => "output"
"v::x:hy:S:G::dns:f::" => "f::G::v::S:s:x:y:dhn"
"aa:a::" => "a::a:a"
"B:" => "B:"
"Confusio:n::" => "n::o:Cfinosu"
"Confusio:n:" => "n:o:Cfinosu"
"m:qW:X:xc:vViI" => "c:m:W:X:IiqVvx"
"V:omo:V" => "o:V:moV"
"agg:ra:va::ting::" => "a::g::a:g:aginrtv"
"input" => "inptu"

長いテストケース(312文字)

無効な入力(処理する必要はありません):

"gg" (duplicated option)
"" (empty string)
":w:" (first colon isn't after a character)
"x:y:0:fhn" ('0' is not alphabetic)
"A:::" (3 colons is invalid)

agg:ra:va::ting::地雷を壊した...皮肉。
マジックタコの骨壷

回答:


9

Husk、11バイト

ΣÖom_↔Oġλ¬√

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

説明

ΣÖom_↔Oġλ¬√  Implicit input, say "kH::r:R:Hk:"
       ġ     Split between characters for which this gives a falsy result:
        λ      Take two arguments, ignore the first.
          √    Is the second argument a letter?
         ¬     Negate.
             Now we have the options: ["k","H::","r:","R:","H","k:"]
      O      Sort: ["H","H::","R:","k","k:","r:"]
 Ö           Sort by
     ↔       reversing and
  om_        converting everything to lowercase: ["H::","k:","R:","r:","H","k"]
Σ            Concatenate: H::k:R:r:Hk

ここには本当に賢いアイデアがいくつかあります。人々がそれらを理解できるように説明を追加する必要があります:D
Leo

1
@Leoコードの詳細を追加しました。
Zgarb 2017年

3

網膜、47バイト

.
$&$&
T01`L`l`..
O^`\w.:*
.(.)
$1
O$^`\w:*
$.&

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

Retinaの「並べ替え」機能には大文字と小文字を区別しない並べ替えがないため、実際には文字を並べ替えるのが最も難しい部分でした(したがって、デフォルトでは大文字をすべての小文字の前に並べ替えます)。これを回避するために、各文字の小文字のコピーを挿入して並べ替えを行い、それを再度取り除く必要がありました。


昨年、大文字と小文字を区別しない並べ替えがどこかに追加されましたか?そうでなければ、大文字と小文字を区別せずに元の順序を維持する方法はありますか?つまりtEsTiNg、あなたのソート方法上記では、への手紙のペアをソートするeEggiinNsstTtt → EgiNsTt代わりに、eEggiinNsstttT → EgiNstT (大文字は常に小文字の前に配置されます)。
Kevin Cruijssen、

1
@KevinCruijssen置換文字列内の文字を小文字に簡単に変換できるため、sort-byを使用してこれを実行できます。tio.run/##K0otycxLNPyvquGe8N9fJUGPSyVHRe3//xLX4pBMv3QA
マーティンエンダー

あ、いいね。私自身、そのことを考えたことはなかったでしょう。私は今私の答えを修正することができました。:)
Kevin Cruijssen



2

Japt17 16バイト

f".:*" ñ_iZw vÃq

オンラインでテストしてください!

使い方

入力文字列がであるとしv:vg::G:G::o:ます。コードの最初の部分は、任意の数のコロンが後に続く文字と一致するf".:*"正規表現のすべての一致を検索します/.:*/g。これは入力を[v:, v, g::, G:, G::, o:].

ñ配列のメソッドは、特定の変更が適用されたかのように各配列を実際に適用せずに(sorted(array, key=<whatever>)Pythonのように)並べ替えます。だから私たちはソートする必要があります:

  • 他のすべての前にダブルコロン。
  • シングルコロンはダブルコロンの後、コロンなしの前。
  • アルファベット順の文字。そして最後に
  • 小文字の前に大文字。

Z{ZiZéJ v} これを行うために私が見つけることができる最も短い方法です:

  Zw     Reverse Z.
     v   Convert to lowercase.
Zi       Insert this at the beginning of Z.

これはいくつかの例で理解するのが最も簡単です:

         v:   v  g::    G:   G::    o:
  Zw     :v   v  ::g    :G   ::G    :o
     v   :v   v  ::g    :g   ::g    :o
Zi       :vv: vv ::gg:: :gG: ::gG:: :oo:

次に、元の値がこれらのキーによって辞書式にソートされます。結果は、それ::gG::が前にソートされ、次に::gg::、というようにソートされて、が与えられ[G::, g::, G:, o:, v:, v]、それが結合されqて出力されます。


1

JavaScript(ES6)、93バイト

f=
s=>s.match(/\w:*/g).sort((a,b)=>b.length-a.length||parseInt(a,36)-parseInt(b,36)||a>b).join``
<input oninput=o.textContent=this.value&&f(this.value)><pre id=o>




1

バッシュ、232 213バイト

s(){ s=${1#?} c=${1%$s} o=${s%%[^:]*} s=${s#$o} o=$c$o;};
p()(s $1;l= g= p=$o d=$c;[[ $o ]]&&(while s $s;[[ $o ]];do
(((x=${#o}-${#p},y=36#$d-36#$c,x?x:y?y:62#$c-62#$d)>0))&&g+=$o||l+=$o;done;echo `p $g`$p`p $l`))

オンラインで試す


1

C#(.NET Core)、152バイト

s=>{var o="";for(var d=":::";d!="";){d=d.Substring(1);for(var c='@';c!=90;o+=s.IndexOf(c+d)>=0?c+d:"",s=s.Replace(c+d,""),c^=' ')if(c<97)c++;}return o;}

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

未ゴルフ:

s => { 
    var o = ""; 
    for (var d = ":::"; d != "";) { 
        d = d.Substring(1); 
        for (
            var c = '@'; 
            c != 90; 
            o += s.IndexOf(c + d) >= 0 ? c + d : "", s = s.Replace(c + d, ""), c ^= ' '
        ) if (c < 97) c++; 
    } 
    return o; 
}

基本的なアイデアは、156の可能なオプションすべてを反復処理し、それらの存在を確認することです。見つかった場合は、出力に追加し、入力から削除します。

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