Wenn Sie eine Zeichenfolge sortieren, erhalten Sie normalerweise Folgendes:
':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy
Ja, das war der erste Satz sortiert.
Wie Sie sehen können, gibt es eine Menge von wiederholten Zeichen, aa
, eee
, ttttt
, 9 Räume und so weiter.
Wenn wir 128
zum ASCII-Wert des ersten Duplikats, 256
zum zweiten, 384
zum dritten und so weiter addieren , sortieren Sie es erneut und geben den neuen String aus (Modul 128, um die gleichen Zeichen wiederzuerlangen), erhalten wir den String:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
(Beachten Sie das einzelne führende Leerzeichen und die 4 nachfolgenden Leerzeichen).
Die Zeichenfolge wird "sequentiell sortiert" <space>':I....uy
, <space>aeg....uy
, <space>egi....ty
, <space>iloty
, <space>lt
, <space>
, <space>
, <space>
, <space>
.
Es könnte einfacher sein, dies zu visualisieren, wenn wir einen String mit Ziffern darin verwenden. Der String 111222334
wird als „geordnet“ sein: 123412312
.
Herausforderung:
Es ist keine Überraschung, dass die Herausforderung darin besteht, einen Code zu schreiben, der eine Zeichenfolge gemäß der obigen Beschreibung sortiert.
Sie können davon ausgehen, dass die Eingabezeichenfolge nur druckbare ASCII-Zeichen im Bereich 32-126 (Leerzeichen bis Tilde) enthält.
Testfälle:
**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(),()()()()
Dies ist Code-Golf , so dass der kürzeste Code in jeder Sprache , der in Bytes gezählt wird, ref gewinnt .
{'S', 'g', 'i', 'n', 'r', 't'}
in Python ausgeben , da dies "normal" ist"String"
.{'a','b'}
in Matlab nicht akzeptiert , da Sie ein Zeichen zu jedem der Zeichen wie diese hinzufügen:{'aa','b'}
. Ihre Eingabe und Ausgabe müssen dasselbe Format haben.Antworten:
Pyth, 5 Bytes
Testsuite
Ganz einfach: Gruppieren und sortieren, transponieren, verketten.
quelle
Gelee , 3 Bytes
Probieren Sie es online!
Wie es funktioniert
Oh Mann, diese Herausforderung war fast wie gemacht für Jelly.
Das Gruppenatom (
Ġ
) nimmt ein Array 1 als Eingabe und gruppiert Indizes, die identischen Elementen des Arrays entsprechen. Das Array der Indexgruppen wird mit den entsprechenden Elementen als Schlüssel sortiert. Dies ist genau die Reihenfolge, die wir für diese Herausforderung benötigen.Als nächstes transponiert das zip- Atom (
Z
) Zeilen und Spalten der generierten (zackigen) Matrix von Indizes. Dies besteht einfach darin, die Spalten der Matrix zu lesen und Elemente zu überspringen, die in dieser Spalte nicht vorhanden sind. Als Ergebnis erhalten wir den ersten Index des Zeichens mit dem niedrigsten Codepunkt, gefolgt vom ersten Index des Zeichens mit dem zweitniedrigsten Codepunkt, gefolgt vom zweiten Index des Zeichens mit dem niedrigsten Codepunkt usw.Schließlich ruft das unindex atom (
ị
) die Elemente des Eingabearrays an allen seinen Indizes in der generierten Reihenfolge ab. Das Ergebnis ist ein 2D-Zeichenfeld, das vor dem Drucken von Jelly abgeflacht wird.1 Jelly hat keinen String- Typ, sondern nur Arrays von Zeichen.
quelle
Python 3,
10910510410399939088817969 Bytes2 Bytes gespart dank FlipTack
7 Bytes gespart, weil das Flornbeben meinen blöden Fehler abgefangen hat
2 Bytes gespart dank xnor
10 Bytes gespart dank Dennis
Erläuterung
Wir beginnen damit, unseren String mit einem Splat in eine Liste umzuwandeln und diese Liste in einer Variablen zu speichern
a
. Dann, während unserea
Liste nicht leer ist, durchlaufen wir jedes einzelne Mitglieda
in sortierter Reihenfolge, drucken es aus und entfernen eine Kopie dieses Zeichens aus der Liste.Bei jedem Iterationsdruck wird somit eine Kopie jedes in vorhandenen Zeichens gedruckt
a
.quelle
set
ist eine unsortierte Gruppe.f
anstelle einer Liste eine Zeichenfolge erstellen, um einige Bytes zu sparen.a=list(input())
, können Sie tuna.remove(c)
, was eine Nettoersparnis ist.Haskell, 44 Bytes
Anwendungsbeispiel:
Sortieren, gruppieren Sie gleiche Zeichen zu einer Liste von Zeichenfolgen (z. B.
"aabbc"
->["aa","bb","c"]
), transponieren Sie und reduzieren Sie sie erneut zu einer einzelnen Zeichenfolge.quelle
Python 2 , 75 Bytes
Probieren Sie es online!
quelle
lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]
für Zeichenfolgen mit maximaler Länge funktioniert9e9
.[]
und ändern18
zu17
zwei Bytes zu speichern.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
zip
, aber ich glaube nicht, dass mir das Hinzufügen1e9
jemals in den Sinn gekommen wäre ... Danke!Dyalog APL, 21 chars = 39 bytes
t[
...]
index t (to be defined shortly) with...0~⍨
zeros removed from∊
the enlisted (flattened)⍉
transposed(⊢⌸t)[
...;]
keyed* t, row-indexed by...⍋
the indices which would sort∪
the unique letters oft←
t, which has the value of⍞
prompted text inputTryAPL online!
*
⊢⌸t
creates a table where the rows (padded with zeros for a rectangular table) list each unique letters' indices in t.quelle
⌸
causes the entire thing to be UTF-8 instead of one byte per char.C,
10910610510410210097989691 BytesBack up to 98 Bytes, needed to initialize j to make f(n) re-useableDown 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;
... I was lucky it was working in the first place
test code...
Here are a few test cases, now it's time to golf this down
quelle
Mathematica,
686059 bytesAccepts a String. Outputs a String.
If list of characters were allowed (46 bytes):
Version using
Sort
(40 bytes):This version cannot be my answer because
Sort
cannot be used here;Sort
sorts by canonical order, not by character code.quelle
Characters
command technically output a list of length-1 strings.Python 2,
7776 bytesTakes a quoted string as input from stdin.
Try it online!
quelle
JavaScript (ES6), 79 bytes
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:
quelle
J,
1615 bytesThis 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.
quelle
Mathematica, 55 bytes, non-competing
Edit: Unfortunately, Mathematica's
sort
is not by character codes, but by alphabetical order, where uppercase immediatly follows lowercase (ieHi There
is sorted to{ , e, e, h, H, i, r, T}
).This works using patterns:
quelle
Rule (->)
should beRuleDelayed (:>)
(no change in byte count) because both sides ofRule
has variables.Rule
can cause conflicts with pre-existing definitions. For instance:a=3;5/.{a_->a}
returns3
, not5
. (a_->a
evaluates toa_->3
-- if you usea_:>a
, it stays that way anda=3;5/.{a_:>a}
returns5
).Brainf*ck,
458226 bytesTry it online! - BF
Numberwang,
262226 bytesTry it online! - NW
I put both of these here because they are identical code.
quelle
PHP, 83 bytes
Unfortunately you can't have
unset
in a ternary so I need to use the annoyingly longarray_filter
.Use like:
quelle
Python 2, 70 bytes
Try it online
This is very inefficient. The test link changes the
i>>7
toi>>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 valuesi%128
in the inner loop. Includes a characterc
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
. Pythonlambda
s do not allow assignment because they only take expressions. Converting to adef
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 becausei
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 initialc=''
is harmless.quelle
V,
3736 bytesThanks @DJMcMayhem for the byte!
Try it online!
Not sure I like the regex at the end, but I needed to make the
ò
break somehow.Explain
quelle
Íî
(or:%s/\n//g
) is shorter thanVGgJ
Perl 6, 68 bytes
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.
quelle
a
to@a
(+2 bytes). Also,grep *eq$_,
can be writtengrep $_,
(-3 bytes) since a string is a valid smart-matcher.{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
-- This variation is only 54 bytes.classify
-based solution as a separate answer now.JavaScript (ES6),
7775 bytesStable sorts the lexicographically sorted string by nth occurence
quelle
1+~~
is the same as-~
.Perl 6, 54 bytes
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.)quelle
05AB1E, 15 bytes
Try it online! or as a Test suite
Explanation
10 of the 15 bytes are for getting around 05AB1E's way of handling zipping strings of different length.
quelle
FSharp,
194190170140133 bytesUsing Seq instead of Array saves a couple of bytes
Defining a shorter name, and using another maps to avoid a
(fun ->)
blockIt 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
quelle
JavaScript (ES6), 114 bytes
Separated with newline for clarity, not part of byte count:
Demo
quelle
Clojure, 79 bytes
An anonymous function, returns a sequence of characters. Supports up-to 10^9 repetitions of any characters, which should be plenty.
quelle
Retina, 24 bytes
Try it online!
quelle
Ruby, 59+1 = 60 bytes
Adds one byte for the
-n
flag. Port of @PatrickRoberts' dictionary solution.quelle