Sortuj ciąg, w pewnym sensie

29

Jeśli posortujesz ciąg, zwykle otrzymasz coś takiego:

         ':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy

Tak, to było pierwsze posortowane zdanie.

Jak widać, istnieje wiele powtarzających się znaków aa, eee, ttttt, 9 miejsc i tak dalej.

Jeśli dodamy 128do wartości ASCII pierwszego duplikatu, 256do drugiego, 384do trzeciego i tak dalej, posortuj go ponownie i wyślij nowy ciąg (moduł 128, aby odzyskać te same znaki), otrzymamy ciąg:

 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt    

(Zwróć uwagę na pojedynczą spację wiodącą i 4 spacje końcowe).

Łańcuch jest "sortowane kolejno" <space>':I....uy, <space>aeg....uy, <space>egi....ty, <space>iloty, <space>lt, <space>, <space>, <space>, <space>.

Wizualizacja tego może być łatwiejsza, jeśli użyjemy łańcucha z cyframi. Ciąg 111222334będzie gdy „posortowane” być: 123412312.

Wyzwanie:

Nic dziwnego, że wyzwaniem jest napisanie kodu sortującego ciąg zgodnie z powyższym opisem.

Możesz założyć, że ciąg wejściowy będzie zawierał tylko drukowalne znaki ASCII w zakresie 32-126 (spacja do znaku tyldy).


Przypadki testowe:

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

Jest to , więc najkrótszy kod w każdym języku liczona w bajtach wygra ref .

Stewie Griffin
źródło
Tytuł jest nieco mylący, co powoduje, że zastanawiam się nad tym i ignoruję opis: tio.run/nexus/05ab1e#@1@td2jh4ZVe//... W przeciwnym razie będę pracować nad rozszerzeniem tego, aby spełnić wytyczne .
Magic Octopus Urn
Czy możemy wypisać listę znaków zamiast ciągu?
Wheat Wizard
Jeśli możesz wprowadzić ciąg, wynik powinien być również ciągiem. Jeśli lista znaków jest normalnym sposobem wprowadzania i wyprowadzania ciągów w twoich językach, to jest OK. Na przykład nie można wyprowadzać danych {'S', 'g', 'i', 'n', 'r', 't'}w Pythonie, ponieważ „normalnym” sposobem na to jest "String".
Stewie Griffin,
Poprawię mój komentarz powyżej: ciąg znaków jest listą znaków , więc lista znaków jest akceptowana jako wynik. Jednak lista ciągów nie jest akceptowana. Oznacza to, że jeśli możliwe jest dodanie drugiego znaku do elementu na liście, nie jest to akceptowane. Jako przykład: {'a','b'}nie jest akceptowana w Matlab ponieważ można dodać znak do każdego z bohaterów, takich jak ten: {'aa','b'}. Twoje dane wejściowe i wyjściowe muszą być w tym samym formacie.
Stewie Griffin,
@StewieGriffin Kiedy mówisz posortowane zgodnie z powyższym opisem. Czy masz na myśli, że mój algorytm sortowania musi podążać za procesem modyfikacji wartości ASCII, czy po prostu musi generować taki sam wynik jak ten algorytm?
George Reith,

Odpowiedzi:

15

Pyth, 5 bajtów

s.T.g

Zestaw testowy

Bardzo proste: Grupuj i sortuj, transponuj, konkatenuj.

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
źródło
Pyth ma wszystko, aby stać się nowym J, jest niesamowity
shabunc
3
@shabunc Jeśli chcesz zobaczyć nowe J, sprawdź github.com/DennisMitchell/jelly
isaacg
13

Galaretka , 3 bajty

ĠZị

Wypróbuj online!

Jak to działa

Och, chłopie, to wyzwanie było prawie zrobione dla Jelly.

Grupę (atom Ġ) wykonuje tablicy 1 jako dane wejściowe i kilka indeksów, które odpowiadają identycznych elementów macierzy. Tablica grup indeksów jest sortowana z odpowiednimi elementami jako kluczami, co jest dokładnie taką kolejnością, jakiej wymagamy do tego wyzwania.

