Sortir string, semacam

29

Jika Anda mengurutkan string, Anda biasanya akan mendapatkan sesuatu seperti:

         ':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy

Ya, itu adalah kalimat pertama yang disortir.

Seperti yang Anda lihat, ada banyak karakter berulang, aa, eee, ttttt, 9 ruang dan sebagainya.

Jika kita menambah 128nilai ASCII dari duplikat pertama, 256ke yang kedua, 384ke yang ketiga dan seterusnya, urutkan lagi dan hasilkan string baru (modulus 128 untuk mendapatkan karakter yang sama kembali) kita mendapatkan string:

 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    

(Perhatikan satu spasi utama dan 4 spasi tambahan).

String "berurutan diurutkan" <space>':I....uy, <space>aeg....uy, <space>egi....ty, <space>iloty, <space>lt, <space>, <space>, <space>, <space>.

Mungkin lebih mudah untuk memvisualisasikan ini jika kita menggunakan string dengan angka di dalamnya. String 111222334akan ketika "diurutkan" menjadi: 123412312.

Tantangan:

Tidak mengherankan, tantangannya adalah menulis kode yang mengurutkan string sesuai dengan deskripsi di atas.

Anda dapat mengasumsikan bahwa string input hanya akan berisi karakter ASCII yang dapat dicetak dalam kisaran 32-126 (ruang untuk tilde).


Kasus uji:

**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(),()()()()

Ini adalah , jadi kode terpendek di setiap bahasa yang dihitung dalam byte akan memenangkan ref .

Stewie Griffin
sumber
Judul agak membingungkan, membuat saya berpikir dan mengabaikan deskripsi: tio.run/nexus/05ab1e#@1@td2jh4ZVe//... Tantangan yang bagus jika tidak, saya akan berusaha mengembangkannya untuk memenuhi brief.
Guci Gurita Ajaib
Bisakah kita menampilkan daftar karakter daripada string?
Wheat Wizard
Jika Anda dapat memasukkan string, maka output juga harus berupa string. Jika daftar karakter adalah cara normal memasukkan dan mengeluarkan string dalam bahasa Anda, maka OK. Misalnya Anda tidak dapat menghasilkan {'S', 'g', 'i', 'n', 'r', 't'}dalam Python, karena cara "normal" untuk melakukannya adalah "String".
Stewie Griffin
Saya akan memperbaiki komentar saya di atas: string adalah daftar karakter , sehingga daftar karakter diterima. Namun, daftar string tidak diterima. Ini berarti, jika memungkinkan untuk menambahkan karakter kedua ke elemen dalam daftar Anda maka itu tidak diterima. Sebagai contoh: {'a','b'}tidak diterima di Matlab karena Anda dapat menambahkan karakter untuk masing-masing karakter seperti ini: {'aa','b'}. Input dan output Anda harus dalam format yang sama.
Stewie Griffin
@StewieGriffin Ketika Anda mengatakan diurutkan sesuai dengan deskripsi di atas. Apakah maksud Anda algoritma pengurutan saya harus mengikuti proses memodifikasi nilai ASCII atau hanya harus menghasilkan output yang sama dengan algoritma itu?
George Reith

Jawaban:

15

Pyth, 5 byte

s.T.g

Suite uji

Sangat mudah: Kelompokkan dan urutkan, transpos, digabungkan.

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.
isaacg
sumber
Pyth memiliki segalanya untuk menjadi J baru, ini luar biasa
shabunc
3
@shabunc Jika Anda ingin melihat J baru, lihat github.com/DennisMitchell/jelly
isaacg
13

Jelly , 3 byte

ĠZị

Cobalah online!

Bagaimana itu bekerja

Oh nak, tantangan ini dibuat untuk Jelly.

The kelompok atom ( Ġ) mengambil array 1 sebagai indeks masukan dan kelompok yang sesuai dengan unsur-unsur yang identik dari array. Array grup indeks diurutkan dengan elemen yang sesuai sebagai kunci, yang merupakan urutan yang kami butuhkan untuk tantangan ini.

