문자열 정렬, 정렬


29

문자열을 정렬하면 일반적으로 다음과 같은 결과가 나타납니다.

         ':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy

네, 첫 번째 문장이 정렬되었습니다.

당신이 볼 수 있듯이, 반복되는 문자의 많은이 있습니다, aa, eee, ttttt, 9 개 공간 등등.

128첫 번째 복제본, 256두 번째, 384세 번째 등 의 ASCII 값에 더하면 다시 정렬하고 새 문자열 (동일한 문자를 다시 가져 오는 계수 128)을 출력하면 문자열이 나타납니다.

 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    

(단일 선행 공간과 4 개의 후행 공백에 유의하십시오).

문자열은 "순차적으로 분류되어"있다 <space>':I....uy, <space>aeg....uy, <space>egi....ty, <space>iloty, <space>lt, <space>, <space>, <space>, <space>.

숫자가 포함 된 문자열을 사용하면이를 시각화하는 것이 더 쉬울 수 있습니다. 문자열은 111222334"분류"하면됩니다 123412312.

도전:

당연히 도전은 위의 설명에 따라 문자열을 정렬하는 코드를 작성하는 것입니다.

입력 문자열에 32-126 (공백에서 공백) 범위의 인쇄 가능한 ASCII 문자 만 포함한다고 가정 할 수 있습니다.


테스트 사례 :

**Test cases:**
 *:Tacest*es*s*

If you sort a string you'll typically get something like:
 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    

Hello, World!
 !,HWdelorlol

#MATLAB, 114 bytes
 #,14ABLMTbesty 1A

f=@(s)[mod(sort(cell2mat(cellfun(@(c)c+128*(0:nnz(c)-1),mat2cell(sort(s),1,histc(s,unique(s))),'un',0))),128),''];
'()*+,-0128:;=@[]acdefhilmnoqrstuz'(),0128@acefilmnorstu'(),12celmnostu'(),12celnstu(),clnst(),cls(),cs(),()()()()

이것은 이므로 바이트 단위 계산 된 각 언어 에서 가장 짧은 코드는 ref이 됩니다.


제목 : 조금 나 결과이 생각하고 설명을 무시하고, 혼란이다 tio.run/nexus/05ab1e#@1@td2jh4ZVe//... 멋진 도전 그렇지 않으면, 나는 간단한을 충족하는 확장 작업을 수 있습니다.
Magic Octopus Urn

문자열 대신 문자 목록을 출력 할 수 있습니까?
밀 마법사

문자열을 입력 할 수 있으면 출력도 문자열이어야합니다. 만약 당신의 언어로 문자열을 입력하고 출력하는 일반적인 방법이 문자 목록이라면 괜찮습니다. 예를 들어 {'S', 'g', 'i', 'n', 'r', 't'}"정상적인"방법은이므로 파이썬에서는 출력 할 수 없습니다 "String".
Stewie Griffin

위의 주석을 수정하겠습니다. 문자열은 문자 목록이므로 문자 목록이 출력됩니다. 그러나 문자열 목록은 허용되지 않습니다. 즉, 목록의 요소에 두 번째 문자를 추가 할 수 있으면 허용되지 않습니다. 예를 들어, 다음 {'a','b'}과 같이 각 문자에 문자를 추가 할 수 있으므로 Matlab에서는 허용되지 않습니다 {'aa','b'}. 입력 및 출력 형식이 동일해야합니다.
Stewie Griffin

@StewieGriffin 위의 설명에 따라 분류했을 때. 내 정렬 알고리즘이 ASCII 값을 수정하는 프로세스를 따라야합니까, 아니면 해당 알고리즘과 동일한 출력을 생성해야합니까?
George Reith

답변:


15

Pyth, 5 바이트

s.T.g

테스트 스위트

매우 간단합니다 : 그룹화 및 분류, 전치, 연결.

s.T.g
s.T.gkQ    Implicit variables
   .gkQ    Group the input input lists of elements whose values match when the
           identity function is applied, sorted by the output value.
 .T        Transpose, skipping empty values. This puts all first characters into
           a list, then all second, etc.
s          Concatenate.

Pyth 새로운 J되기 위해 모든 것을 갖추고 있습니다, 그것은 끝내
shabunc는

3
@shabunc 새로운 J를보고 싶다면 github.com/DennisMitchell/jelly
isaacg를 방문하십시오

