Alphabétiser les entiers
Pour un ensemble donné de nombres, mettez-les dans l'ordre alphabétique lorsqu'ils sont épelés (c'est-à-dire 1: un, 2: deux, 90: quatre-vingt-dix, 19: dix-neuf). Votre code devrait fonctionner pour la plage [-999999, 999999]
. La sortie doit avoir un délimiteur entre les nombres. Un espace fonctionnera, tout comme un espace et une virgule comme indiqué dans les exemples ci-dessous. L'entrée peut être un tableau d'entiers, une chaîne de nombres délimités ou comme bon vous semble. Tous les entiers sont supposés être uniques.
Les chiffres ne sont pas coupés d'un trait aux fins de ce défi et les espaces sont classés par ordre alphabétique avant tout autre caractère. Les nombres négatifs sont supposés être exprimés en utilisant le mot minus
. Par exemple, four
précéderait four thousand
et le nombre -40
serait trié à l'aide de la chaîne minus forty
. Supposons que tous les nombres seront uniquement composés de mots numériques et pas de conjonctions (par exemple, utiliser à la two thousand forty two
place de two thousand and forty two
).
Cas de test
Entiers à un chiffre:
Contribution:
1, 2, 3, 4, 5
Production:
5, 4, 1, 3, 2
Entiers à plusieurs chiffres:
Contribution:
-1002, 5, 435012, 4, 23, 81, 82
Production:
81, 82, 5, 4, 435012, -1002, 23
Espaces entre les mots, sans tirets, virgules ou "et":
Contribution:
6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804
Production:
6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204
N'oubliez pas qu'il s'agit de code-golf , donc le code avec le moins d'octets gagne. Aucune échappatoire autorisée!
Réponses:
JavaScript (ES6),
189179186 octetsL'idée de base est de convertir chaque numéro d'entrée en une chaîne courte qui est dans la position lexographique correcte par rapport à toutes les autres paires de chaînes de nombres. Voici le dictionnaire utilisé: (N'exécutez pas l'extrait; il est juste utilisé pour masquer la longue liste.)
Afficher l'extrait de code
Cela crée un moyen très concis de mapper chaque nombre à sa position lexographiquement correcte. C'est ce que fait la
q
fonction récursive :Au
0
début de la chaîne est de s'assurer que par exemple 100 (one hundred
, converti enPK0
) est trié avant101
(one hundred one
, converti enPKP
). Cela crée un scénario étrange où 0 (zero
) est trié à l'avant du tableau, donc pour contourner cela, dans la fonction de tri, nous trions d'abord les zéros à droite avec!x-!y||(...
.la source
[1100, 1000]
. Je m'attendrais à ce que la sortie soit1000 (one thousand), 1100 (one thousand one hundred)
, mais la sortie est du même ordre que l'entrée.1000
est analysé commeone thousand zero
; Je vais arranger ça momentanément. Doit-on soutenir0
seul? C'est un cas unique qui ajoutera environ 15 octets à mon code.Informer 7,
214201118 octetsInform 7 est un langage absolument horrible pour le golf, donc je voulais lui donner une chance ici.
L'indentation doit utiliser des caractères tab (
\t
), mais HTML n'aime pas ceux-ci. Inversement, Inform n'aime pas les espaces pour l'indentation, vous devrez donc remplacer les espaces par des tabulations si vous copiez-collez le code d'ici pour le tester. Ou copiez-collez simplement à partir de la source Markdown.Golfé:
L'entrée doit être une table Inform, comme ceci (avec
\t
entre les colonnes):Production:
Cette fonction parcourt le tableau une fois, en ajoutant une représentation textuelle de chaque numéro dans une nouvelle colonne. Ensuite, il trie les lignes du tableau en fonction de la colonne de texte; dans Inform, les chaînes sont triées lexicographiquement. Enfin, il imprime la colonne d'origine dans la nouvelle commande. De manière pratique, le format "brut mais parfois utile" d' Inform 7 pour l'impression des colonnes du tableau se révèle être séparé par des virgules, exactement comme demandé.
Non golfé, avec passe-partout indiquant comment appeler la fonction:
la source
words
référence des versions épelées des nombres est-elle intégrée à Inform 7?say "[R entry] "
devrait suffire.Mathematica, 67 octets
Fonction sans nom prenant une liste d'entiers comme argument et renvoyant une liste d'entiers comme valeur.
#~IntegerName~"Words"
est une fonction intégrée qui change un entier en son nom en anglais.IntegerName
a parfois des virgules et des tirets dans sa sortie, donc l'StringReplace
appel se débarrasse de ceux-ci. (Malheureusement, le tiret est en fait le caractère à 3 octets, 8208, en UTF-8.)SortBy
Trie ensuite la liste d'origine par ordre alphabétique en fonction de la valeur du nom entier modifié.Une belle coïncidence:
IntegerName
utilisenegative
au lieu deminus
dans sa sortie - mais aucun mot apparaissant dans les noms des numéros autorisés n'est alphabétiquement entre ces deux mots, donc aucun remplacement n'est nécessaire!(Pointe du chapeau à ngenisis pour me le rappeler
Sortby
.)la source
IntegerName
. La documentation Wolfram indique qu'il s'agit du caractère unicode 2010 .Bash + GNU utils + bsdgames, 52
Les E / S sont des lignes délimitées par des sauts de ligne.
number
utilitaire ), suivie de:
puis la forme numérique du nombre.sort
éd.sed
bande menant les caractères jusqu'au et y compris le:
, laissant la forme numérique triée comme requis.number
gère correctement "moins", et sa sortie est suffisamment proche du format spécifique que lesort
fonctionne comme requis. Il affiche "quarante-quatre" au lieu de "quarante-quatre", mais cela ne devrait pas avoir d'importance du point de vue du tri.Le package bsdgames peut nécessiter une installation:
Les utilitaires
sed
etsort
sont presque certainement déjà dans votre distribution.la source
-t:
est inutile et vous pouvez utilisernumber<<<&
-t:
. Cependant, lae
fonction val de sed exécute des commandes en utilisantsh
, donc les fonctionnalités bash comme<<<
ne fonctionneront pas.sh
il essaie d'émuler autant que possible Posix sh, ce qui signifie que les bashismes tels que<<<
sont désactivés.sed
Lae
fonction val de GNU démarre les commandes avec/bin/sh -c ...
et non/bin/bash -c ...
. Avez-vous essayé cela?<<<
, même pas en mode posixPython + flexion,
979189 octetsUtilisé la
inflect
bibliothèque pour transformer lewords
tableau d'entiers en leur représentation phonétique / chaîne. Stocké dans un dictionnaire de paires k / v où les clés étaient la représentation numérique et les valeurs étaient la représentation sous forme de chaîne. Renvoyé la liste des clés triées par valeurs.EDIT: 5 et 3 octets enregistrés, grâce à ETHproductions et Alex.S!
la source
a={x:inflect.engine().number_to_words(x)for x in words}
.from inflect import*
et en jetant surinflect.
la deuxième ligne.Mathematica, 30 octets
La réponse ci-dessous génère une fonction pure qui prendra une liste d'entiers en entrée et les triera par leur nom alphabétique. Juste ce que le docteur à prescrit ;)
Voici la version non golfée:
Et voici un exemple d'utilisation:
Qui pourrait aussi s'écrire
Ils produisent des sorties identiques - en mathématique,
f[x]
équivaut àf@x
.Il y a une réponse beaucoup plus longue qu'un autre utilisateur a posté dans Mathematica. Cette réponse essaie de corriger quelques petites différences entre la façon dont mathématique alphebatise les nombres pour mieux se conformer à la façon dont les nombres déclarés OP doivent être alphebatisés, cependant les choses qu'ils corrigent n'affectent pas l'ordre de tri, et ma réponse renvoie de manière identique à la leur:
la source
TheirF
trie correctement 888 avant 880 000, maisMyF
pas. Le problème est probablement lié au copier-coller du trait d'union étrange: votre version deTheirF
remplace probablement les tirets normaux (dont il n'y en a pas), tandis que la version actuelle remplace l'étrange trait d'unicode 3 octets. (Il serait toujours intéressant de voir si la suppression des virgules est nécessaire.)Lisp commun, 113 octets
Aucune bibliothèque externe nécessaire.
Sortie si
x
est'(1 2 3 4 5)
:la source