Selanjutnya, atom zip (Z ) mentransposisi baris dan kolom dari matriks indeks yang dihasilkan (kasar). Ini hanya terdiri dari membaca kolom dari matriks, melewatkan elemen yang tidak ada dalam kolom itu. Sebagai hasilnya, kita mendapatkan indeks karakter pertama dengan titik kode terendah, diikuti oleh indeks pertama karakter dengan titik kode terendah kedua, ... diikuti oleh indeks karakter kedua dengan titik kode terendah, dll.

Akhirnya, atom unindex ( ) mengambil elemen array input di semua indeksnya dalam urutan yang dihasilkan. Hasilnya adalah array karakter 2D, yang Jelly rata sebelum mencetaknya.


1 Jelly tidak memiliki tipe string , hanya array karakter.

Dennis
sumber
"Oh nak, tantangan ini dibuat untuk Jelly." -> 3 byte jawaban
geisterfurz007 Hentikan kekacauan ini
Seperti yang saya katakan, hampir dibuat untuk Jelly. :)
Dennis
10

Python 3, 109 105 104 103 99 93 90 88 81 79 69 byte

2 byte disimpan berkat FlipTack

7 byte disimpan karena flornquake menangkap kesalahan bodoh saya

2 byte disimpan berkat xnor

10 byte disimpan berkat Dennis

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

Penjelasan

Kami mulai dengan mengubah string kami ke daftar menggunakan percikan dan menyimpan daftar itu dalam sebuah variabel a. Kemudian, sementara kami abukan daftar kosong, kami memeriksa setiap anggota unik adalam urutan, cetak dan hapus salinan karakter itu dari daftar.

Setiap iterasi mencetak dengan demikian mencetak satu salinan dari setiap karakter yang ada di a .

Wisaya Gandum
sumber
1
@StewieGriffin setadalah set yang tidak disortir.
FlipTack
2
@StewieGriffin ketika dicetak mereka diurutkan tetapi tidak dengan nilai ASCII mereka persis. Ini sering muncul tetapi saya percaya mereka diurutkan berdasarkan beberapa jenis hash.
Wheat Wizard
1
Anda dapat membuat fstring alih-alih daftar untuk menyimpan beberapa byte.
flornquake
1
Jika Anda mengambil a=list(input()), Anda bisa melakukannya a.remove(c), yang merupakan penghematan bersih.
xnor
1
Beralih ke Python 3 akan menghemat banyak byte. tio.run/nexus/…
Dennis
6

Haskell, 44 byte

import Data.List
concat.transpose.group.sort

Contoh penggunaan:

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

Urutkan, kelompok karakter yang sama dengan daftar string (misalnya "aabbc"-> ["aa","bb","c"]), transpos dan ratakan menjadi satu string, lagi.

nimi
sumber
6

Python 2 , 75 byte

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

Cobalah online!

Dennis
sumber
1
Tidak tahu apakah itu valid tetapi lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]berfungsi untuk string dengan panjang maksimal 9e9.
xnor
@ xnatau Anda dapat menjatuhkan []dan mengubah 18ke 17untuk menyimpan dua byte. lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
Wheat Wizard
@ xnor Paling tidak, ini harus menjadi golf Python 32-bit yang valid. Saya mencoba untuk menyingkirkan zip, tetapi saya tidak berpikir menambahkan 1e9akan pernah terjadi pada saya ... Terima kasih!
Dennis
@WheatWizard Mata yang bagus. Terima kasih!
Dennis
Ini gagal jika string memiliki garis miring terbalik di dalamnya.
Lynn
4

Dyalog APL , 21 karakter = 39 byte

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

t[... ] indeks t (akan didefinisikan segera) dengan ...

0~⍨ nol dihapus dari

 yang terdaftar (diratakan)

 ditransposisikan

(⊢⌸t)[... ;] dikunci * t , diindeks baris oleh ...

   indeks yang akan diurutkan

   surat unik dari

  t←t , yang memiliki nilai

   input teks yang diminta

TryAPL online!


⊢⌸tmembuat tabel di mana baris (diisi dengan nol untuk tabel persegi panjang) daftar masing-masing indeks huruf unik di t .

