順序文字列チェック


17

説明:

入力として文字列を指定し、それが英語の有効な序数かどうかを確認します。有効な場合は真理値を返し、そうでない場合は偽の値を返します。(@Arnauldによる提案。ありがとう。また@JoKingによる)

序数について知りたいユーザーの場合は、ここにアクセスしてください:

https://www.mathsisfun.com/numbers/cardinal-ordinal-chart.html(提案:qwr)

可能な入力:

21st ---> true
12nd ---> false
1nd ---> false
....

これはコードゴルフチャレンジであるため、各言語の最短コードが勝者となります。

例:

console.log('12th' , true) // This evaluates to true
console.log('1st' , true) // also evaluates to true
console.log('21nd' , false) // returns false
console.log('11st' , false) // returns false
console.log('111199231923819238198231923213123909808th' , true) // true

多くの人が、入力が有効な文字列のみであるかどうかに関する質問をしたので:

すべての入力は常に有効です。つまり、文字列の形式であり、4つのサフィックスのいずれかと一緒に数字(または数字の数)で構成されます。

stndrdth


序数の規則を明確にできますか?または、少なくともあなたが従っているルールへのリンクを置きます。
qwr

通常のルールです。私は何も変えませんでした。しかし、入力のためのおかげで、私はリンクを追加
ムハンマドサルマン

@ジョナサンアラン序番号から開始1st、負序は存在しません- english.stackexchange.com/questions/309713/...
オリバー・ニッケル

@JonathanAllan OPは、「入力は有効な順序パターンになる」と述べています。これはネガティブを意味しません
Oliver Ni

2
入力は常に有効であると言っていますが、より良い用語が形成されると思います。12番目と12番目の両方は適切に形成されていますが、前者だけが有効です
デビッドコンラッド

回答:


3

Bash + GNUユーティリティ、54

正規表現のマッチングは簡単な方法のようです。この式はもっと短くできると確信しています。

egrep '((^|[^1])(1st|2nd|3rd)|(1.|(^|[^1])[^1-3])th)$'

STDINからの入力。シェルの戻りコードとして出力-0は真実で、1は偽です。

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


何 ?これは正しい答えを出力していません。
ムハンマドサルマン

@MuhammadSalmanそれはテストスイートだからです。以下のための終了コードを見てみましょう1stとし1th
デニス

egrep加算および素数のテスト(単項)が可能であるため、これをegrepの回答にすることができると思います。
デニス

申し訳ありませんが、中にあるものについて何もわからないので、私のbashはひどいです。退屈したので、入力と出力の違いをチェックするためにdiffチェッカーを使用しました。あなたの言ってる事がわかります。だから私は今@Dennis:Bashにはブール値がありますか?
ムハンマドサルマン

egrep各入力に対して個別に実行され、それぞれに一致する終了コードを取得する場合、テストケースはより明確になるでしょう。オンラインで試してみてください!
マナトワーク

3

これは、入力が有効な順序パターンであることを前提としています。そうでない場合は変更が必要です

JavaScript(Node.js)97 92 78バイト

s=>("tsnr"[~~((n=(o=s.match(/(\d{1,2})(\D)/))[1])/10%10)-1?n%10:0]||'t')==o[2]

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

説明

s=>
   ("tsnr"                                // all the options for ordinal - 4-9 will be dealt afterwards    
      [~~(                                //floor the result of the next expression
        (n=(                              //save the number (actually just the two right digits of it into n
          o=s.match(/(\d{1,2})(\D)/))[1]) //store the number(two digits) and the postfix into o (array)
        /10%10)-1                         //if the right most(the tenths digit) is not 1 (because one is always 'th')
          ?n%10:0]                        //return n%10 (where we said 0-3 is tsnr and afterwards is th
            ||'t')                        // if the result is undefined than the request number was between 4 and 9 therefor 'th' is required
    ==o[2]                                // match it to the actual postfix  

_____________________________________________________________________

@ハーマンラウエンシュタイン港

JavaScript(Node.js)、48バイト

s=>/1.th|(^|[^1])(1st|2nd|3rd|[^1-3]th)/.test(s)

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


仮定regの解も***.
-l4m2

