按给定顺序对字符串进行排序


23

您面临的挑战是对字符串进行排序,而不是按照正常的字母顺序(abc..xyz),而是按指定的字母对字符串进行排序。

你必须写一个程序或功能有两个输入端:一个字母一个和串小号。两者都将仅包含小写英文字母,并且都将包含至少一个字符。

您必须在移动字母小号,使得第一次出现在信出现,再取其信在第二出现一个,等有可能会在某些字母小号没有出现在,这些都应该在年底左右不能相对移动。

测试用例:

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

最小字节获胜!


我们可以打印/返回单例字符串数组吗?我们可以将一个字符串和一个单例字符串数组作为输入吗?
丹尼斯

@Dennis是的,两者都是字符串的精细表示。
帕维尔

我们可以将一个或两个输入作为单个字符的数组吗?
毛茸茸的

@Shaggy字符串是一个字符数组,所以可以。
帕维尔

Answers:


5

05AB1E,4个字节

Rvy†

在线尝试!

说明

R     # Reverse the alphabet
 vy   # For each letter ...
   †  # Push S with the current letter filtered to the front

比聪明Σ²sk>
魔术章鱼缸

太糟糕了,R€†无法按预期工作:)。有时这可以作为较小的vy循环。很好回答的人。
魔术章鱼缸

10

Python 3中50 47 46 44个字节

-3个字节,感谢ngn!

-1字节归功于mypetlion

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)%27保存1个字节
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,它仍然可以工作并保存一个字节。
帕维尔


6

Stax,6个字节

{xrINo

运行并调试

这按执行此操作的块排序。

  • 反转字母。
  • 获取反向字母中每个字符的索引。缺少收益-1。
  • 否定索引。

5

Python 2,38个字节

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

a必须是一个字符串,s是一个长度为1的字符串的列表。f对s进行适当排序。

在线尝试!

备用版本,字符串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中。Python3已弃用,cmp并创建了keyreverse仅使用关键字的参数,因此它list.sort仅接受一个位置参数。
丹尼斯

4

J,5个字节

]/:i.

二进位动词,左边是字母,右边是要排序的字符串。

i. 查找字母中字符串字符的索引,如果找不到,则字母长度。

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

/: 根据右侧的顺序对左侧的片段进行排序。

] 严格参数(字符串)

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

在线尝试!



4

K(ngn / k),9个字节

{y@>-x?y}

在线尝试!

{... }是参数的函数xy

x?yy中首次出现的索引中查找每个元素x; 如果在中找不到元素,则将x其索引视为0N(-2 63

-则无效不同之处在于它使所有索引0N-s完好,因为2 63 ≡-2 63(模2 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个字节

以currying语法接受输入(a)(s),其中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个字节

以currying语法接受输入(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字节

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

在线尝试!

输入是第一个字符串,后跟一个空值,然后是第二个字符串。使用换行符作为分隔符的版本会增加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并具有长度si并且o应省略。

在线尝试!


2

Pyth 9  5字节

ox+vz

在这里尝试!

ox + vz完整程序。输入格式:“ S” \ n“ A”。
o将S的字符排序为(变量:N)...
 x ... N的索引在...
  + vz ... A + N

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)'18年

@OlivierGrégoire哦,不知道可以早日使用Java 11。不过,这.repeat(n)看起来很有希望。:D
凯文·克鲁伊森


2

Prolog(SWI),136字节

X/_/[X|_].
X/Y/[Z|R]:-Y\=Z,X/Y/R.
i(_,X,[],[X]).
i(A,X,[Y|R],[X,Y|R]):-X/Y/A.
i(A,X,[Y|R],[Y|S]):-i(A,X,R,S).
A*S*T:-foldl(i(A),S,[],T).

在线尝试!用法示例:

[i,l]*[n,m,i,u,p,l,l,i,u]*S.
S = [i, i, l, l, n, m, u, p, u]




1

PynTree,13个字节

§yz:ṡzCæf+yxx

在线尝试!

Jo King的Python答案端口。

说明

§yz:ṡzCæf+yxx  Anonymous lambda
§              lambda  ,
 y                    y
  z                     z
   :                     :
    ṡ                     sorted( ,lambda x:
     z                           z
      C                                     (          )( )
       æf                                    (   ).find
         +                                     +
          y                                   y
           x                                    x
            x                                            x
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.