Adm
sumber
1
mana dari mesin terbang yang lebih mahal?
ren
1
@ wptreanor menyebabkan semuanya menjadi UTF-8, bukan satu byte per karakter.
Adám
4

C, 109 106 105 104 102 100 97 98 96 91 Bytes

Cadangkan hingga 98 Bytes, diperlukan untuk menginisialisasi j agar f (n) dapat digunakan kembali

Turun ke 96 Bytes menggunakan menempatkan strlen B-)

Sungguh aneh saya harus kembali ke strlen tapi saya menyingkirkan for (; i ++;) loop jadi sekarang turun ke 91 Bytes. Tampaknya halaman manual untuk menempatkan dibaca;

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

... Saya beruntung itu bekerja di tempat pertama

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;}}

kode uji ...

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("");    
}

Berikut adalah beberapa kasus uji, sekarang saatnya untuk memainkan golf ini

C:\eng\golf>a.exe
 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
 !,HWdelorlo
Cleblanc
sumber
Apakah spasi tambahan tertinggal dalam test case pertama?
Stewie Griffin
Saya memiliki tiga spasi tambahan dalam kasus uji pertama ... Itu karena saya tidak memasukkan spasi tambahan pada string input ;-)
cleblanc
4

Mathematica, 68 60 59 byte

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

Menerima String. Menghasilkan String.

Jika daftar karakter diizinkan (46 byte):

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

Versi menggunakan Sort(40 byte):

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

Versi ini tidak dapat menjadi jawaban saya karena Sorttidak dapat digunakan di sini; Sortmengurutkan berdasarkan urutan kanonik, bukan dengan kode karakter.

JungHwan Min
sumber
Saya tidak tahu matematika jadi ini mungkin baik-baik saja, tetapi apakah Anda membaca komentar ini ?
Stewie Griffin
@StewieGriffin Welp, tidak. Saya dapat memperbaikinya, tetapi bukankah itu memberikan keuntungan yang tidak adil untuk bahasa yang tidak memiliki perbedaan String vs Char []? Terkait diskusi meta
JungHwan Min
Poin bagus. Saya melakukan koreksi, lihat komentar di bawah aslinya. Adil? Saya tidak yakin apakah ini membuat jawaban Anda valid atau tidak.
Stewie Griffin
@StewieGriffin Mathematica tidak memiliki perbedaan antara karakter dan string. Bahkan Charactersperintah secara teknis menampilkan daftar string panjang-1.
JungHwan Min
1
@StewieGriffin Saya pikir ini juga relevan . Saya pikir lebih baik untuk mengizinkan input dalam format yang masuk akal, baik itu string, daftar panjang 1 string, array karakter, array byte, dll.
ngenisis
3

Python 2, 77 76 byte

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

Mengambil string yang dikutip sebagai input dari stdin.

Cobalah online!

gempa bumi
sumber
Saya pikir ini tidak diperbolehkan karena fungsi harus dapat digunakan kembali . Anda bisa menjadikannya sebuah program.
xnor
Saya sangat suka metode ini, menyortir dengan fungsi yang bermutasi. Sarang tuple juga pintar.
xnor
@ xnor Terima kasih, sudah diperbaiki.
flornquake
3

JavaScript (ES6), 79 byte

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>

Bekerja dengan mengekstraksi himpunan karakter unik, mengurutkannya, menghapusnya dari string asli, dan secara rekursif menghitung jenis sisa string. Solusi 81 byte yang menurut saya menarik:

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

J , 16 15 byte

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

Ini adalah kata kerja yang mengambil dan mengembalikan satu string. Cobalah online!

Miles menyimpan satu byte, terima kasih!

Penjelasan

Tidak ada yang terlalu mewah di sini: urutkan berdasarkan urutan kejadian, kedua berdasarkan nilai 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.
Zgarb
sumber
Saya pikir Anda dapat menyimpan penjumlahan byte yang bergerak ke luar tanda kurung `+ / @ (= {:)`
mil
@Miles Oh yeah, karena kereta memiliki peringkat yang tak terbatas. Terima kasih banyak!
Zgarb
3

