序数の出力(1、2、3)


43

(関数の戻り値として、または単にプログラムの出力として)数値に連結された正の整数の序数の接尾辞を生成したいと思います。

サンプル:

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

など、サフィックスが最初の1〜10のサブパターンを10まで100ごとに繰り返し、最後にパターンが最初から始まります。

上記のように、入力は数値で、出力は順序文字列です。

これの最小のアルゴリズムは何ですか?


こんにちは、NickC、codegolf.SEへようこそ!明確にするために、11入力や出力などの数値を読み取る必要があるということ11thですか?入力の各番号は別々の行にあり、出力番号も別の行にある必要がありますか?また、複数行の入力を処理する必要がありますか?
イルマリカロネン

1
最小のアルゴリズムまたは最小のコードをお探しですか?
トト

@Ilmari 11入力および11th出力として探しています。複数の行を処理するかどうかは気にしませんが、私が念頭に置いていたのは、1つの数字だけを処理することでした。
ニコール

@ M42ご存知のように、私にはよくわかりません。厳密な要件はありませんが、おそらく最小のアルゴリズムを考えていました。
ニコール

回答:


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プログラムです。実際のコードの長さは37文字ですが、pスイッチは1つの余分な文字としてカウントされます。

サンプル入力:

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ます。

どのように機能しますか?

  • まず、これはグローバルな正規表現の置換(s///g)です。一致する正規表現はで1?\d\b、ここ\dで任意の数字と\b一致し、英数字と非英数字の境界に一致する幅ゼロのアサーションです。したがって、1?\d\b任意の数値の最後の数字に一致し、偶然にも前の数字に一致します1

  • /e切り替えによりPerlコードとして評価される置換では、一致した文字列セグメント($&)を.取得$&し、リストへの整数インデックスとしてそれ自体を使用して取得したサフィックスを追加します()(0,st,nd,rd)。この接尾辞がゼロまたは未定義の場合(つまり、$&ゼロまたは3より大きい場合)、||演算子はそれをに置き換えthます。


編集:入力が単一の整数に制限されている場合、この35文字のソリューションで十分です。

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

1
g各番号が独自の行になければならないことを指定した場合、置換を削除できるはずです。また、単語の境界をに変更できます$。しかし、全体として、+ 1、気の利いたソリューションです。
氏ラマ

@GigaWatt:実際、NickCが入力形式についての質問に答える前にコードを書いたので、可能な限り一般的なものにしました。
イルマリカロネン

38

Python 2、49バイト

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

匿名関数。完全なプログラムは、 55バイトでカウントされます。

'tsnrhtdd'[i::4]0から3までのth st nd rd値のサフィックスをエンコードしますi。これを考えると、必要なのはn、対応するサフィックスのインデックスに値をマッピングする方法だけiです。動作する簡単な式は(n%10)*(n%10<4 and 10<n%100<14)です。これを簡単に短縮するには、最初のかっこを削除し、特別なサフィックスを使用したの値n%5と同じ結果が得られることn%10を確認しますn。少し試行錯誤することで、1つをに短縮10<n%100<14することもn%100^15>4できます。これを他の条件とチェーン化して、さらに多くのバイトを節約できます。


3
:これは、C右ここにいくつかの黒魔術です


わかりません。誰がここで何が起こっているのか説明できますか?
パベル

@Pavel回答を説明付きで更新しました。
xsot

驚くばかり!考えるためのブリリアントな方法...
Benisonサム

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の一部pp定義されていない、エラーメッセージを生成し、とにかく正しい答えを返します。Quietエラーメッセージが印刷されないように追加しました。

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

使用法

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

31日

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

{「1st」、「2nd」、「3rd」、「4th」、「5th」、「6th」、「7th」、「8th」、「9th」、「10th」、「11th」、「12th」、「 13th」、「14th」、「15th」、「16th」、「17th」、「18th」、「19th」、「20th」、「21st」}


使い方

SpokenString有効なMathematica式が読み上げられるように書き出します。以下は、SpokenStringのドキュメントからの2つの例です

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

「量yにzを加えた量xの平方根」*)

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

「0、0、0および1、1、1を中心とする単位球で構成される3次元グラフィック」


さて、手元の例では、

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

「pの31番目の要素」

上記の文字列を単語のリストとして表現しましょう。

StringSplit[%]

{「the」、「31st」、「element」、「of」、「p」}

そして2番目の要素を取ります...

%[[2]]

31日


よくわかりません; どこでp定義されていますか?編集:気にしないで、私はあなたがこれをどのように使用しているかわかります。残念ながら私のシステムでは動作しません。:-/
Mr.Wizard

v.9.0.1で動作します。(7.0を使用していることを思い出すようです。)はい、pを定義する必要はありません。
DavidC

今理解しています。ただし、v7 SpokenString @ p[[117]]ではoutput から取得します" part 117 of p"
ミスターウィザード

