Kiểm tra chuỗi thông thường


17

Sự miêu tả :

Đưa ra một chuỗi làm đầu vào, kiểm tra xem đó có phải là số thứ tự hợp lệ bằng tiếng Anh hay không. Nếu nó là giá trị trả về giá trị trung thực nếu không trả về giá trị giả. (Được đề xuất bởi @Arnauld. Cảm ơn. Cũng bởi @JoKing)

Đối với người dùng muốn biết về số thứ tự, hãy truy cập vào đây:

https://www.mathsisfun.com/numbers/cardinal-ordinal-chart.html (Gợi ý bởi: qwr)

Đầu vào có thể:

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

Đây là một thử thách golf mã nên mã ngắn nhất trong mỗi ngôn ngữ sẽ là người chiến thắng.

Ví dụ:

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

Vì nhiều người đã hỏi câu hỏi liên quan đến việc liệu đầu vào sẽ chỉ là các chuỗi hợp lệ hay không:

Tất cả các đầu vào sẽ luôn luôn hợp lệ. tức là chúng sẽ ở dạng chuỗi và bao gồm một chữ số (hoặc số chữ số) cùng với một trong bốn hậu tố:

st, nd, rd,th


Bạn có thể làm rõ các quy tắc của số thứ tự? Hoặc ít nhất là đặt một liên kết đến những gì các quy tắc bạn đang tuân theo.
qwr

Chúng là những quy tắc bình thường. Tôi không thay đổi gì cả. Nhưng cảm ơn về đầu vào, tôi đã thêm một liên kết
Muhammad Salman

@Jonathan Allan Các số thông thường bắt đầu từ 1st, các số âm không tồn tại - english.stackexchange.com/questions/309713/ mẹo
Oliver Ni

@Jonathan ALLan OP nói "Đầu vào sẽ là mẫu thứ tự hợp lệ." có nghĩa là không có tiêu cực
Oliver Ni

2
Bạn nói rằng đầu vào sẽ luôn hợp lệ nhưng tôi nghĩ một thuật ngữ tốt hơn sẽ được hình thành tốt . Cả thứ 12 và 12 đều được hình thành tốt nhưng chỉ có cái trước là hợp lệ .
David Conrad

Câu trả lời:


3

Tiện ích Bash + GNU , 54

Kết hợp Regex dường như là một cách đơn giản để đi. Tôi khá chắc chắn rằng biểu thức này có thể được rút ngắn hơn:

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

Đầu vào từ STDIN. Đầu ra dưới dạng mã trả về shell - 0 là trung thực và 1 là falsey.

Hãy thử trực tuyến!


Gì ? Đây không phải là câu trả lời chính xác.
Muhammad Salman

@MuhammadSalman Đó là vì nó là một bộ thử nghiệm. Hãy xem các mã thoát cho 1st1th.
Dennis

egrepcó khả năng kiểm tra bổ sung và nguyên thủy (đơn nhất), vì vậy tôi nghĩ bạn có thể thực hiện điều này một câu trả lời egrep.
Dennis

Tôi xin lỗi nhưng bash của tôi hút như trong tôi không có ý tưởng về một điều trong đó. Tôi đã chán nên sử dụng một trình kiểm tra khác để kiểm tra sự khác biệt giữa đầu vào và đầu ra. Tôi thấy điểm của bạn. Vì vậy, bây giờ tôi có một câu hỏi @Dennis: Bash có booleans không?
Muhammad Salman

Có thể các trường hợp kiểm tra sẽ rõ ràng hơn nếu egrepđược thực hiện riêng cho từng đầu vào để lấy mã thoát phù hợp cho từng trường hợp: Hãy thử trực tuyến! .
manatwork

3

đây là giả định rằng đầu vào là mẫu thứ tự hợp lệ. nếu nó không phải là trường hợp thay đổi cần phải được thực hiện

JavaScript (Node.js) , 97 92 78 byte

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

Hãy thử trực tuyến!

Giải trình

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  

Giới thiệu

cảng @Herman Lauenstein

JavaScript (Node.js) , 48 byte

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

Hãy thử trực tuyến!


Nếu giải pháp giả định reg cũng có thể là***.
l4m2

Nếu không giả định đó là / \ d * (st | nd | rd | th) / input, hãy 1stavượt qua bài kiểm tra reg; nếu giả định, /1.th|(^|[^1])(1s|2n|3r|[^1-3]t)/làm việc
l4m2

3

Python ,  56  53 byte

-3 cảm ơn (sử dụng bao gồm chữ cái duy nhất thay vì bình đẳng nhân vật áp chót)

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

Một chức năng không tên.

Hãy thử trực tuyến!

Làm sao?

Vì tất cả các đầu vào (ở đây v) đảm bảo sẽ có dạng \d*[st|nd|rd|th]chúng ta có thể chỉ kiểm tra xem một nhân vật tồn tại trong vmà chúng tôi mong đợi để được ở đó nếu nó là đúng ( s, n, r, hay h, tương ứng) - đó là <getExpectedLetter>in v.

Chữ số cuối cùng thường xác định điều này:

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

... ngoại trừ khi chữ số áp chót là a 1, khi tất cả nên kết thúc bằng thvà do đó nhân vật dự kiến ​​của chúng ta phải là h; để đánh giá điều này, chúng ta có thể lấy một lát (để tránh xảy ra lỗi chỉ mục cho các đầu vào không có ký tự thứ 4 ) v[-4:-3]. Vì các 0bản đồ hđã có sẵn, chúng tôi có thể đạt được hiệu ứng mong muốn bằng cách nhân trước khi lập chỉ mục vào 'hsnrhhhhhh'.