Następnie atom zip (Z ) transponuje wiersze i kolumny wygenerowanej (nierównej) macierzy indeksów. Polega to po prostu na czytaniu kolumn macierzy, pomijaniu elementów, które nie są obecne w tej kolumnie. W rezultacie otrzymujemy pierwszy indeks znaku o najniższym punkcie kodowym, następnie pierwszy indeks znaku o drugim najniższym punkcie kodowym,… a następnie drugi indeks znaku o najniższym punkcie kodowym itp.

Wreszcie, unindex atom ( ) pobiera elementy tablicy wejściowej we wszystkich swoich indeksach w wygenerowanej kolejności. Rezultatem jest tablica znaków 2D, która Jelly spłaszcza się przed wydrukowaniem.


1 galaretka nie ma typu łańcucha , a jedynie tablice postaci.

Dennis
źródło
„Och, chłopie, to wyzwanie było prawie zrobione dla Jelly”. -> 3 bajtowa odpowiedź
geisterfurz007 Zatrzymaj ten chaos
Jak powiedziałem, prawie zrobiony dla Galaretki. :)
Dennis
10

Python 3, 109 105 104 103 99 93 90 88 81 79 69 bajtów

2 bajty zapisane dzięki FlipTack

Zapisano 7 bajtów, ponieważ trzęsienie ziemi złapało mój głupi błąd

2 bajty zapisane dzięki xnor

10 bajtów zaoszczędzonych dzięki Dennisowi

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

Wyjaśnienie

Zaczynamy od konwersji naszego łańcucha na listę za pomocą ikony i zapisania tej listy w zmiennej a. Następnie, mimo że nasza alista nie jest pusta, przeglądamy każdego unikalnego członka aw posortowanej kolejności, drukujemy go i usuwamy kopię tego znaku z listy.

Każda iteracja drukuje w ten sposób drukuje jedną kopię każdego znaku w nim obecnego a.

Kreator pszenicy
źródło
1
@StewieGriffin setto nieposortowany zestaw.
FlipTack,
2
@StewieGriffin po wydrukowaniu są sortowane, ale nie według ich wartości ASCII. Często wydaje się, że są, ale wierzę, że są posortowane według pewnego rodzaju skrótu.
Wheat Wizard
1
Możesz utworzyć fciąg zamiast listy, aby zapisać kilka bajtów.
trzęsienie ziemi
1
Jeśli weźmiesz a=list(input()), możesz to zrobić a.remove(c), co stanowi oszczędności netto.
xnor
1
Przejście na Python 3 pozwoliłoby zaoszczędzić wiele bajtów. tio.run/nexus/…
Dennis
6

Haskell, 44 bajty

import Data.List
concat.transpose.group.sort

Przykład użycia:

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

Sortuj, grupuj równe znaki do listy ciągów (np. "aabbc"-> ["aa","bb","c"]), ponownie transponuj i spłaszcz w pojedynczy ciąg.

nimi
źródło
6

Python 2 , 75 bajtów

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

Wypróbuj online!

Dennis
źródło
1
Nie wiem, czy jest poprawny, ale lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]działa na ciągi o maksymalnej długości 9e9.
xnor
@ xnor możesz upuścić []i zmienić 18na, 17aby zapisać dwa bajty. lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
Wheat Wizard
@xnor Przynajmniej powinien to być prawidłowy 32-bitowy golf Python. Próbowałem się tego pozbyć zip, ale nie sądzę, 1e9żebym kiedykolwiek przyszedł do głowy ... Dzięki!
Dennis
@WheatWizard Dobre oko. Dzięki!
Dennis
Nie udaje się to, jeśli ciąg zawiera odwrotne ukośniki.
Lynn
4

Dyalog APL , 21 znaków = 39 bajtów

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

t[... ] indeks t (wkrótce zostanie zdefiniowany) z ...

