If you sort a string you'll typically get something like:
':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy
Yes, that was the first sentence sorted.
As you can see, there are a lot of repeated characters, aa
, eee
, ttttt
, 9 spaces and so on.
If we add 128
to the ASCII-value of the first duplicate, 256
to the second, 384
to the third and so on, sort it again and output the new string (modulus 128 to get the same characters back) we get the string:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
(Note the single leading space and the 4 trailing spaces).
The string is "sequentially sorted" <space>':I....uy
, <space>aeg....uy
, <space>egi....ty
, <space>iloty
, <space>lt
, <space>
, <space>
,<space>
, <space>
.
It might be easier to visualize this if we use a string with digits in it. The string 111222334
will when "sorted" be: 123412312
.
Challenge:
To no surprise, the challenge is to write a code that sorts a string according to the description above.
You can assume that the input string will contain only printable ASCII-characters in the range 32-126 (space to tilde).
Test cases:
**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(),()()()()
This is code-golf, so the shortest code in each language counted in bytes will winref .
32 Answers 32
Pyth, 5 bytes
s.T.g
Very straightforward: Group and sort, transpose, concatenate.
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.
-
\$\begingroup\$ Pyth has everything to become new J, it's awesome \$\endgroup\$shabunc– shabunc2017年01月12日 01:36:41 +00:00Commented Jan 12, 2017 at 1:36
-
4\$\begingroup\$ @shabunc If you want to see the new J, check out github.com/DennisMitchell/jelly \$\endgroup\$izzyg– izzyg2017年01月12日 04:51:34 +00:00Commented Jan 12, 2017 at 4:51
Jelly, 3 bytes
ĠZị
How it works
Oh boy, this challenge was all but made for Jelly.
The group atom (Ġ
) takes an array1 as input and groups indices that correspond to identical elements of the array. The array of index groups is sorted with the corresponding elements as keys, which is precisely the order we require for this challenge.
Next, the zip atom (Z
) transposes rows and columns of the generated (ragged) matrix of indices. This simply consists of reading the columns of the matrix, skipping elements that are not present in that column. As a result, we get the first index of the character with the lowest code point, followed by the first index of the character with the second lowest code point, ... followed by the second index of the character with the lowest code point, etc.
Finally, the unindex atom (ị
) retrieves the elements of the input array at all of its indices in the generated order. The result is a 2D character array, which Jelly flattens before printing it.
1 Jelly doesn't have a string type, just arrays of characters.
-
\$\begingroup\$ "Oh boy, this challenge was all but made for Jelly." -> 3 byte answer \$\endgroup\$geisterfurz007– geisterfurz0072017年01月12日 11:29:50 +00:00Commented Jan 12, 2017 at 11:29
-
\$\begingroup\$ As I said, almost made for Jelly. :) \$\endgroup\$Dennis– Dennis2017年01月12日 12:54:36 +00:00Commented Jan 12, 2017 at 12:54
Python 3, (削除) 109 (削除ここまで) (削除) 105 (削除ここまで) (削除) 104 (削除ここまで) (削除) 103 (削除ここまで) (削除) 99 (削除ここまで) (削除) 93 (削除ここまで) (削除) 90 (削除ここまで) (削除) 88 (削除ここまで) (削除) 81 (削除ここまで) (削除) 79 (削除ここまで) 69 bytes
2 bytes saved thanks to FlipTack
7 bytes saved because flornquake caught my dumb error
2 bytes saved thanks to xnor
10 bytes saved thanks to Dennis
a=[*input()]
while a:
for c in sorted({*a}):print(end=c);a.remove(c)
Explanation
We start by converting our string to a list using a splat and storing that list in a variable a
. Then while our a
is not the empty list we go through each unique member of a
in sorted order, print it and remove a copy of that character from the list.
Each iteration prints thus prints one copy of each character present in a
.
-
1\$\begingroup\$ @StewieGriffin
set
is an unsorted set. \$\endgroup\$FlipTack– FlipTack2017年01月10日 22:03:16 +00:00Commented Jan 10, 2017 at 22:03 -
2\$\begingroup\$ @StewieGriffin when printed they are sorted but not by their ASCII values exactly. It often appears they are but I believe they are sorted by some type of hash. \$\endgroup\$2017年01月10日 22:05:40 +00:00Commented Jan 10, 2017 at 22:05
-
1\$\begingroup\$ You can make
f
a string instead of a list to save a few bytes. \$\endgroup\$flornquake– flornquake2017年01月11日 03:08:37 +00:00Commented Jan 11, 2017 at 3:08 -
1\$\begingroup\$ If you take
a=list(input())
, you can doa.remove(c)
, which is a net savings. \$\endgroup\$xnor– xnor2017年01月11日 03:43:04 +00:00Commented Jan 11, 2017 at 3:43 -
1\$\begingroup\$ Switching to Python 3 would save a lot of bytes. tio.run/nexus/… \$\endgroup\$Dennis– Dennis2017年01月11日 04:12:39 +00:00Commented Jan 11, 2017 at 4:12
Haskell, 44 bytes
import Data.List
concat.transpose.group.sort
Usage example:
Prelude Data.List> concat.transpose.group.sort $ "If you sort a string you'll typically get something like:"
" ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt "
Sort, group equal chars to a list of strings (e.g. "aabbc"
-> ["aa","bb","c"]
), transpose and flatten into a single string, again.
-
\$\begingroup\$ This might be stupid thing to ask but how does this adds 128,256,384.... to the repeated values? \$\endgroup\$Jayant Choudhary– Jayant Choudhary2022年01月19日 05:44:54 +00:00Commented Jan 19, 2022 at 5:44
Python 2, 75 bytes
lambda s:`zip(*sorted((s[:i].count(c),c)for i,c in enumerate(s)))[1]`[2::5]
-
1\$\begingroup\$ Don't know if it's valid but
lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]
works for strings with max length9e9
. \$\endgroup\$xnor– xnor2017年01月11日 04:22:07 +00:00Commented Jan 11, 2017 at 4:22 -
\$\begingroup\$ @xnor you can drop the
[]
and change18
to17
to save two bytes.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
\$\endgroup\$2017年01月11日 04:38:00 +00:00Commented Jan 11, 2017 at 4:38 -
\$\begingroup\$ @xnor At the very least, this should be a valid 32-bit Python golf. I tried to get rid off the
zip
, but I don't think adding1e9
would have ever occurred to me... Thanks! \$\endgroup\$Dennis– Dennis2017年01月11日 04:45:04 +00:00Commented Jan 11, 2017 at 4:45 -
\$\begingroup\$ @WheatWizard Good eye. Thanks! \$\endgroup\$Dennis– Dennis2017年01月11日 04:45:52 +00:00Commented Jan 11, 2017 at 4:45
-
\$\begingroup\$ This fails if the string has backslashes in it. \$\endgroup\$lynn– lynn2017年01月12日 03:02:28 +00:00Commented Jan 12, 2017 at 3:02
APL (Dyalog Unicode), (削除) 21 (削除ここまで) 20 bytes
t[0~⍨∊⍉(⊂⍋∪t)⌷⊢⌸t←⍞]
t[
...]
index t (to be defined shortly) with...
0~⍨
zeros removed from
∊
the enlisted (flattened)
⍉
transposed
(⊂
...)⌷
reordered using...
⍋
the indices which would sort
∪
the unique letters of
t
t (to be defined shortly)
⊢⌸t
keyed* t, which has the value of
⍞
prompted text input
* ⊢⌸t
creates a table where the rows (padded with zeros for a rectangular table) list each unique letters' indices in t.
-
1\$\begingroup\$ which of the glyphs are more expensive? \$\endgroup\$ren– ren2017年01月11日 06:39:01 +00:00Commented Jan 11, 2017 at 6:39
-
\$\begingroup\$ @ren Updated to use new technology that allows counting each glyph as a single byte. \$\endgroup\$Adám– Adám2022年01月19日 08:43:01 +00:00Commented Jan 19, 2022 at 8:43
C, (削除) 109 (削除ここまで) (削除) 106 (削除ここまで) (削除) 105 (削除ここまで) (削除) 104 (削除ここまで) (削除) 102 (削除ここまで) (削除) 100 (削除ここまで) (削除) 97 (削除ここまで) (削除) 98 (削除ここまで) (削除) 96 (削除ここまで) 91 Bytes
(削除) Back up to 98 Bytes, needed to initialize j to make f(n) re-useable (削除ここまで)
(削除) Down to 96 Bytes using puts in place of strlen B-) (削除ここまで)
It's strange I had to back to strlen but I got rid of the for(;i++;) loop so now it's down to 91 Bytes. Apparently the man page for puts reads;
"RETURNS
If successful, the result is a nonnegative integer; otherwise, the result is `EOF'."
... I was lucky it was working in the first place
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;}}
test code...
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("");
}
Here are a few test cases, now it's time to golf this down
C:\eng\golf>a.exe
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
!,HWdelorlo
-
\$\begingroup\$ Are the trailing spaces left out in the first test case? \$\endgroup\$Stewie Griffin– Stewie Griffin2017年01月10日 22:07:41 +00:00Commented Jan 10, 2017 at 22:07
-
\$\begingroup\$ I have three trailing spaces in the first test case... That's because I didn't include the trailing space on the input string ;-) \$\endgroup\$cleblanc– cleblanc2017年01月10日 22:10:07 +00:00Commented Jan 10, 2017 at 22:10
Mathematica, (削除) 68 (削除ここまで) (削除) 60 (削除ここまで) 59 bytes
Split[Characters@#~SortBy~ToCharacterCode]~Flatten~{2}<>""&
Accepts a String. Outputs a String.
If list of characters were allowed (46 bytes):
Split[#~SortBy~ToCharacterCode]~Flatten~{2,1}&
Version using Sort
(40 bytes):
Split@Sort@Characters@#~Flatten~{2}<>""&
This version cannot be my answer because Sort
cannot be used here; Sort
sorts by canonical order, not by character code.
-
\$\begingroup\$ I don't know mathematica so this might be just fine, but did you read this comment? \$\endgroup\$Stewie Griffin– Stewie Griffin2017年01月10日 23:22:38 +00:00Commented Jan 10, 2017 at 23:22
-
\$\begingroup\$ @StewieGriffin Welp, nope. I can fix that, but doesn't that give an unfair advantage to languages that don't have a String vs Char[] distinction? Related meta discussion \$\endgroup\$JungHwan Min– JungHwan Min2017年01月10日 23:29:27 +00:00Commented Jan 10, 2017 at 23:29
-
\$\begingroup\$ Good point. I made a correction, see the comment below the original. Fair? I'm not sure if this makes your answer valid or not. \$\endgroup\$Stewie Griffin– Stewie Griffin2017年01月10日 23:42:02 +00:00Commented Jan 10, 2017 at 23:42
-
\$\begingroup\$ @StewieGriffin Mathematica doesn't have a distinction between characters and strings. Even the
Characters
command technically output a list of length-1 strings. \$\endgroup\$JungHwan Min– JungHwan Min2017年01月10日 23:58:49 +00:00Commented Jan 10, 2017 at 23:58 -
1\$\begingroup\$ @StewieGriffin I think this is also relevant. I think it's better to allow the input in any reasonable format, be it a string, list of length 1 strings, array of characters, array of bytes, etc. \$\endgroup\$user61980– user619802017年01月11日 01:47:30 +00:00Commented Jan 11, 2017 at 1:47
Python 2, (削除) 77 (削除ここまで) 76 bytes
d={}
def f(c):d[c]=r=d.get(c,c),;return r
print`sorted(input(),key=f)`[2::5]
Takes a quoted string as input from stdin.
-
\$\begingroup\$ I think this isn't allowed because functions have to be re-usable. You could make it a program. \$\endgroup\$xnor– xnor2017年01月11日 03:33:25 +00:00Commented Jan 11, 2017 at 3:33
-
\$\begingroup\$ I really like this method, sorting with a function that mutates. The nesting of tuples is clever too. \$\endgroup\$xnor– xnor2017年01月11日 04:10:45 +00:00Commented Jan 11, 2017 at 4:10
-
\$\begingroup\$ @xnor Thanks, fixed. \$\endgroup\$flornquake– flornquake2017年01月11日 09:20:39 +00:00Commented Jan 11, 2017 at 9:20
JavaScript (ES6), 79 bytes
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>
Works by extracting the set of unique characters, sorting it, removing them from the original string, and recursively calculating the sort of the rest of the string. 81 byte solution that I found interesting:
f=s=>s&&(s=[...s].sort().join``).replace(r=/(.)(1円*)/g,"1ドル")+f(s.replace(r,"2ドル"))
J, (削除) 16 (削除ここまで) 15 bytes
/:+/@(={:)\;"0]
This is a verb that takes and returns one string. Try it online!
Miles saved a byte, thanks!
Explanation
Nothing too fancy here: sort primarily by order of occurrence, secondarily by char value.
/:+/@(={:)\;"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.
-
\$\begingroup\$ I think you can save a byte moving summation to the outside of the parentheses `+/@(={:)` \$\endgroup\$miles– miles2017年01月12日 09:15:23 +00:00Commented Jan 12, 2017 at 9:15
-
\$\begingroup\$ @Miles Oh yeah, because a train has infinite rank. Nice, thanks! \$\endgroup\$Zgarb– Zgarb2017年01月12日 09:19:32 +00:00Commented Jan 12, 2017 at 9:19
Brainf*ck, (削除) 458 (削除ここまで) 226 bytes
,[>>>>>>,]<<<<<<[[-<<<+<<<]>>>[>>>[>>>>>>]<<<[>>--[<->--]<-<[>->+<[>]>[<+>-]<<[<]>-]>>.[[-]<]<<<[[>>>>>>+<<<<<<-]<<<]>>>>>>]>>>[>>>[>>>>>>]<<<[>>--[<->--]<-<[>->+<[>]>[<+>-]<<[<]>-]>>[-<+<+>>]<[->>+<<]<[<<<<<<]>>>]>>>]]<<<<<<]
Numberwang, (削除) 262 (削除ここまで) 226 bytes
8400000087111111442111911170004000400000071114002241202271214020914070419027114170270034427171114400000091111112711170000007000400040000007111400224120227121402091407041902711417027004219190071420091171411111170007000771111117
I put both of these here because they are identical code.
PHP, 83 bytes
for($s=count_chars($argv[1]);$s=array_filter($s);$c%=128)echo$s[++$c]--?chr($c):'';
Unfortunately you can't have unset
in a ternary so I need to use the annoyingly long array_filter
.
Use like:
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:"
Python 2, 70 bytes
f=lambda s,i=0,c='':s[i>>7:]and(s.count(c)>i>>7)*c+f(s,i+1,chr(i%128))
This is very inefficient. The test link changes the i>>7
to i>>5
and sets the recursion limit to 10000. Assumes the inputs only has ASCII values up to 126.
Uses the div-mod trick to iterate through two loops: minimum counts i/128
in the outer loop and ASCII values i%128
in the inner loop. Includes a character c
with the given ASCII value if the number of times it appears in the string is at least its minimum count.
The code uses a trick to simulate the assignment c=chr(i%128)
so that it can be referenced in the expression (s.count(c)>i>>7)*c
. Python lambda
s do not allow assignment because they only take expressions. Converting to a def
or full program is still a net loss here.
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.
V, (削除) 37 (削除ここまで) 36 bytes
Thanks @DJMcMayhem for the byte!
Í./&ò
dd:sor
Íî
òÍ ̈.© ̈±«©±À! ̈.«©/±32
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//
òÍ ̈.© ̈±«©±À! ̈.«©/±32 #until breaking s/\v(.)(1円+)1円@!(.+)/3円2円1円
-
\$\begingroup\$
Íî
(or:%s/\n//g
) is shorter thanVGgJ
\$\endgroup\$DJMcMayhem– DJMcMayhem2017年01月12日 15:40:41 +00:00Commented Jan 12, 2017 at 15:40
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\$\begingroup\$ I get "This Seq has already been iterated" unless I rename
a
to@a
(+2 bytes). Also,grep *eq$_,
can be writtengrep $_,
(-3 bytes) since a string is a valid smart-matcher. \$\endgroup\$smls– smls2017年01月11日 14:25:58 +00:00Commented Jan 11, 2017 at 14:25 -
1\$\begingroup\$
{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
-- This variation is only 54 bytes. \$\endgroup\$smls– smls2017年01月11日 14:45:18 +00:00Commented Jan 11, 2017 at 14:45 -
\$\begingroup\$ @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. \$\endgroup\$Sean– Sean2017年01月11日 17:33:19 +00:00Commented Jan 11, 2017 at 17:33
-
\$\begingroup\$ 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. \$\endgroup\$smls– smls2017年01月11日 18:43:20 +00:00Commented Jan 11, 2017 at 18:43
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>
-
\$\begingroup\$
1+~~
is the same as-~
. \$\endgroup\$Neil– Neil2017年01月11日 09:34:42 +00:00Commented Jan 11, 2017 at 9:34
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.)
05AB1E, 15 bytes
{.¡"ä"©1g×ばつ«ø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
1g×ばつ # 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.
FSharp, (削除) 194 (削除ここまで) (削除) 190 (削除ここまで) (削除) 170 (削除ここまで) (削除) 140 (削除ここまで) 133 bytes
let f=Seq.map
let(@)=(>>)
f [email protected] id@f([email protected]((*)128@(+)))@[email protected]@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
JavaScript (Node.js), 71 bytes
f=x=>x&&[...x].filter(k=c=>k[c]?![h+=c]:k[c]=1,h='').sort().join``+f(h)
R, 89 bytes
f=\(S,U=utf8ToInt(S),`+`=intToUtf8)if(sum(U)){cat(+sort(unique(U)));f(+U[duplicated(U)])}
Recursive function with a name :D which works in 2 simple steps:
- prints sorted unique characters
- the rest of the string is passed again to the workflow.
Stops once the input is empty.
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``)
-
\$\begingroup\$ 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) :-) \$\endgroup\$Stewie Griffin– Stewie Griffin2017年01月10日 23:51:44 +00:00Commented Jan 10, 2017 at 23:51
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.
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}
,Safginorst orst ort
:P \$\endgroup\$