输出序号(第一,第二,第三)


43

我想生成(作为函数的返回结果,或仅作为程序的输出)与数字连接的正整数的序数后缀。

样品:

1st  
2nd  
3rd  
4th  
...  
11th  
12th  
13th  
...  
20th  
21st
22nd
23rd
24th

依此类推,后缀每10个重复最初的1-10个子模式,直到100个,该模式最终重新开始。

输入将是数字,输出将是如上所示的序数字符串。

最小的算法是什么?


嗨,尼克C,欢迎来到codegolf.SE!只是为了澄清,您是说我们应该读一个数字11作为输入,然后输出例如11th?输入中的每个数字是否都在单独的行中,并且输出数字也应该在单独的行中吗?我们是否需要处理多于一行的输入?
Ilmari Karonen 2012年

1
您在寻找最小的算法还是最小的代码?
Toto 2012年

@Ilmari我正在寻找11输入和11th输出。我不介意它是否处理多行,但我想到的只是处理一个数字。
妮可2012年

@ M42你知道,我不太确定。我没有严格的要求-但我可能正在考虑最小的算法。
妮可

Answers:


30

Perl,37个1个字符

s/1?\d\b/$&.((0,st,nd,rd)[$&]||th)/eg

这是一个正则表达式替换,它将适当的序数后缀附加到$_尚未跟有字母的任何数字之后。要将其应用于文件输入,请使用p命令行开关,如下所示:

perl -pe 's/1?\d\b/$&.((0,st,nd,rd)[$&]||th)/eg'

这是一个完整的Perl程序,可从stdin读取输入并将处理后的输出写入stdout。实际的代码长37个字符,但该p开关算作一个额外的字符

输入样例:

This is the 1 line of the sample input...
...and this is the 2.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
101 102 103 104 105 106 107 108 109 110

输出:

This is the 1st line of the sample input...
...and this is the 2nd.
1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10th
11th 12th 13th 14th 15th 16th 17th 18th 19th 20th
21st 22nd 23rd 24th 25th 26th 27th 28th 29th 30th
101st 102nd 103rd 104th 105th 106th 107th 108th 109th 110th

已经跟随字母的数字将被忽略,因此通过过滤器再次提供输出不会改变它。数字之间的空格,逗号和句点没有特别处理,因此假定它们像其他标点符号一样分隔数字。因此,例如3.14159变为3rd.14159th