Mathematica, 55 byte, tidak bersaing

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

Edit: Sayangnya, Mathematica ini sortadalah tidak dengan kode karakter, tetapi dengan urutan abjad, di mana huruf besar immediatly berikut huruf kecil (yaituHi There diurutkan ke { , e, e, h, H, i, r, T}).

Ini bekerja menggunakan pola:

//.{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)
pesawat ruang angkasa
sumber
1
Satu hal kecil: Rule (->)harus RuleDelayed (:>)(tidak ada perubahan dalam jumlah byte) karena kedua sisi Rulememiliki variabel. Ruledapat menyebabkan konflik dengan definisi yang sudah ada sebelumnya. Misalnya: a=3;5/.{a_->a}mengembalikan 3, bukan 5. ( a_->amengevaluasi ke a_->3- jika Anda menggunakannya a_:>a, tetap seperti itu dan a=3;5/.{a_:>a}kembali 5).
JungHwan Min
Saya menandai jawaban Anda yang tidak bersaing karena tidak melakukan apa yang ditentukan oleh pertanyaan (urutkan berdasarkan kode karakter, bukan dalam urutan kanonik).
JungHwan Min
@JungHwanMin diperbaiki ke RuleDelayed. Terima kasih.
spacemit
2

Brainf * ck , 458 226 byte

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

Cobalah online! - BF

Numberwang , 262 226 byte

8400000087111111442111911170004000400000071114002241202271214020914070419027114170270034427171114400000091111112711170000007000400040000007111400224120227121402091407041902711417027004219190071420091171411111170007000771111117

Cobalah online! - NW

Saya meletakkan keduanya di sini karena mereka adalah kode yang identik.

JungHwan Min
sumber
2

PHP, 83 byte

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

Sayangnya Anda tidak dapat memiliki unsetdi ternary jadi saya harus menggunakan lama yang mengganggu array_filter.
Gunakan seperti:

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:"
pengguna59178
sumber
2

Python 2, 70 byte

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

Cobalah online

Ini sangat tidak efisien. Tautan uji mengubah i>>7kei>>5 dan menetapkan batas rekursi menjadi 10.000. Mengasumsikan input hanya memiliki nilai ASCII hingga 126.

Menggunakan trik div-mod untuk beralih melalui dua loop: jumlah minimum i/128di loop luar dan nilai-nilai ASCII i%128di loop dalam. Termasuk karakter cdengan nilai ASCII yang diberikan jika jumlah kemunculannya dalam string paling tidak jumlah minimumnya.

Kode menggunakan trik untuk mensimulasikan tugas c=chr(i%128)sehingga dapat direferensikan dalam ekspresi (s.count(c)>i>>7)*c. Python lambdas tidak mengizinkan tugas karena mereka hanya mengambil ekspresi. Konversi ke defatau program penuh masih merupakan kerugian bersih di sini.

Sebagai gantinya, fungsi mendorong nilai chr(i%128)ke panggilan rekursif berikutnya sebagai input opsional. Ini tidak aktif karena itelah bertambah, tetapi tidak masalah asalkan string tidak mengandung karakter khusus '\x7f'(kita juga bisa menaikkan 128 hingga 256). Awal c=''tidak berbahaya.

Tidak
sumber
2

V , 37 36 byte

Terima kasih @DJMcMayhem untuk byte!

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

Cobalah online!

Tidak yakin saya suka regex pada akhirnya, tetapi saya perlu membuat òistirahat entah bagaimana.

Menjelaskan