/ \ d *(st | nd | rd | th)/入力と想定されない場合1sta、regテストに合格します。想定される場合、/1.th|(^|[^1])(1s|2n|3r|[^1-3]t)/仕事
-l4m2

3

Python 56  53バイト

-3のおかげ(最後から2番目の文字の平等ではなく、一意の文字を使用してください)

lambda v:'hsnrhhhhhh'[(v[-4:-3]!='1')*int(v[-3])]in v

名前のない関数。

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

どうやって?

すべての入力が(ここではのでv)形式であることが保証されている\d*[st|nd|rd|th]私たちは、文字が存在するかどうかだけでテストすることができますv(私たちはそこにそれが正しかった場合であることを期待されsnr、またはh、それぞれ) -です<getExpectedLetter>in v

通常、最後の桁がこれを決定します。

v[-3]: 0 1 2 3 4 5 6 7 8 9
v[-2]: h s n r h h h h h h

...最後から二番目の桁があるときを除いて1、すべてのときに終了する必要がありth、したがって、私たちの期待の文字でなければなりませんh。これを評価するために、スライスを取ることができます(-4 番目の文字がない入力でインデックスエラーが発生するのを防ぐため)v[-4:-3]。はすでに0マッピングされhているため、にインデックスを付ける前に乗算を使用して目的の効果を実現でき'hsnrhhhhhh'ます。


STは、ND、RD、すべての目は独特の手紙を持っているので、することができますだけのテストでは、文字列で発生した場合、53バイト
Asone Tuhidを

@AsoneTuhid素敵なゴルフ-ありがとう!
ジョナサンアラン

@AsoneTuhid-私のゼリーの回答で3つも節約したので、感謝を2倍にします!
ジョナサンアラン

3

Java 8、54 51バイト

s->s.matches(".*1.th|(.*[^1])?(1s|2n|3r|[^1-3]t).")

説明:

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

s->  // Method with String parameter and boolean return-type
  s.matches(".*1.th|(.*[^1])?(1s|2n|3r|[^1-3]t).")
     //  Validates if the input matches this entire regex

JavaのString#matchesは暗黙的にaddを追加します^...$

正規表現の説明:

^.*1.th|(.*[^1])?(1s|2n|3r|[^1-3]t).$
^                                          Start of the regex
 .*1.                                       If the number ends in 11-19:
     th                                      it must have a trailing th
       |                                    If not:
        (.*    )?                            Optionally it has leading digits,
           [^1]                              excluding a 1 at the end
                 (1s|2n|3r         .      followed by either 1st, 2nd, 3rd,
                          |[^1-3]t).      0th, 4th, 5th, ..., 8th, or 9th
                                    $   End of the regex

2

Pyth、49 60バイトSBCS

Js<2zK%J100I||qK11qK12qK13q>2z"th".?qz+J@c."dt8¸*£tÎðÎs"2J

テストスイート

SEはコード(および以下の説明)で印刷できないものをいくつか食べましたが、それらはリンクにあります。

説明:
Js<2zK%J100I||qK11qK12qK13q>2z"th".?qz+J@c."dt8¸*£tÎðÎs"2J # Code
Js<2z                                                         # J= the integer in the input
     K%J100                                                   # K=J%100
           I||qJ11qJ12qJ13                                    # IF K is 11, 12, or 13:
                          q>2z"th"                            #  Print whether the end of the input is "th"
                                  .?                          # Otherwise:
                                    qz                        #  Print whether the input is equal to
                                      +J                      #   J concatenated with
                                        @                   J #    The object at the Jth modular index of
                                          ."dt8¸*£tÎðÎs"   #     The string "thstndrdthththththth"
                                         c                 2  #      Chopped into strings of length 2 as a list
Python 3の翻訳:
z=input();J=int(z[:-2]);K=J%100
if K==11or K==12or K==13:print(z[-2:]=="th")
else:print(z==str(J)+["thstndrdthththththth"[2*i:2*i+2] for i in range(10)][J%10])

2

Python 2、92 82 74 68バイト

-8 Chas Brownに
感謝-6 Kevin Cruijssenに感謝