13

젤리 , 3 바이트

ĠZị

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

작동 원리

오 소년,이 도전은 젤리를위한 것이 었습니다.

그룹 원자는 ( Ġ) 배열 얻어 1 어레이의 동일한 요소에 대응하는 입력 그룹을 지표로서. 인덱스 그룹의 배열은 해당 요소를 키로 정렬하여 정확하게이 문제에 필요한 순서입니다.

다음으로, Zip 아톰 ( Z)은 생성 된 (정지 된) 인덱스 매트릭스의 행과 열을 바꿉니다. 이것은 단순히 행렬의 열을 읽고 해당 열에없는 요소를 건너 뛰는 것으로 구성됩니다. 결과적으로 코드 포인트가 가장 낮은 문자의 첫 번째 인덱스, 코드 포인트가 가장 낮은 두 번째 문자의…, 코드 포인트가 가장 낮은 문자의 두 번째 인덱스 등이 나타납니다.

마지막으로 unindex atom ( )은 생성 된 순서대로 모든 색인에서 입력 배열의 요소를 검색합니다. 결과적으로 2D 문자 배열이 생성되어 젤리가 인쇄하기 전에 평평하게됩니다.


1 Jelly에는 문자열 유형 이 없으며 문자 배열 만 있습니다.


"아,이 도전은 젤리를위한 것이 었습니다." -> 3 byte answer
geisterfurz007이 혼란을 막으십시오

내가 말했듯이 거의 젤리를 위해 만들었습니다. :)
Dennis

10

파이썬 3 109 105 104 103 99 93 90 88 81 79 69 바이트

FlipTack 덕분에 2 바이트 절약

flornquake가 바보 오류를 발견하여 7 바이트가 저장되었습니다.

xnor 덕분에 2 바이트 절약

Dennis 덕분에 10 바이트 절약

a=[*input()]
while a:
    for c in sorted({*a}):print(end=c);a.remove(c)

설명

먼저 splat을 사용하여 문자열을 목록으로 변환하고 해당 목록을 변수에 저장합니다 a. 그런 다음 우리 a가 빈 목록이 아닌 동안 우리 는 각각의 고유 한 구성원을 a정렬 된 순서대로 살펴보고 인쇄하고 목록에서 해당 문자의 사본을 제거합니다.

따라서 각 반복 인쇄는에있는 각 문자의 사본 하나를 인쇄합니다 a.


1
@StewieGriffin set은 분류되지 않은 세트입니다.
FlipTack

2
@StewieGriffin은 인쇄 될 때 ASCII 값으로 정확하게 정렬되지 않고 정렬됩니다. 종종 그들이 나타나는 것처럼 보이지만 해시 유형에 따라 정렬되어 있다고 생각합니다.
밀 마법사

1
f리스트 대신 문자열을 만들어 몇 바이트를 절약 할 수 있습니다.
flornquake

1
당신이 걸릴 경우 a=list(input()), 당신은 할 수 있습니다 a.remove(c), 이것은 순 저축입니다.
xnor

1
Python 3으로 전환하면 많은 바이트가 절약됩니다. tio.run/nexus/…
Dennis

6

하스켈, 44 바이트

import Data.List
concat.transpose.group.sort

사용 예 :

Prelude Data.List> concat.transpose.group.sort $ "If you sort a string you'll typically get something like:"
" ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    "

같은 문자를 문자열 목록 (예 : "aabbc"-> ["aa","bb","c"])으로 정렬하고 그룹화 하고 단일 문자열로 다시 편 평화합니다.


6

파이썬 2 , 75 바이트

lambda s:`zip(*sorted((s[:i].count(c),c)for i,c in enumerate(s)))[1]`[2::5]

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


1
유효한지 모르지만 lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]max length 인 문자열에는 작동합니다 9e9.
xnor

@xnor 당신은을 놓을 수 []변경 18하기 위해 172 바이트를 저장합니다. lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
밀 마법사

@xnor 최소한 유효한 32 비트 Python 골프 여야합니다. 나는를 없애려고 노력했지만 zip추가 1e9가 나에게 일어난 적이 있다고 생각하지 않는다 ... 고마워!
Dennis

@WheatWizard 좋은 눈. 감사!
Dennis

문자열에 백 슬래시가 있으면 실패합니다.
Lynn

