ตัวตรวจสอบบัญชีผู้ใช้ VEVO


21

เรามักจะดูมิวสิควิดีโอบน Youtube ช่อง Youtube จำนวนมากที่โฮสต์มิวสิควิดีโอนั้นถูก "ขับเคลื่อนโดย VEVO" สามารถระบุได้อย่างง่ายดายโดยฝังทั้ง VEVO ที่ภาพขนาดย่อของวิดีโอและต่อท้าย VEVO กับชื่อช่องของพวกเขา

ตอนนี้เขียนโค้ดเพื่อทดสอบว่าสตริงที่กำหนดโดยผู้ใช้เป็นบัญชีผู้ใช้ VEVO หรือไม่

ข้อกำหนดสำหรับสตริงบัญชีผู้ใช้ VEVO ที่ถูกต้อง:

  • ต้องมีอักขระตัวพิมพ์ใหญ่ตัวพิมพ์เล็กและตัวเลขเท่านั้น (ไม่มีช่องว่างหรือเครื่องหมายวรรคตอน)

  • ต้องไม่เกิน 80 ตัวอักษร

  • ต้องมีสตริงย่อย "VEVO" ที่ท้ายสตริง

กรณีทดสอบ:

อินพุตที่ถูกต้อง:

AdeleVEVO
ConnieTalbotVEVO
SHMVEVO
justimberlakeVEVO
DJMartinJensenVEVO
test123VEVO

อินพุตไม่ถูกต้อง:

syam kapuk
jypentertainment
Noche de Brujas
testVEVO123

แน่นอนเพราะนี่คือฉันกำลังมองหารหัสสั้นที่สุดโดยใช้ภาษาการเขียนโปรแกรมใด ๆ


4
คำถามแรกที่ดี! +1
LiefdeWen

12
กรณีทดสอบ: VEVOและūņīčōdēVEVO
dzaima

8
กรณีทดสอบอื่น ๆ ที่แนะนำ: test123VeVoและอีกหนึ่งตัวที่มีมากกว่า 80 ตัวอักษร
Arnauld

6
คุณควรรอนานกว่านี้ก่อนที่จะยอมรับคำตอบที่ดีที่สุด; คำถามนั้นใช้เวลาเพียงหนึ่งชั่วโมงเท่านั้นและยังมีอีกหลายภาษาที่ผู้คนจะตอบ!
ลุคสตีเวนส์

5
"ตัวอักษรตัวพิมพ์ใหญ่ตัวพิมพ์เล็กและตัวเลข" ต้องกำหนด (ฉันจะถือว่า (ตามที่ฉันเชื่อว่าทั้งหมดได้ทำไปแล้ว) ว่าคุณหมายถึง A-Za-z0-9 แต่อาจหมายถึงสิ่งใด ๆ ที่อาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กสำหรับ ตัวอย่างและตัวเลขในตัวอักษรอื่นเช่น(9)
Jonathan Allan

คำตอบ:



6

Japt v2.0a0, 20 16 ไบต์

ส่งคืน1ค่าที่ถูกต้องหรือ0ไม่ถูกต้อง [\l\d]จะทำงานแทน[^\W_]ไบต์เดียวกัน

è/^\w{0,76}VEVO$

ลองมัน | ตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย : èนับจำนวนการแข่งขันของ RegEx ในอินพุต ใน Japt \wคลาส RegEx จะไม่มีการขีดเส้นใต้


ทำได้ดีนี่. ดีที่สุดที่ฉันสามารถทำได้โดยไม่ต้อง regex คือ;¥oB+mc)¯80 ©"VEVO"¥Ut4n
ETHproductions

@ETHproductions เคล็ดลับที่ดีกับB+mc:) อย่างไรก็ตามถ้า Japt2 มีคลาสตัวละคร[A-Za-z0-9]เราสามารถเอาชนะ Retina ได้ที่นี่! แม้อาจจะมีมูลค่าเอาชนะ&\w \W
Shaggy

ฉันคิดว่าฉันกำลังวางแผนที่จะทำสิ่งนั้นจริง ๆ แล้ว ... ฉันควรกลับไปทำงานกับ Japt โดยทั่วไป: P
ETHproductions

4

JavaScript (ES6), 27 36 34 31 ไบต์

บันทึก 2 ไบต์ขอบคุณ @Neil และ 3 ไบต์ขอบคุณ @Shaggy

s=>/^[^\W_]{0,76}VEVO$/.test(s)

กรณีทดสอบ


2
ไม่\wตรงกับ_s เช่นกัน?
Neil

ฉันคิดว่า((?!_)\w)ประหยัดได้ 2 ไบต์
Neil

