주어진 순서대로 문자열을 정렬


23

문제는 문자열을 정렬하는 것이지만 일반적인 알파벳 순서 (abc..xyz)가 아닌 문자열을 지정된 알파벳으로 정렬하는 것입니다.

알파벳 A 와 문자열 S 의 두 가지 입력을받는 프로그램이나 함수를 작성해야합니다 . 둘 다 소문자 영문 만 포함하고 둘 이상의 문자를 포함합니다.

당신의 편지를 이동해야합니다 S 에 처음 나타나는 문자 있도록 A가 에서 두 번째 나타납니다 다음 중 문자 먼저 표시 등의 일부 문자가있을 수 있습니다 S 에 나타나지 않습니다 이이 말에 두어야하고 서로에 대해 움직이지 않았습니다.

테스트 사례 :

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

가장 적은 바이트가 이깁니다!


단일 문자열 배열을 인쇄 / 반품 할 수 있습니까? 하나의 문자열과 하나의 단일 문자열 배열을 입력으로 사용할 수 있습니까?
Dennis

@Dennis 네, 둘 다 문자열을 잘 표현한 것입니다.
Pavel

입력 중 하나 또는 둘 다를 개별 문자 배열로 사용할 수 있습니까?
얽히고 설킨

@Shaggy 문자열은 문자 배열이므로 그렇습니다.
Pavel

답변:



10

파이썬 3 , 50 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

하스켈, 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

펄 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 자로 대체 할 수 있으며 여전히 작동하고 바이트를 저장합니다.
Pavel

6

하스켈 , 40 34 바이트

Laikoni 덕분에 -6 바이트가 큽니다 .

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

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

첫 번째 줄은 SA의 두 가지 인수를 취하는 표현식입니다 .


1
좋은! f=익명의 기능이 허용되기 때문에 삭제할 수도 있습니다 .
Laikoni

1
또한 (<>)현재 Prelude에 있으므로 foldr(\c->r(==c)<>r(/=c))34 바이트 로 단축 할 수 있습니다 . 온라인으로 사용해보십시오!
Laikoni

6

Stax , 6 바이트

{xrINo

실행 및 디버깅

이를 수행하는 블록별로 정렬합니다.

  • 알파벳을 뒤집습니다.
  • 알파벳 역순으로 각 문자의 색인을 가져옵니다. 수율 누락 -1.
  • 색인을 무효화하십시오.

5

파이썬 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 개의 인수를 사용할 수 있습니다.
Pavel

만 파이썬 2. 파이썬 3되지에서 cmp와 제작 keyreverse키워드 인수 만, 그것 때문에 list.sort만 소요 위치 인수를.
데니스

4

J , 5 바이트

]/:i.

Dyadic 동사는 왼쪽에 알파벳을, 오른쪽에 정렬 할 문자열을 취합니다.

i. 알파벳에서 문자열의 문자 수 (찾을 수없는 경우 알파벳 길이)를 찾습니다.

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

/: 오른쪽에 지정된 순서에 따라 왼쪽 agrument를 정렬합니다.

] rigth 인수 (문자열)

  '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?y에서 y처음 나타나는 색인의 각 요소를 찾습니다 x. 에 요소가 없으면 x해당 인덱스가 고려됩니다 0N(-2 63 ).

-0N2 63 ≡-2 63 (mod 2 64 ) 때문에 -s를 그대로 유지한다는 점을 제외하고 모든 인덱스를 무효화합니다.

> 정렬 내림차순 치환을 반환

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Ɱ;ḟ

왼쪽의 문자열과 오른쪽의 알파벳 (문자 목록으로)을 승인하고 결과 (문자 목록으로도)를 리턴하는 2 진 링크.

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

방법?

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

자바 스크립트 (SpiderMonkey), 50 바이트

카레 구문으로 입력을 받습니다. (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는 알파벳에 속하지 않는
  • 알파벳 의 c 위치에 따른 [-Inf, 0) 의 부동 소수점 값 (-Inf, -1, -1/2, -1/3 등)

우리는 일종의 [] s의 계산함으로써 g (c) - g (b)를 각각의 문자 쌍 (b, c) 의 콜백으로 전달 정렬 () .

SpiderMonkey에서 sort () 의 구현 은 안정적이므로 알파벳에 속하지 않는 s []의 모든 문자 는 모양 순서대로 끝까지 이동하고 서로 비교할 때 변경되지 않습니다.


자바 스크립트 (ES6), 61 바이트

카레 구문으로 입력을 받습니다. (a)(s)여기서 as 는 모두 문자 배열입니다. 문자열을 반환합니다.

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

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


3

R , 69 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 바이트

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

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

입력은 첫 번째 문자열이고, 그 뒤에 null이, 두 번째 문자열이옵니다. 줄 바꾸기를 구분자로 사용하는 버전은 대신 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있습니다. io생략한다.

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



2

자바 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)방법으로 도 더 낮아질 수 없습니다 . 좋은! :)
Olivier Grégoire

@ OlivierGrégoire 아, Java 11에 대한 초기 액세스가 이미 가능하다는 것을 몰랐습니다. .repeat(n)그래도 유망 해 보인다. : D
Kevin Cruijssen






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