Je voudrais générer (en tant que résultat d'une fonction ou simplement en tant que sortie d'un programme) le suffixe ordinal d'un entier positif concaténé au nombre.
Échantillons:
1st
2nd
3rd
4th
...
11th
12th
13th
...
20th
21st
22nd
23rd
24th
Et ainsi de suite, avec le suffixe répétant le sous-motif initial 1-10 tous les 10 jusqu'à 100, où le motif recommence à la fin.
L'entrée serait le nombre et la sortie la chaîne ordinale, comme indiqué ci-dessus.
Quel est le plus petit algorithme pour cela?
11
entrée et une sortie par exemple11th
? Chaque numéro de l'entrée est-il sur une ligne distincte, et les numéros de sortie doivent-ils également figurer sur des lignes séparées? Et devons-nous gérer plus d’une ligne d’entrée?11
en entrée et11th
en sortie. Cela ne me dérange pas si elle traite plusieurs lignes, mais ce que je pensais, c’était traiter un seul numéro.Réponses:
Perl, 37 + 1 caractères
Il s'agit d'une substitution d'expressions rationnelles qui ajoute le suffixe ordinal approprié à tous les nombres
$_
non suivis d'une lettre. Pour l'appliquer à l'entrée de fichier, utilisez lep
commutateur de ligne de commande, comme suit:Il s'agit d'un programme Perl complet qui lit les entrées de stdin et écrit les sorties traitées dans stdout. Le code actuel est long de 37 caractères, mais le
p
commutateur compte pour un caractère supplémentaire .Exemple de saisie:
Sortie:
Les nombres déjà suivis de lettres seront ignorés, ainsi, alimenter à nouveau la sortie à travers le filtre ne la changera pas. Les espaces, les virgules et les points entre les nombres ne sont pas traités spécialement. Ils sont donc supposés séparer les chiffres comme toute autre ponctuation. Ainsi, par exemple
3.14159
devient3rd.14159th
.Comment ça marche?
Tout d’abord, il s’agit d’un regexp global (
s///g
). L'expression rationnelle étant adapté est1?\d\b
, le cas\d
correspond à un chiffre et\b
une assertion de longueur nulle correspondant à la limite entre un alphanumérique et un caractère non alphanumérique. Ainsi,1?\d\b
correspond au dernier chiffre d’un nombre, plus le chiffre précédent s’il se trouve1
.Dans la substitution, qui est évaluée en tant que code Perl en raison du
/e
commutateur, nous prenons la chaîne correspondante segment ($&
) et lui ajoutons.
le suffixe obtenu en s’utilisant$&
lui-même en tant qu’indice entier de la liste(0,st,nd,rd)
; si ce suffixe est zéro ou non défini (c’est-à-dire quand$&
zéro ou plus grand que trois), l’||
opérateur le remplaceth
.Edit: Si la saisie est limitée à un seul entier, cette solution à 35 caractères suffira:
la source
g
substitution si vous spécifiez que chaque numéro doit figurer sur sa propre ligne. En outre, cela vous permettrait de changer la limite de mots pour être$
. Mais dans l’ensemble, +1, solution sacrément astucieuse.Python 2, 49 octets
Une fonction anonyme. Un programme complet serait compté à 55 octets.
'tsnrhtdd'[i::4]
encode les suffixesth st nd rd
pour les valeurs dei
0 à 3. Compte tenu de cela, tous nous avons besoin est un moyen de cartographier les valeurs den
l'indice du suffixe correspondanti
. Une expression simple qui fonctionne est(n%10)*(n%10<4 and 10<n%100<14)
. Nous pouvons facilement abréger ce problème en supprimant le premier ensemble de parenthèses et en observantn%5
les résultats obtenus avec les mêmesn%10
valeurs que pour lesn
suffixes spéciaux. Avec un peu d'essais et d'erreurs, on peut aussi raccourcir10<n%100<14
len%100^15>4
, ce qui peut être enchaîné avec l'autre conditionnel pour économiser encore plus d'octets.la source
Python, 68 caractères
la source
`i`+"tsnrhtdd"
. Sinon, c'est la solution exacte que je viens de recevoir.Mathematica
3945 octetsRemarque: Dans les versions récentes de Mathematica, demander la
nth
partie dep
, oùp
est indéfinie, génère un message d'erreur, mais renvoie néanmoins la réponse correcte. J'ai ajoutéQuiet
pour empêcher le message d'erreur de l'impression.Usage
Comment ça marche
SpokenString
écrit une expression Mathematica valide telle qu’elle pourrait être parlée. Vous trouverez ci-dessous deux exemples tirés de la documentation de SpokenString .Maintenant, pour l'exemple en main,
Représentons la chaîne ci-dessus sous forme de liste de mots:
et prenez le deuxième élément ...
la source
p
défini? EDIT: ça ne fait rien, je vois comment vous utilisez ceci; Malheureusement, cela ne fonctionne pas sur mon système. : - /SpokenString @ p[[117]]
la sortie" part 117 of p"
.SpokenString
est révisé de temps en temps. Je ne serais pas surpris si ce code ( codegolf.stackexchange.com/questions/8859/… ) ne fonctionne pas non plus sur le v. 7. Au fait, il ne s'agissait pas d'une solution durable.Ruby, 60 ans
Ce n'est pas aussi bon que l'entrée Perl, mais je me suis dit que je travaillerais sur mes compétences en Ruby.
Fonction prend un argument entier
n
, et renvoie une chaîne sous la forme ordinale.Fonctionne selon la logique suivante:
Si le chiffre des dizaines est un 1 ou que le chiffre des unités est supérieur à 3, utilisez le suffixe 'th'; sinon, trouvez le suffixe dans le tableau ['th', 'st', 'nd', 'rd'] en utilisant le dernier chiffre comme index.
la source
o(113)
est"113rd"
, devrait être"113th"
. La vérification des dizaines ne prend pas en compte les nombres de plus de deux chiffres.%10
pour compenser. Ajout de 3 caractères. (Je me sens comme%10
semble assez où il devrait être raccourcies en quelque sorte, mais je ne peux pas penser à une solution)10
?n%10
est mieux.Javascript (ES6)
5044 octets (non concurrents)Remarques
la source
a+
->a+=
, supprime les parenthèses,\d
->.
, supprime[0]
et si vous prenez le nombre sous forme de chaîne:a.match`1?.$`
au lieu de/1?.$/.exec(a)
.Javascript,
6871Effort conjoint avec ItsCosmo.
EDIT: ne fonctionnait pas correctement avec des nombres> 100
la source
function o(n)n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
et vous pouvez le réduire davantage à 54 si vous préférez utiliser la notation des grosses flèches:o=n=>n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
Golfscript, 34 caractères
la source
Haskell, 95 caractères
Essai:
Doit être chargé avec -XNoMonomorphismRestriction.
la source
JavaScript, 64 caractères (ES3) ou 47 caractères (ES6)
ES3 (64 caractères):
function(n){return n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'}
ES6 (47 caractères):
n=>n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
Explication
L'expression est
n % 100 >> 3 ^ 1
évaluée à 0 pour touten
fin positive avec chiffres08
-15
. Ainsi, pour touten mod 100
fin dans11
,12
ou13
, la recherche de tableau retourneundefined
, conduisant à un suffixe deth
.Pour tout positif
n
se terminant dans d' autres chiffres que08
-15
, l'expression estn % 100 >> 3 ^ 1
évaluée à un nombre entier positif, en invoquant l'expressionn % 10
pour la recherche de réseau, le retourst
,nd
ourd
pourn
qui se termine avec1
,2
, ou3
. Dans le cas contraire,th
.la source
n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
.n+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th"
, adaptée de ce post .APL (Dyalog Unicode) ,
38 à36 octetsMerci à ngn pour avoir corrigé un bogue tout en maintenant le nombre d'octets.
Fonction de préfixe tacite anonyme. Nécessite
⎕IO
( I ndex O ensemble à RIGINE)0
, qui est par défaut sur de nombreux systèmes. Même travaille pour 0!Essayez-le en ligne!
{
…}
Lambda anonyme;⍵
est l'argument:⍳4
quatre premières ɩ ndices;[0,1,2,3]
10↑
prenez les dix premiers éléments de cela, en ajoutant des zéros:[0,1,2,3,0,0,0,0,0,0]
⊂
joindre à traiter comme un seul élément;[[0,1,2,3,0,0,0,0,0,0]]
1 0 8\
développer à une copie, une copie prototype (tout à zéro), huit copies;[[0,1,2,3,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,1,2,3,0,0,0,0,0,0],
[0,1,2,3,0,0,0,0,0,0],
(5 autres)
[0,1,2,3,0,0,0,0,0,0]]
∊
ε nlist (aplatir);[0,1,2,3,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,1,2,3,0,0,0,0,0,0,
0,1,2,3,0,0,0,0,0,0,
(50 de plus)
0,1,2,3,0,0,0,0,0,0]
⍵⌽
faire une rotation cyclique à gauche autant de pas que l'indique l'argument⊃
choisir le premier nombre (c'est-à-dire le nombre argument-mod-100)2×
multiplier par deux que (donne0
,2
,4
, ou6
)'thstndrd'↓⍨
déposer autant de caractères de cette chaîne2↑
prendre les deux premiers des personnages restants⍕,
concaténer l'argument stringifié à celuila source
⍕,{2↑'thstndrd'↓⍨2×⊃⍵⌽∊1 0 8\⊂10↑⍳4}
⎕io←0
. Je vois que vous avez deviné, mais il y en a quelques 1,2,3,4,0,0 ... qui devraient être 0,1,2,3,0,0 ...PowerShell, 92
Fonctionne avec un numéro par ligne d'entrée. L'entrée est donnée par le pipeline. Le faire fonctionner pour un seul nombre ne réduit pas la taille.
la source
J - 44 caractères
Rien dans J? C'est un outrage!
Expliqué (notez que le
1
booléen est vrai en J et qu'il0
est faux):10 10(...)/@#:]
- Prenons d'abord l'argument (]
) et trouvons le chiffre des dizaines et des un (10 10 #:
). Ensuite, nous allons insérer(...)
entre les deux.(]*[(~:*])4>])
- Dans cette sous-expression, mais pas la plus profonde,]
indiquera le chiffre des unités et[
le chiffre des dizaines.[(~:*])4>]
-~:
est J pour "non-égal", donc cela prend le résultat de4>]
(c'est-à-dire si le chiffre est inférieur ou égal à 4) et le multiplie par le résultat detens ~: (4>])
. Pourquoi quelqu'un ferait-il cela? Considérer ce qui suit:tens
est1
(nous sommes dans l'adolescence) etones
est inférieur à 4, donctens ~: (4>])
est faux et le résultat est0*1
=0
.tens ~: (4>])
est vrai et nous sortons1*1
=1
.ones
est supérieur à quatre, alors4>]
c'était0
et peu importe ce qu'il advient du test, nous sortirons quand0
même.[(~:*])4>]
est1
si nous sommes dans {X0, X1, X2, X3} mais pas dans les adolescents, et0
autrement.]*
- Enfin, nous multiplions ce résultat par le chiffre des unités. Donc, ce produit sera0
si le nombre mérite un'th'
suffixe, sinon sa valeur.th`st`nd`rd{::~
- Nous utilisons les chiffres modifiés en haut pour indexer la liste des suffixes.0
obtient'th'
,1
obtient'st'
, et ainsi de suite.":,
- Enfin, prenez le numéro d'origine, convertissez-le en chaîne (":
), puis ajoutez-le au suffixe.L'utilisation est évidente, même si le verbe en l'état ne peut prendre qu'un ordinal, pas une liste.
la source
C #, 62 octets
Programme complet et vérification:
la source
||
pour|
.Mathematica 29 + 5 = 34 octets
+5 octets car la
Speak
fonction doit être appelée avant d'utiliser cette fonction intégrée.Usage
la source
PHP, 151
Je sais que ce programme n'est pas comparable aux autres. Juste envie de donner une solution.
la source
foreach($s as $n){echo$n;
Scala 86
Scala 102:
102 également:
ungolfed:
la source
OCaml
Je suis assez nouveau sur OCaml, mais c’est le plus court que je puisse obtenir.
J'ai créé une fonction n qui prend un nombre en paramètre et fait le travail. C'est long mais j'ai pensé que ce serait génial d'avoir un exemple fonctionnel.
la source
if v>10 && v<14
? Je ne connais pas bien ocaml, mais est-il nécessaire que lastring_v
variable soit aussi longue?K - 44 caractères
Il se trouve que cela est exactement aussi long que le J et fonctionne presque de la même manière.
A expliqué:
x$:
- Nous convertissons d'abord l'opérandex
en chaîne, puis nous lui attribuons de nouveaux
. Nous aurons besoin de son représentant de chaîne ultérieurement, afin de le sauvegarder maintenant..:'
- Reconvertir (.:
) chaque'
chiffre ( ) en un nombre.-2#0,
- Ajoutez un 0 au début de la liste des chiffres (dans le cas de nombres à un chiffre), puis prenez les deux derniers.{y*(y<4)*~1=x}.
- Utilisez les deux chiffres comme argumentsx
ety
à cette fonction interne, qui renvoiey
siy
est inférieur à 4 etx
n’est pas égal à 1, sinon 0.`th`st`nd`rd@
- Indexez la liste des suffixes par ce résultat.x,$
- Convertissez le suffixe de symbole en chaîne et ajoutez-le au numéro d'origine.Usage:
la source
C -
9583 caractèresDegolfed:
Nous pourrions faire
k=(n-1)%10
au lieu d’ajouter 9, mais pour n = 0, nous aurions un comportement incorrect, car C(-1)%10
évalue à -1, pas à 9.la source
Javascript, 75
la source
PHP, 98 octets
Le bit 11-13 me tue ici. Fonctionne pour tout entier
$n >= 0
.Pour tout entier
$n
:PHP, 103 octets
la source
Python,
8884 octetsUngolfed:
lambda x
définit une fonction anonyme avec paramètrex
.((('th','st','nd','rd')+('th',)*6)[int(x[-1])]
définit un tuple des fins pour les nombres inférieurs à 10, l'0-th
élément est pour0
, et ainsi de suite. lesif ('0'+x)[-2] != '1'
contrôles s'il y a11
,12
ou un13
à fixer, et ajouteelse 'th'
ajoute auth
lieu dest
,rd
ound
.la source
JavaScript (Node.js) , 51 octets
crédit à @KevinCruijssen pour l'amélioration de la réponse
Essayez-le en ligne!
Explication:
la source
R ,
7976 octetsPuisqu'il n'y a pas encore de solution R ... pas d'astuce ici, index de base de vecteur, golfé jusqu'à 3 caractères grâce à Giuseppe. Index précédemment essayé:
[1+(x%%10)-(x%%100==11)]
et[1+(x%%10)*(x%%100!=11)]
.Essayez-le en ligne!
Avec
substr
79 octets:Essayez-le en ligne!
la source
1+x%%10*!x%%100==11
pour l'index?!
devant l'expression au lieu de!=
.^
est vraiment élevé, puis les%%
opérateurs de type, puis*/
et+-
et je pense==
et&|
vient ensuite.!
La priorité est assez faible, vous pouvez donc l'utiliser comme séparateur entre les opérations.Python 2.7, 137 caractères
n
devrait être une chaîneJe sais que je suis déjà battu par la concurrence ici, mais je pensais donner mon idée quand même.
ceci génère simplement une liste de paires clé / valeur avec un nombre (sous forme de chaîne) se terminant
e
et l'ordinalo
. Il essaie de faire correspondre "th" en premier (d'où la raison pour laquelle je n'ai pas utilisé de dictionnaire), afin qu'il ne retourne pas accidentellement "st", par exemple, alors qu'il doit être "th". Cela fonctionnera pour tout entier positifla source
n[-1]==e
est de 5 caractères plus court quen.endswith(e)
C: 95 caractères
Une solution ridiculement longue:
Il doit être mutilé davantage.
la source
Javascript, 75
la source
Oracle SQL 11.2, 101 octets
la source
Javascript ES6, 52 caractères
la source