指定された順序で文字列をソートします


23

あなたの挑戦は文字列をソートすることですが、通常のアルファベット順(abc..xyz)でなく、指定されたアルファベットで文字列をソートします。

アルファベットAと文字列Sの 2つの入力を受け取るプログラムまたは関数を作成する必要があります。両方に小文字の英字のみが含まれ、両方に少なくとも1つの文字が含まれます。

あなたがで文字を移動させなければならないSに最初に表示される文字というように、Aは、第二表示され、その後いずれかの文字、最初に表示されたAなどの一部の文字があるかもしれませんSに表示されていないA、これらは最後に残されるべきと互いに相対的に移動しません。

テストケース:

A       S               Result
axd     haxuizzxaxduxha aaaxxxxdhuizzuh
a       xyz             xyz
abc     dcba            abcd
il      nmiuplliu       iillnmupu
asdf    qwerty          qwerty

最少バイト数が勝ちます!


シングルトン文字列の配列を印刷/返すことはできますか?入力として1つの文字列と1つのシングルトン文字列の配列を使用できますか?
デニス

@Dennisはい、両方とも文字列の細かい表現です。
パベル

片方または両方の入力を個々の文字の配列として使用できますか?
シャギー

@Shaggy文字列は文字配列なので、はい。
パベル

回答:



10

Pythonの350の47 46 44バイト

ngnのおかげで-3バイト!

mypetlionのおかげで-1バイト

lambda a,s:s.sort(key=lambda c:a.find(c)%27)

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

文字列をアルファベットとして、文字のリストを文字列として受け取り、リストを所定の位置に並べ替えます。

これ%27により、文字がアルファベットにない場合、返されるインデックスはアルファベットの残りの後にそれを配置します。


2
-a[::-1].find(c)->(a+c).find(c)
ngn

1
(a+c).find(c)-> a.find(c)%271バイトを節約するには
-mypetlion

7

Haskell、42バイト

a#s=[c|c<-a,d<-s,c==d]++[c|c<-s,all(/=c)a]

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

a#s=                     -- take alphabet a and string s
        c<-a             -- for all c in a
             d<-s        --   for all d in s
    [c|       c==d]             keep c if c equals d
   ++                    -- append
    [c|c<-s        ]     --   all c of s
         ,all(/=c)a      --   that are not in a 

7

Perl 6の 55の  43バイト