そのSpokenStringため、随時改訂されます。このコード(codegolf.stackexchange.com/questions/8859/…)がv。7でも機能しないことは驚くことではありません。ところで、それは永続的な解決策ではありませんでした。
DavidC

ああ、私はその答えを見たことがありませんでした。
ミスターウィザード

7

ルビー、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

関数は1つの整数引数を取りn、序数形式として文字列を返します。

次のロジックに従って動作します
。10桁が1であるか、1桁が3より大きい場合は、接尾辞「th」を使用します。それ以外の場合は、最後の数字をインデックスとして使用して、配列['th'、 'st'、 'nd'、 'rd']からサフィックスを見つけます。


o(113)"113rd"ある必要があります"113th"。10桁のチェックでは、2桁を超える数字は考慮されません。
ハンマー

OK、%10補償するために別のピッチング。3文字を追加しました。(%10どうにかして短縮すべきところに十分に現れているように感じますが、解決策は思いつきません)
ラマ氏

可能な限り短い恐ろしく不可解なコードを書くことで、Perlを決して負かすことはできません:)
jamylak

変数を10?に設定します
wizzwizz4

変数を設定するn%10方が良いと思います。
CalculatorFeline

6

Javascript(ES6)50 44バイト(非競合)

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

ノート

  • 文字列として入力を取ります
  • @ user81655に感謝、6バイトを削除

1
a+-> a+=、括弧の削除、\d-> .、remove [0]、および数字を文字列として使用する場合:のa.match`1?.$`代わりに/1?.$/.exec(a)
user81655

チャレンジが投稿されたときに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')し、あなたが脂肪の矢印表記を使用するために満足している場合は、54に、さらにそれをダウンさせることができます:o=n=>n+([,'st','nd','rd'][~~(n/10%10)-1?n%10:0]||'th')
WallyWest

@WallyWestなんらかの理由で、私のソリューションが最新のブラウザで動作することが本当に好きです。あなた自身の答えを投稿してください。十分に違うと思います。
aebabis 14

いいえ、大丈夫です!いくつかの選択肢を提供するだけです!
WallyWest 14


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 ^ 1n、数字08-で終わる正の値に対して0と評価されます15。このように、いずれかのためn mod 100に終わる1112または13配列参照を返す、undefinedの接尾辞につながりますth

任意の正用n以外の数字で終わる08- 15、発現n % 100 >> 3 ^ 1発現呼び出す正の整数に評価、n % 10配列検索のために、復帰stnd又はrdためnで終了する12または3。それ以外の場合、th


でバイトを保存しますn+=[,'st','nd','rd'][n%100>>3^1&&n%10]||'th'
シャギー

@Shaggy、ありがとう、提案どおりに更新しました。
トマスランカース


@ guest271314、このコードが使用されているのを見るのは楽しい。これは正の数に対してのみ機能することに注意してください。別の代替手段はn+=[,"st","nd","rd"][(((n<0?-n:n)+90)%100-10)%10]||"th"この投稿から適応されています。
トマスランカース

3

APL(Dyalog Unicode)38 36バイト

バイト数を維持しながらバグを修正してくれたngnに感謝します。

匿名の暗黙の接頭辞関数。⎕IOI ndex O rigin)に設定する必要があり0ます。これは多くのシステムでデフォルトです。0でも機能します!

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

オンラインでお試しください!

{} 匿名ラムダ; 引数です:

⍳4 最初の4つのɩndices ;[0,1,2,3]

10↑ そこから最初の10個の要素を取り出し、ゼロでパディングします。 [0,1,2,3,0,0,0,0,0,0]

 単一の要素として扱うために囲みます。 [[0,1,2,3,0,0,0,0,0,0]]

1 0 8\ 1つのコピー、プロトタイプコピー(すべてゼロ)、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]