0~⍨ zera usunięte z

 zaciągnięty (spłaszczony)

 transponowane

(⊢⌸t)[... ;] kluczowany * t , indeksowany przez ...

   wskaźniki, które by się posortowały

   unikalne litery

  t←t , który ma wartość

   monit o wprowadzenie tekstu

Wypróbuj APL online!


⊢⌸ttworzy tabelę, w której wiersze (wypełnione zerami dla tabeli prostokątnej) zawierają listę indeksów poszczególnych liter wt .

Adám
źródło
1
które z glifów są droższe?
ren
1
@wptreanor powoduje, że całość ma postać UTF-8 zamiast jednego bajtu na znak.
Adám
4

C, 109 106 105 104 102 100 97 98 96 91 bajtów

Wykonaj kopię zapasową do 98 bajtów, potrzebną do zainicjowania j, aby f (n) mógł być ponownie użyty

Do 96 bajtów za pomocą putów zamiast strlen B-)

Dziwne, że musiałem wrócić do strlen, ale pozbyłem się pętli for (; i ++;), więc teraz jest to 91 bajtów. Najwyraźniej strona man dla puts czyta;

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

... miałem szczęście, że to przede wszystkim działało

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

kod testowy ...

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

Oto kilka przypadków testowych, teraz nadszedł czas na grę w golfa

C:\eng\golf>a.exe
 ':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
 !,HWdelorlo
cleblanc
źródło
Czy końcowe spacje zostały pominięte w pierwszym przypadku testowym?
Stewie Griffin,
Mam trzy spacje końcowe w pierwszym przypadku testowym ... To dlatego, że nie
zawarłem
4

Mathematica, 68 60 59 bajtów

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

Akceptuje ciąg. Wysyła ciąg znaków.

Jeśli dozwolona jest lista znaków (46 bajtów):

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

Wersja wykorzystująca Sort(40 bajtów):

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

Ta wersja nie może być moją odpowiedzią, ponieważ Sortnie można jej tutaj użyć; Sortsortuje według kolejności kanonicznej, a nie według kodu znakowego.

JungHwan Min
źródło
Nie znam matematyki, więc może być w porządku, ale czy przeczytałeś ten komentarz?
Stewie Griffin,
@StewieGriffin Welp, nie. Mogę to naprawić, ale czy nie daje to niesprawiedliwej przewagi językom, które nie mają rozróżnienia String vs Char []? Powiązana meta dyskusja
JungHwan Min
Słuszna uwaga. Poprawiłem, patrz komentarz pod oryginałem. Targi? Nie jestem pewien, czy to sprawia, że ​​twoja odpowiedź jest ważna, czy nie.
Stewie Griffin,
@StewieGriffin Mathematica nie rozróżnia znaków i ciągów znaków. Nawet Characterspolecenie technicznie wyświetla listę ciągów o długości 1.
JungHwan Min
1
@StewieGriffin Myślę, że jest to również istotne . Myślę, że lepiej jest zezwolić na wprowadzanie danych w dowolnym rozsądnym formacie, np. Łańcuch, lista łańcuchów o długości 1, tablica znaków, tablica bajtów itp.
ngenisis
3

Python 2, 77 76 bajtów

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

Pobiera cytowany ciąg jako dane wejściowe ze standardowego wejścia.

Wypróbuj online!

trzęsienie ziemi
źródło
Myślę, że nie jest to dozwolone, ponieważ funkcje muszą być wielokrotnego użytku . Możesz zrobić z tego program.
xnor
Bardzo podoba mi się ta metoda, sortowanie z funkcją mutującą. Sprytne jest również zagnieżdżanie krotek.
xnor
@xnor Dzięki, naprawiono.
trzęsienie ziemi
3

JavaScript (ES6), 79 bajtów

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>

Działa poprzez wyodrębnienie zestawu unikalnych znaków, sortowanie go, usuwanie ich z oryginalnego łańcucha i rekurencyjne obliczanie rodzaju reszty łańcucha. 81 bajtowe rozwiązanie, które uznałem za interesujące:

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

