Nous connaissons tous différents algorithmes de tri fantaisistes, mais aucun d'eux ne nous donne de chiffres d'une manière facile à prononcer. Pour y remédier, je propose d'utiliser prononciationSort ™, le moyen le plus naturel de trier les listes de numéros.
Prononciation
Les règles officielles pour prononcer les nombres (dans ce défi) sont que les chiffres sont prononcés un par un, et la chaîne résultante est triée dans l'ordre lexicographique. Par exemple, cela signifie que le nombre 845
est prononcé "eight four five"
et doit être trié en conséquence.
Nombres négatifs
Les nombres négatifs sont prononcés en ajoutant le mot au début "minus"
. Ainsi, -23
est prononcé comme "minus two three"
. Notez que cela fait que les nombres négatifs se retrouvent au milieu de la sortie, juste entre les nombres commençant par 4
(quatre) et 9
(neuf).
À titre indicatif, l'ordre officiel des mots pour prononciationSort ™ est:
- huit
- cinq
- quatre
- moins
- neuf
- une
- Sept
- six
- Trois
- deux
- zéro
C'est,
8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0
Contribution
Une liste d'entiers dans la plage , contenant au plus 100 éléments. La saisie sous forme de liste de chaînes n'est pas autorisée. Si votre langue ne prend pas en charge la saisie sous forme de liste, il est autorisé de fournir la saisie sous forme d'entiers séparés.
L'entrée ne contiendra aucun numéro non valide, ni aucun numéro commençant par un 0 (à l'exception du numéro 0 lui-même). L'entrée ne sera généralement pas triée, elle peut être donnée dans n'importe quel ordre.
Sortie
Les mêmes entiers, dans l'ordre de prononciationSort ™. Notez que les nombres ne doivent être convertis qu'en leurs prononciations pour obtenir le tri, la sortie ne doit contenir aucune chaîne.
Exemples
Pour les exemples, l'étape intermédiaire (entourée de parenthèses) sert uniquement de guide et ne fait pas partie de la sortie.
[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]
Il existe également un script pour vérifier vos résultats .
Réponses:
05AB1E (hérité) , 15 octets
Essayez-le en ligne!
Explication
la source
•ĆU‘•
. Il ajoute une nouvelle ligne pendant le mappage / tri pour une raison quelconque.Σ•ĆU‘•"54-ÿ"sSk
aurait pu être une alternative de 15 octets sur laquelle je travaillais, sans ce bug bizarre .. Si je change•ĆU‘•
pour le littéral,9176320
cela fonctionne très bien ..…54-ì
mêmeΣ•RT‹•Á…54-ìsSk
pour le 15•t∍ýJ•'-ìÁÁ
fonctionnerait égalementHaskell , 57 octets
Essayez-le en ligne!
la source
Gelée ,
1513 octetsEssayez-le en ligne!
Un lien monadique acceptant une liste d'entiers qui donne une liste d'entiers.
Comment?
Trie par les valeurs ordinales des chiffres des entiers (où
-
est un "chiffre" de -1) convertis en chaînes en utilisant les caractères à leur index modulaire et basé sur 1 dans la chaîne magique "murgeon lix".Le tri est effectivement alphabétique lorsqu'un espace est considéré comme inférieur à n'importe quelle lettre.
La chaîne magique "murgeon lix" a été trouvée en inspectant les dictionnaires de Jelly utilisés en compression. Il n'y a pas de mots de 11 lettres qui satisfont aux exigences (et aucun de plus qui le serait lors de la déduplication). puisqu'un espace trie avant les lettres, le prochain choix le plus évident est un mot de longueur sept suivi d'un espace suivi d'un mot de longueur trois. "murgeon" et "lix" est la seule combinaison satisfaisante, bien que sans espace, d'autres peuvent être possibles (par exemple,
“£Py:ƥ»
"murgeonalix" qui fonctionne pour le même nombre d'octets)Précédent @ 15 octets :
Ici
“¡Zo⁶’Œ?¤
trouve la première permutation de nombres naturels qui résiderait à l'indice 21,340,635 lorsque toutes les permutations des nombres sont triées lexicographiquement - ce qui est[6,10,9,3,2,8,7,1,5,4,11]
. (“¡Zo⁶’
est une représentation de base 250 de 21340635, tandisŒ?
que le calcul et¤
regroupe ces instructions)la source
Perl 6 , 30 octets
Essayez-le en ligne!
Solution Ruby du port de GB.
Version originale de 35 octets
Essayez-le en ligne!
Convertissez chaque nombre en une chaîne, obtenez le nom Unicode de chaque caractère, supprimez le premier mot ("DIGIT" ou "HYPHEN"), puis triez.
la source
JavaScript (SpiderMonkey) , 69 octets
Essayez-le en ligne!
la source
+''
, car vous prenez l'entrée comme un tableau de chaînes.K (ngn / k) ,
2120 octetsEssayez-le en ligne!
{
}
fonction avec argumentx
$
format sous forme de chaînes"
"?
"8"
<
calculer la permutation de tri croissantx@
l'argument à ces indicesla source
Python 3,
68 octets67 octets64 octetsUtilise la
sorted
fonction intégrée avec un lambda anonyme pour la clé. Codez en dur l'ordre de tri et comparez chaque chiffre de chaque valeur de la liste d'entrée à sa position dans la liste d'ordre de tri.Modifier: 1 octet enregistré en supprimant
8
de la liste de tri pour profiter dustr.find
retour-1
lorsque le paramètre n'est pas trouvé. Merci à maxb.Edit2: enregistré 3 octets en utilisant la syntaxe de décompression étoilée dans un
list
littéral au lieu d'unlist
constructeurEssayez-le en ligne!
la source
lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Pyth,
1716 octetsEssayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
1 octet sauvegardé grâce à @ngn et leur réponse K , en omettant 8 dès le début de la chaîne du dictionnaire
la source
Japt, 19 octets
Essayez-le
la source
S.n(s)
:ñ_s ®n"54-9176320
(apparemmentS.n(s)
c'est exactement la même chose ques.b(S)
pour laS
longueur 1, sauf qu'il revient0
à la place de-1
)Retina 0.8.2 , 36 octets
Essayez-le en ligne! Le lien inclut une suite de tests. Explication:
Traduisez le signe moins et les chiffres à leur position dans l'ordre de prononciation, en utilisant
:
pour la 10ème position.Trier dans l'ordre de prononciation.
Remettez la commande dans le signe moins et les chiffres d'origine.
la source
Rubis , 50 octets
Essayez-le en ligne!
la source
R , 58 octets
Essayez-le en ligne!
L'entrée est une liste de nombres qui est implicitement convertie en chaîne en utilisant
chartr
.order
utilise ensuite l'ordre lexigographique pour récupérer l'ordre selon lequel la liste d'origine doit être triée.la source
Java (JDK 10) , 123 octets
Essayez-le en ligne!
Il s'agit d'une implémentation Java naïve. Devrait être beaucoup golfable.
Crédits
la source
.chars
-IntStream et.reduce
à une boucle régulière permet d' économiser 2 octets:n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}
. De plus, un octet de plus peut être enregistré en changeant10+"85
en20+"5
, car le.indexOf
chiffre for8
entraînerait alors -1. Essayez-le en ligne 123 octetsJavaScript (SpiderMonkey) ,
8773 octetsEssayez-le en ligne!
Merci @Arnauld d'avoir dit que le tri dans SpiderMonkey est stable, donc la
||-(F(q)>F(p))
partie peut enfin être supprimée.la source
Rouge , 114 octets
Essayez-le en ligne!
Plus lisible:
la source
C ++, 353 octets
C'est une sorte de comédie, mais je perdais du temps et je l'ai écrit, donc je ne peux pas ne pas le poster ... Profitez d'un petit rire et faites-moi savoir s'il y a des économiseurs d'espace que j'ai ratés!
Sortie:
la source
Mathematica, 68 octets
Une fonction. Prend une liste d'entiers en entrée et renvoie la liste triée en sortie. Juste les chiffres sépare de chaque numéro avec
IntegerDigits
, convertit chaque chiffre à"zero"
,"one"
etc., avecIntegerName
, convertit la liste en une chaîne séparée par des espaces avecStringRiffle
, prepends un"m "
si le nombre est négatif et sortes basées sur cette chaîne. En effet, c'était l'approche la plus courte que je puisse trouver, puisque Mathematica n'utilise nativement le tri lexicographique que pour des listes de même longueur; ainsi, une approche basée sur854-9176320
finit par prendre plus d'octets car les fonctions de chaîne sont si chères.la source
05AB1E ,
1514 octets-1 octet grâce à @Emigna .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Voir cette astuce de la mine de 05AB1E (section Comment compresser les grands entiers ) pour comprendre pourquoi
•ĆU‘•
est9176320
.la source