4

Dyalog APL , 21 자 = 39 바이트

t[0~⍨∊⍉(⊢⌸t)[⍋∪t←⍞;]]

t[... 다음과 함께 ] 색인 t (곧 정의)

0~⍨ 에서 제거 된 0

 입대 (편 평화)

 전치

(⊢⌸t)[... ;] 키순 * t , 행 인덱스 ...

   정렬 할 인덱스

   의 독특한 편지

  t←t 의 값을 갖는

   프롬프트 텍스트 입력

TryAPL 온라인!


⊢⌸t행 (직사각형 테이블의 경우 0으로 채워짐)이 각 고유 문자의 인덱스를 t 로 나열하는 테이블을 만듭니다 .


1
어떤 글리프가 더 비쌉니까?
Ren

1
@wptreanor 는 전체 문자를 문자 당 1 바이트 대신 UTF-8로 만듭니다.
Adám

4

C, 109 106 105 104 102 100 97 98 96 91 바이트

f (n)을 재사용 할 수 있도록 j를 초기화하는 데 필요한 최대 98 바이트

strlen B-) 대신 풋을 사용하여 최저 96 바이트

내가 strlen하기 위해 되돌아가는 것이 이상하지만 for (; i ++;) 루프를 제거하여 91 바이트로 줄었습니다. 분명히 풋 페이지는 읽습니다.