lambda s:(a+'t'*10+a*8)[int(s[-4:-2]):][:1]==s[-2:-1]
a='tsnr'+'t'*6

大きな文字列を構築しth、秒stよ、ndよ、とrd語尾のためだ0099。次に、一致するかどうかを確認します。


2

網膜35 31バイト

@Asone Tuhidのおかげで-4バイト

バグを見つけてくれた@Leoに感謝

1.th|(^|[^1])(1s|2n|3r|[04-9]t)

1trueおよび0falseの出力。これは、入力が有効サフィックス(で終了と順序形式であると仮定しstndrdまたはth)。

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




1

ゼリー 25  22 バイト

Pythonエントリで行われたコメントで行われた観察のおかげで、-3バイトになりました。

ḣ-2VDṫ-’Ạ×ɗ/«4ị“snrh”e

モナドリンク。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

ḣ-2VDṫ-’Ạ×ɗ/«4ị“snrh”e - Link: list of characters   e.g. "213rd" or "502nd" or "7th"
ḣ-2                    - head to index -2                "213"      "502"      "7"
   V                   - evaluate                         213        502        7
    D                  - cast to decimal list            [2,1,3]    [5,0,2]    [7]
     ṫ-                - tail from index -1                [1,3]      [0,2]    [7]
           /           - reduce with:                                          (no reduction since already length 1)
          ɗ            -   last 3 links as a dyad:                           
       ’               -     decrement (the left)           0         -1        x
        Ạ              -     all? (0 if 0, 1 otherwise)     0          1        x
         ×             -     multiply (by the right)        0          2        x
            «4         - minimum of that and 4              0          2        4
              ị“snrh”  - index into "snrh"                 'h'        'n'      'h'
                     e - exists in? (the input list)        0          1        1


0

05AB1E、24バイト

0ìþR2£`≠*.•’‘vê₅ù•sèsáнQ

オンラインでお試しください! またはテストスイートとして

説明

0ì                         # prepend 0 to input
  þ                        # remove letters
   R                       # reverse
    2£                     # take the first 2 digits
      `≠                   # check if the 2nd digit is false
        *                  # and multiply with the 1st digit
         .•’‘vê₅ù•         # push the string "tsnrtttttt"
                  sè       # index into this string with the number calculated
                    sáн    # get the first letter of the input
                       Q   # compare for equality

0

ルビー42 39バイト

ラムダ:

->s{s*2=~/1..h|[^1](1s|2n|3r|[4-90]t)/}

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

ユーザー入力:

p gets*2=~/1..h|[^1](1s|2n|3r|[4-90]t)/

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