1
จะ[^\W_]ทำงานเพื่อประหยัด 3 ไบต์หรือไม่
Shaggy

@Shaggy Heck ด้วยเหตุผลบางอย่างฉันคิดว่าคลาสตัวละครดังกล่าวไม่ทำงานภายในชุดอักขระ ขอบคุณ!
Arnauld

JS ไม่มีวิธีข้ามแลมบ์ดาหรือไม่? ชอบ/^[^\W_]{0,76}VEVO$/.testหรืออะไร
สิ้นเชิงมนุษย์

4

PHP , 51 ไบต์

-10 ไบต์ขอบคุณ @Ismael Miguel สำหรับการใช้งาน<?=แทน<?php echo! และลบแท็กปิด

<?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));

ลองออนไลน์!

ขอบคุณสำหรับคำตอบอื่น ๆ ดังนั้นฉันไม่ต้องเขียน regex!


1
แทนการที่คุณสามารถทำได้<?php echo <?=preg_match("/^[^\W_]{0,76}VEVO$/",fgets(STDIN));
Ismael Miguel

ไม่เป็นไร คุณสามารถออกจากแท็กปิด PHP การอ้างถึงเอกสาร: "หากไฟล์เป็นรหัส PHP แท้ๆคุณควรละเว้นแท็กปิด PHP ที่ท้ายไฟล์" ( php.net/manual/th/language.basic-syntax.phptags.php ) สิ่งนี้จะช่วยให้คุณประหยัดได้อีก 2 ไบต์ นอกจากนี้แทนที่จะเป็น[^\W_]เพียงแค่ใช้ซึ่งเป็นเช่นเดียวกับ\w [a-zA-Z_]
Ismael Miguel

1
ขอบคุณเช่นกันฉันมีคำตอบให้อัปเดตตอนนี้!
NK1406

ไม่เป็นไร คำแนะนำอย่างหนึ่ง: การอ่านเอกสารและทำความคุ้นเคยกับมันจะช่วยได้มาก
Ismael Miguel


3

C (gcc) , 83 ไบต์

c,i;f(char*s){for(c=i=0;s[i];c+=!isalnum(s[i++]));c=i<81*!c*!strcmp("VEVO",s+i-4);}

ลองออนไลน์!


ฉันไม่เห็นreturnคำสั่งใด ๆสิ่งนี้จะส่งคืนได้cอย่างไร พฤติกรรมที่ไม่ได้กำหนด?
MD XF

@MDXF นี่เป็นพฤติกรรมที่ไม่ได้กำหนดแน่นอนและการใช้ gcc ในทางที่ผิดเหมือนกันสำหรับการกำหนดตัวแปรและค่าส่งคืน (ดูเคล็ดลับสำหรับการเล่นกอล์ฟใน C ) นี้ไม่ได้พกพาและไม่จำเป็นต้องทำงานร่วมกับคอมไพเลอร์อื่น ๆ (ตัวอย่างเช่นมันไม่ทำงานกับเสียงดังกราว)
scottinet

ที่มากน่าประทับใจ คุณค้นพบได้อย่างไร?
MD XF