J , 16 15 bajtów

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

Jest to czasownik, który pobiera i zwraca jeden ciąg. Wypróbuj online!

Miles uratował bajt, dzięki!

Wyjaśnienie

Nic szczególnego: sortuj według kolejności występowania, a następnie według wartości 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
źródło
Myślę, że można zapisać ruchome podsumowanie bajtów na zewnątrz nawiasów `+ / @ (= {:)`
mile
@Miles O tak, ponieważ pociąg ma nieskończoną pozycję. Fajnie dzięki!
Zgarb
3

Mathematica, 55 bajtów, niekonkurujące

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

Edycja: Niestety Mathematica niesort jest według kodów znaków, lecz według kolejności alfabetycznej, w której wielkie litery następują bezpośrednio po małych (tzn. Hi ThereSą sortowane { , e, e, h, H, i, r, T}).

Działa to przy użyciu wzorów:

//.{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)
spacemit
źródło
1
Jedna drobna rzecz: Rule (->)powinna być RuleDelayed (:>)(bez zmiany liczby bajtów), ponieważ obie strony Rulemają zmienne. Rulemoże powodować konflikty z wcześniej istniejącymi definicjami. Na przykład: a=3;5/.{a_->a}zwraca 3, a nie 5. ( a_->aocenia na a_->3- jeśli użyjesz a_:>a, pozostanie w ten sposób i a=3;5/.{a_:>a}wróci 5).
JungHwan Min
Oznacziłem twoją odpowiedź jako niekonkurencyjną, ponieważ nie robi tego, co określa pytanie (sortuj według kodu znakowego, a nie w kolejności kanonicznej).
JungHwan Min
@JungHwanMin naprawiono na RuleDelayed. dzięki.
spacemit
2

Brainf * ck , 458 226 bajtów

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

Wypróbuj online! - BF

Numberwang , 262 226 bajtów

8400000087111111442111911170004000400000071114002241202271214020914070419027114170270034427171114400000091111112711170000007000400040000007111400224120227121402091407041902711417027004219190071420091171411111170007000771111117

Wypróbuj online! - PÓŁNOCNY ZACHÓD

Umieściłem oba tutaj, ponieważ są one identycznym kodem.

JungHwan Min
źródło
2

PHP, 83 bajty

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

Niestety nie możesz mieć unsettrójki, więc muszę użyć denerwująco długiej array_filter.
Użyj jak:

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:"
użytkownik59178
źródło
2

Python 2, 70 bajtów

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

Wypróbuj online

To jest bardzo nieefektywne. Link testowy zmienia się i>>7nai>>5 i ustawia limit rekurencji na 10000. Zakłada, że ​​dane wejściowe mają tylko wartości ASCII do 126.

Używa sztuczki div-mod do iteracji przez dwie pętle: minimalna liczba i/128w pętli zewnętrznej i wartości ASCII i%128w pętli wewnętrznej. Obejmuje znak co podanej wartości ASCII, jeśli liczba wystąpień w ciągu jest co najmniej jego minimalną liczbą.

Kod wykorzystuje sztuczkę do symulacji przypisania, c=chr(i%128)aby można było do niego odwołać się w wyrażeniu (s.count(c)>i>>7)*c. Python lambdanie pozwala na przypisanie, ponieważ przyjmuje tylko wyrażenia. Przejście na program deflub pełny program wciąż tutaj jest stratą netto.

Zamiast tego funkcja przekazuje wartość chr(i%128)do następnego wywołania rekurencyjnego jako opcjonalne wejście. Jest to wyłączone o jeden, ponieważ izostało zwiększone, ale nie ma znaczenia, dopóki łańcuch nie zawiera znaku specjalnego '\x7f'(moglibyśmy również zwiększyć 128 do 256). Inicjał c=''jest nieszkodliwy.

xnor
źródło
2

V , 37 36 bajtów

