การตรวจสอบสตริงปกติ


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

เนื่องจากผู้คนจำนวนมากถามคำถามเกี่ยวกับว่าการป้อนข้อมูลจะเป็นเพียงสตริงที่ถูกต้องหรือไม่:

อินพุตทั้งหมดจะใช้ได้ตลอดเวลา เช่นพวกเขาจะอยู่ในรูปแบบของสตริงและประกอบด้วยตัวเลข (หรือจำนวนหลัก) พร้อมกับหนึ่งในสี่ของคำต่อท้าย:

st, nd, rd,th


คุณสามารถอธิบายกฎของเลขลำดับได้หรือไม่? หรืออย่างน้อยก็ใส่ลิงค์ไปยังกฎที่คุณกำลังติดตาม
qwr

เป็นกฎปกติ ฉันไม่ได้เปลี่ยนอะไรเลย แต่ขอบคุณสำหรับอินพุตฉันเพิ่มลิงค์
Muhammad Salman

@ โจนาธานอัลลันลำดับที่หมายเลขเริ่มต้น1stไม่มีลำดับลบ - english.stackexchange.com/questions/309713/…
โอลิเวอร์ Ni

@JonathanAllan OP กล่าวว่า "อินพุตจะเป็นรูปแบบปกติที่ถูกต้อง" ซึ่งหมายความว่าไม่มีเชิงลบ
Oliver Ni

2
คุณบอกว่าปัจจัยการผลิตจะเป็นที่ถูกต้องแต่ฉันคิดว่าเป็นคำที่ดีกว่าจะดีขึ้น ทั้ง 12 และ 12 จะดีขึ้นแต่อดีตเป็นที่ถูกต้อง
David Conrad

คำตอบ:


3

ยูทิลิตี Bash + GNU , 54

การจับคู่ Regex น่าจะเป็นวิธีที่ตรงไปตรงมา ฉันค่อนข้างมั่นใจว่าการแสดงออกนี้อาจสั้นลงอีก:

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

อินพุตจาก STDIN เอาต์พุตเป็นโค้ดส่งคืนเชลล์ - 0 คือความจริงและ 1 เป็นเท็จ

ลองออนไลน์!


อะไร ? นี่ไม่ใช่การแสดงคำตอบที่ถูกต้อง
มูฮัมหมัดซัลมาน

@ MuhammadSalman นั่นเป็นเพราะเป็นชุดทดสอบ ลองดูที่รหัสออกสำหรับและ1st 1th
เดนนิส

egrepมีความสามารถในการเพิ่มและการทดสอบแบบดั้งเดิม (เป็นเอกภาพ) ดังนั้นฉันคิดว่าคุณสามารถทำสิ่งนี้ตอบคำถาม egrep
เดนนิส

ฉันขอโทษ แต่ทุบตีของฉันดูดเหมือนฉันไม่มีความคิดเกี่ยวกับสิ่งที่อยู่ในนั้น ฉันเบื่อจึงใช้ตัวตรวจสอบ 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  

_____________________________________________________________________

พอร์ตของ @Herman Lauenstein

JavaScript (Node.js)ขนาด 48 ไบต์

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

ลองออนไลน์!


หากวิธีแก้ปัญหาข้อสมมติฐานสามารถเป็นได้***.
l4m2

หากไม่คิดว่าเป็น / \ d * (st | nd | rd | th) / อินพุตให้1staผ่านการทดสอบ reg; ถ้าสันนิษฐานว่า/1.th|(^|[^1])(1s|2n|3r|[^1-3]t)/ทำงาน
l4m2

3

งูหลาม ,  56  53 ไบต์

-3 ต้องขอบคุณ (ใช้การรวมตัวอักษรที่ไม่ซ้ำกันแทนความเท่าเทียมกันของตัวละครสุดท้าย)

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

ฟังก์ชั่นที่ไม่มีชื่อ

ลองออนไลน์!

อย่างไร?

