Si vous triez une chaîne, vous obtiendrez généralement quelque chose comme:
':Iaaceeefggghiiiiklllllmnnooooprrssstttttuuyyyy
Oui, c'était la première phrase triée.
Comme vous pouvez le voir, il y a beaucoup de caractères répétés, aa
, eee
,ttttt
, 9 places et ainsi de suite.
Si nous ajoutons 128
à la valeur ASCII du premier doublon, 256
au second, 384
au troisième et ainsi de suite, trions-le à nouveau et sortons la nouvelle chaîne (module 128 pour récupérer les mêmes caractères), nous obtenons la chaîne:
':Iacefghiklmnoprstuy aegilnorstuy egilosty iloty lt
(Notez le seul espace de tête et les 4 espaces de fin).
La chaîne est "ordonnée de manière séquentielle" <space>':I....uy
, <space>aeg....uy
, <space>egi....ty
, <space>iloty
, <space>lt
, <space>
, <space>
, <space>
, <space>
.
Il pourrait être plus facile de visualiser cela si nous utilisons une chaîne contenant des chiffres. La chaîne 111222334
sera quand « triée » être: 123412312
.
Défi:
Sans surprise, le défi est d'écrire un code qui trie une chaîne selon la description ci-dessus.
Vous pouvez supposer que la chaîne d'entrée ne contiendra que des caractères ASCII imprimables compris entre 32 et 126 (espace au tilde).
Cas de test:
**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(),()()()()
Il s'agit de code-golf , donc le code le plus court dans chaque langue compté en octets gagnera ref .
{'S', 'g', 'i', 'n', 'r', 't'}
en Python, car la façon "normale" de le faire est"String"
.{'a','b'}
ne sont pas acceptés dans Matlab puisque vous pouvez ajouter un caractère à chacun des personnages comme celui - ci:{'aa','b'}
. Vos entrées et sorties doivent être au même format.Réponses:
Pyth, 5 octets
Suite de tests
Très simple: regrouper et trier, transposer, concaténer.
la source
Gelée , 3 octets
Essayez-le en ligne!
Comment ça marche
Oh mon garçon, ce défi était tout sauf fait pour Jelly.
Le groupe atom (
Ġ
) prend un tableau 1 en entrée et regroupe les indices qui correspondent à des éléments identiques du tableau. Le tableau des groupes d'index est trié avec les éléments correspondants sous forme de clés, ce qui est précisément l'ordre dont nous avons besoin pour ce défi.Ensuite, l' atome zip (
Z
) transpose les lignes et les colonnes de la matrice d'indices générée (irrégulière). Cela consiste simplement à lire les colonnes de la matrice, en sautant les éléments qui ne sont pas présents dans cette colonne. En conséquence, nous obtenons le premier index du caractère avec le point de code le plus bas, suivi du premier index du caractère avec le deuxième point de code le plus bas,… suivi du deuxième index du caractère avec le point de code le plus bas, etc.Enfin, l' atome unindex (
ị
) récupère les éléments du tableau d'entrée à tous ses indices dans l'ordre généré. Le résultat est un tableau de caractères 2D que Jelly aplatit avant de l'imprimer.1 Jelly n'a pas de type chaîne , juste des tableaux de caractères.
la source
Python 3,
109105104 10410399939088817969 octets2 octets économisés grâce à FlipTack
7 octets enregistrés parce que le tremblement de terre a attrapé mon erreur stupide
2 octets économisés grâce à xnor
10 octets économisés grâce à Dennis
Explication
Nous commençons par convertir notre chaîne en liste en utilisant un splat et en stockant cette liste dans une variable
a
. Ensuite, bien que notrea
liste ne soit pas vide, nous parcourons chaque membre uniquea
dans l'ordre trié, l'imprimons et supprimons une copie de ce caractère de la liste.Chaque itération imprime ainsi une copie de chaque caractère présent dans
a
.la source
set
est un ensemble non trié.f
une chaîne au lieu d'une liste pour enregistrer quelques octets.a=list(input())
, vous pouvez le fairea.remove(c)
, ce qui représente une économie nette.Haskell, 44 octets
Exemple d'utilisation:
Trier, regrouper des caractères égaux dans une liste de chaînes (par exemple
"aabbc"
->["aa","bb","c"]
), transposer et aplatir à nouveau en une seule chaîne.la source
Python 2 , 75 octets
Essayez-le en ligne!
la source
lambda s:`[sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))]`[18::21]
fonctionne pour les chaînes de longueur maximale9e9
.[]
changer18
pour17
sauver deux octets.lambda s:`sorted((1e9+s[:i].count(c),c)for i,c in enumerate(s))`[17::21]
zip
, mais je ne pense pas que cela1e9
m'aurait été venu à l'esprit ... Merci!Dyalog APL , 21 caractères = 39 octets
t[
...]
index t (à définir prochainement) avec ...0~⍨
zéros supprimés de∊
l'enrôlé (aplati)⍉
transposé(⊢⌸t)[
... indexé;]
* t , indexé par ligne par ...⍋
les indices qui trieraient∪
les lettres uniques det←
t , qui a la valeur de⍞
saisie de texte avec inviteTryAPL en ligne!
*
⊢⌸t
crée un tableau où les lignes (complétées par des zéros pour un tableau rectangulaire) listent les indices de chaque lettre unique en t .la source
⌸
fait que le tout est UTF-8 au lieu d'un octet par caractère.C,
10910610510410210097989691 OctetsSauvegarde jusqu'à 98 octets, nécessaire pour initialiser j pour rendre f (n) réutilisableJusqu'à 96 octets en utilisant met à la place de strlen B-)C'est étrange, j'ai dû revenir à strlen mais je me suis débarrassé de la boucle for (; i ++;) alors maintenant, c'est à 91 octets. Apparemment, la page de manuel pour met des lectures;
... j'ai eu de la chance que ça marche en premier lieu
code de test ...
Voici quelques cas de test, il est maintenant temps de jouer au golf
la source
Mathematica,
686059 octetsAccepte une chaîne. Génère une chaîne.
Si la liste des caractères était autorisée (46 octets):
Version utilisant
Sort
(40 octets):Cette version ne peut pas être ma réponse car
Sort
ne peut pas être utilisée ici;Sort
trie par ordre canonique et non par code de caractère.la source
Characters
commande affiche techniquement une liste de chaînes de longueur 1.Python 2,
7776 octetsPrend une chaîne entre guillemets en entrée de stdin.
Essayez-le en ligne!
la source
JavaScript (ES6), 79 octets
Fonctionne en extrayant le jeu de caractères uniques, en le triant, en les supprimant de la chaîne d'origine et en calculant récursivement le tri du reste de la chaîne. Solution de 81 octets que j'ai trouvée intéressante:
la source
J ,
1615 octetsIl s'agit d'un verbe qui prend et renvoie une chaîne. Essayez-le en ligne!
Miles a sauvé un octet, merci!
Explication
Rien de trop sophistiqué ici: trier principalement par ordre d'occurrence, secondairement par valeur de caractère.
la source
Mathematica, 55 octets, sans compétition
Edit: Malheureusement, Mathematica
sort
n'est pas par codes de caractères, mais par ordre alphabétique, où les majuscules suivent immédiatement les minuscules (c'estHi There
-à- dire sont triées sur{ , e, e, h, H, i, r, T}
).Cela fonctionne en utilisant des modèles:
la source
Rule (->)
devrait êtreRuleDelayed (:>)
(pas de changement dans le nombre d'octets) car les deux côtés deRule
a des variables.Rule
peut provoquer des conflits avec les définitions préexistantes. Par exemple:a=3;5/.{a_->a}
renvoie3
, non5
. (a_->a
évalue àa_->3
- si vous utiliseza_:>a
, cela reste ainsi eta=3;5/.{a_:>a}
revient5
).Brainf * ck ,
458226 octetsEssayez-le en ligne! - BF
Numberwang ,
262226 octetsEssayez-le en ligne! - NW
Je mets les deux ici parce qu'ils sont du code identique.
la source
PHP, 83 octets
Malheureusement, vous ne pouvez pas en avoir
unset
dans un ternaire, j'ai donc besoin d'utiliser le long ennuyeuxarray_filter
.Utilisez comme:
la source
Python 2, 70 octets
Essayez-le en ligne
C'est très inefficace. Le lien de test change le
i>>7
eni>>5
et définit la limite de récursivité à 10000. Suppose que les entrées n'ont que des valeurs ASCII jusqu'à 126.Utilise l'astuce div-mod pour parcourir deux boucles: nombre minimum
i/128
dans la boucle externe et valeurs ASCIIi%128
dans la boucle interne. Inclut un caractèrec
avec la valeur ASCII donnée si le nombre de fois où il apparaît dans la chaîne est au moins son nombre minimum.Le code utilise une astuce pour simuler l'affectation
c=chr(i%128)
afin qu'elle puisse être référencée dans l'expression(s.count(c)>i>>7)*c
. Pythonlambda
n'autorisent pas l'affectation car ils ne prennent que des expressions. Conversion en undef
programme complet est toujours une perte nette ici.Au lieu de cela, la fonction transmet la valeur
chr(i%128)
au prochain appel récursif en tant qu'entrée facultative. Ceci est désactivé d'unei
unité car a été incrémenté, mais n'a pas d'importance tant que la chaîne ne contient pas de caractère spécial'\x7f'
(nous pourrions également augmenter de 128 à 256). L'initialec=''
est inoffensive.la source
V ,
3736 octetsMerci @DJMcMayhem pour l'octet!
Essayez-le en ligne!
Pas sûr que j'aime le regex à la fin, mais je devais faire le
ò
pause d'une manière ou d'une autre.Explique
la source
Íî
(ou:%s/\n//g
) est plus courte queVGgJ
Perl 6 , 68 octets
J'ai été un peu surpris de constater qu'il n'y a aucun moyen intégré de regrouper des éléments similaires dans une liste. C'est ce que fait le bit squish-map.
la source
a
en@a
(+2 octets). En outre,grep *eq$_,
on peut écriregrep $_,
(-3 octets) car une chaîne est une puce matcher valide.{[~] flat roundrobin |.comb.classify(~*){*}.sort»[*]}
- Cette variation n'est que de 54 octets.classify
-based solution as a separate answer now.JavaScript (ES6),
7775 bytesStable sorts the lexicographically sorted string by nth occurence
la source
1+~~
is the same as-~
.Perl 6 , 54 octets
Explication:
{ }
: Un lambda qui prend un argument - par exemple21211
..comb
: Divise l'argument d'entrée en une liste de caractères - par exemple(2,1,2,1,1)
..classify(~*)
: Groupez les caractères en utilisant la comparaison de chaînes comme condition de regroupement, en retournant un Hash non ordonné - par exemple{ 2=>[2,2], 1=>[1,1,1] }
.{*}
: Retourne une liste de toutes les valeurs du Hash - par exemple[2,2], [1,1,1]
..sort
: Trier - par exemple[1,1,1], [2,2]
.»[*]
: Supprimez les conteneurs d'articles dans lesquels les tableaux ont été enveloppés en raison de leur présence dans le hachage, de sorte qu'ils ne seront pas considérés comme un seul élément à l'étape suivante, par exemple(1,1,1), (2,2)
.roundrobin |
: Zip les sous-listes jusqu'à épuisement - par exemple(1,2), (1,2), (1)
.flat
: Aplatissez le résultat - par exemple1, 2, 1, 2, 1
.[~]
: Concatenate it to get a string again -- e.g.12121
.(Credit for the
roundrobin
approach goes to Sean's answer.)la source
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.
la source
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
la source
JavaScript (ES6), 114 bytes
Separated with newline for clarity, not part of byte count:
Demo
la source
Clojure, 79 bytes
An anonymous function, returns a sequence of characters. Supports up-to 10^9 repetitions of any characters, which should be plenty.
la source
Retina, 24 bytes
Try it online!
la source
Ruby, 59+1 = 60 bytes
Adds one byte for the
-n
flag. Port of @PatrickRoberts' dictionary solution.la source