Dzięki @DJMcMayhem za bajt!

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

Wypróbuj online!

Nie jestem pewien, czy podoba mi się regex na końcu, ale musiałem òjakoś zrobić przerwę.

Wyjaśniać

Í./&ò                    #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
źródło
Íî(lub :%s/\n//g) jest krótszy niżVGgJ
DJMcMayhem
1

Perl 6 , 68 bajtów

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

Byłem trochę zaskoczony, gdy odkryłem, że nie ma wbudowanego sposobu grupowania elementów na liście. Tak właśnie działa bit squish-map.

Sean
źródło
1
Dostaję komunikat „Ten Seq został już iterowany”, chyba że zmienię nazwę ana @a(+2 bajty). Ponadto, grep *eq$_,mogą być zapisywane grep $_,(-3 bajtów), ponieważ ciąg jest ważny smart-dopasowujący.
smls
1
{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}- Ta odmiana ma tylko 54 bajty.
sml
@smis Nie widzę tego błędu. Może używamy różnych wersji? Jestem na rakudo-star-2016.10. W każdym razie twoje rozwiązanie zawstydza mnie, powinieneś opublikować je jako osobną odpowiedź.
Sean
W tym tygodniu używam najnowocześniejszego Rakudo skompilowanego z głównej gałęzi repozytorium git. W każdym razie opublikowałem classifyrozwiązanie oparte na osobnej odpowiedzi.
smls
1

JavaScript (ES6), 77 75 bajtów

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

Stabilny sortuje leksykograficznie posortowany ciąg według n- tego wystąpienia

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
źródło
1+~~jest taki sam jak -~.
Neil
@Neil Niesamowite dzięki -2 bajty
George Reith
1

Perl 6 , 54 bajtów

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

Wyjaśnienie:

  • { }: Lambda, która przyjmuje jeden argument - np 21211 .
  • .comb: Podziel argument wejściowy na listę znaków - np (2,1,2,1,1).
  • .classify(~*): Grupuj znaki przy użyciu porównania ciągów jako warunku grupowania, zwracając nieuporządkowany skrót - np { 2=>[2,2], 1=>[1,1,1] }.
  • {*}: Zwraca listę wszystkich wartości skrótu - np [2,2], [1,1,1] .
  • .sort: Sortuj - np [1,1,1], [2,2].
  • »[*]: Rozebrać pojemniki na przedmioty, w które były owinięte tablice, ponieważ znajdują się w haszu, aby nie były traktowane jako pojedynczy element w następnym kroku - np (1,1,1), (2,2).
  • roundrobin |: Zip listy podrzędne, aż wszystkie zostaną wyczerpane - np (1,2), (1,2), (1).
  • flat: Spłaszcz wynik - np 1, 2, 1, 2, 1.
  • [~]: Połącz go, aby ponownie uzyskać ciąg - np 12121.

(Uznanie za roundrobinpodejście należy do odpowiedzi Seana .)

smls
źródło
1

05AB1E , 15 bajtów

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

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

{                # 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 z 15 bajtów służy do obejścia sposobu obsługi ciągów zip o różnej długości w 05AB1E.

Emigna
źródło
1

FSharp, 194 190 170 140 133 bajtów

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

Użycie Seq zamiast Array pozwala zaoszczędzić kilka bajtów

Zdefiniowanie krótszej nazwy i użycie innych map w celu uniknięcia (fun ->)bloku

Okazuje się, że F # może zamapować char na in, więc usunięcie skróconej nazwy System.Text.Encoding.ASCII i dodanie innej mapy pozwala mi zaoszczędzić 20 bajtów!

Zwrócenie tablicy znaków zamiast łańcucha oszczędza mi 30 bajtów!

Nie muszę już upewniać się, że jest to ciąg znaków, co oszczędza mi 7 bajtów

Cykliczny 3
źródło
0

JavaScript (ES6), 114 bajtów

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

Patrick Roberts
źródło
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.

NikoNyrh
źródło
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}
Value Ink
źródło