서수 문자열 확인


17

설명 :

문자열을 입력으로 받으면 영어의 유효한 서수인지 확인하십시오. 유효한 값이면 true를 반환하고 그렇지 않으면 false를 반환합니다. (@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 개의 접미사 중 하나와 함께 숫자 (또는 자릿수)로 구성됩니다.

st, nd, rd,th


서수 규칙을 명확히 할 수 있습니까? 또는 적어도 당신이 따르는 규칙에 대한 링크를 넣으십시오.
qwr

그것들은 정상적인 규칙입니다. 나는 아무것도 바꾸지 않았다. 그러나 입력 해 주셔서 감사합니다. 링크를 추가했습니다
Muhammad Salman

@Jonathan Allan 서수는에서 시작하고 1st음수는 존재하지 않습니다.- english.stackexchange.com
Oliver Ni

@JonathanAllan OP는 "입력이 유효한 서수 패턴이 될 것"이라고 말합니다. 이것은 부정적인 의미가 없습니다
Oliver Ni

2
입력은 항상 유효 하지만 더 나은 용어가 잘 형성 될 것이라고 생각합니다 . 12 번과 12 번은 잘 구성되어 있지만 전자 만 유효합니다 .
David Conrad

답변:


3

배쉬 + GNU 유틸리티 , 54

정규식 일치는 간단한 방법으로 보입니다. 이 표현이 더 짧아 질 수 있다고 확신합니다.

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

STDIN에서 입력. 쉘 리턴 코드로 출력-0은 참이고 1은 거짓입니다.

온라인으로 사용해보십시오!


뭐 ? 이것은 정답을 출력하지 않습니다.
Muhammad Salman

@MuhammadSalman 테스트 스위트이기 때문입니다. 1st및 의 종료 코드를 살펴보십시오 1th.
Dennis

egrep(단항으로) 덧셈과 우선 순위 테스트가 가능하기 때문에 이것을 egrep 답변으로 만들 수 있습니다.
Dennis

미안하지만 내 bash는 그것에 대해 전혀 모른다. 지루해 졌기 때문에 diff checker를 사용하여 입력과 출력의 차이를 확인했습니다. 너의 의도를 알 겠어. @Dennis : 이제 Bash에 부울이 있습니까?
Muhammad Salman

egrep각 입력에 대해 개별적으로 실행되어 각각에 대해 적합한 종료 코드를 얻는 경우 테스트 사례가 더 분명 할 수 있습니다. 온라인으로 시도하십시오! .
manatwork

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  

_____________________________________________________________________

@Herman Lauenstein 항구

자바 스크립트 (Node.js) , 48 바이트

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

온라인으로 사용해보십시오!


가정 등록 솔루션이 다음과 같이 될 수있는 경우***.
l4m2

/ \ d * (st | nd | rd | th) / 입력이라고 가정하지 않으면 1stareg 테스트를 통과하십시오. 가정한다면, /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 번째 문자 가없는 입력에서 인덱스 오류가 발생하지 않도록 ) v[-4:-3]. 이후 0지도하는 h이미 우리가 원하는 곱셈을 사용하여 효과를 사전에 인덱싱을 달성 할 수있다 'hsnrhhhhhh'.


st, nd, rd 및 th는 모두 고유 한 문자를 가지므로 문자열 53 바이트
Asone Tuhid

@AsoneTuhid 좋은 골프-감사합니다!
Jonathan Allan

@ AsoneTuhid-Jelly 답변에 3을 저장 했으므로 감사합니다.
Jonathan Allan

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

Java의 String # matches는 암시 적으로 추가합니다 ^...$.

정규식 설명 :

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

테스트 스위트

코드에서 (및 아래 설명에서) 인쇄 할 수없는 일부를 먹었지 만 링크에 있습니다.

설명:
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 바이트

Chas Brown 덕분에 -8, Kevin Cruijssen
덕분에 -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 바이트

@Asone Tuhid 덕분에 -4 바이트

버그를 찾은 @Leo에게 감사합니다

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

1true 및 0false에 대한 출력 . 이것은 (끝나는를 입력 유효한 접미사 서수 형식으로 가정 st, nd, rd또는 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

엑셀, 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- 13그리고 3, 5, 7, 등. 그렇지 않으면

MIN(9,~)위의 모든 반환 변경 9에를 9을 끌어 th문자열에서

MID("thstndrdth",MIN(~),2)- , for , for , for로 th끝나는 입력의 경우 첫 번째 를 , 더 높은 항목의 경우 에는 마지막 을 가져옵니다 . 1113st1nd2rd3th

=A1&MID(~) 원래 숫자를 서수 앞에 추가합니다.


필자가 저자가 아니기 때문에 위키로 게시. ( 소스 )


0

볼프람 언어 (수학) 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 Language (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"teen"번호 뒤에 또는 1..3 이외의 숫자 뒤에 받아들 입니다. 1..3를 들어, 우리가 받아 들일 음의 lookbehind를 사용 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 ✓
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.