⍵⌽ 引数で示されるステップ数だけ左に循環的に回転します

 最初の数(すなわち、引数mod-100の数)を選択します

 それによって、2つの乗算(与え024、または6

'thstndrd'↓⍨この文字列から多くの文字を削除します

2↑ 残りの文字の最初の2つを取ります

⍕, 文字列化された引数をそれに連結します


「31日」?
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'}})"}

入力の行ごとに1つの数値で機能します。入力はパイプラインを通じて提供されます。単一の数字のみで機能するように設定しても、サイズは小さくなりません。


2

J-44文字

Jには何もない?これは怒りです!

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

説明(1Jでは真であり、0偽であることに注意してください):

  • 10 10(...)/@#:]-まず、引数(])を取得し、10桁と1桁を見つけます(10 10 #:)。次に、(...)2つの間に挿入します。
  • (]*[(~:*])4>])-このサブエクスプレッションでは、最も内側のサブエクスプレッションではなく、1 ]桁と[10桁を指しています。
  • [(~:*])4>]- ~:「等しくない」ことを意味するJであるため、これは4>](つまり、1桁が4未満であるかどうか)の結果を取り、それに結果を乗算しtens ~: (4>])ます。なぜこれを行うのでしょうか?以下を考慮してください。
    • 10、11、12、13をチェックしている場合tens1(10代です)、ones4未満であるためtens ~: (4>])falseであり、結果は0*1= 0です。
    • {X0、X1、X2、X3}のいずれかである場合、明らかtens ~: (4>])にtrueであり、1*1=が得られ1ます。
    • onesが4より大きい場合は、4>]だった0し、テストに何が起こるかは問題ではない、我々は0関係なく出て行きます。
    • だから、要約すると、[(~:*])4>]ある1我々は{X0、X1、X2、X3}ではなく、十代の若者であり、そして場合は0そうでありません。
  • ]*-最後に、その結​​果に1桁を掛けます。したがって、この製品は0、数値に'th'接尾辞が必要な場合、そうでない場合は値になります。
  • th`st`nd`rd{::~-上記の修正された1桁を使用して、サフィックスのリストにインデックスを付けます。0gets 'th'1gets 'st'など。
  • ":,-最後に、元の番号を取得し、それを文字列(":)に変換してから、サフィックスの前に追加します。

使用方法は明らかですが、動詞はリストではなく1つの序数しか使用できません。

   (":,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バイトでゴルフをすることができます|||
ケビンCruijssen 16年

2

Mathematica 29 + 5 = 34バイト

SpokenStringDump`SpeakOrdinal

Speakこの組み込み関数を使用する前に関数を呼び出す必要があるため、+ 5バイト。

使用法

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

Scala 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は出力を生成します:11st

ええ、あなたは正しい..私は訂正をしました。ありがとう
ジョセフエルシド

私はあなたのコードのフォーマットを整えました。コードブロックとして認識されるためには、各行の前に4つのスペースが必要です。
ガレス

チェックが次のように短くなれば、あなたの最初ではないでしょうif v>10 && v<14か?私はocamlに精通していませんが、string_v変数をそれほど長くする必要がありますか?
ガフィ

いいえ、必要ありません。wまたはxを選択できます。何か意味のあるものが欲しかった。しかし、あなたは正しい、それはコードを少し短くしたでしょう。
ジョセフエルシド

1

K-44文字

これは、Jとまったく同じ長さであり、ほぼ同じように機能することがあります。

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

説明:

  • x$:-最初に、オペランドxを文字列に変換し、それをに割り当てxます。後で再度文字列repが必要になるので、これを行うと文字が保存されます。
  • .:'- .:各(')桁を数値に変換()します。
  • -2#0, -数字のリストの先頭に0を追加し(1桁の数字の場合)、最後の2つを取得します。
  • {y*(y<4)*~1=x}.-引数として二桁使用xy戻り、このインナー機能にyあればy4未満であり、xそうでない場合は0、1に等しくありません。
  • `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)%109を追加する代わりに行うことができますが、n = 0の場合、C (-1)%10では9ではなく-1に評価されるため、不正な動作が発生します。



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要素はfor 0などです。if ('0'+x)[-2] != '1'チェックがある場合1112または13修正するには、その後、追加は、else 'th'追加thの代わりにstrdまたはnd


これは素晴らしい答えですが、それを理解して理解するのに時間がかかりました。もしあなたがあなたのコードのゴルフバージョンの下にコードの説明と内訳を追加できれば、それは人々があなたのコードから学び、答えの質を改善するのに役立つでしょう。
wizzwizz4

わかった。ゴルフ以外の回答も追加する必要がありますか?
-NoOneIsHere

それは別の答えであってはなりません...あなたがやったことはうまく、よくやった。さらにチャレンジしたい場合は、いくつかの推奨事項を提示できます。
wizzwizz4

OK。あなたが試すことができます ... あなたの椅子を調整するか、あなたの仲間がどこに座るでしょうか。または、ナイトの次のツアーなど、私の挑戦を試してみることもできます。これらがあなたの好きなチャレンジではない場合は、ただ言ってください。
-wizzwizz4

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の解決策はまだないので...トリックはありません。基本的なベクトルインデックス作成は、ジュゼッペのおかげで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

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'を返すことはありません。これは任意の正の整数で機能します


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

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");}

もっとマングルする必要があります。


ユーザーこれに「間違っている:まったくループしない。つまり、指定された番号だけで機能し、その下のすべての番号では機能しない。ideone.com/ pO6UwVを参照」とフラグを立てました。それはモデレーターが正当性を判断しないためフラグを立てる理由ではありませんが、それは問題かもしれません。
dmckee

質問作成者からの次のコメントに基づきます。「@ Ilmari入力として11、出力として11を探しています。複数の行を処理するかどうかは気にしません。 20 '12 at 21:00 "それはすべきことをしている。つまり、単一の番号のみを処理する必要があります。
-Fors

そのフラグを申し訳ありません。要件を読み違え、その時点で直接コメントするのに十分な担当者がいませんでした。またすみません。:)
ウィルネス


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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.