它是如何工作的?

  • 首先,这是全局regexp替换(s///g)。匹配的正则表达式为1?\d\b,其中\d匹配任何数字,并且\b是零宽度的断言,与字母数字字符和非字母数字字符之间的边界匹配。因此,1?\d\b匹配任何数字的最后一位,如果恰好是,则匹配前一位1

  • 在替换中,由于/e切换,该替换被评估为Perl代码,我们将匹配的字符串segment($&.加上后缀()附加到后缀,该后缀通过将$&自身用作列表的整数索引而获得(0,st,nd,rd);如果此后缀为零或未定义(即,当$&为零或大于三时),则||运算符用替换th


编辑:如果输入限制为单个整数,则此35个字符的解决方案就足够了:

s/1?\d$/$&.((0,st,nd,rd)[$&]||th)/e

1
g如果您指定每个数字必须在自己的行上,则应该能够删除替换项。另外,还可以将单词border更改为$。但总体而言,+ 1是该死的聪明解决方案。
拉玛先生先生2012年

@GigaWatt:的确,我在NickC回答有关输入格式的问题之前就编写了代码,因此我使它尽可能通用。
Ilmari Karonen 2012年

38

Python 2,49字节

lambda n:`n`+'tsnrhtdd'[n%5*(n%100^15>4>n%10)::4]

匿名函数。一个完整的程序将在55个字节计数。

'tsnrhtdd'[i::4]编码th st nd rdi从0到3 的后缀。鉴于此,我们需要的是一种将的值映射n到相应后缀的索引的方法i。一个简单有效的表达式是(n%10)*(n%10<4 and 10<n%100<14)。我们可以通过删除第一组括号并观察n%5得出与特殊后缀n%10的值相同的结果来轻松缩短此时间n。反复尝试,一个也可能会缩短10<n%100<14n%100^15>4,可以与另一个条件链接起来以节省更多字节。


3
这是这里的一些黑魔法c:
cat


我不明白 谁能解释这里发生了什么?
帕维尔

@Pavel我用解释更新了我的答案。
xsot

太棒了!
出色的思维

10

Python,68个字符

i=input()
k=i%10
print"%d%s"%(i,"tsnrhtdd"[(i/10%10!=1)*(k<4)*k::4])

4
这确实很晚,但是您可以通过执行腾出7个字节`i`+"tsnrhtdd"。否则,这是我刚得到的确切解决方案。
DLosc

10

Mathematica 39 45字节

注意:在最新版本的Mathematica中,询问的nth部分p,其中pundefined不确定,会生成一条错误消息,但无论如何都会返回正确的答案。我已添加Quiet以防止打印错误消息。

Quiet@StringSplit[SpokenString[p[[#]]]][[2]]&

用法

Quiet@StringSplit[SpokenString[p[[#]]]][[2]] &[31]

31日

Quiet@StringSplit[SpokenString[p[[#]]]][[2]] &/@Range[21]

{“第1个”,“第2个”,“第3个”,“第4个”,“第5个”,“第6个”,“第7个”,“第8个”,“第9个”,“第10个”,“第11个”,“第12个”,“ 13“,” 14th“,” 15th“,” 16th“,” 17th“,” 18th“,” 19th“,” 20th“,” 21st“}


这个怎么运作

SpokenString写出任何可能有效的Mathematica表达式。以下是SpokenString文档中的两个示例,

SpokenString[Sqrt[x/(y + z)]]

“数量x超过数量y加z的平方根” *)

SpokenString[Graphics3D[Sphere[{{0, 0, 0}, {1, 1, 1}}]], "DetailedGraphics" -> True]

“由以0、0、0和1、1、1为中心的单位球面组成的三维图形”


现在,举个例子

Quiet@SpokenString[p[[#]]] &[31]

“ p的第31个元素”

让我们将上述字符串表示为单词列表:

StringSplit[%]

{“ the”,“ 31st”,“ element”,“ of”,“ p”}

并考虑第二个要素...

%[[2]]

31日


我糊涂了; 在哪里p定义?编辑:没关系,我知道您如何使用它;不幸的是,它在我的系统上不起作用。:-/
巫师先生(Mr.Wizard)

它适用于v.9.0.1。(我记得您使用的是7.0。)是的,不需要定义p。
DavidC 2013年

我现在明白了 但是,在v7中,我从SpokenString @ p[[117]]output 获得" part 117 of p"
威兹德先生2013年

因此SpokenString会不时进行修订。我对这个代码(codegolf.stackexchange.com/questions/8859/…)在第7版中也不起作用感到惊讶,顺便说一句,这并不是一个持久的解决方案。
DavidC 2013年

哈哈,我以前没看过那个答案。
威兹德先生2013年

7

Ruby,60岁

它不如Perl入门,但我认为我会研究Ruby技能。

def o(n)n.to_s+%w{th st nd rd}[n/10%10==1||n%10>3?0:n%10]end

函数采用一个整数参数,n并以字符串形式返回字符串。

根据以下逻辑工作:
如果十位数为1或一个位数大于3,则使用后缀'th';否则,使用最后一位作为索引,从数组['th','st','nd','rd']中找到后缀。


o(113)"113rd",应该是"113th"。十位数检查不考虑两位以上的数字。
hammar 2012年

好吧,请搭另一个%10来弥补。添加了3个字符。(我觉得%10应该以某种方式缩短它的地方看起来足够多了,但我想不出解决方案了)
先生2012年

您永远不会在编写可怕的,难以理解的代码中击败Perl,该代码

将变量设置为10
wizzwizz4 '16

我认为将变量设置n%10为更好。
CalculatorFeline

6

Javascript(ES6)50 44字节(非竞争)

a=>a+=[,"st","nd","rd"][a.match`1?.$`]||"th"

笔记

  • 以imput作为字符串
  • 删除了6个字节,谢谢@ user81655

1
a+-> a+=删除括号,\d-> .删除[0],如果您将数字作为字符串:a.match`1?.$`而不是/1?.$/.exec(a)
user81655 '16

您可能应该添加一个注意,该答案是非竞争性的,因为发布挑战时不存在ES6。
user2428118

5

Javascript 68 71

function o(n){return n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')}

与itsCosmo共同努力。

编辑:无法正常使用数字> 100


您可以使用以下命令将其降低到62:function o(n)n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')如果您愿意使用o=n=>n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')

@WallyWest由于某种原因,我真的很喜欢我的解决方案可以在现代浏览器中使用。随意发表自己的答案;我认为它足够不同。
aebabis 2014年

不,很好!仅提供一些替代方案!
WallyWest 2014年


3

Haskell,95个字符

h=foldr g"th".show
g '1'"th"="1st"
g '2'"th"="2nd"
g '3'"th"="3rd"
g '1'[x,_,_]='1':x:"th"
g a s=a:s

测试:

*Main> map h [1..40]
["1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th","11th","12th","13t
h","14th","15th","16th","17th","18th","19th","20th","21st","22nd","23rd","24th",
"25th","26th","27th","28th","29th","30th","31st","32nd","33rd","34th","35th","36
th","37th","38th","39th","40th"]

必须加载-XNoMonomorphismRestriction。


3

JavaScript,64个字符(ES3)或47个字符(ES6)

ES3(64个字符):

function(n){return n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'}

ES6(47个字符):

n=>n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'

说明

n % 100 >> 3 ^ 1对于n以数字08– 表示的任何正数结尾,该表达式的计算结果为0 15。因此,对于任何n mod 100结束在111213,阵列查找返回undefined,导致的后缀th

对于任何正n在其他数字比结局08- 15,表达式n % 100 >> 3 ^ 1计算结果为正整数,调用表达式n % 10为阵列查找,返回stndrd用于n其端用123。否则,th


使用保存字节n+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
毛茸茸的

@Shaggy,谢谢,根据建议进行了更新。
Tomas Langkaas


@ guest271314,很高兴看到此代码被使用。请注意,它仅适用于正数,另一种替代方法是n+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th"改编自本文
Tomas Langkaas

3

APL(Dyalog Unicode) 38 36字节

感谢ngn在维护字节数的同时修复了错误。

匿名默认前缀功能。需要将⎕IOI ndex O rigin)设置为0,这在许多系统上都是默认设置。甚至适用于0!

⍕,{2'thstndrd'↓⍨2×⊃⍵⌽∊1 0 8\⊂10↑⍳4}

在线尝试!

{} 匿名lambda;是参数:

⍳4 前四个ɩ ndices;[0,1,2,3]

10↑ 从中取前十个元素,并用零填充: [0,1,2,3,0,0,0,0,0,0]

 封闭视为单一要素; [[0,1,2,3,0,0,0,0,0,0]]

1 0 8\ 扩展到一个副本,一个原型副本(全零),八个副本;
  [[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个)
   [0,1,2,3,0,0,0,0,0,0]]

ε NLIST(扁平化);
  [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个)
   0,1,2,3,0,0,0,0,0,0]

⍵⌽ 循环向左旋转参数指定的步数

 选择第一个数字(即第100个mod-mod参数)

 乘两个由(给出024,或6

'thstndrd'↓⍨从该字符串中删除那么多字符

2↑ 取剩下的两个字符

⍕, 将字符串化参数连接到该字符串


“ 31th”?
ngn

⍕,{2↑'thstndrd'↓⍨2×⊃⍵⌽∊1 0 8\⊂10↑⍳4}
ngn

对不起,我忘了提⎕io←0。我可以看到您猜到了,但是有一些1,2,3,4,0,0 ...应该是0,1,2,3,0,0 ...
ngn

@ngn固定。并且碰巧也为0工作!
亚当

2

PowerShell,92岁

process{"$_$(switch -r($_){"(?<!1)1$"{'st'}"(?<!1)2$"{'nd'}"(?<!1)3$"{'rd'}default{'th'}})"}

每行输入只能使用一个数字。输入是通过管道给出的。使它仅适用于单个数字并不会减小大小。


2

J-44个字符

J什么都没有?这真是令人发指!

(":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:])

解释(请注意,1在J中布尔值为true,0为false):

  • 10 10(...)/@#:]-首先,我们接受参数(])并找到十位数和个位数(10 10 #:)。然后,我们将在(...)两者之间插入。
  • (]*[(~:*])4>])-在此子表达式中(而不是最里面的子表达式)]将指向一位数字和[十位数。
  • [(~:*])4>]- ~:是“不等于”的J,因此将结果4>](即一位数字是否小于4)乘以结果tens ~: (4>])。为什么有人会这样做?考虑以下:
    • 如果我们正在检查10、11、12、13,tens则为1(我们处于十几岁)且ones小于4,因此tens ~: (4>])为false,结果为0*1= 0
    • 如果我们是{X0,X1,X2,X3}中的任何其他人,那么显然tens ~: (4>])是正确的,我们得出1*1=1
    • 如果ones大于4,然后4>]0它不事会发生什么情况测试了,我们会得到0了不管。
    • 总结一下,[(~:*])4>]就是1我们是否在{X0,X1,X2,X3}中,但不在青少年中,0否则。
  • ]*-最后,我们将结果乘以一个数字。因此,0如果该数字应加一个'th'后缀,则该产品将为它的值。
  • th`st`nd`rd{::~-我们使用上方的修改后的一位索引后缀列表。0gets 'th'1gets 'st'等。
  • ":,-最后,获取原始数字,将其转换为字符串(":),然后将其添加到后缀之前。

用法很明显,尽管动词按原样只能接受一个序数,而不能接受一个列表。

   (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:]) 112         NB. single use
112th
   (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:]) 1 2 3 4 5   NB. doing it wrong
|length error
|       (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:])1 2 3 4 5
   NB. i.5 10   makes a 5x10 grid of increasing integers
   NB. &.>      to operate on each integer separately, and box the result after
   (":,th`st`nd`rd{::~10 10(]*[(~:*])4>])/@#:])&.> i.5 10   NB. all better
+----+----+----+----+----+----+----+----+----+----+
|0th |1st |2nd |3rd |4th |5th |6th |7th |8th |9th |
+----+----+----+----+----+----+----+----+----+----+
|10th|11th|12th|13th|14th|15th|16th|17th|18th|19th|
+----+----+----+----+----+----+----+----+----+----+
|20th|21st|22nd|23rd|24th|25th|26th|27th|28th|29th|
+----+----+----+----+----+----+----+----+----+----+
|30th|31st|32nd|33rd|34th|35th|36th|37th|38th|39th|
+----+----+----+----+----+----+----+----+----+----+
|40th|41st|42nd|43rd|44th|45th|46th|47th|48th|49th|
+----+----+----+----+----+----+----+----+----+----+

2

C#,62个字节

n=>n+(n/10%10==1||(n%=10)<1||n>3?"th":n<2?"st":n<3?"nd":"rd");

完整的程序和验证:

using System;

namespace OutputOrdinalNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int,string>f= n=>n+(n/10%10==1||(n%=10)<1||n>3?"th":n<2?"st":n<3?"nd":"rd");

            for (int i=1; i<=124; i++)
                Console.WriteLine(f(i));
        }
    }
}

您可以通过将更||改为来打高尔夫球两个字节|
凯文·克鲁伊森

2

Mathematica 29 + 5 = 34字节

SpokenStringDump`SpeakOrdinal

+5个字节,因为Speak必须在使用此内置函数之前调用函数。

用法

SpokenStringDump`SpeakOrdinal[1]

"1st "

SpokenStringDump`SpeakOrdinal[4707]

"4,707th "


1

PHP 151

我知道该程序无法与其他程序相提并论。只是觉得自己想办法。

<?$s=explode(' ',trim(fgets(STDIN)));foreach($s as$n){echo$n;echo(int)(($n%100)/10)==1?'th':($n%10==1?'st':($n%10==2?'nd':($n%10==3?'rd':'th')))."\n";}

您可以使用foreach($s as $n){echo$n;
karthik

1

斯卡拉86

def x(n:Int)=n+{if(n%100/10==1)"th"else(("thstndrd"+"th"*6).sliding(2,2).toSeq(n%10))}

Scala 102:

def x(n:Int)=if((n%100)/10==1)n+"th"else if(n%10<4)n+("thstndrd".take(n+1)%5*2.drop(n%5*2))else n+"th"

102:

def x(n:Int)=if((n%100)/10==1)n+"th"else if(n%10<4)n+("thstndrd".sliding(2,2).toSeq(n%10))else n+"th"

松散:

def x (n: Int) =
  n + { if (((n % 100) / 10) == 1) "th" 
        else (("thstndrd"  + ("th"  * 6)).sliding (2, 2).toSeq (n % 10))
      }

1

OCaml

我对OCaml很陌生,但这是我能得到的最短的时间。

let n x =
   let v = x mod 100 and string_v = string_of_int x in
   let z = v mod 10 in
   if v=11 || v=12 || v=13 then string_v^"th" 
   else if v = 1 || z = 1 then string_v^"st" else if v = 2 || z = 2 then string_v^"nd" else if v = 3 || z = 3 then string_v^"rd" else string_v^"th";;

我创建了一个以数字为参数的函数n并完成了工作。它虽然很长,但是认为拥有一个实用的示例会很棒。


输入:11会产生输出:

是的,您是对的。我已进行了更正。谢谢
约瑟夫·艾尔西德

我刚刚整理了代码的格式。每行必须在前面加上四个空格才能被识别为代码块。
Gareth

如果支票缩短为,您不会第一次if v>10 && v<14吗?我不熟悉ocaml,但是是否有必要使string_v变量变长?
加菲2012年

没必要,我可以选择w或x。只是想要一些有意义的东西。但是您是对的,它会使代码更短。
2012年

1

K-44个字符

碰巧这恰好与J一样长,并且工作方式几乎相同。

{x,$`th`st`nd`rd@{y*(y<4)*~1=x}.-2#0,.:'x$:}

解释:

  • x$:-首先,我们将操作数x转换为字符串,然后将其分配回x。稍后我们将再次需要其字符串rep,因此现在可以保存字符。
  • .:'-将.:每个(')数字()转换回一个数字。
  • -2#0, -在数字列表的前面加上一个0(如果是一位数字),然后取最后两位。
  • {y*(y<4)*~1=x}.-使用两位数作为该内部函数的参数x,如果小于4 且不等于1,则返回0,否则返回0。yyyx
  • `th`st`nd`rd@ -通过该结果索引后缀列表。
  • x,$ -将后缀从符号转换为字符串,并将其附加到原始数字之后。

用法:

  {x,$`th`st`nd`rd@{y*(y<4)*~1=x}.-2#0,.:'x$:} 3021
"3021st"
  {x,$`th`st`nd`rd@{y*(y<4)*~1=x}.-2#0,.:'x$:}' 1 2 3 4 11 12 13 14  /for each in list
("1st"
 "2nd"
 "3rd"
 "4th"
 "11th"
 "12th"
 "13th"
 "14th")

1

C- 95 83个字符

main(n,k){scanf("%d",&n);k=(n+9)%10;printf("%d%s\n",n,k<3?"st\0nd\0rd"+3*k:"th");}

已脱胶:

main(n,k)
{
    scanf("%d",&n);
    k=(n+9)%10; // xx1->0, xx2->1, xx3->2
    printf("%d%s\n",n,k<3?"st\0nd\0rd"+3*k:"th");
}

我们可以做k=(n-1)%10而不是加9,但是对于n = 0,我们将得到不正确的行为,因为在C中的(-1)%10计算结果为-1,而不是9。


1

Javascript,75

function s(i){return i+'thstndrd'.substr(~~(i/10%10)-1&&i%10<4?i%10*2:0,2)}

1

PHP,98字节

function c($n){$c=$n%100;$s=['','st','nd','rd'];echo$c>9&&$c<14||!$s[$c%10]?$n.'th':$n.$s[$c%10];}

11-13位在这里杀了我。适用于任何整数$n >= 0

对于任何整数$n

PHP,103字节

function c($n){$c=abs($n%100);$s=['','st','nd','rd'];echo$c>9&&$c<14||!$s[$c%10]?$n.'th':$n.$s[$c%10];}

1

Python,88 84字节

lambda x:x+((('th','st','nd','rd')+('th',)*6)[int(x[-1])]if('0'+x)[-2]!='1'else'th')

取消高尔夫:

def y(x):
    return x + (('th', 'st', 'nd', 'rd') + ('th', ) * 6)[int(x[-1])] if ('0' + x)[-2] != '1' else 'th')

lambda x用参数定义一个匿名函数x((('th','st','nd','rd')+('th',)*6)[int(x[-1])]为小于10的数字定义结尾的元组,为的0-th元素0,依此类推。在if ('0'+x)[-2] != '1'检查是否存在111213以修复,并将然后else 'th'添加th代替strdnd


这是一个很好的答案,但是我花了一些时间来理解它。如果您可以在代码的常规版本下面添加代码说明和细目分类,则可以帮助人们从您的代码中学习并提高答案的质量。
wizzwizz4 2016年

好的,我会。我还应该添加一个不符合要求的答案吗?
NoOneIsHere

答案不应该不同...您所做的一切都很好,做得很好。如果您还想挑战,我可以提出一些建议。
wizzwizz4 2016年

好。您可以尝试... 调整您的椅子,或者您的伙伴将坐在哪里。或者,您可以尝试我的一些挑战,例如《骑士的下一场旅程》。如果这些不是您喜欢的挑战,请说。
wizzwizz4 '16

1

JavaScript(Node.js),51字节

感谢@KevinCruijssen改善了答案

n=>n+=[,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th'

在线尝试!


说明:

n =>                      // input
    n+=[,'st','nd','rd']     // the array of suffices add everything to n
        [~~(n/10%10)-1?n%10:0] // the full magic 
    || 'th'               // works for everything except 1 , 2 , 3 just like what you want


1

R79 76字节

由于还没有R解决方案...这里没有技巧,基本的矢量索引在Giuseppe的帮助下减少了3个字符。先前尝试过的索引:[1+(x%%10)-(x%%100==11)][1+(x%%10)*(x%%100!=11)]

function(x)paste0(x,c("th","st","nd","rd",rep("th",6))[1+x%%10*!x%%100==11])

在线尝试!

substr,79个字节:

function(x,y=1+2*min(x%%10-(x%%100==11),4))paste0(x,substr("thstndrdth",y,y+1))

在线尝试!


1
1+x%%10*!x%%100==11为索引?
朱塞佩

@Giuseppe我需要对括号保持冷静:)。巧妙地!在表达式前使用而不是!=
JayCe '18年

1
是的,运营商拥有奇怪的优先权;^真的很高,然后是%%-type运算符,然后是*/and +-,我认为==&|是下一个。!具有较低的优先级,因此您可以将其用作操作之间的分隔符。
朱塞佩

0

Python 2.7,137个字符

def b(n):
 for e,o in[[i,'th']for i in['11','12','13']+list('4567890')]+[['2','nd'],['1','st'],['3','rd']]:
  if n.endswith(e):return n+o

n 应该是一个字符串

我知道我已经在这里赢得比赛了,但是我想我还是会提出我的想法

这基本上只是生成一个键列表,键值对以数字(作为字符串)结尾e和序号o。它尝试首先匹配“ th”(因此为什么我不使用字典),以便它不会偶然返回“ st”,例如,当它应为“ th”时。这将适用于任何正整数


n[-1]==en.endswith(e)
hlt 2014年

0

C:95个字符

一个荒唐的解决方案:

n;main(){scanf("%d",&n);printf("%d%s",n,n/10%10-1&&(n=n%10)<4&&n?n>2?"rd":n<2?"st":"nd":"th");}

它需要更多地修改。


一位用户举报了这句话 是“不正确的:根本不会循环,即,它仅适用于给定的数字,而不是其下面的_all_数字。请参阅ideone.com/pO6UwV。” 这不是标记主持人不判断正确性的理由,但这可能是一个问题。
dmckee 2013年

基于问题创建者的评论:“ @ Ilmari,我正在寻找11作为输入,寻找11作为输出。我不介意它是否处理多行,但我想的只是处理一个数字。– NickC Jan 20 '12 at 21:00“正在做应做的事情。即,它只应处理一个数字。
Fors 2013年

抱歉,那面旗帜;我没有正确阅读要求,并且当时没有足够的代表直接发表评论。再次抱歉。:)
Will Ness

0

Javascript,75

function o(s){return s+((0|s/10%10)==1?"th":[,"st","nd","rd"][s%10]||"th")}

0

Oracle SQL 11.2,101字节

SELECT:1||DECODE(ROUND(MOD(:1,100),-1),10,'th',DECODE(MOD(:1,10),1,'st',2,'nd',3,'rd','th'))FROM DUAL

0

Javascript ES6,52个字符

n=>n+(!/1.$/.test(--n)&&'snr'[n%=10]+'tdd'[n]||'th')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.