"RETURNS
   If successful, the result is a nonnegative integer; otherwise, the result is `EOF'."

... 처음부터 일하는 것이 운이 좋았습니다.

char*c,i,j;f(m){for(j=strlen(m);j;++i)for(c=m;*c;c++)if(*c==i){*c=7,putchar(i),j--;break;}}

테스트 코드 ...

main(c,v)char**v;
{
    char test[] = "If you sort a string you'll typically get something like: ";
    char test2[] = "Hello, World!";

    f(test);puts("");    
    f(test2);puts("");    
}

다음은 몇 가지 테스트 사례입니다. 이제 골프를 밟을 차례입니다.

C:\eng\golf>a.exe
 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
 !,HWdelorlo

첫 번째 테스트 사례에서 후행 공백이 남아 있습니까?
Stewie Griffin

첫 번째 테스트 사례에는 3 개의 후행 공백이 있습니다. 입력 문자열에 후행 공백을 포함하지 않았기 때문입니다. ;-)
cleblanc

4

매스 매 티카, 68 60 59 바이트

Split[Characters@#~SortBy~ToCharacterCode]~Flatten~{2}<>""&

문자열을 받아들입니다. 문자열을 출력합니다.

문자 목록이 허용 된 경우 (46 바이트) :

Split[#~SortBy~ToCharacterCode]~Flatten~{2,1}&

Sort(40 바이트)를 사용하는 버전 :

Split@Sort@Characters@#~Flatten~{2}<>""&

이 버전은 Sort여기서 사용할 수 없기 때문에 내 대답이 될 수 없습니다. Sort문자 코드가 아닌 정식 순서로 정렬합니다.


나는 수학을 모른다. 그래서 이것은 괜찮을 수도 있지만, 당신은 의견 을 읽었 는가?
Stewie Griffin

@StewieGriffin Welp, 아뇨. 나는 그것을 고칠 수는 있지만 String vs Char [] 구별이없는 언어에는 불공평 한 이점을 제공하지 않습니까? 관련 메타 토론
JungHwan Min

좋은 지적. 수정했습니다. 원본 아래의 의견을 참조하십시오. 공정한? 이것이 귀하의 답변이 유효한지 확실하지 않습니다.
Stewie Griffin

@StewieGriffin Mathematica는 문자와 문자열을 구분하지 않습니다. 이 Characters명령 조차 기술적으로 길이 1 문자열 목록을 출력합니다.
JungHwan Min

1
@StewieGriffin 이것 또한 관련이 있다고 생각합니다 . 문자열, 길이 1 문자열 목록, 문자 배열, 바이트 배열 등 합리적인 형식으로 입력을 허용하는 것이 좋습니다.
ngenisis

3

파이썬 2, 77 76 바이트

d={}
def f(c):d[c]=r=d.get(c,c),;return r
print`sorted(input(),key=f)`[2::5]

stdin에서 인용 된 문자열을 입력으로받습니다.

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


함수를 재사용 할 수 있어야하기 때문에 이것이 허용되지 않는다고 생각합니다 . 당신은 그것을 프로그램으로 만들 수 있습니다.
xnor

나는이 방법이 정말 마음에 들며 돌연변이 기능으로 정렬합니다. 튜플의 중첩도 영리합니다.
xnor

@xnor 감사합니다.
flornquake

3

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

f=s=>s&&(a=[...new Set(s)]).sort().join``+f(a.reduce((s,e)=>s.replace(e,``),s))
<input oninput=o.textContent=f(this.value)><pre id=o>

고유 한 문자 집합을 추출하고, 정렬하고, 원래 문자열에서 제거하고, 나머지 문자열의 정렬을 재귀 적으로 계산하여 작동합니다. 내가 찾은 81 바이트 솔루션 :

f=s=>s&&(s=[...s].sort().join``).replace(r=/(.)(\1*)/g,"$1")+f(s.replace(r,"$2"))

3

J , 16 15 바이트

/:+/@(={:)\;"0]

하나의 문자열을 가져 와서 반환하는 동사입니다. 온라인으로 사용해보십시오!

마일은 1 바이트를 절약했습니다. 감사합니다!

설명

여기서 너무 멋진 것은 없습니다 : 주로 발생 순서에 따라, 두 번째로 char 값으로 정렬하십시오.

/:+/@(={:)\;"0]  Input is y.
          \      Map over prefixes:
  +/              Sum
    @(   )        of
      =           bit-array of equality
       {:         with last element.
                 This gives an array of integers whose i'th element is k
                 if index i is the k'th occurrence of y[i].
           ;     Pair this array
            "0   element-wise
              ]  with y
/:               and sort y using it as key.

난 당신이`+ / @ (= {: '괄호의 외부로 요약 이동 바이트를 저장할 수 있다고 생각
마일

@Miles 아, 기차는 무한정이기 때문에. 감사합니다!
Zgarb

3

Mathematica, 55 바이트, 비경쟁

(Sort@Characters@#//.{a___,b_,b_,c___}:>{a,b,c,b})<>""&

편집 : 불행하게도, 매스 매 티카의가 sort있다 하지 문자 코드에 의해하지만, 대문자가 immediatly 소문자를 다음 알파벳 순서에 의해 (즉 Hi There에 정렬됩니다 { , e, e, h, H, i, r, T}).

이것은 패턴을 사용하여 작동합니다.

//.{a___,b_,b_,c___}:>{a,b,c,b}
    a___       c___              (Three _) a zero or more members, named a and c
         b_,b_                   exactly one member, repeated twice (since they have the same name)
                    :>           Delayed Rule (replace left hand side with right hand side.)
                                 Delayed Rule evaluate on each substitution, avoiding conflicts with predefined variables
                      {a,b,c,b}  put one of the b-named member after all other sequences
//.                              repeat until no change (aka Replace Repeated)

1
한 가지 사소한 사항 : 양쪽에 변수가 있기 때문에 (바이트 수 변경 없음) Rule (->)이어야 합니다. 기존 정의와 충돌을 일으킬 수 있습니다. 예를 들어 : 반환 하지 . ( 로 평가 - 당신이 사용하는 경우 , 그 방법 및 유지 반환 ). RuleDelayed (:>)RuleRulea=3;5/.{a_->a}35a_->aa_->3a_:>aa=3;5/.{a_:>a}5
JungHwan Min

질문에 지정된 내용을 수행하지 않기 때문에 정답이 아닌 답변으로 표시했습니다 (정규 순이 아닌 문자 코드로 정렬).
JungHwan Min

@JungHwanMin이 RuleDelayed로 수정되었습니다. 감사.
spacemit

2

Brainf * CK , 458 226 바이트

,[>>>>>>,]<<<<<<[[-<<<+<<<]>>>[>>>[>>>>>>]<<<[>>--[<->--]<-<[>->+<[>]>[<+>-]<<[<]>-]>>.[[-]<]<<<[[>>>>>>+<<<<<<-]<<<]>>>>>>]>>>[>>>[>>>>>>]<<<[>>--[<->--]<-<[>->+<[>]>[<+>-]<<[<]>-]>>[-<+<+>>]<[->>+<<]<[<<<<<<]>>>]>>>]]<<<<<<]

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

Numberwang , 262 226 바이트

8400000087111111442111911170004000400000071114002241202271214020914070419027114170270034427171114400000091111112711170000007000400040000007111400224120227121402091407041902711417027004219190071420091171411111170007000771111117

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

둘 다 동일한 코드이기 때문에 두 가지를 모두 여기에 넣었습니다.


2

PHP, 83 바이트

for($s=count_chars($argv[1]);$s=array_filter($s);$c%=128)echo$s[++$c]--?chr($c):'';

불행히도 당신은 unset삼항식을 가질 수 없으므로 성가신 긴을 사용해야합니다 array_filter.
다음과 같이 사용하십시오.

php -r "for($s=count_chars($argv[1]);$s=array_filter($s);$c%=128)echo$s[++$c]--?chr($c):'';" "If you sort a string you'll typically get something like:"

2

파이썬 2, 70 바이트

f=lambda s,i=0,c='':s[i>>7:]and(s.count(c)>i>>7)*c+f(s,i+1,chr(i%128))

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

이것은 매우 비효율적입니다. 테스트 링크는 변경 i>>7에를i>>5 10000의 재귀 한도에만 최대 126 ASCII 값을 갖는 입력을 가정 설정한다.

div-mod 트릭을 사용 i/128하여 외부 루프의 최소 개수 와 i%128내부 루프의 ASCII 값의 두 루프를 반복 합니다. c문자열에 나타나는 횟수가 최소 개수 이상인 경우 지정된 ASCII 값을 가진 문자 를 포함합니다 .

코드는 트릭을 사용하여 대입을 시뮬레이션 c=chr(i%128)하여 식에서 참조 할 수 있도록합니다 (s.count(c)>i>>7)*c. 파이썬 lambda은 표현식 만 가져 오기 때문에 할당을 허용하지 않습니다. 로 변환def여기서 전체 또는 전체 프로그램으로 것은 여전히 ​​순 손실입니다.

Instead, the function pushes forward the value chr(i%128) to the next recursive call as an optional input. This is off by one because i has been incremented, but doesn't matter as long as the string doesn't contain special character '\x7f' (we could also raise 128 to 256). The initial c='' is harmless.


2

V, 37 36 bytes

Thanks @DJMcMayhem for the byte!

Í./&ò
dd:sor
Íî
òͨ.©¨±«©±À!¨.«©/±³²

Try it online!

Not sure I like the regex at the end, but I needed to make the ò break somehow.

Explain

Í./&ò                    #All chars on their own line
dd:sor                   #Delete empty line, sort chars
Íî                       #Join all lines together s/\n//
òͨ.©¨±«©±À!¨.«©/±³² #until breaking s/\v(.)(\1+)\1@!(.+)/\3\2\1

Íî (or :%s/\n//g) is shorter than VGgJ
DJMcMayhem

1

Perl 6, 68 bytes

{my \a=.comb.sort;[~] flat roundrobin |a.squish.map({grep *eq$_,a})}

I was a little surprised to find that there's no built-in way to group like elements in a list. That's what the squish-map bit does.


1
I get "This Seq has already been iterated" unless I rename a to @a (+2 bytes). Also, grep *eq$_, can be written grep $_, (-3 bytes) since a string is a valid smart-matcher.
smls

1
{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]} -- This variation is only 54 bytes.
smls

@smis I don't see that error. Maybe we're using different versions? I'm on rakudo-star-2016.10. Anyway, your solution puts mine to shame, you should post it as a separate answer.
Sean

I'm using a bleeding-edge Rakudo compiled from the main branch of the git repo this week. Anyway, I posted the classify-based solution as a separate answer now.
smls

1

JavaScript (ES6), 77 75 bytes

s=>(a=[],x={},[...s].sort().map(c=>a[x[c]=n=-~x[c]]=(a[n]||'')+c),a).join``

Stable sorts the lexicographically sorted string by nth occurence

F=s=>(a=[],x={},[...s].sort().map(c=>a[x[c]=n=-~x[c]]=(a[n]||'')+c),a).join``

const update = () => {
  console.clear();
  console.log(F(input.value));
};
input.oninput = update;
update();
#input {
  width: 100%;
  box-sizing: border-box;
}
<input id="input" type="text" value="         ':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy" length=99/>
<div id="output"></div>


1+~~ is the same as -~.
Neil

@Neil Awesome thanks -2 bytes
George Reith

1

Perl 6, 54 bytes

{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}

Explanation:

  • { }: A lambda that takes one argument -- e.g. 21211.
  • .comb: Split the input argument into a list of characters -- e.g. (2,1,2,1,1).
  • .classify(~*): Group the characters using string comparison as the grouping condition, returning an unordered Hash -- e.g. { 2=>[2,2], 1=>[1,1,1] }.
  • {*}: Return a list of all values of the Hash -- e.g. [2,2], [1,1,1].
  • .sort: Sort it -- e.g. [1,1,1], [2,2].
  • »[*]: Strip the item containers the arrays were wrapped in due to being in the hash, so that they won't be considered as a single item in the following step -- e.g. (1,1,1), (2,2).
  • roundrobin |: Zip the sub-lists until all are exhausted -- e.g. (1,2), (1,2), (1).
  • flat: Flatten the result -- e.g. 1, 2, 1, 2, 1.
  • [~]: Concatenate it to get a string again -- e.g. 12121.

(Credit for the roundrobin approach goes to Sean's answer.)


1

05AB1E, 15 bytes

{.¡"ä"©¹g׫øJ®K

Try it online! or as a Test suite

Explanation

{                # sort input
 .¡              # group by equal elements
   "ä"©          # push "ä" and store a copy in the register
       ¹g×       # repeat the "ä" input-nr times
          «      # concatenate the result to each string in the grouped input
           ø     # zip
            J    # join to string
             ®K  # remove all instances of "ä" in the string

10 of the 15 bytes are for getting around 05AB1E's way of handling zipping strings of different length.


1

FSharp, 194 190 170 140 133 bytes

let f=Seq.map
let(@)=(>>)
f int@Seq.groupBy id@f(snd@Seq.mapi((*)128@(+)))@Seq.concat@Seq.sort@f((%)@(|>)128@byte)@Array.ofSeq@f char

Using Seq instead of Array saves a couple of bytes

Defining a shorter name, and using another maps to avoid a (fun ->) block

It turns out F# can map a char to an in, so removing the shortened name of System.Text.Encoding.ASCII, and adding in another map saves me 20 bytes!

Returning a char array instead of a string, saves me 30 bytes!

I no longer need to make sure it's a string, saves me 7 bytes


0

JavaScript (ES6), 114 bytes

Separated with newline for clarity, not part of byte count:

s=>[...s].map(a=>(m[a]=-~m[a])*128+a.charCodeAt(),m={})
.sort((a,b)=>a-b).map(a=>String.fromCharCode(a%128)).join``

Demo

`**Test cases:**
 *:Tacest*es*s*

If you sort a string you'll typically get something like:
 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    

Hello, World!
 !,HWdelorlol

#MATLAB, 114 bytes
 #,14ABLMTbesty 1A

f=@(s)[mod(sort(cell2mat(cellfun(@(c)c+128*(0:nnz(c)-1),mat2cell(sort(s),1,histc(s,unique(s))),'un',0))),128),''];
'()*+,-0128:;=@[]acdefhilmnoqrstuz'(),0128@acefilmnorstu'(),12celmnostu'(),12celnstu(),clnst(),cls(),cs(),()()()()`.split`\n\n`.map(s=>(p=s.split`\n`,console.log(`${p[0]}\n\n${r=f(p[0])}\n\nmatch: ${r==p[1]}`)),
f=s=>[...s].map(a=>(m[a]=-~m[a])*128+a.charCodeAt(),m={}).sort((a,b)=>a-b).map(a=>String.fromCharCode(a%128)).join``)


The same bytecount as my Matlab code, and the exact same approach. Haven't attempted to golf mine yet though. I'll probably upvote later if you add an explanation :-) (I've made a principle out of not upvoting answers without explanations, even when I understand it) :-)
Stewie Griffin

0

Clojure, 79 bytes

#(for[V[(group-by(fn[s]s)%)]i(range 1e9)k(sort(keys V))c[(get(V k)i)]:when c]c)

An anonymous function, returns a sequence of characters. Supports up-to 10^9 repetitions of any characters, which should be plenty.



0

Ruby, 59+1 = 60 bytes

Adds one byte for the -n flag. Port of @PatrickRoberts' dictionary solution.

d={};print *$_.chars.sort_by{|c|d[c]||=0;c.ord+128*d[c]+=1}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.