一致:

  • 1(anything)(anything)h - 12th
  • (not 1)1s-(1st
  • (not 1)2n-(2nd
  • (not 1)3r-(3rd

[^1]not 1)は文字列の先頭と一致しないため、最後の前に文字があることを確認するために入力が複製されます。


ルビー -n、35バイト

p~/1..h|([^1]|^)(1s|2n|3r|[4-90]t)/

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

上記と同じ考えですが、文字列を複製する代わりに、これは文字列の先頭(^)にも一致します。


0

Excel、63バイト

=A1&MID("thstndrdth",MIN(9,2*RIGHT(A1)*(MOD(A1-11,100)>2)+1),2)

(MOD(A1-11,100)>2)-で終わるFALSE場合に戻りますA11113

2*RIGHT(A1)*(MOD(A1-11,100)>2)+1戻って1それが中だならば11- 13357、など。さもないと

MIN(9,~)上記のいずれかの戻り変更9にを9引っ張ってth文字列から

MID("thstndrdth",MIN(~),2)- 、for 、for 、for 、でth終わる入力の最初を引き出し、それ以上の入力の最後を引き出します。 1113st1nd2rd3th

=A1&MID(~) 元の番号を序数に追加します。


私はこの著者ではないので、wikiとして投稿しています。(ソース


0

Wolfram言語(Mathematica)、122バイト

ここでの他のほとんどの回答とは異なり、入力が「有効な順序パターン」でない場合、これは実際にfalseを返すため、「3a23rd」、「monkey」、または「╚§+!」などの入力で正しくfalseを返します。したがって、これは可能な入力文字列のセット全体に対して機能すると思います。

StringMatchQ[((d=DigitCharacter)...~~"1"~(e=Except)~d~~(e["1"|"2"|"3",d]~~"th")|("1st"|"2nd"|"3rd"))|(d...~~"1"~~d~~"th")]

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


0

Wolfram言語(Mathematica)65 59バイト

SpokenString@p[[#]]~StringTake~{5,-14}&@@ToExpression@#==#&

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

もちろん、Mathematicaには序数に変換するための組み込みのドキュメントがありますが、ドキュメント化されていません。ソース

(65バイトバージョンの場合:それによると、v9以前はSpeak前に呼び出す必要がないようであるため、さらにバイトを節約できる可能性があります)

非組み込みバージョンについては、KellyLowderの回答もご覧ください。


0

PHP、60バイト

退屈:正規表現をもう一度最短のソリューション

<?=preg_match("/([^1]|^)(1st|2nd|3rd|\dth)$|1\dth$/",$argn);

虚偽、1真実のための空の出力。

でパイプとして実行する-nF、オンラインで試してください。(便宜上、TiOを関数としてラップ)


0

x86マシンコード、65バイト

00000000: 31c0 4180 3930 7cfa 8079 0161 7ef4 8079  1.A.90|..y.a~..y
00000010: ff31 7418 31db 8a19 83eb 308a 9300 0000  .1t.1.....0.....
00000020: 0031 db43 3851 010f 44c3 eb0a 31db 4380  .1.C8Q..D...1.C.
00000030: 7901 740f 44c3 c374 736e 7274 7474 7474  y.t.D..tsnrttttt
00000040: 74                                       t

アセンブリ:

section .text
	global func
func:					;the function uses fastcall conventions
					;ecx=first arg to function (ptr to input string)
	xor eax, eax			;reset eax to 0
	read_str:
		inc ecx			;increment ptr to string

		cmp byte [ecx], '0'
		jl read_str		;if the char isn't a digit, get next digit
		cmp byte [ecx+1], 'a'
		jle read_str		;if the char after the digit isn't a letter, get next digit
		cmp byte [ecx-1], '1'
		je tens 		;10-19 have different rules, so jump to 'tens'
		xor ebx, ebx		;reset ebx to 0
		mov bl, byte [ecx]  	;get current digit and store in bl (low byte of ebx)
		sub ebx, 0x30		;convert ascii digit to number
		mov dl, [lookup_table+ebx] ;get correct ordinal from lookup table
		xor ebx, ebx		;reset ebx to 0
		inc ebx			;set ebx to 1
		cmp byte [ecx+1], dl	;is the ordinal correct according to the lookup table?
		cmove eax, ebx		;if the ordinal is valid, set eax (return reg) to 1 (in ebx)
		jmp end			;jump to the end of the function and return

		tens:
		xor ebx, ebx		;reset ebx to 0
		inc ebx			;set ebx to 1
		cmp byte [ecx+1], 't'	;does it end in th?
		cmove eax, ebx		;if the ordinal is valid, set eax (return reg) to 1 (in ebx)

	end:
	ret				;return the value in eax
section .data
	lookup_table db 'tsnrtttttt'

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


-1

Perl互換の正規表現、29バイト

1.th|(?<!1)(1s|2n|3r)|[4-90]t

我々は受け入れるth任意の「ティーン」番号の後、または1..3以外の任意の数字の後に。1..3のために、我々は受け入れるために、負の後読みを使うstndまたはrdが先行していないときにのみ1

テストプログラム

#!/usr/bin/bash

ok=(✓ ❌)

for i
do grep -Pq '1.th|(?<!1)(1s|2n|3r)|[4-90]t' <<<"$i"; echo $i ${ok[$?]}
done 

結果

1st ✓
1th ❌
2nd ✓
2th ❌
3rd ✓
3th ❌
4st ❌
4th ✓
11th ✓
11st ❌
12nd ❌
12th ✓
13th ✓
13rd ❌
112nd ❌
112th ✓
21nd ❌
32nd ✓
33rd ✓
21th ❌
21st ✓
11st ❌
111199231923819238198231923213123909808th ✓
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.