Sıradan dize denetimi


17

Açıklama :

Girdi olarak bir dize verildiğinde, dizinin İngilizce geçerli bir sıra numarası olup olmadığını kontrol edin. Geçerli bir dönüş doğruluk değeri ise, aksi takdirde yanlış değeri döndürün. (@Arnauld tarafından önerildi. Teşekkürler. @JoKing tarafından da)

Sıra sayıları hakkında bilgi edinmek isteyen kullanıcılar için buraya gidin:

https://www.mathsisfun.com/numbers/cardinal-ordinal-chart.html (Öneri: qwr)

Olası girişler:

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

Bu bir kod golf meydan okuma her dilde en kısa kod kazanan olacak.

Örnekler:

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

Birçok kişi girdinin yalnızca geçerli dizeler olup olmayacağı sorusunu sorduğundan:

Tüm girişler her zaman geçerli olacaktır. yani, dize biçiminde olacaklar ve dört soneklerden biriyle birlikte bir basamaktan (veya basamak sayısından) oluşacaklar:

st, nd, rd,th


Sıra sayılarının kurallarını netleştirebilir misiniz? Ya da en azından takip ettiğiniz kurallara bir link koyun.
qwr

Bunlar normal kurallardır. Hiçbir şey değiştirmedim. Ancak giriş için teşekkürler, bir bağlantı ekledim
Muhammad Salman

@Jonathan Allan Ordinal numaraları başlar 1st, negatif sıra sayıları yoktur - english.stackexchange.com/questions/309713/…
Oliver Ni

@JonathanAllan OP "Giriş geçerli sıra deseni olacak" diyor. bu hiçbir olumsuzluk anlamına gelmez
Oliver Ni

2
Girdilerin her zaman geçerli olacağını söylüyorsunuz, ancak daha iyi bir terimin iyi oluşturulacağını düşünüyorum . Hem 12. hem de 12. iyi biçimlendirilmiş, ancak sadece birincisi geçerlidir .
David Conrad

Yanıtlar:


3

Bash + GNU yardımcı programları , 54

Normal ifade eşleşmesi kolay bir yol gibi görünüyor. Eminim bu ifade daha da kısaltılabilir:

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

STDIN'den giriş. Kabuk dönüş kodu olarak çıktı - 0 doğrudur ve 1 yanlıştır.

Çevrimiçi deneyin!


Ne ? bu doğru cevabı vermiyor.
Muhammed Salman

@MuhammadSalman Çünkü bir test takımı. İçin çıkış kodları bir göz atın 1stve 1th.
Dennis

egrep(tekli olarak) ekleme ve öncelik testi yapabilir, bu yüzden bunu bir egrep cevabı yapabilirsiniz.
Dennis

Üzgünüm ama benim bash içinde bir şey hakkında hiçbir fikrim yok gibi berbat. Ben sıkıldım bu yüzden giriş ve çıkış arasındaki farkı kontrol etmek için bir fark denetleyicisi kullanılır. Senin değinmek istediğin noktayı anlıyorum. Şimdi bir sorum var @Dennis: Bash'in booleleri var mı?
Muhammed Salman

Belki egrepher biri için eşleşen çıkış kodunu almak üzere her bir giriş için ayrı yürütülürse test senaryoları daha açık olur : Çevrimiçi deneyin! .
manatwork

3

bu, girdinin geçerli sıra deseni olduğu varsayımı altındadır. durum böyle değilse, değişiklik yapılması gerekir

JavaScript (Node.js) , 97 92 78 bayt

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

Çevrimiçi deneyin!

açıklama

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  

_____________________________________________________________________

Limanı @Herman Lauenstein

JavaScript (Node.js) , 48 bayt

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

Çevrimiçi deneyin!


Varsayım reg çözüm de olabilir***.
l4m2 14:18

/ \ D * (st | nd | rd | th) / input olduğu varsayılmazsa 1sta, reg testini geçin; varsayalım, /1.th|(^|[^1])(1s|2n|3r|[^1-3]t)/çalışma
l4m2

3

Python ,  56  53 bayt

-3 sayesinde (sondan bir önceki karakter eşitliği yerine benzersiz harf ekleme özelliğini kullanın)

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

Adsız bir işlev.

Çevrimiçi deneyin!

Nasıl?

Tüm giriş (burada beri v) formunun olması sağlanır \d*[st|nd|rd|th]biz karakter var olup olmadığını sadece deneme yapabilirsiniz v(biz orada doğru olsaydı olmasını bekliyoruz ki s, n, rveya h, sırasıyla) - olduğunu <getExpectedLetter>in v.

Son basamak genellikle bunu belirler:

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

... sondan bir önceki rakamın a olması 1, herkesin ne zaman bitmesi gerektiği thve bu nedenle beklenen karakterimizin olması gerektiği h; bunu değerlendirmek için bir dilim alabiliriz (-4 karakter içermeyen girdiler için bir dizin hatasını önlemek için ) v[-4:-3]. Yana 0haritalar için hzaten biz arzu çarpma işlemi kullanılarak etkisini önce içine endeksleme için elde edebilirsiniz 'hsnrhhhhhh'.


st, nd, rd ve th benzersiz bir harfe sahiptir, böylece sadece 53 baytlık
Asone Tuhid