Í./&ò                    #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
nmjcman101
sumber
Íî(atau :%s/\n//g) lebih pendek dariVGgJ
DJMcMayhem
1

Perl 6 , 68 byte

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

Saya sedikit terkejut menemukan bahwa tidak ada cara bawaan untuk mengelompokkan elemen seperti dalam daftar. Itulah yang dilakukan oleh bit squish-map.

Sean
sumber
1
Saya mendapatkan "Seq ini sudah diulang" kecuali saya mengubah nama amenjadi @a(+2 byte). Juga, grep *eq$_,dapat ditulis grep $_,(-3 byte) karena string adalah pencocokan-pintar yang valid.
sml
1
{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}- Variasi ini hanya 54 byte.
sml
@smis saya tidak melihat kesalahan itu. Mungkin kita menggunakan versi yang berbeda? Saya di rakudo-star-2016.10. Bagaimanapun, solusi Anda membuat malu saya, Anda harus mempostingnya sebagai jawaban terpisah.
Sean
Saya menggunakan Rakudo-edge berdarah yang disusun dari cabang utama git repo minggu ini. Lagi pula, saya memposting classifysolusi berbasis sebagai jawaban yang terpisah sekarang.
sml
1

JavaScript (ES6), 77 75 byte

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

Stabil mengurutkan string diurutkan secara leksikografis berdasarkan kemunculan ke- n

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>

George Reith
sumber
1+~~sama dengan -~.
Neil
@Neil Luar biasa terima kasih -2 byte
George Reith
1

Perl 6 , 54 byte

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

Penjelasan:

  • { }: A lambda yang mengambil satu argumen - mis 21211.
  • .comb: Pisahkan argumen input menjadi daftar karakter - mis (2,1,2,1,1).
  • .classify(~*): Kelompokkan karakter menggunakan perbandingan string sebagai kondisi pengelompokan, kembalikan Hash yang tidak terurut - misalnya { 2=>[2,2], 1=>[1,1,1] }.
  • {*}: Kembalikan daftar semua nilai Hash - misalnya [2,2], [1,1,1] .
  • .sort: Sortir - mis [1,1,1], [2,2].
  • »[*]: Keluarkan wadah item yang dibungkus oleh array karena berada di hash, sehingga tidak akan dianggap sebagai satu item dalam langkah berikut - mis (1,1,1), (2,2).
  • roundrobin |: Zip sub-daftar sampai semua habis - mis (1,2), (1,2), (1).
  • flat: Ratakan hasilnya - mis 1, 2, 1, 2, 1.
  • [~]: Menggabungkannya untuk mendapatkan string lagi - mis 12121.

(Penghargaan atas roundrobinpendekatan ini diberikan untuk jawaban Sean .)

seseorang
sumber
1

05AB1E , 15 byte

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

Cobalah online! atau sebagai Test suite

Penjelasan

{                # 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 dari 15 byte adalah untuk menyiasati cara 05AB1E dalam menangani string zip dengan panjang yang berbeda.

Emigna
sumber
1

FSharp, 194 190 170 140 133 byte

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

Menggunakan Seq alih-alih Array menghemat beberapa byte

Menentukan nama yang lebih pendek, dan menggunakan peta lain untuk menghindari a (fun ->) blok

Ternyata F # dapat memetakan char ke dalam, jadi menghapus nama singkat System.Text.Encoding.ASCII, dan menambahkan di peta lain menghemat 20 byte!

Mengembalikan array char bukan string, menyelamatkan saya 30 byte!

Saya tidak perlu lagi memastikan itu adalah string, menghemat 7 byte

Siklik3
sumber
0

JavaScript (ES6), 114 byte

Dipisahkan dengan baris baru untuk kejelasan, bukan bagian dari jumlah byte:

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``)

Patrick Roberts
sumber
Bytecount yang sama dengan kode Matlab saya, dan pendekatan yang sama persis. Namun saya belum mencoba menambang golf. Saya mungkin akan lebih baik nanti jika Anda menambahkan penjelasan :-) (Saya sudah membuat prinsip untuk tidak mengangkat jawaban tanpa penjelasan, bahkan ketika saya memahaminya) :-)
Stewie Griffin
0

Clojure, 79 byte

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

Fungsi anonim, mengembalikan urutan karakter. Mendukung pengulangan hingga 10 ^ 9 karakter apa pun, yang seharusnya banyak.

NikoNyrh
sumber
0

Ruby, 59 + 1 = 60 byte

Menambahkan satu byte untuk -nbendera. Port of @PatrickRoberts solusi kamus.

d={};print *$_.chars.sort_by{|c|d[c]||=0;c.ord+128*d[c]+=1}
Nilai Tinta
sumber