->\A,\S{[~] S.comb.sort:{%(A.comb.antipairs){$_}//∞}}

それを試してみてください

->\A,\S{[~] S.comb.sort:{A.index($_)//∞}}

それを試してみてください

拡張:

-> \A, \S {
  [~]  # reduce using &infix:«~» (shorter than `.join`)

    S.comb.sort: # split into character list and sort by:

      {  # bare block lambda with implicit parameter $_

        A.index( $_ ) # get the position

        //  # if it is undefined (not in `A`)
           # return Inf instead (so it comes at end of result)
      }
}

入力には最大26個の異なる文字があり、∞は3バイトであるため、これを27に置き換えることができ、それでも動作し、1バイトを保存します。
パベル

6

Haskell40 34バイト

ライコニのおかげで-6バイトの巨大な。

foldr(\c->r(==c)<>r(/=c))
r=filter

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

最初の行は、SAの 2つの引数を取る式です。


1
いいね!f=匿名関数が許可されているため、ドロップすることもできます。
ライコニ

1
さらに(<>)、現在プレリュードにあるため、これはfoldr(\c->r(==c)<>r(/=c))34バイトに短縮できます。オンラインで試してみてください!
ライコニ

6

スタックス、6バイト

{xrINo

実行してデバッグする

これは、これを行うブロックでソートされます。

  • アルファベットを逆にします。
  • 逆アルファベットの各文字のインデックスを取得します。不足している利回り-1
  • インデックスを無効にします。

5

Python 2、38バイト

def f(a,s):s.sort(None,a[::-1].find,1)

文字列でなければなりません、sは長さ1の文字列のリストF種類場所では。

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

代替バージョン、ストリングI / O、48バイト

lambda a,s:`sorted(s,None,a[::-1].find,1)`[2::5]

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

使い方

s.sort(None,a[::-1],1) 略記です s.sort(cmp=None,key=a[::-1],reverse=1)

ドキュメントから:

reverseはブール値です。に設定するTrueと、リスト要素は各比較が逆になったようにソートされます。


TILソートは4つの引数を取ることができます。
パベル

唯一のPythonの2のPython 3で非推奨cmpと作られたkeyreverseそのがして、キーワードのみの引数list.sortのみ取り1位置引数を。
デニス

4

J、5バイト

]/:i.

二項動詞、左側にアルファベット、右側にソートされる文字列を取ります。

i. アルファベットの文字列の文字のインデックスを検索し、見つからない場合はアルファベットの長さを検索します。

   'axd' i. 'haxuizzxaxduxha'
3 0 1 3 3 3 3 1 0 1 2 3 1 3 0

/: 右側の引数で指定された順序に従って、左側の引数を並べ替えます。

] rigth引数(文字列)

  'haxuizzxaxduxha' /: 3 0 1 3 3 3 3 1 0 1 2 3 1 3 0
aaaxxxxdhuizzuh

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


4

パイソン235の 50バイト

lambda a,s:sorted(s,key=lambda c:-a[::-1].find(c))

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

受け取りas文字列として。シングルトン文字列のリストを返します。

注:痛い!修正するために15バイトを獲得しました...


ハ!これは実際には私の答えの元のコードとまったく同じです。偉大な心は同じように考える
ジョーキング

1
@ジョーキング:私の考えを制御するのをやめる!:)
チャスブラウン

4

K(ngn / k)、9バイト

{y@>-x?y}

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

{... }は引数xを持つ関数であり、y

x?yy最初に出現するインデックスの各要素を検索しxます。要素がに見つからない場合x、そのインデックスは考慮されます0N(-2 63

-それが保持していることを除き、すべてのインデックスを否定する0Nため2、無傷-s 63 ≡-2 63(2 MOD 64

> ソート降順の順列を返します

y@インデックスのyことで


3

木炭、13バイト

Fθ×ι№ηιΦη¬№θι

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

 θ              First input
F               Loop over characters
     η          Second input
      ι         Current character
    №           Count matches
   ι            Current character
  ×             Repeat
                Implicitly print
        η       Second input
       Φ        Filter
           θ    First input
            ι   Current character
          №     Count matches
         ¬      Logical not
                Implicitly print non-matching characters

3

ゼリー、4 バイト

fⱮ;ḟ

左側の文字列と右側のアルファベットを(文字のリストとして)受け入れ、結果を返す(文字のリストとして)ダイアディックリンク。

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

どうやって?

fⱮ;ḟ - Link: string; alphabet                                    e.g. smallnotxl; xl
 Ɱ   - map (for each character in the alphabet):                      1=x; 2=l
f    -   filter keep (keep occurrences of this character from string)   x    lll -> xlll
   ḟ - filter discard (discard all alphabet characters from string)   smanot
  ;  - concatenate                                                    xlllsmanot

3

APL(Dyalog Unicode)、5 バイトSBCS

[string,ordering]引数として使用する匿名の暗黙の接頭辞関数。

⍋⍨/⌷⊃

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

/  次の機能により削減します。

  …  つまり、次の関数の引数を逆にしたバージョンです。

   左の順序に従って右の文字列を格付けします(欠落している文字は末尾に移動します)

 それを使用してインデックスを作成します…

 引数の最初の要素(つまり、文字列)


3

JavaScript(SpiderMonkey)、50バイト

構文カリー化で入力を受け取り(a)(s)、文字列とされている文字の配列です。文字の配列を返します。

a=>s=>s.sort((b,c)=>(g=c=>-1/a.search(c))(b)-g(c))

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

どうやって?

ヘルパー関数g()を次のように定義します:

c => -1 / a.search(c)

返されるもの:

  • cがアルファベットに属さない場合は1
  • それ以外の場合のアルファベットのcの位置に基づく[-Inf、0)の浮動小数点値(-Inf、-1、-1/2、-1/3など)

sort()のコールバックに渡される文字(b、c)の各ペアに対してg(b)-g(c)を計算することにより、s []をソートします。

SpiderMonkey でのsort()の実装は安定しているため、アルファベットに属さないs []のすべての文字は、出現順に単純に最後に移動され、互いに比較されるときに変更されません。


JavaScript(ES6)、61バイト

カリー化構文で入力を受け取り(a)(s)の両方、ASは文字の配列です。文字列を返します。

a=>s=>a.map(C=>s=s.filter(c=>c!=C||!(o+=c)),o='')&&o+s.join``

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


3

R69 62 58バイト

function(a,s)c(rep(a,rowSums(outer(a,s,"=="))),s[!s%in%a])

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

入力と出力は、個々の文字のベクトルです。

説明:

function(a,s)c(                              ,           ) #combine:
                   a,                                      #[each char in a
               rep(                                        #each repeated
                     rowSums(               )              #the number of
                             outer(a,s,"==")               #occurrence in s]
                                              s            #with s
                                               [ s%in%a]   #all chars in a
                                                !          #omitted

3

Brain-Flak(BrainHack)、118バイト

{({}(<>))<>}{}<>{<>([[]()]<{<>(({})<({}<>[({}<>)]){(<()>)}{}{}>)<>}<>({}<{({}<>)<>}<>>)>[]){({}()<(({}))>)}{}{}<>{}}<>

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

入力は最初の文字列で、その後にヌルが続き、2番目の文字列が続きます。代わりにセパレータとして改行を使用するバージョンでは、24バイトが追加されます。

Brain-Flak、142バイト

(()){{}(({}(<>))[(()()()()()){}]<>)}{}<>{<>([[]()]<{<>(({})<({}<>[({}<>)]){(<()>)}{}{}>)<>}<>({}<{({}<>)<>}<>>)>[]){({}()<(({}))>)}{}{}<>{}}<>

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

説明

# Move A to other stack reversed
# Zeroes are pushed under each character for later.
# (This is the only part that needs to change in order to use newline as separator.)
{({}(<>))<>}{}<>

# For each character in A, starting at the end:
{

  # Track current length of S.
  <>([[]()]<

    # For each character in S:
    {

      # While keeping character from A
      <>(({})<

        # Move character from S to second stack and push difference
        ({}<>[({}<>)])

        # Delete character if equal
        {(<()>)}{}{}

      >)

    <>}

    # Move S back to first stack while maintaining character from A
    <>({}<{({}<>)<>}<>>)

  # Push difference between old and new lengths of S
  >[])

  # Insert character from A at beginning of S that many times
  {({}()<(({}))>)}{}{}

<>{}}<>

2

C(gcc)、97バイト

f(D,d,S,s,i,o)char*D,*S;{
  while(d--){
    for(i=o=s;i--;)S[i]-D[d]?S[--o]=S[i]:0;
    while(o--)S[o]=D[d];
  }
}

すべての空白(スペースと改行)上記のコード内のは読みやすくするためのものであり、削除する必要があります。

辞書は渡されDて長さを持ちd、文字列は渡されSて長さを持ちsます。iそしてo省略されなければなりません。

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



2

Java 8、98バイト

a->s->{for(int i=a.length;i-->0;s=s.replaceAll("[^"+a[i]+"]","")+s.replaceAll(a[i],""));return s;}

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

説明:

a->s->{       // Method with String-array and String parameters, and String return-type
  for(int i=a.length;i-->0;
              //  Loop backwards over the alphabet
    s=        //   Replace the current `s` with:
      s.replaceAll("[^"+a[i]+"]","") 
              //    All the current characters of `a` in `s`
      +s.replaceAll(a[i],""));
              //    Concatted with everything else
  return s;}  //  Return the modified `s`

Java 11の新しいString.repeat(int)メソッドを使用しても、低くなることはできませんでした。いいね!:)
オリビエグレゴワール

@OlivierGrégoireああ、Java 11への早期アクセスがすでに利用可能であることを知りませんでした。しかし、それ.repeat(n)は有望に見えます。:D
ケビンクルーッセン

2

Perlの5-pF43のバイト

$_=<>;print$F[0]x s/@{[shift@F]}//g while@F

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


$_=<>;無料で提供するフラグはありませんか?
パベル

@Pavelええ、ごめんなさい、それを使って値@Fを設定していますが、ヘッダーに追加しませんでした!今すぐやるよ!ありがとうございました!
ドムヘイスティングス

これを10バイト削減しても、同じロジックを使用できます:オンラインで試してください!
Xcali





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