साधारण स्ट्रिंग जाँच


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

वे सामान्य नियम हैं। मैंने कुछ नहीं बदला। लेकिन इनपुट के लिए धन्यवाद, मैंने एक लिंक जोड़ा
मुहम्मद सलमान

@ जोनाथन एलन साधारण संख्या से शुरू 1stहोते हैं, नकारात्मक अध्यादेश मौजूद नहीं हैं - english.stackexchange.com/questions/309713/…
ओलिवर नी

@JonathanAllan ओपी का कहना है कि "इनपुट वैध क्रमिक पैटर्न होने जा रहा है।" जिसका कोई अर्थ नहीं है
ओलिवर नी

2
आप कहते हैं कि इनपुट्स हमेशा मान्य होंगे लेकिन मुझे लगता है कि एक बेहतर टर्म अच्छी तरह से बनेगा । 12 वीं और 12 वीं दोनों अच्छी तरह से बनाई गई हैं, लेकिन केवल पूर्व ही मान्य है
डेविड कॉनरेड

जवाबों:


3

बाश + जीएनयू उपयोगिताओं , 54

रेगेक्स मिलान एक सीधा रास्ता लगता है। मुझे पूरा यकीन है कि इस अभिव्यक्ति को और छोटा किया जा सकता है:

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

STDIN से इनपुट शेल रिटर्न कोड के रूप में आउटपुट - 0 सत्य है और 1 गलत है।

इसे ऑनलाइन आज़माएं!


क्या ? यह सही जवाब नहीं दे रहा है।
मुहम्मद सलमान

@MuhammadSalman ऐसा इसलिए है क्योंकि यह एक परीक्षण सूट है। 1stऔर के लिए बाहर निकलें कोड पर एक नज़र रखना 1th
डेनिस

egrepइसके अलावा और एकरूपता परीक्षण करने में सक्षम है (एकात्मक में), इसलिए मुझे लगता है कि आप इसे एक जवाब दे सकते हैं।
डेनिस

मुझे खेद है लेकिन मेरा बैश बेकार है क्योंकि मुझे इसमें किसी चीज के बारे में कोई पता नहीं है। मैं ऊब गया था इसलिए इनपुट और आउटपुट के बीच अंतर की जांच करने के लिए एक अलग चेकर का इस्तेमाल किया। में तुम्हारी बात समझ रहा हूँ। तो मेरे पास अब एक सवाल है @ डेनिस: क्या बैश में बूलियन हैं?
मुहम्मद सलमान

शायद परीक्षण के मामले अधिक स्पष्ट होंगे यदि egrepप्रत्येक इनपुट के लिए अलग-अलग निष्पादित किया जाएगा प्रत्येक के लिए मिलान निकास कोड प्राप्त करने के लिए: इसे ऑनलाइन आज़माएं!
बजे १५:१५ में मैनेटवर्क

3

यह इस धारणा के तहत है कि इनपुट मान्य क्रमिक पैटर्न है। अगर इसके मामले में बदलाव नहीं किए जाने की जरूरत है