บางครั้ง f ("VO" ก็เป็นจริงเมื่อก่อนคือ "VI" ที่เก็บไว้หรืออาจผิด
l4m2

3

Dyalog APLขนาด 47 ไบต์

{0::0⋄(∧/(1(819⌶)t)∊⎕A,⎕D)∧77>≢t←,∘'VEVO'⍣¯1⊢⍵}

ลองออนไลน์!

โซลูชัน regex บริสุทธิ์คือ32 ไบต์แต่ก็น่าเบื่อกว่าวิธีนี้มาก

{0::0⋄(∧/(1(819⌶)t)∊⎕A,⎕D)∧77>≢t←,∘'VEVO'⍣¯1⊢⍵} a dfn with right arg '⍵'
 0::0                                          on error, return 0
                                 ,∘'VEVO'       a train that appends VEVO
                                         ⍣¯1    apply it -1 times
                                               on '⍵'
                                                and error if impossible (which returns 0)
                               t               save on variable 't'
                                               get the length of that
                           77>                  if that's smaller than 77
                          ∧                     and
         (1(819I)t)                              [for each of] 't' uppercased
                   ∊⎕A,⎕D                        is it in the uppercase alphabet concatenated with the digits
       ∧/                                        reduced by and

แทนการใช้⍣¯1เพื่อตรวจสอบVEVOและต้องเฝ้า dfn 'VEVO'≡¯4↑⍵คุณสามารถทำได้ การเคลื่อนย้ายสิ่งต่าง ๆ รอบตัวทำให้ฉันได้รับ{('VEVO'≡¯4↑⍵)∧∧/⍵∊⎕D,⎕A,(819⌶)⎕A}
Kritixi Lithos

@ Cowquack ใช่ฉันอาจลืมไปแล้ว.. มีวิธีอื่นที่ดีกว่าในการทำสิ่งนี้แม้ว่า ((เช่น Eriks ตอบ)) และฉันชอบความคิดนี้: p
dzaima

3

สิ่งสกปรก 13 ไบต์

e`n{-76"VEVO"

ลองออนไลน์!

ไม่มีอะไรแฟนซีที่นี่ ตรงกับeการป้อนข้อมูล ntire กับรูปแบบ: ที่มากที่สุด 76 อัลฟาnตัวอักษร umeric VEVOตามด้วยสตริง พิมพ์1สำหรับการจับคู่และ0ไม่มีการจับคู่ ฉันจำได้ว่าสามารถลบเครื่องหมายคำพูดสุดท้ายเมื่อสิ้นสุดบรรทัด แต่ดูเหมือนว่าจะทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์


3

C # (. NET Core) , 87 + 18 = 105 ไบต์

ลองออนไลน์!

a=>a.Where(x=>char.IsLetterOrDigit(x)).Count()==a.Length&a.Length<81&a.EndsWith("VEVO")

สิ่งนี้จะไม่ล้มเหลวหรือไม่หากอินพุตมีอักขระที่ไม่ใช่ตัวอักษรและตัวเลขใด ๆ
Shaggy

@Shaggy คุณพูดถูกจะแก้ไขในภายหลัง
LiefdeWen

ฉันตรวจสอบกับ TIO แล้วและพบว่าอินพุต "ConnieTalbotVEVO" (ซึ่งควรเป็นอินพุตที่ถูกต้อง) ได้รับการประกาศอย่างไม่ถูกต้องว่าเป็นอินพุตที่ไม่ถูกต้อง
Bagas Sanjaya

@BasasSanjaya เป็นเพราะฉันใส่แท็บหลังจากนั้นในกรณีทดสอบนำแท็บออกมาและมันจะเหมือนกับกรณีทดสอบด้านบนและจะทำงานได้
LiefdeWen

73 + 18: a=>a.All(x=>char.IsLetterOrDigit(x)&x<123)&a.Length<81&a.EndsWith("VEVO")เฉพาะตัวอักษร ASCII หรือ 67 + 18: a=>a.All(x=>char.IsLetterOrDigit(x))&a.Length<81&a.EndsWith("VEVO")ด้วยการสนับสนุน unicode
dg3

2

> <> , 147 125 ไบต์

!\i:0(?^1[::::::"/9@Z`z"!
;>{(?;{(?v{(?;{(?v{(?;{(?v
 ~l1-?!v >       > !|!: !<
;v    ]/~l99*-0(?!;4["OVEV"{-?;{-?;{-?;{-?;1n

ลองออนไลน์!

> <> , 147 ไบต์

ลองออนไลน์!

สิ่งนี้จะพิมพ์ 1 ถ้าสตริงอินพุตนั้นถูกต้องและไม่มีอะไรสำหรับอินพุตที่ไม่ถูกต้อง

แก้ไข 1: เปลี่ยนการตรวจสอบตัวอักษรและตัวเลขเพื่อใช้ช่วงแทนที่จะเปรียบเทียบกับตัวละครทุกตัว (บันทึก 22 ไบต์)


ตอนนี้ฉันยังไม่มีเวลาเล่นกอล์ฟ แต่ฉันค่อนข้างมั่นใจว่าคุณจะเสียจำนวนไบต์ด้วยการเปรียบเทียบกับรหัสตัวละคร ส่วนสำคัญของมันคือการปฏิเสธสิ่งที่น้อยกว่า '0' และมากกว่า 'z' และจากนั้นปฏิเสธสิ่งต่าง ๆ ระหว่าง '9' และ 'A' รวมถึงระหว่าง 'Z' และ 'a'
โคล

@cole: - ฉันไม่ได้อยู่ที่พีซีของฉันที่จะเปลี่ยนแปลงเมื่อวานนี้หลังจากโพสต์ แต่คุณพูดถูกการเปรียบเทียบจะลดลงเล็กน้อย ฉันแน่ใจว่าถ้าคุณสแกนรหัสคุณอาจจะลดไบต์พิเศษบางอย่าง
นกกระทุงนกเป็ดน้ำ

2

Bash, 53 26 30 ไบต์

[[ $1 =~ ^[^\W_]{0,76}VEVO$ ]]

รหัสออก 0 สำหรับผลลัพธ์ VALID และ 1 สำหรับผลลัพธ์ INVALID

ยังทำงานกับอักขระ 80 ตัวหรือน้อยกว่านั้น

-27 ไบต์จากการลบเอาต์พุตขอบคุณ @KeyWeeUsr

+4 ไบต์คงที่ regex (เหมือนกับทุกคน)

ลองออนไลน์!


คุณสามารถecho 1เป็นจริงหรือเพียงแค่ไปโดยไม่มีเสียงสะท้อนใด ๆ ไม่จำเป็นต้องมีเพื่ออะไรก้องในขณะที่คุณยังคงจบลงด้วยรหัสทางออกจริงที่คุณตรวจสอบกับเป็น&&และ||
KeyWeeUsr

โอเคไม่แน่ใจว่าจำเป็นต้องใช้เอาต์พุตประเภทใด (ถ้ามี) คำถามไม่ได้พูดจริง ๆ
อาจ

แนวคิดของ 'ความจริง' มีการอธิบายไว้ที่นี่codegolf.meta.stackexchange.com/q/2190/16658และโดยทั่วไปจะมีนัยโดยทั่วไปเว้นแต่ระบุไว้เป็นอย่างอื่น
Sirens

สิ่งนี้จะไม่แสดงผลอะไรบน TIO นอกจากนี้ RegEx ของคุณอนุญาตขีดล่างซึ่งไม่ควร และคุณไม่ได้ตรวจสอบความยาว เราต้องการโซลูชันที่ทำงานได้อย่างสมบูรณ์ที่นี่ไม่ควรโพสต์งานระหว่างทำ ฉันขอแนะนำให้ลบมันจนกว่าคุณจะสามารถแก้ไขปัญหาได้ (ในบันทึกที่เกี่ยวข้องทำไมผู้คนถึงเลือกแก้ปัญหาที่ไม่ได้ผลอย่างชัดเจน)
Shaggy

@Shaggy การส่งออกเป็นรหัสทางออก
มนุษย์

2

> <> , 101 89 83 81 94 ไบต์

แก้ไข: เปลี่ยนเป็นการตรวจสอบอักขระที่ไม่ใช่ตัวอักษรและตัวเลขแทนที่จะเป็นตัวอักษรและตัวเลข เปลี่ยนกลับเพราะฉันลืมตรวจสอบระหว่าง Z และ a ขอบคุณ @Emigna ฉีกไบต์ที่หายไปแม้ว่า

แก้ไข 2: นอกจากนี้ฉันสามารถกำจัดพวกนั้นได้}}}} โดยสิ้นเชิง ขอบคุณนกกระทุงนกเป็ดน้ำสำหรับเรื่องนั้นและค้นหาปัญหากับ TIO

แก้ไข 3: แทนที่ ~~~ ด้วย ap

!\i::0(?v:::"/")$":"(*$:"`")$"{"(*+$:"@")$"["(*+?
0/?("S"l/
l/"VEVO"[4pn?$0(6
!\{-?vl?
1/;n0/n

ผมไม่ทราบว่าทำไมถึงจะไม่ทำงานใน TIO แต่มันทำงานได้ดีที่นี่ ปัญหาคือว่าคำสั่ง {} ใน TIO ไม่ทำงานสำหรับรายการที่ว่างเปล่าลองที่นี่

มันทำงานอย่างไร

!\i::0(?v:::"/")$":"(*$:"`")$"{"(*+$:"@")$"["(*+?
0/....../
......... Checks each input is alphanumeric
...       If any isn't, print 0 and exit with an error
...

...
0/?("S"l/ Checks if there are more than 80 characters
...       If so, print 0 and exit with an error
...
...

...
...
l/"VEVO"[4pn?$0(6 Check if the input is less than 4 characters
...               If so, print 0 and exit with an error
...

...
...
./"VEVO"[4pn?$0(6 Take the last 4 characters of the input into a new stack (first time I've actually used [)
...               Add "VEVO" to the stack to compare
...

...
0/....../n
........V
!\{-?vl?  Check if the last 4 characters are VEVO
1/;n0/n   Print 1 and exit with an error if so, else print 0 and exit

เพื่อความสอดคล้องแทนที่; ในบรรทัดสุดท้ายที่มีคำสั่งที่ไม่ถูกต้องทำให้ทุกข้อผิดพลาด


ฉันเชื่อว่าข้อผิดพลาด TIO ของคุณอาจเป็นวิธีการทำงานกับการสั่งซื้อในการแยกสแต็กสิ้นสุด TIO ลิงค์ที่นี่มีระเบียบใน TIO คุณสามารถเปลี่ยนเป็น
นกกระทุงนกเป็ดน้ำ

ขอบคุณ @Tealpelican แก้ไขและฆ่าอีกไม่กี่ไบต์
Jo King

คุณขาดการตรวจสอบอักขระระหว่าง "Z" และ "a"
Emigna

@Emigna โอ๊ะขอบคุณ! หนี้!
Jo King

2

C ++, 129 105 102 ไบต์

ขอบคุณคำตอบอื่น ๆ ที่แสดงให้ฉันเห็นว่าฉันสามารถนับจำนวนอักขระได้
-2 ไบต์ขอบคุณZacharý

#include<regex>
int v(std::string s){return std::regex_match(s, std::regex("[a-zA-Z0-9]{0,76}VEVO"));}

TIO LINK


ลิงก์ TIO ของคำตอบของคุณอยู่ที่ไหน ฉันต้องการทดสอบรหัสของคุณ ...
Bagas Sanjaya

ยกโทษให้ฉันถ้านี่คือการขาดความรู้ของ C ++ คุณสามารถย้ายลบตัวแปรrและเพียงแค่มี regex ภายในการโทรไปstd::regex_match?
Zacharý

มีช่องว่างที่ไม่จำเป็นหลังจากเครื่องหมายจุลภาค
Zacharý

คุณสามารถลบเครื่องหมายจุลภาคเว้นวรรคหลังเครื่องหมายจุลภาค
Zacharý







1

V, 17 bytes

ø^¨áüä©û,76}VEVO$

Try it online!

Hexdump:

00000000: f85e a8e1 fce4 a9fb 2c37 367d 5645 564f  .^......,76}VEVO
00000010: 24                                       $

Compressed regexes for the win!

ø                   " Count the number of matches of
 ^                  "   The beginning of the line
  ¨áüä©             "   A letter or number...
       û,76}        "   From 0 to 76 times...
            VEVO    "   Followed by "VEVO"
                $   "   At the end of the line





1

Perl 5, 35 29+1(-a) = 30 bytes

-6 bytes thanks to ETHproductions

Added 4 bytes. Didn't see that underscore wasn't allowed.

This is my first golf, so here's hoping I did it right.

Returns 1 if valid, 0 if not.

print/^[^\W_]{0,76}VEVO$/?1:0

Try it online!


1
Welcome to PPCG! You can remove extraneous whitespace to get down to 25 (+1) bytes: print/^\w{1,76}VEVO$/?1:0
ETHproductions

+0 converts match bool into number, rather than ?1:0, saves 2 bytes. Calling with -ple prints $_ for you. So: perl -ple '$_=/^[^\W_]{0,76}VEVO$/+0'. 25 bytes. If you are happy to get blanks on non-matching lines, $_=/^[^\W_]{0,76}VEVO$/ is 23 bytes.
Phil H

0

Google Sheets, 33 Bytes

Anonymous worksheet function that takes input from range A1 and outputs to the calling cell

=RegexMatch(A1,"^[^\W_]{0,76}VEVO

Where's the closing bracket?
Bagas Sanjaya

@BagasSanjaya that's one of the wonderful things about Google Sheets, it autocompletes unclosed strings and groups. So when this is pasted into a cell and you either click off the cell or press enter GS converts this to =RegexMatch(A1,"^[^\W_]{0,76}VEVO") without any feedback to the user and executes
Taylor Scott

-1

Clojure, 146 bytes

(fn[u](let[c count](and(<(c u)81)(=(c(filter #(let[i(int %)](or(< 47 i 58)(< 64 i 91)(< 96 i 123)))u))(c u))(clojure.string/ends-with? u"VEVO"))))

Try it online!

This would be much shorter using a regex, but I figured doing it manually would be more interesting.

(defn vevo? [username]
  (and (< (count username) 81)

       ; Filter out the illegal characters, then check if the length is the same as the original string
       (= (count (filter #(let [i (int %)]
                            ; Make sure the char code is in the valid ranges
                            (or (< 47 i 58) (< 64 i 91) (< 96 i 123)))
                         username))
          (count username))

       (clojure.string/ends-with? username "VEVO")))

Any TIO link for testing?
Bagas Sanjaya

@BagasSanjaya I can add one in a bit. It seems like adding TIO links are standard now. They were optional last time I used the site frequently, but now everyone's adding them.
Carcigenicate

@BagasSanjaya I added a link. Unfortunately TIO seems broken. It can't find the ends-with? function, even though that's part of the standard library.
Carcigenicate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.