st, nd, nd và th đều có một chữ cái duy nhất để bạn có thể kiểm tra xem nó có xuất hiện trong chuỗi 53 byte không
Asone Tuhid

@AsoneTuhid golf đẹp - cảm ơn!
Jonathan Allan

@AsoneTuhid - cũng đã lưu ba câu trả lời Jelly của tôi, vì vậy hãy nhân đôi lời cảm ơn!
Jonathan Allan

3

Java 8, 54 51 byte

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

Giải trình:

Hãy thử trực tuyến.

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

Chuỗi # của Java khớp hoàn toàn thêm vào ^...$.

Regex giải thích:

^.*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 byte SBCS

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

Bộ kiểm tra

SE đã ăn một số thứ không thể in được trong mã (và trong phần giải thích bên dưới) nhưng chúng có mặt trong liên kết.

Giải trình:
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
Dịch thuật 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 byte

-8 cảm ơn Chas Brown
-6 nhờ Kevin Cruijssen

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

Xây dựng một chuỗi lớn của ths, sts, nds, và rds cho kết thúc 00để 99. Sau đó kiểm tra xem nó có khớp không.


2

Võng mạc , 35 31 byte

-4 byte nhờ @Asone Tuhid

Cảm ơn @Leo vì đã tìm ra lỗi

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

Đầu ra 1cho đúng và 0sai. Điều này giả định đầu vào là ở định dạng thứ tự với một hậu tố hợp lệ (đầu với st, nd, rdhoặc th).

Hãy thử trực tuyến!




1

Thạch ,  25  22 byte

-3 byte nhờ một quan sát được thực hiện trong một nhận xét được thực hiện bởi mục nhập Python của tôi.

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

Một liên kết đơn âm.

Hãy thử trực tuyến! Hoặc xem bộ thử nghiệm .

Làm sao?

ḣ-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 byte

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

Hãy thử trực tuyến! hoặc như một bộ thử nghiệm

Giải trình

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

Ruby , 42 39 byte

Lambda:

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

Hãy thử trực tuyến!

Đầu vào của người dùng:

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

Hãy thử trực tuyến!

Diêm:

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

Bởi vì [^1]( not 1) không khớp với phần đầu của chuỗi, đầu vào được sao chép để đảm bảo có một ký tự trước phần cuối.


Ruby -n , 35 byte

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

Hãy thử trực tuyến!

Tương tự như trên nhưng thay vì sao chép chuỗi, điều này cũng khớp với bắt đầu của chuỗi ( ^).


0

Excel, 63 byte

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

(MOD(A1-11,100)>2)trả về FALSEkhi A1kết thúc bằng 11-13

2*RIGHT(A1)*(MOD(A1-11,100)>2)+1lợi nhuận 1nếu nó trong 11- 133, 5, 7, vv. nếu không thì

MIN(9,~)thay đổi bất kỳ lợi nhuận trên 9vào 9để kéo thtừ chuỗi

MID("thstndrdth",MIN(~),2)lấy ra cái đầu tiên thcho đầu vào kết thúc bằng 11- 13, stfor 1, ndfor 2, rdfor 3và cuối cùng thcho bất cứ thứ gì cao hơn.

=A1&MID(~) chuẩn bị số ban đầu cho số thứ tự.


Đăng như wiki vì tôi không phải là tác giả của điều này. ( Nguồn )


0

Ngôn ngữ Wolfram (Mathicala) , 122 byte

Không giống như hầu hết các câu trả lời khác ở đây, điều này thực sự sẽ trả về false khi đầu vào không phải là "mẫu thứ tự hợp lệ", do đó, nó sẽ trả về sai trên đầu vào như "3a23rd", "khỉ" hoặc "╚ § +!". Vì vậy, tôi nghĩ rằng điều này làm việc cho toàn bộ các chuỗi đầu vào có thể.

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

Hãy thử trực tuyến!


0

Ngôn ngữ Wolfram (Mathicala) , 65 59 byte

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

Hãy thử trực tuyến!

Tất nhiên Mathicala có tích hợp sẵn (mặc dù không có giấy tờ) để chuyển đổi sang số thứ tự. Nguồn .

(đối với phiên bản 65 byte: theo đó có vẻ như v9 và trước đó không cần gọi Speaktrước nên có thể lưu thêm một số byte)

Ngoài ra hãy xem câu trả lời của KellyLowder cho phiên bản không dựng sẵn.


0

PHP, 60 byte

nhàm chán: regrec một lần nữa giải pháp ngắn nhất

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

đầu ra trống cho giả, 1cho sự thật.

Chạy như ống với -nFhoặc thử trực tuyến . (TiO được bao bọc như chức năng cho thuận tiện)


0

mã máy x86, 65 byte

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

Hội,, tổ hợp:

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'

Hãy thử trực tuyến!


-1

Biểu thức chính quy tương thích Perl, 29 byte

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

Chúng tôi chấp nhận thsau bất kỳ số "tuổi teen" nào hoặc sau bất kỳ chữ số nào ngoài 1..3. Đối với 1..3, chúng tôi sử dụng một lookbehind tiêu cực để chấp nhận st, ndhoặc rdchỉ khi không đứng trước 1.

Chương trình kiểm tra

#!/usr/bin/bash

ok=(✓ ❌)

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

Các kết quả

1st ✓
1th ❌
2nd ✓
2th ❌
3rd ✓
3th ❌
4st ❌
4th ✓
11th ✓
11st ❌
12nd ❌
12th ✓
13th ✓
13rd ❌
112nd ❌
112th ✓
21nd ❌
32nd ✓
33rd ✓
21th ❌
21st ✓
11st ❌
111199231923819238198231923213123909808th ✓
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.