जावास्क्रिप्ट (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  

_____________________________________________________________________

पोर्ट @ हर्मन लॉस्टीन

जावास्क्रिप्ट (Node.js) , 48 बाइट्स

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

इसे ऑनलाइन आज़माएं!


यदि अनुमान reg समाधान भी हो सकता है***.
l4m2

यदि यह नहीं माना जाता है कि यह / \ d * (st | nd | rd | th) / इनपुट है, 1staतो रेग टेस्ट पास करें; अगर मान लिया जाए, तो /1.th|(^|[^1])(1s|2n|3r|[^1-3]t)/काम
l4m2

3

पायथन ,  56  53 बाइट्स

-3 के लिए धन्यवाद (का उपयोग करें अद्वितीय पत्र समावेश के बजाय penultimate चरित्र समानता)

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

... सिवाय इसके कि जब अंकों का अंक एक हो 1, जब सभी को समाप्त होना चाहिए thऔर इसलिए हमारा अपेक्षित चरित्र होना चाहिए h; इसका मूल्यांकन करने के लिए हम एक स्लाइस ले सकते हैं (कोई -4 वें वर्ण वाले इनपुट के लिए होने वाली अनुक्रमणिका त्रुटि से बचने के लिए ) v[-4:-3]। चूंकि 0नक्शे hपहले से ही हम अनुक्रमण से पहले गुणा का उपयोग करके वांछित प्रभाव प्राप्त कर सकते हैं 'hsnrhhhhhh'


st, nd, rd और th सभी के लिए एक अनोखा पत्र है, ताकि आप सिर्फ टेस्ट कर सकें कि यह स्ट्रिंग 53 बाइट्स
Asone Tuhid

@AsoneTuhid अच्छा गोल्फ - धन्यवाद!
जोनाथन एलन

@AsoneTuhid - भी मेरे जेली उत्तर पर तीन बचाया, इसलिए धन्यवाद दोगुना!
जोनाथन एलन

3

जावा 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

जावा के स्ट्रिंग # मैचों को स्पष्ट रूप से जोड़ता है ^...$

रेगेक्स स्पष्टीकरण:

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

परीक्षण सूट

एसई कोड में (और नीचे की व्याख्या में) कुछ 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
पायथन 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

पायथन 2, 92 82 74 68 बाइट्स

-8 चेस ब्राउन
-6 धन्यवाद केविन क्रूज़सेन के लिए धन्यवाद

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

एंडिंग के लिए ths, sts, nds और rds के एक बड़े तार का निर्माण करता 00है 99। फिर देखने के लिए जांचें कि क्या यह मेल खाता है।


2

रेटिना , 35 31 बाइट्स

-4 बाइट्स @ एशोन तुहिद को धन्यवाद

बग खोजने के लिए @Leo का धन्यवाद

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

1सत्य के लिए और 0असत्य के लिए आउटपुट । यह (के साथ समाप्त होता है मान लिया गया एक मान्य प्रत्यय के साथ क्रमसूचक प्रारूप में है st, nd, rdया th)।

इसे ऑनलाइन आज़माएं!




1

जेली ,  25  22 बाइट्स

-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

रूबी , ४२ 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

एक्सेल, 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

वोल्फ्राम भाषा (गणितज्ञ) , 122 बाइट्स

यहां दिए गए अधिकांश अन्य उत्तरों के विपरीत, यह वास्तव में गलत होगा जब इनपुट "मान्य क्रमिक पैटर्न" नहीं होगा, इसलिए यह "3a23rd", "बंदर" या "╚§ +" जैसे इनपुट पर सही ढंग से गलत लौटेगा। इसलिए मुझे लगता है कि यह संभव इनपुट स्ट्रिंग्स के पूरे सेट के लिए काम करता है।

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

इसे ऑनलाइन आज़माएं!


0

वोल्फ्राम लैंग्वेज (गणितज्ञ) , 65 59 बाइट्स

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

इसे ऑनलाइन आज़माएं!

निश्चित रूप से गणितज्ञ के पास क्रमिक संख्या में परिवर्तित करने के लिए एक अंतर्निहित (हालांकि अनिर्दिष्ट) है। स्रोत

(65-बाइट संस्करण के लिए: इसके अनुसार ऐसा लगता है कि v9 और इससे पहले कॉलिंग की आवश्यकता नहीं है Speak इसलिए कुछ और बाइट्स को सहेजना संभव हो सकता है)

गैर- बिलिन संस्करण के लिए केलीलॉउडर के उत्तर को भी देखें ।


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

पर्ल-संगत नियमित अभिव्यक्ति, 29 बाइट्स

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

हम thकिसी भी "किशोर" संख्या के बाद, या 1..3 के अलावा किसी भी अंक के बाद स्वीकार करते हैं । 1..3 के लिए, हम स्वीकार करने के लिए एक नकारात्मक खोज का उपयोग करते हैं st,nd या 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 ✓
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.