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 128
do wartości ASCII pierwszego duplikatu, 256
do drugiego, 384
do 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 111222334
bę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 kod-golf , więc najkrótszy kod w każdym języku liczona w bajtach wygra ref .
{'S', 'g', 'i', 'n', 'r', 't'}
w Pythonie, ponieważ „normalnym” sposobem na to jest"String"
.{'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.Odpowiedzi:
Pyth, 5 bajtów
Zestaw testowy
Bardzo proste: Grupuj i sortuj, transponuj, konkatenuj.
źródło
Galaretka , 3 bajty
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.
źródło
Python 3,
10910510410399939088817969 bajtów2 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
Wyjaśnienie
Zaczynamy od konwersji naszego łańcucha na listę za pomocą ikony i zapisania tej listy w zmiennej
a
. Następnie, mimo że naszaa
lista nie jest pusta, przeglądamy każdego unikalnego członkaa
w 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
.źródło
set
to nieposortowany zestaw.f
ciąg zamiast listy, aby zapisać kilka bajtów.a=list(input())
, możesz to zrobića.remove(c)
, co stanowi oszczędności netto.Haskell, 44 bajty
Przykład użycia:
Sortuj, grupuj równe znaki do listy ciągów (np.
"aabbc"
->["aa","bb","c"]
), ponownie transponuj i spłaszcz w pojedynczy ciąg.źródło
Python 2 , 75 bajtów
Wypróbuj online!
źródło
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ści9e9
.[]
i zmienić18
na,17
aby zapisać dwa bajty.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
zip
, ale nie sądzę,1e9
żebym kiedykolwiek przyszedł do głowy ... Dzięki!Dyalog APL , 21 znaków = 39 bajtów
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 literyt←
t , który ma wartość⍞
monit o wprowadzenie tekstuWypróbuj APL online!
*
⊢⌸t
tworzy tabelę, w której wiersze (wypełnione zerami dla tabeli prostokątnej) zawierają listę indeksów poszczególnych liter wt .źródło
⌸
powoduje, że całość ma postać UTF-8 zamiast jednego bajtu na znak.C,
10910610510410210097989691 bajtówWykonaj kopię zapasową do 98 bajtów, potrzebną do zainicjowania j, aby f (n) mógł być ponownie użytyDo 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;
... miałem szczęście, że to przede wszystkim działało
kod testowy ...
Oto kilka przypadków testowych, teraz nadszedł czas na grę w golfa
źródło
Mathematica,
686059 bajtówAkceptuje ciąg. Wysyła ciąg znaków.
Jeśli dozwolona jest lista znaków (46 bajtów):
Wersja wykorzystująca
Sort
(40 bajtów):Ta wersja nie może być moją odpowiedzią, ponieważ
Sort
nie można jej tutaj użyć;Sort
sortuje według kolejności kanonicznej, a nie według kodu znakowego.źródło
Characters
polecenie technicznie wyświetla listę ciągów o długości 1.Python 2,
7776 bajtówPobiera cytowany ciąg jako dane wejściowe ze standardowego wejścia.
Wypróbuj online!
źródło
JavaScript (ES6), 79 bajtów
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:
źródło
J ,
1615 bajtówJest 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.
źródło
Mathematica, 55 bajtów, niekonkurujące
Edycja: Niestety Mathematica nie
sort
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 There
Są sortowane{ , e, e, h, H, i, r, T}
).Działa to przy użyciu wzorów:
źródło
Rule (->)
powinna byćRuleDelayed (:>)
(bez zmiany liczby bajtów), ponieważ obie stronyRule
mają zmienne.Rule
może powodować konflikty z wcześniej istniejącymi definicjami. Na przykład:a=3;5/.{a_->a}
zwraca3
, a nie5
. (a_->a
ocenia naa_->3
- jeśli użyjesza_:>a
, pozostanie w ten sposób ia=3;5/.{a_:>a}
wróci5
).Brainf * ck ,
458226 bajtówWypróbuj online! - BF
Numberwang ,
262226 bajtówWypróbuj online! - PÓŁNOCNY ZACHÓD
Umieściłem oba tutaj, ponieważ są one identycznym kodem.
źródło
PHP, 83 bajty
Niestety nie możesz mieć
unset
trójki, więc muszę użyć denerwująco długiejarray_filter
.Użyj jak:
źródło
Python 2, 70 bajtów
Wypróbuj online
To jest bardzo nieefektywne. Link testowy zmienia się
i>>7
nai>>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/128
w pętli zewnętrznej i wartości ASCIIi%128
w pętli wewnętrznej. Obejmuje znakc
o 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
. Pythonlambda
nie pozwala na przypisanie, ponieważ przyjmuje tylko wyrażenia. Przejście na programdef
lub 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żi
został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.źródło
V ,
3736 bajtówDzięki @DJMcMayhem za bajt!
Wypróbuj online!
Nie jestem pewien, czy podoba mi się regex na końcu, ale musiałem
ò
jakoś zrobić przerwę.Wyjaśniać
źródło
Íî
(lub:%s/\n//g
) jest krótszy niżVGgJ
Perl 6 , 68 bajtów
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.
źródło
a
na@a
(+2 bajty). Ponadto,grep *eq$_,
mogą być zapisywanegrep $_,
(-3 bajtów), ponieważ ciąg jest ważny smart-dopasowujący.{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
- Ta odmiana ma tylko 54 bajty.classify
rozwiązanie oparte na osobnej odpowiedzi.JavaScript (ES6),
7775 bajtówStabilny sortuje leksykograficznie posortowany ciąg według n- tego wystąpienia
źródło
1+~~
jest taki sam jak-~
.Perl 6 , 54 bajtów
Wyjaśnienie:
{ }
: Lambda, która przyjmuje jeden argument - np21211
..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 - np1, 2, 1, 2, 1
.[~]
: Połącz go, aby ponownie uzyskać ciąg - np12121
.(Uznanie za
roundrobin
podejście należy do odpowiedzi Seana .)źródło
05AB1E , 15 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
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.
źródło
FSharp,
194190170140133 bajtówUżycie Seq zamiast Array pozwala zaoszczędzić kilka bajtów
Zdefiniowanie krótszej nazwy i użycie innych map w celu uniknięcia
(fun ->)
blokuOkazuje 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
źródło
JavaScript (ES6), 114 bajtów
Separated with newline for clarity, not part of byte count:
Demo
źródło
Clojure, 79 bytes
An anonymous function, returns a sequence of characters. Supports up-to 10^9 repetitions of any characters, which should be plenty.
źródło
Retina, 24 bytes
Try it online!
źródło
Ruby, 59+1 = 60 bytes
Adds one byte for the
-n
flag. Port of @PatrickRoberts' dictionary solution.źródło