ทั้งหมดตั้งแต่การป้อนข้อมูล (ที่นี่v) รับประกันได้ว่าจะอยู่ในรูปแบบ\d*[st|nd|rd|th]ที่เราสามารถเพียงแค่การทดสอบไม่ว่าจะเป็นตัวละครที่อยู่ในvที่เราคาดหวังว่าจะมีถ้ามันถูกที่ถูกต้อง ( s, n, rหรือ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

... ยกเว้นเมื่อหลักสุดท้ายคือ a 1เมื่อทุกคนควรลงท้ายด้วยthและดังนั้นตัวละครที่เราคาดหวังจะต้องเป็นh; ในการประเมินนี้เราสามารถใช้ชิ้น (เพื่อหลีกเลี่ยงข้อผิดพลาดที่เกิดขึ้นดัชนีสำหรับปัจจัยการผลิตที่ไม่มี -4 THv[-4:-3]ตัวอักษร) ตั้งแต่0แผนที่ไปแล้วเราสามารถบรรลุผลที่ต้องการใช้คูณก่อนที่จะมีการจัดทำดัชนีลงไปh'hsnrhhhhhh'


st, nd, rd และ th ทั้งหมดมีตัวอักษรที่ไม่ซ้ำกันเพื่อให้คุณสามารถทดสอบว่ามันเกิดขึ้นในสตริง53 ไบต์
Asone Tuhid

@ AsoneTuhid กอล์ฟที่ดี - ขอบคุณ!
Jonathan Allan

@AsoneTuhid - บันทึกสามคำตอบใน Jelly ของฉันด้วยดังนั้นขอขอบคุณเป็นสองเท่า!
Jonathan Allan

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

การจับคู่ Stringของ Java เพิ่มโดยนัย^...$โดยปริยายเพิ่ม

คำอธิบาย Regex:

^.*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 กิน unprintables บางอย่างในรหัส (และในคำอธิบายด้านล่าง) แต่พวกเขาอยู่ในลิงค์

คำอธิบาย:
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

โครงสร้างสตริงใหญ่ของths, sts, nds และrdสำหรับตอนจบไป00 99จากนั้นตรวจสอบเพื่อดูว่าตรงกันหรือไม่


2

เรติน่า , 35 31 ไบต์

-4 ไบต์ขอบคุณ @Asone Tuhid

ขอบคุณ @Leo สำหรับการหาจุดบกพร่อง

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

เอาต์พุต1สำหรับ true และ0false นี้จะถือว่าการป้อนข้อมูลที่อยู่ในรูปแบบลำดับมีคำต่อท้ายที่ถูกต้อง (ปลายกับst, nd, rdหรือth)

ลองออนไลน์!




1

เยลลี่ ,  25  22 ไบต์

-3 ไบต์ขอบคุณจากการสังเกตในความคิดเห็นที่ทำโดยรายการ Python ของฉัน

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

ลิงค์ monadic

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

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

Ruby , 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) ไม่ตรงกับจุดเริ่มต้นของสตริงอินพุตจึงมีการทำซ้ำเพื่อให้แน่ใจว่ามีอักขระอยู่ก่อนหน้าตัวสุดท้าย


Ruby -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เมื่อA1ลงท้ายด้วย11-13

2*RIGHT(A1)*(MOD(A1-11,100)>2)+1ผลตอบแทน1ถ้ามันอยู่ใน11- 13และ3, 5, 7ฯลฯ มิฉะนั้น

MIN(9,~)เปลี่ยนผลตอบแทนใด ๆ ข้างต้น9เป็น9ดึงthจากสตริง

MID("thstndrdth",MIN(~),2)ดึงออกเป็นครั้งแรกthสำหรับอินพุตที่ลงท้ายด้วย11- 13, stสำหรับ1, ndสำหรับ2 , rdสำหรับ3, และสุดท้ายthสำหรับสิ่งที่สูงกว่า

=A1&MID(~) เตรียมหมายเลขเดิมให้กับเลขลำดับ


โพสต์เป็นวิกิเนื่องจากฉันไม่ใช่ผู้เขียนสิ่งนี้ ( ที่มา )


0

ภาษา Wolfram (Mathematica) , 122 ไบต์

ไม่เหมือนคำตอบอื่น ๆ ส่วนใหญ่ที่นี่จริง ๆ แล้วจะคืนเท็จเมื่ออินพุตไม่ใช่ "รูปแบบลำดับที่ถูกต้อง" ดังนั้นมันจะกลับเท็จบนอินพุตเช่น "3a23rd", "monkey" หรือ "╚§ +!" อย่างถูกต้อง ดังนั้นฉันคิดว่ามันใช้ได้กับทั้งชุดของสตริงอินพุตที่เป็นไปได้

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 มี built-in (แม้ว่าจะไม่มีเอกสาร) สำหรับการแปลงเป็นเลขลำดับ แหล่งแหล่ง

(สำหรับรุ่น 65- ไบต์: ตามที่ดูเหมือนว่า v9 และก่อนหน้านี้ไม่จำเป็นต้องโทร Speakมาก่อนดังนั้นจึงเป็นไปได้ที่จะสามารถบันทึกไบต์ได้มากขึ้น)

ตรวจสอบคำตอบของ KellyLowder สำหรับรุ่นที่ไม่ได้สร้างขึ้นด้วย


0

PHP, 60 ไบต์

น่าเบื่อ: regexp อีกครั้งทางออกที่สั้นที่สุด

<?=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 เราจะใช้ lookbehind เชิงลบที่จะยอมรับst, ndหรือเฉพาะเมื่อไม่ได้นำหน้าด้วยrd1

โปรแกรมทดสอบ

#!/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.