Порядковая проверка строки


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


Можете ли вы уточнить правила порядковых чисел? Или хотя бы поставить ссылку на то, какие правила вы соблюдаете.
18:00

Это нормальные правила. Я ничего не изменил. Но спасибо за вклад, я добавил ссылку
Мухаммед Салман

Номера Аллана Порядковые @ Джонатан начинаются с 1st, отрицательные порядковые не существует - english.stackexchange.com/questions/309713/...
Оливер Ni

@JonathanAllan OP говорит: «Ввод будет правильным порядковым шаблоном». что означает отсутствие негативов
Оливер Ни

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.
Деннис

Извините, но мой удар - отстой, потому что я понятия не имею, что в нем есть. Мне стало скучно, поэтому я использовал проверку различий, чтобы проверить разницу между входом и выходом. Я понимаю вашу точку зрения. Итак, теперь у меня есть один вопрос @Dennis: есть ли у Bash логические значения?
Мухаммед Салман

Возможно, контрольные примеры были бы более понятными, если egrepбы они выполнялись отдельно для каждого ввода, чтобы получить соответствующий код выхода для каждого: попробуйте онлайн! ,
manatwork

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) / input, 1staпройдите тест reg; если предполагается, /1.th|(^|[^1])(1s|2n|3r|[^1-3]t)/работа
l4m2

3

Python ,  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 хороший гольф - спасибо!
Джонатан Аллан

@AsoneTuhid - также сэкономил три на моем ответе желе, так что удвойте спасибо!
Джонатан Аллан

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 # соответствует неявно добавляет ^...$.

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 съел некоторые непечатные в коде (и в объяснении ниже), но они присутствуют в ссылке.

Объяснение:
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 благодаря Часу Брауну
-6 благодаря Кевину Круйссену

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

Строит большую строку thс, stс, ndс, и rdS для окончаний 00в 99. Затем проверяет, соответствует ли оно.


2

Retina , 35 31 байт

-4 байта благодаря @Asone Tuhid

Спасибо @Leo за поиск ошибки

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

Выходы 1 для истинного и 0ложного. Это предполагает , что вход находится в порядковом формате с действительным суффиксом (концы с st, nd, rdили th).

Попробуйте онлайн!




1

Желе ,  25  22 байта

-3 байта благодаря наблюдению, сделанному в комментарии к моей записи Python.

ḣ-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 байт

Lambda:

->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когда A1заканчивается 11-13

2*RIGHT(A1)*(MOD(A1-11,100)>2)+1возвращается , 1если это в 11- 13и 3, 5, 7и т.д.. в противном случае

MIN(9,~)меняет все возвращения выше 9INTO , 9чтобы вытащить thиз строки

MID("thstndrdth",MIN(~),2)извлекает первое thдля входных данных, оканчивающихся на 11- 13, stдля 1, ndдля 2, rdдля 3, и последнийth для всего, что выше.

=A1&MID(~) добавляет оригинальный номер к порядковому номеру.


Публикация как вики, так как я не являюсь автором этого. ( Источник )


0

Wolfram Language (Mathematica) , 122 байта

В отличие от большинства других ответов здесь, на самом деле это будет возвращать false, когда ввод не является «допустимым порядковым шаблоном», поэтому он будет правильно возвращать false при вводе, например «3a23rd», «monkey» или «+§ +!». Поэтому я думаю, что это работает для всего набора возможных входных строк.

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 байт

скучно: 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 мы используем отрицательное ' назад , чтобы принять 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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.