@AsoneTuhid güzel golf - teşekkürler!
Jonathan Allan

@AsoneTuhid - Jelly cevabımda da üç tane kurtardım, bu yüzden iki kat teşekkürler!
Jonathan Allan

3

Java 8, 54 51 bayt

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

Açıklama:

Çevrimiçi deneyin.

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'nın String # ifadeleri örtük olarak ekler ^...$.

Normal ifade açıklaması:

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

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

Test odası

SE kodda (ve aşağıdaki açıklamada) bazı yazdırılamayanlar yedi ancak bağlantıda mevcutlar.

Açıklama:
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 çeviri:
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 bayt

Chas Brown sayesinde -8 teşekkürler Kevin Cruijssen
sayesinde -6 teşekkürler

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

Büyük bir dize oluşturur th, s sts, nds, ve rdsonlar için s 00için 99. Ardından eşleşip eşleşmediğini kontrol eder.


2

Retina , 35 31 bayt

@Asone Tuhid sayesinde -4 bayt

Bir hata bulduğu için @Leo'ya teşekkürler

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

1Doğru ve 0yanlış için çıktılar . Bu (ile biter girdi geçerli bir sonek ile sıralı biçimde varsayar st, nd, rdveya th).

Çevrimiçi deneyin!




1

Jöle ,  25  22 bayt

Python girişime yapılan bir yorumda yapılan gözlem sayesinde -3 bayt.

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

Monadik bir bağlantı.

Çevrimiçi deneyin! Veya bakın test takımına bakın .

Nasıl?

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

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

Çevrimiçi deneyin! veya Test takımı olarak

açıklama

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

Yakut , 42 39 bayt

Lambda:

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

Çevrimiçi deneyin!

Kullanıcı girişi:

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

Çevrimiçi deneyin!

Maçlar:

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

Çünkü [^1]( not 1) bir dize başlangıcı uymuyor, giriş emin geçen önce karakter var olmak için yineleniyor.


Yakut -n , 35 bayt

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

Çevrimiçi deneyin!

Yukarıdaki fikirle aynıdır, ancak dizeyi çoğaltmak yerine, dizenin ( ^) başlangıcıyla da eşleşir .


0

Excel, 63 bayt

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

(MOD(A1-11,100)>2)- ile FALSEbitince geri dönerA11113

2*RIGHT(A1)*(MOD(A1-11,100)>2)+1döner 1İçinde eğer 11- 13ve 3, 5, 7, vb. aksi takdirde

MIN(9,~)yukarıdaki getirileri 9içine 9çekmek içinth dizesinden

MID("thstndrdth",MIN(~),2)ile thbiten girdilerin ilkini 11- 13, stiçin 1, ndiçin 2, rdiçin 3ve sonuncusu thdaha yüksek herhangi bir şey için çıkarır .

=A1&MID(~) orijinal sayıyı sıraya ekler.


Bunun yazarı olmadığım için wiki olarak gönderiyorum. ( Kaynak )


0

Wolfram Dili (Mathematica) , 122 bayt

Buradaki diğer cevapların çoğundan farklı olarak, giriş "geçerli bir sıra deseni" olmadığında bu aslında yanlış döndürür, bu nedenle "3a23rd", "maymun" veya "+§ +!" Bu yüzden tüm olası giriş dizeleri kümesi için bu bence.

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

Çevrimiçi deneyin!


0

Wolfram Dili (Mathematica) , 65 59 bayt

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

Çevrimiçi deneyin!

Elbette Mathematica, sıra numarasına dönüştürmek için yerleşik (belgelenmemiş olmasına rağmen) sahiptir. Kaynak .

(65 baytlık sürüm için: buna göre v9 ve daha önce aramaya gerek yok gibi görünüyor Speak bu nedenle biraz daha bayt kaydetmek mümkün olabilir)

Ayrıca KellyLowder en check out cevabı olmayan yerleşik versiyonu için.


0

PHP, 60 bayt

sıkıcı: regexp bir kez daha en kısa çözüm

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

doğruluk 1için falsy için boş çıktı .

Pipo ile çalıştırın -nFveya çevrimiçi deneyin . (Kolaylık sağlamak için fonksiyon olarak TiO sarılmış)


0

x86 makine kodu, 65 bayt

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

Montaj:

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'

Çevrimiçi deneyin!


-1

Perl uyumlu düzenli ifade, 29 bayt

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

thHerhangi bir "genç" numaradan sonra veya 1..3 dışında herhangi bir rakamdan sonra kabul ediyoruz . 1..3 için, kabul etmek için bir Negatif Geriye İlerleme kullanmak st, ndveya rdöncesinde sadece zaman1 .

Test programı

#!/usr/bin/bash

ok=(✓ ❌)

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

Sonuçlar

1st ✓
1th ❌
2nd ✓
2th ❌
3rd ✓
3th ❌
4st ❌
4th ✓
11th ✓
11st ❌
12nd ❌
12th ✓
13th ✓
13rd ❌
112nd ❌
112th ✓
21nd ❌
32nd ✓
33rd ✓
21th ❌
21st ✓
11st ❌
111199231923819238198231923213123909808th ✓
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.